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);