From 87122216c5924bd42a205caeaeb6f897c7318cfc Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 8 Mar 2026 18:04:19 -0400 Subject: [PATCH] Fix bouncy floors not killing airdrop and make generalized air drop kill function (and expose it to lua) --- src/k_kart.c | 13 +++++++++++++ src/k_kart.h | 2 ++ src/lua_baselib.c | 13 +++++++++++++ src/p_mobj.c | 7 +------ src/p_user.c | 7 +++++++ 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c9c418400..c96b6f17c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7155,6 +7155,19 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) player->airdroppredelay++; } +void K_KillAirDrop(player_t *player, p_airdropflags_t airdropflags) +{ + if (!player) + return; + + if (player->airdropflags & airdropflags) + { + player->airdroptime = 0; + player->airdroppredelay = 0; + player->airdropflags &= ~PAF_AIRDROP_MASK; + } +} + // Returns the bumpspark value as an enum. INT32 K_GetBumpSpark(void) { diff --git a/src/k_kart.h b/src/k_kart.h index 6cfd73707..4cd6d4305 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -414,6 +414,8 @@ typedef enum AIRDROP_FUSION, } airdroptype_t; +void K_KillAirDrop(player_t *player, p_airdropflags_t airdropflags); + boolean K_NullDriftTiltEnabled(void); #define RECOVERYDASHADD (TICRATE/2) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 63f9c331f..4f43b76a7 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4375,6 +4375,18 @@ static int lib_kSafeRespawnPositionEx(lua_State *L) return 1; } +static int lib_kKillAirDrop(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + p_airdropflags_t airdropflags = luaL_checkinteger(L, 2); + + if (!player) + return LUA_ErrInvalid(L, "player_t"); + + K_KillAirDrop(player, airdropflags); + return 0; +} + // Checks if Rings are applicable. static int lib_kRingsActive(lua_State *L) { @@ -5770,6 +5782,7 @@ static luaL_Reg lib[] = { {"K_SetHyudoroCooldown",lib_kSetHyuCountdown}, {"K_SafeRespawnPosition",lib_kSafeRespawnPosition}, {"K_SafeRespawnPositionEx",lib_kSafeRespawnPositionEx}, + {"K_KillAirDrop", lib_kKillAirDrop}, {"K_GetCollideAngle",lib_kGetCollideAngle}, diff --git a/src/p_mobj.c b/src/p_mobj.c index d09acba2c..a7683796d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3406,12 +3406,7 @@ void P_MobjCheckWater(mobj_t *mobj) mobj->momz = FixedMul(mobj->momz, FixedDiv(2*FRACUNIT, 5*FRACUNIT)); // kill momentum significantly, to make the goo feel thick. // Kill heavy airdrop too so you don't get softlocked. - if (mobj->player && (mobj->player->airdropflags & PAF_AIRDROP_HEAVY)) - { - mobj->player->airdroptime = 0; - mobj->player->airdroppredelay = 0; - mobj->player->airdropflags &= ~PAF_AIRDROP_MASK; - } + K_KillAirDrop(mobj->player, PAF_AIRDROP_HEAVY); } else if (wasinwater && P_MobjFlip(mobj) * mobj->momz > 0) { diff --git a/src/p_user.c b/src/p_user.c index b12c21904..d5ced7f91 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1692,6 +1692,9 @@ static void P_CheckBouncySectors(player_t *player) { player->mo->momx = -FixedMul(player->mo->momx,rover->bouncestrength); player->mo->momy = -FixedMul(player->mo->momy,rover->bouncestrength); + + // Kill heavy airdrop too so you don't get softlocked. + K_KillAirDrop(player, PAF_AIRDROP_HEAVY); } else { @@ -1731,6 +1734,10 @@ static void P_CheckBouncySectors(player_t *player) player->mo->momx = momentum.x; player->mo->momy = momentum.y; player->mo->momz = momentum.z; + + // Kill heavy airdrop too so you don't get softlocked. + K_KillAirDrop(player, PAF_AIRDROP_HEAVY); + } goto bouncydone; }