Update Lua compat logic for Damage

This commit is contained in:
NepDisk 2026-04-09 12:11:14 -04:00
parent 95a018c82c
commit e883c6968e
2 changed files with 14 additions and 3 deletions

View file

@ -1850,7 +1850,9 @@ static int lib_pDamageMobj(lua_State *L)
damage = (INT32)luaL_optinteger(L, 4, 1);
if ((damage == 10000) && lua_isnil(L, 5))
damagetype = DMG_TIMEOVER;
damagetype = DMG_INSTAKILL;
else if ((damage == 42000) && lua_isnil(L, 5))
damagetype = DMG_SPECTATOR;
else
damagetype = (UINT8)luaL_optinteger(L, 5, 0);

View file

@ -2047,6 +2047,7 @@ static UINT8 P_ShouldHookDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sourc
{
boolean targetisplayer = false;
const boolean killer = (damagetype & DMG_DEATHMASK);
const boolean specdamage = (damagetype == DMG_SPECTATOR);
INT32 use_damage = damage;
if (target && (!P_MobjWasRemoved(target)) && target->player)
@ -2054,7 +2055,12 @@ static UINT8 P_ShouldHookDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sourc
targetisplayer = true;
}
if (lua_compatmode && targetisplayer && killer)
if (lua_compatmode && targetisplayer && specdamage)
{
// Before the introduction of dedicated damage types, this magic number was used to kill spectator players.
use_damage = 42000;
}
else if (lua_compatmode && targetisplayer && killer)
{
// Before the introduction of dedicated damage types, this magic number was used to kill players.
use_damage = 10000;
@ -2068,7 +2074,7 @@ static UINT8 P_ShouldHookDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sourc
const UINT8 type = (damagetype & DMG_TYPEMASK);
status = shouldDamage;
if (!killer)
if (!killer && !specdamage)
{
if (shouldSpin > 0 && ((type == DMG_NORMAL) || (type == DMG_WIPEOUT) || (type == DMG_FLIPOVER)))
status = shouldSpin;
@ -2116,6 +2122,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
if (damagetype != DMG_SPECTATOR && target->player && target->player->spectator)
return false;
if (damagetype == DMG_SPECTATOR && target->player && target->player->spectator)
damagetype = DMG_INSTAKILL;
if (!P_MobjWasRemoved(source) && source->player && source->player->spectator)
return false;