Merge branch 'consoleplayer-dedicated' into 'next'

Fix not being able to access consoleplayer as a dedicated server + other more consistent checks

See merge request KartKrew/Kart-Public!240
This commit is contained in:
Sal 2020-11-10 14:50:22 -05:00
commit 5ec44ba3fa
4 changed files with 28 additions and 19 deletions

View file

@ -9709,11 +9709,10 @@ static inline int lib_getenum(lua_State *L)
lua_pushinteger(L, mapmusposition); lua_pushinteger(L, mapmusposition);
return 1; return 1;
} else if (fastcmp(word,"server")) { } else if (fastcmp(word,"server")) {
if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer]) return LUA_PushServerPlayer(L);
return 0;
LUA_PushUserdata(L, &players[serverplayer], META_PLAYER);
return 1;
} else if (fastcmp(word,"consoleplayer")) { // Player controlling the console, basically our local player } 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]) if (consoleplayer < 0 || !playeringame[consoleplayer])
return 0; return 0;
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER); LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);

View file

@ -27,25 +27,35 @@
static int lib_iteratePlayers(lua_State *L) static int lib_iteratePlayers(lua_State *L)
{ {
INT32 i = -1; INT32 i = -1;
if (lua_gettop(L) < 2) 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'."); //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); lua_pushcfunction(L, lib_iteratePlayers);
return 1; return 1;
} }
lua_settop(L, 2); lua_settop(L, 2);
lua_remove(L, 1); // state is unused. lua_remove(L, 1); // state is unused.
if (!lua_isnil(L, 1)) if (!lua_isnil(L, 1))
i = (INT32)(*((player_t **)luaL_checkudata(L, 1, META_PLAYER)) - players); i = (INT32)(*((player_t **)luaL_checkudata(L, 1, META_PLAYER)) - players);
for (i++; i < MAXPLAYERS; i++)
i++;
if (i == serverplayer)
{
return LUA_PushServerPlayer(L);
}
for (; i < MAXPLAYERS; i++)
{ {
if (!playeringame[i]) if (!playeringame[i])
continue; continue;
if (!players[i].mo)
continue;
LUA_PushUserdata(L, &players[i], META_PLAYER); LUA_PushUserdata(L, &players[i], META_PLAYER);
return 1; return 1;
} }
return 0; return 0;
} }
@ -58,10 +68,10 @@ static int lib_getPlayer(lua_State *L)
lua_Integer i = luaL_checkinteger(L, 2); lua_Integer i = luaL_checkinteger(L, 2);
if (i < 0 || i >= MAXPLAYERS) if (i < 0 || i >= MAXPLAYERS)
return luaL_error(L, "players[] index %d out of range (0 - %d)", i, MAXPLAYERS-1); 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]) if (!playeringame[i])
return 0; return 0;
if (!players[i].mo)
return 0;
LUA_PushUserdata(L, &players[i], META_PLAYER); LUA_PushUserdata(L, &players[i], META_PLAYER);
return 1; return 1;
} }
@ -122,8 +132,6 @@ static int lib_iterateDisplayplayers(lua_State *L)
if (i > splitscreen || !playeringame[displayplayers[i]]) 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. 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_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'! 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; return 2;
@ -144,8 +152,6 @@ static int lib_getDisplayplayers(lua_State *L)
return 0; return 0;
if (!playeringame[displayplayers[i]]) if (!playeringame[displayplayers[i]])
return 0; return 0;
if (!players[displayplayers[i]].mo)
return 0;
LUA_PushUserdata(L, &players[displayplayers[i]], META_PLAYER); LUA_PushUserdata(L, &players[displayplayers[i]], META_PLAYER);
return 1; return 1;
} }
@ -184,12 +190,7 @@ static int player_get(lua_State *L)
else if (fastcmp(field,"name")) else if (fastcmp(field,"name"))
lua_pushstring(L, player_names[plr-players]); lua_pushstring(L, player_names[plr-players]);
else if (fastcmp(field,"mo")) 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")) else if (fastcmp(field,"cmd"))
LUA_PushUserdata(L, &plr->cmd, META_TICCMD); LUA_PushUserdata(L, &plr->cmd, META_TICCMD);
else if (fastcmp(field,"playerstate")) else if (fastcmp(field,"playerstate"))

View file

@ -367,6 +367,14 @@ void LUA_PushUserdata(lua_State *L, void *data, const char *meta)
lua_remove(L, -2); // remove LREG_VALID 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. // When userdata is freed, use this function to remove it from Lua.
void LUA_InvalidateUserdata(void *data) void LUA_InvalidateUserdata(void *data)
{ {

View file

@ -46,6 +46,7 @@ void LUA_DumpFile(const char *filename);
#endif #endif
fixed_t LUA_EvalMath(const char *word); fixed_t LUA_EvalMath(const char *word);
void LUA_PushUserdata(lua_State *L, void *data, const char *meta); void LUA_PushUserdata(lua_State *L, void *data, const char *meta);
int LUA_PushServerPlayer(lua_State *L);
void LUA_InvalidateUserdata(void *data); void LUA_InvalidateUserdata(void *data);
void LUA_InvalidateLevel(void); void LUA_InvalidateLevel(void);
void LUA_InvalidateMapthings(void); void LUA_InvalidateMapthings(void);