diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index a58b2c581..6b08d1cdd 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; + mo->renderflags |= visflags; + } + } mo->eflags = (UINT16)eflags; break; } 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),