From 1358541f75246ed38c5bd605b3513f04ac1b23c4 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 28 Dec 2024 10:45:06 -0500 Subject: [PATCH] wip: Old damage hooks Don't seem to work as of yet. --- src/lua_hook.h | 12 +++++++++++ src/lua_hooklib.c | 51 +++++++++++++++++++++++++++++++++++++++++++- src/lua_playerlib.c | 7 ++++++ src/p_inter.c | 52 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 118 insertions(+), 4 deletions(-) diff --git a/src/lua_hook.h b/src/lua_hook.h index daa6ff535..4d8d11c3d 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -41,7 +41,13 @@ automatically. X (MobjThinker),/* P_MobjThinker, P_SceneryThinker */\ X (BossThinker),/* P_GenericBossThinker */\ X (ShouldDamage),/* P_DamageMobj (Should mobj take damage?) */\ + X (ShouldSpin),/* P_DamageMobj (Should mobj take spinout damage?) */\ + X (ShouldExplode),/* P_DamageMobj (Should mobj take explosion damage?) */\ + X (ShouldSquish),/* P_DamageMobj (Should mobj take squish damage?) */\ X (MobjDamage),/* P_DamageMobj (Mobj actually takes damage!) */\ + X (PlayerSpin),/* P_DamageMobj (Mobj actually takes damage!) */\ + X (PlayerExplode),/* P_DamageMobj (Mobj actually takes damage!) */\ + X (PlayerSquish),/* P_DamageMobj (Mobj actually takes damage!) */\ X (MobjDeath),/* P_KillMobj */\ X (BossDeath),/* A_BossDeath */\ X (MobjRemoved),/* P_RemoveMobj */\ @@ -134,7 +140,13 @@ void LUA_HookThinkFrame(void); int LUA_HookMobjLineCollide(mobj_t *, line_t *); int LUA_HookTouchSpecial(mobj_t *special, mobj_t *toucher); int LUA_HookShouldDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +int LUA_HookShouldSpin(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +int LUA_HookShouldExplode(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +int LUA_HookShouldSquish(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); int LUA_HookMobjDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +int LUA_HookPlayerSpin(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +int LUA_HookPlayerExplode(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +int LUA_HookPlayerSquish(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); int LUA_HookMobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); int LUA_HookMobjMoveBlocked(mobj_t *, mobj_t *, line_t *); void LUA_HookSpecialExecute(activator_t *activator, INT32 *args, char **stringargs); diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 1018a5a91..b25b5e016 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -749,10 +749,59 @@ int LUA_HookShouldDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT3 MOBJ_HOOK(ShouldDamage), res_force); } +int LUA_HookShouldSpin(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + if (damagetype & DMG_NORMAL || damagetype & DMG_WIPEOUT || damagetype & DMG_STING) + return damage_hook(target, inflictor, source, damage, damagetype, + MOBJ_HOOK(ShouldSpin), res_force); + return 0; +} + +int LUA_HookShouldExplode(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + if (damagetype & DMG_EXPLODE || damagetype & DMG_KARMA) + return damage_hook(target, inflictor, source, damage, damagetype, + MOBJ_HOOK(ShouldExplode), res_force); + return 0; +} + +int LUA_HookShouldSquish(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + if (damagetype & DMG_SQUISH) + return damage_hook(target, inflictor, source, damage, damagetype, + MOBJ_HOOK(ShouldSquish), res_force); + return 0; +} + int LUA_HookMobjDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) { return damage_hook(target, inflictor, source, damage, damagetype, - MOBJ_HOOK(MobjDamage), res_true); + MOBJ_HOOK(MobjDamage), res_true); +} + +int LUA_HookPlayerSpin(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + if (damagetype & DMG_NORMAL || damagetype & DMG_WIPEOUT || damagetype & DMG_STING) + return damage_hook(target, inflictor, source, damage, damagetype, + MOBJ_HOOK(PlayerSpin), res_true); + + return 0; +} + +int LUA_HookPlayerExplode(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + if (damagetype & DMG_EXPLODE || damagetype & DMG_KARMA) + return damage_hook(target, inflictor, source, damage, damagetype, + MOBJ_HOOK(PlayerExplode), res_true); + return 0; +} + +int LUA_HookPlayerSquish(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + if (damagetype & DMG_SQUISH) + return damage_hook(target, inflictor, source, damage, damagetype, + MOBJ_HOOK(PlayerSquish), res_true); + return 0; } int LUA_HookMobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index eced2c526..1d692704d 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -197,6 +197,13 @@ static int player_get(lua_State *L) LUA_PushUserdata(L, &plr->oldcmd, META_TICCMD); else if (fastcmp(field,"playerstate")) lua_pushinteger(L, plr->playerstate); + else if (fastcmp(field,"health")) + { + if (plr->mo) + lua_pushinteger(L, plr->mo->health); + else + lua_pushinteger(L, 0); + } else if (fastcmp(field,"viewz")) lua_pushfixed(L, plr->viewz); else if (fastcmp(field,"viewheight")) diff --git a/src/p_inter.c b/src/p_inter.c index f05d8ada2..d7de017bc 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1864,6 +1864,51 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, return true; } +// Determines what ShouldX Hook's status should be used. +static UINT8 P_ShouldHookDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + UINT8 shouldDamage = LUA_HookShouldDamage(target, inflictor, source, damage, damagetype); + UINT8 shouldSpin = LUA_HookShouldSpin(target, inflictor, source, damage, damagetype); + UINT8 shouldExplode = LUA_HookShouldExplode(target, inflictor, source, damage, damagetype); + UINT8 shouldSquish = LUA_HookShouldSquish(target, inflictor, source, damage, damagetype); + UINT8 status; + + status = shouldDamage; + + if (shouldSpin > 0 && ((damagetype & DMG_NORMAL) || (damagetype & DMG_WIPEOUT) || (damagetype & DMG_STING))) + status = shouldSpin; + else if (shouldExplode > 0 && ((damagetype & DMG_EXPLODE) || (damagetype & DMG_KARMA))) + status = shouldExplode; + else if (shouldSquish > 0 && (damagetype & DMG_SQUISH)) + status = shouldSquish; + + return status; +} + +// Determines what Damage Hook's status should be used. +static UINT8 P_HookDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) +{ + UINT8 MobjDamage = LUA_HookMobjDamage(target, inflictor, source, damage, damagetype); + UINT8 PlayerSpin = LUA_HookPlayerSpin(target, inflictor, source, damage, damagetype); + UINT8 PlayerExplode = LUA_HookPlayerExplode(target, inflictor, source, damage, damagetype); + UINT8 PlayerSquish = LUA_HookPlayerSquish(target, inflictor, source, damage, damagetype); + UINT8 status; + + status = MobjDamage; + + if (target->type != MT_PLAYER) + return status; + + if (PlayerSpin > 0 && ((damagetype & DMG_NORMAL) || (damagetype & DMG_WIPEOUT) || (damagetype & DMG_STING))) + status = PlayerSpin; + else if (PlayerExplode > 0 && ((damagetype & DMG_EXPLODE) || (damagetype & DMG_KARMA))) + status = PlayerExplode; + else if (PlayerSquish > 0 && (damagetype & DMG_SQUISH)) + status = PlayerSquish; + + return status; +} + /** Damages an object, which may or may not be a player. * For melee attacks, source and inflictor are the same. * @@ -1881,6 +1926,7 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, * \todo Clean up this mess, split into multiple functions. * \sa P_KillMobj */ + boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) { player_t *player; @@ -1902,7 +1948,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Everything above here can't be forced. if (!metalrecording) { - UINT8 shouldForce = LUA_HookShouldDamage(target, inflictor, source, damage, damagetype); + UINT8 shouldForce = P_ShouldHookDamage(target, inflictor, source, damage, damagetype); if (P_MobjWasRemoved(target)) return (shouldForce == 1); // mobj was removed if (shouldForce == 1) @@ -1925,7 +1971,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!force && target->flags2 & MF2_FRET) // Currently flashing from being hit return false; - if (LUA_HookMobjDamage(target, inflictor, source, damage, damagetype) || P_MobjWasRemoved(target)) + if (P_HookDamage(target, inflictor, source, damage, damagetype) || P_MobjWasRemoved(target)) return true; if (target->health > 1) @@ -1955,7 +2001,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!P_KillPlayer(player, inflictor, source, damagetype)) return false; } - else if (LUA_HookMobjDamage(target, inflictor, source, damage, damagetype)) + else if (P_HookDamage(target, inflictor, source, damage, damagetype)) { return true; }