diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 5c52d1236..790ccdbc6 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1372,7 +1372,7 @@ static int lib_pSpawnGhostMobj(lua_State *L) INLEVEL if (!mobj) return LUA_ErrInvalid(L, "mobj_t"); - LUA_PushUserdata(L, P_SpawnGhostMobj(mobj), META_MOBJ); + LUA_PushUserdata(L, P_SpawnGhostMobjEX(mobj, lua_compatmode), META_MOBJ); return 1; } diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index a58b2c581..c1ad48ab2 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -615,6 +615,23 @@ static int mobj_get(lua_State *L) return 1; } +static inline UINT32 eflags_vischeck(UINT32 eflags) +{ + UINT8 playerhide; + + playerhide = 0; + if (eflags & RF_DONTDRAW) + { + // Visibility checks are necessary + playerhide = (UINT8)((eflags & RF_DONTDRAW) >> RF_HIDESHIFT); + + // Hiding is the opposite of visibility. + playerhide = (~playerhide) & 0x0F; + } + + return ((UINT32)(playerhide) << RF_HIDESHIFT); +} + #define NOSET luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly.", mobj_opt[field]) #define NOSETPOS luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly. Use " LUA_QL("P_Move") ", " LUA_QL("P_TryMove") ", or " LUA_QL("P_SetOrigin") ", or " LUA_QL("P_MoveOrigin") " instead.", mobj_opt[field]) static int mobj_set(lua_State *L) @@ -838,8 +855,19 @@ static int mobj_set(lua_State *L) case mobj_eflags: { UINT32 eflags = luaL_checkinteger(L, 3); + UINT32 visflags = 0; if (lua_compatmode) - mo->renderflags = (mo->renderflags & ~RF_DONTDRAW) | (~eflags & RF_DONTDRAW); // eeeyup. + { + // eeeyup. + // Mhm. Yeah. + visflags = eflags_vischeck(eflags); + + if ((visflags) && ((mo->renderflags & RF_DONTDRAW) != RF_DONTDRAW)) + { + mo->renderflags &= ~RF_DONTDRAW; + mo->renderflags |= visflags; + } + } mo->eflags = (UINT16)eflags; break; } diff --git a/src/p_local.h b/src/p_local.h index 885b66ea5..54be8014e 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -200,7 +200,8 @@ boolean P_PlayerHitFloor(player_t *player, boolean fromAir); void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative); void P_RestoreMusic(player_t *player); boolean P_EndingMusic(player_t *player); -mobj_t *P_SpawnGhostMobj(mobj_t *mobj); +mobj_t *P_SpawnGhostMobjEX(mobj_t *mobj, boolean legacy); +#define P_SpawnGhostMobj(mobj) P_SpawnGhostMobjEX(mobj, false) INT32 P_GivePlayerRings(player_t *player, INT32 num_rings); void P_GivePlayerLives(player_t *player, INT32 numlives); UINT8 P_GetNextEmerald(void); diff --git a/src/p_mobj.c b/src/p_mobj.c index 644bf1d9a..15da50e6c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10561,7 +10561,7 @@ void P_MobjThinker(mobj_t *mobj) } } } - else + else if (mobj->extravalue3 <= 0) // Legacy mode bypasses this visibility system. { UINT32 dur = (mobj->flags2 & MF2_BOSSNOTRAP) ? (2*mobj->fuse)/3 diff --git a/src/p_user.c b/src/p_user.c index e977f9ba4..dbc18e1fa 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1182,11 +1182,11 @@ boolean P_IsDisplayPlayer(player_t *player) } // -// P_SpawnGhostMobj +// P_SpawnGhostMobjEX // -// Spawns a ghost object on the player +// Spawns a ghost object on the player. Has an option for "legacy mode". // -mobj_t *P_SpawnGhostMobj(mobj_t *mobj) +mobj_t *P_SpawnGhostMobjEX(mobj_t *mobj, boolean legacy) { mobj_t *ghost = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_GHOST); @@ -1264,6 +1264,12 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->old_spritexoffset = mobj->old_spritexoffset2; ghost->old_spriteyoffset = mobj->old_spriteyoffset2; + // Legacy mode + if (legacy) + { + ghost->extravalue3 = 1; + } + return ghost; } diff --git a/src/r_defs.h b/src/r_defs.h index 0d70653e9..f0720b491 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1021,11 +1021,12 @@ typedef enum RF_ABSOLUTELIGHTLEVEL = 0x00010000, // mobj_t.lightlevel is absolute instead of relative RF_HIDEINSKYBOX = 0x00020000, // do not render in skybox - RF_DONTDRAW = 0x00F00000, // --Don't generate a vissprite - RF_DONTDRAWP1 = 0x00100000, // No P1 - RF_DONTDRAWP2 = 0x00200000, // No P2 - RF_DONTDRAWP3 = 0x00400000, // No P3 - RF_DONTDRAWP4 = 0x00800000, // No P4 + RF_HIDESHIFT = (20), + RF_DONTDRAW = 0x0F << RF_HIDESHIFT, // --Don't generate a vissprite + RF_DONTDRAWP1 = 0x01 << RF_HIDESHIFT, // No P1 + RF_DONTDRAWP2 = 0x02 << RF_HIDESHIFT, // No P2 + RF_DONTDRAWP3 = 0x04 << RF_HIDESHIFT, // No P3 + RF_DONTDRAWP4 = 0x08 << RF_HIDESHIFT, // No P4 RF_BLENDMASK = 0x07000000, // --Blending override - see patchalphastyle_t RF_BLENDSHIFT = (6*4),