Skip to content

Commit 0b8d3f9

Browse files
committedFeb 23, 2020
Move core.get_connected_players() implementation to C++
Keeping the ObjectRefs around in a table isn't ideal and this allows removing the somewhat nonsensical is_player_connected() added in 86ef7147.
1 parent c657fb3 commit 0b8d3f9

File tree

6 files changed

+27
-17
lines changed

6 files changed

+27
-17
lines changed
 

‎builtin/game/misc.lua

-16
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ function core.check_player_privs(name, ...)
4040
end
4141

4242

43-
local player_list = {}
44-
45-
4643
function core.send_join_message(player_name)
4744
if not core.is_singleplayer() then
4845
core.chat_send_all("*** " .. player_name .. " joined the game.")
@@ -61,7 +58,6 @@ end
6158

6259
core.register_on_joinplayer(function(player)
6360
local player_name = player:get_player_name()
64-
player_list[player_name] = player
6561
if not core.is_singleplayer() then
6662
local status = core.get_server_status(player_name, true)
6763
if status and status ~= "" then
@@ -74,22 +70,10 @@ end)
7470

7571
core.register_on_leaveplayer(function(player, timed_out)
7672
local player_name = player:get_player_name()
77-
player_list[player_name] = nil
7873
core.send_leave_message(player_name, timed_out)
7974
end)
8075

8176

82-
function core.get_connected_players()
83-
local temp_table = {}
84-
for index, value in pairs(player_list) do
85-
if value:is_player_connected() then
86-
temp_table[#temp_table + 1] = value
87-
end
88-
end
89-
return temp_table
90-
end
91-
92-
9377
function core.is_player(player)
9478
-- a table being a player is also supported because it quacks sufficiently
9579
-- like a player if it has the is_player function

‎src/script/common/c_internal.h

+1
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,6 @@ int script_exception_wrapper(lua_State *L, lua_CFunction f);
103103
void script_error(lua_State *L, int pcall_result, const char *mod, const char *fxn);
104104
void script_run_callbacks_f(lua_State *L, int nargs,
105105
RunCallbacksMode mode, const char *fxn);
106+
106107
void log_deprecated(lua_State *L, const std::string &message,
107108
int stack_depth=1);

‎src/script/lua_api/l_env.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -640,14 +640,31 @@ int ModApiEnvMod::l_add_item(lua_State *L)
640640
return 1;
641641
}
642642

643+
// get_connected_players()
644+
int ModApiEnvMod::l_get_connected_players(lua_State *L)
645+
{
646+
GET_ENV_PTR;
647+
648+
lua_createtable(L, env->getPlayerCount(), 0);
649+
u32 i = 0;
650+
for (RemotePlayer *player : env->getPlayers()) {
651+
PlayerSAO *sao = player->getPlayerSAO();
652+
if (sao) {
653+
getScriptApiBase(L)->objectrefGetOrCreate(L, sao);
654+
lua_rawseti(L, -2, ++i);
655+
}
656+
}
657+
return 1;
658+
}
659+
643660
// get_player_by_name(name)
644661
int ModApiEnvMod::l_get_player_by_name(lua_State *L)
645662
{
646663
GET_ENV_PTR;
647664

648665
// Do it
649666
const char *name = luaL_checkstring(L, 1);
650-
RemotePlayer *player = dynamic_cast<RemotePlayer *>(env->getPlayer(name));
667+
RemotePlayer *player = env->getPlayer(name);
651668
if (player == NULL){
652669
lua_pushnil(L);
653670
return 1;
@@ -1319,6 +1336,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top)
13191336
API_FCT(find_nodes_with_meta);
13201337
API_FCT(get_meta);
13211338
API_FCT(get_node_timer);
1339+
API_FCT(get_connected_players);
13221340
API_FCT(get_player_by_name);
13231341
API_FCT(get_objects_inside_radius);
13241342
API_FCT(set_timeofday);

‎src/script/lua_api/l_env.h

+3
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ class ModApiEnvMod : public ModApiBase {
101101
// pos = {x=num, y=num, z=num}
102102
static int l_add_item(lua_State *L);
103103

104+
// get_connected_players()
105+
static int l_get_connected_players(lua_State *L);
106+
104107
// get_player_by_name(name)
105108
static int l_get_player_by_name(lua_State *L);
106109

‎src/script/lua_api/l_object.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,9 @@ int ObjectRef::l_get_luaentity(lua_State *L)
10631063
int ObjectRef::l_is_player_connected(lua_State *L)
10641064
{
10651065
NO_MAP_LOCK_REQUIRED;
1066+
// This method was once added for a bugfix, but never documented
1067+
log_deprecated(L, "is_player_connected is undocumented and "
1068+
"will be removed in a future release");
10661069
ObjectRef *ref = checkobject(L, 1);
10671070
RemotePlayer *player = getplayer(ref);
10681071
lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT));

‎src/serverenvironment.h

+1
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ class ServerEnvironment : public Environment
358358

359359
RemotePlayer *getPlayer(const session_t peer_id);
360360
RemotePlayer *getPlayer(const char* name);
361+
const std::vector<RemotePlayer *> getPlayers() const { return m_players; }
361362
u32 getPlayerCount() const { return m_players.size(); }
362363

363364
static bool migratePlayersDatabase(const GameParams &game_params,

0 commit comments

Comments
 (0)
Please sign in to comment.