wip: Old damage hooks

Don't seem to work as of yet.
This commit is contained in:
NepDisk 2024-12-28 10:45:06 -05:00
parent 3be3d83738
commit 1358541f75
4 changed files with 118 additions and 4 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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"))

View file

@ -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;
}