diff --git a/src/k_kart.c b/src/k_kart.c index 4da38bbe3..809dba4b4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2060,6 +2060,12 @@ boolean K_TripwirePass(const player_t *player) return (player->tripwirePass != TRIPWIRE_NONE); } +boolean K_PlayerCanPunt(const player_t *player) +{ + return player->invincibilitytimer > 0 || player->growshrinktimer > 0 || + (player->flamestore > 0 && K_GetShieldFromPlayer(player) == KSHIELD_FLAME); +} + // Safe guard cvars to prevent cheating in RA. INT32 K_RAGuard(consvar_t cvar) { diff --git a/src/k_kart.h b/src/k_kart.h index b7230097b..e980edfb1 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -279,6 +279,7 @@ boolean K_ApplyOffroad(const player_t *player); fixed_t K_PlayerTripwireSpeedThreshold(const player_t *player); tripwirepass_t K_TripwirePassConditions(const player_t *player); boolean K_TripwirePass(const player_t *player); +boolean K_PlayerCanPunt(const player_t *player); boolean K_WaterRun(mobj_t *mobj); void K_SpawnWaterTrail(mobj_t *mobj); boolean K_ItemMobjAllowedtoWaterRun(mobj_t *item); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 2801b2a98..9a3735d35 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4388,6 +4388,17 @@ static int lib_kGetShieldFromPlayer(lua_State *L) return 1; } +static int lib_kPlayerCanPunt(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + + //HUDSAFE + if (!player) + return LUA_ErrInvalid(L, "player_t"); + lua_pushboolean(L, K_PlayerCanPunt(player)); + return 1; +} + static int lib_kAddNewScoreboardMod(lua_State *L) { const char *modname = luaL_checkstring(L, 1); @@ -5322,6 +5333,7 @@ static luaL_Reg lib[] = { {"K_AwardPlayerRings", lib_kAwardPlayerRings}, {"K_AwardScaledPlayerRings", lib_kAwardScaledPlayerRings}, {"K_GetShieldFromPlayer", lib_kGetShieldFromPlayer}, + {"K_PlayerCanPunt", lib_kPlayerCanPunt}, // k_hud {"K_AddNewScoreboardMod", lib_kAddNewScoreboardMod}, diff --git a/src/p_inter.c b/src/p_inter.c index eec5c219a..fdff30205 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -573,9 +573,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; // kill - if (player->invincibilitytimer > 0 - || player->growshrinktimer > 0 - || player->flamestore > 0) + if (K_PlayerCanPunt(player)) { P_KillMobj(special, toucher, toucher, DMG_NORMAL); return; diff --git a/src/p_map.c b/src/p_map.c index 9d17208e4..4be5c52b7 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1208,8 +1208,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (!thing->health) return BMIT_CONTINUE; // dead - if (g_tm.thing->player->invincibilitytimer > 0 - || g_tm.thing->player->growshrinktimer > 0) + if (K_PlayerCanPunt(g_tm.thing->player)) { if (thing->type == MT_BLUEROBRA_JOINT) P_KillMobj(thing->target, g_tm.thing, g_tm.thing, DMG_NORMAL); @@ -1234,8 +1233,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (!thing->health) return BMIT_CONTINUE; // dead - if (g_tm.thing->player->invincibilitytimer > 0 - || g_tm.thing->player->growshrinktimer > 0) + if (K_PlayerCanPunt(g_tm.thing->player)) { P_KillMobj(thing, g_tm.thing, g_tm.thing, DMG_NORMAL); return BMIT_CONTINUE; // kill @@ -1265,8 +1263,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) return BMIT_CONTINUE; // underneath // kill - if (g_tm.thing->player->invincibilitytimer > 0 - || g_tm.thing->player->growshrinktimer > 0) + if (K_PlayerCanPunt(g_tm.thing->player)) { P_KillMobj(thing, g_tm.thing, g_tm.thing, DMG_NORMAL); return BMIT_CONTINUE;