diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 056aa42e8..afcf98107 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -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); diff --git a/src/p_inter.c b/src/p_inter.c index d7e2a1146..31baf140a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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;