diff --git a/src/dehacked.c b/src/dehacked.c index 9e46522e44787c050e0e580742a1f42109344ca1..6e21e787920a7c1c64242f1b0b4db2ee0a44a3c4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9740,10 +9740,11 @@ static inline int lib_getenum(lua_State *L) lua_pushinteger(L, mapmusposition); return 1; } else if (fastcmp(word,"server")) { - return LUA_PushServerPlayer(L); + if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer]) + return 0; + LUA_PushUserdata(L, &players[serverplayer], META_PLAYER); + return 1; } else if (fastcmp(word,"consoleplayer")) { // Player controlling the console, basically our local player - if (consoleplayer == serverplayer) - return LUA_PushServerPlayer(L); if (consoleplayer < 0 || !playeringame[consoleplayer]) return 0; LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index e00af595b705a09fe784bfb76dc996b6c6d49189..26561a4db5bf78b088f67c0f6c7d430d769f30dc 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -27,35 +27,25 @@ static int lib_iteratePlayers(lua_State *L) { INT32 i = -1; - if (lua_gettop(L) < 2) { //return luaL_error(L, "Don't call players.iterate() directly, use it as 'for player in players.iterate do <block> end'."); lua_pushcfunction(L, lib_iteratePlayers); return 1; } - lua_settop(L, 2); lua_remove(L, 1); // state is unused. - if (!lua_isnil(L, 1)) i = (INT32)(*((player_t **)luaL_checkudata(L, 1, META_PLAYER)) - players); - - i++; - - if (i == serverplayer) - { - return LUA_PushServerPlayer(L); - } - - for (; i < MAXPLAYERS; i++) + for (i++; i < MAXPLAYERS; i++) { if (!playeringame[i]) continue; + if (!players[i].mo) + continue; LUA_PushUserdata(L, &players[i], META_PLAYER); return 1; } - return 0; } @@ -68,10 +58,10 @@ static int lib_getPlayer(lua_State *L) lua_Integer i = luaL_checkinteger(L, 2); if (i < 0 || i >= MAXPLAYERS) return luaL_error(L, "players[] index %d out of range (0 - %d)", i, MAXPLAYERS-1); - if (i == serverplayer) - return LUA_PushServerPlayer(L); if (!playeringame[i]) return 0; + if (!players[i].mo) + return 0; LUA_PushUserdata(L, &players[i], META_PLAYER); return 1; } @@ -132,6 +122,8 @@ static int lib_iterateDisplayplayers(lua_State *L) if (i > splitscreen || !playeringame[displayplayers[i]]) return 0; // Stop! There are no more players for us to go through. There will never be a player gap in displayplayers. + if (!players[displayplayers[i]].mo) + continue; LUA_PushUserdata(L, &players[displayplayers[i]], META_PLAYER); lua_pushinteger(L, i); // push this to recall what number we were on for the next function call. I suppose this also means you can retrieve the splitscreen player number with 'for p, n in displayplayers.iterate'! return 2; @@ -152,6 +144,8 @@ static int lib_getDisplayplayers(lua_State *L) return 0; if (!playeringame[displayplayers[i]]) return 0; + if (!players[displayplayers[i]].mo) + return 0; LUA_PushUserdata(L, &players[displayplayers[i]], META_PLAYER); return 1; } @@ -190,7 +184,12 @@ static int player_get(lua_State *L) else if (fastcmp(field,"name")) lua_pushstring(L, player_names[plr-players]); else if (fastcmp(field,"mo")) - LUA_PushUserdata(L, plr->mo, META_MOBJ); + { + if (plr->spectator) + lua_pushnil(L); + else + LUA_PushUserdata(L, plr->mo, META_MOBJ); + } else if (fastcmp(field,"cmd")) LUA_PushUserdata(L, &plr->cmd, META_TICCMD); else if (fastcmp(field,"playerstate")) diff --git a/src/lua_script.c b/src/lua_script.c index 5aff53808d221ecc48b5a1e898795551d44bcef0..ef1d2544ddd12f56a3a711cb1e273622db8ea7d7 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -369,14 +369,6 @@ void LUA_PushUserdata(lua_State *L, void *data, const char *meta) lua_remove(L, -2); // remove LREG_VALID } -int LUA_PushServerPlayer(lua_State *L) -{ - if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer]) - return 0; - LUA_PushUserdata(L, &players[serverplayer], META_PLAYER); - return 1; -} - // When userdata is freed, use this function to remove it from Lua. void LUA_InvalidateUserdata(void *data) { diff --git a/src/lua_script.h b/src/lua_script.h index 5e2e171f51625eb794994a336c74a6cacc8e25fb..b3ca16bc003ae2099b4f03c401d36b3683d40510 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -46,7 +46,6 @@ void LUA_DumpFile(const char *filename); #endif fixed_t LUA_EvalMath(const char *word); void LUA_PushUserdata(lua_State *L, void *data, const char *meta); -int LUA_PushServerPlayer(lua_State *L); void LUA_InvalidateUserdata(void *data); void LUA_InvalidateLevel(void); void LUA_InvalidateMapthings(void);