From: sfan5 Date: Wed, 12 Feb 2020 18:49:48 +0000 (+0100) Subject: Move core.get_connected_players() implementation to C++ X-Git-Tag: 5.2.0~104 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0b8d3f99a5424113178329e56c2ebe4b38fd2b46;p=oweals%2Fminetest.git 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. --- diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 02c36ccb1..0ed11ada0 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -40,9 +40,6 @@ function core.check_player_privs(name, ...) end -local player_list = {} - - function core.send_join_message(player_name) if not core.is_singleplayer() then core.chat_send_all("*** " .. player_name .. " joined the game.") @@ -61,7 +58,6 @@ end core.register_on_joinplayer(function(player) local player_name = player:get_player_name() - player_list[player_name] = player if not core.is_singleplayer() then local status = core.get_server_status(player_name, true) if status and status ~= "" then @@ -74,22 +70,10 @@ end) core.register_on_leaveplayer(function(player, timed_out) local player_name = player:get_player_name() - player_list[player_name] = nil core.send_leave_message(player_name, timed_out) end) -function core.get_connected_players() - local temp_table = {} - for index, value in pairs(player_list) do - if value:is_player_connected() then - temp_table[#temp_table + 1] = value - end - end - return temp_table -end - - function core.is_player(player) -- a table being a player is also supported because it quacks sufficiently -- like a player if it has the is_player function diff --git a/src/script/common/c_internal.h b/src/script/common/c_internal.h index 69b8a7fdc..d8cf3fe76 100644 --- a/src/script/common/c_internal.h +++ b/src/script/common/c_internal.h @@ -103,5 +103,6 @@ int script_exception_wrapper(lua_State *L, lua_CFunction f); void script_error(lua_State *L, int pcall_result, const char *mod, const char *fxn); void script_run_callbacks_f(lua_State *L, int nargs, RunCallbacksMode mode, const char *fxn); + void log_deprecated(lua_State *L, const std::string &message, int stack_depth=1); diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 762612af4..7d5de896d 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -640,6 +640,23 @@ int ModApiEnvMod::l_add_item(lua_State *L) return 1; } +// get_connected_players() +int ModApiEnvMod::l_get_connected_players(lua_State *L) +{ + GET_ENV_PTR; + + lua_createtable(L, env->getPlayerCount(), 0); + u32 i = 0; + for (RemotePlayer *player : env->getPlayers()) { + PlayerSAO *sao = player->getPlayerSAO(); + if (sao) { + getScriptApiBase(L)->objectrefGetOrCreate(L, sao); + lua_rawseti(L, -2, ++i); + } + } + return 1; +} + // get_player_by_name(name) int ModApiEnvMod::l_get_player_by_name(lua_State *L) { @@ -647,7 +664,7 @@ int ModApiEnvMod::l_get_player_by_name(lua_State *L) // Do it const char *name = luaL_checkstring(L, 1); - RemotePlayer *player = dynamic_cast(env->getPlayer(name)); + RemotePlayer *player = env->getPlayer(name); if (player == NULL){ lua_pushnil(L); return 1; @@ -1319,6 +1336,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(find_nodes_with_meta); API_FCT(get_meta); API_FCT(get_node_timer); + API_FCT(get_connected_players); API_FCT(get_player_by_name); API_FCT(get_objects_inside_radius); API_FCT(set_timeofday); diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 68a4eae50..ac2f8b588 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -101,6 +101,9 @@ private: // pos = {x=num, y=num, z=num} static int l_add_item(lua_State *L); + // get_connected_players() + static int l_get_connected_players(lua_State *L); + // get_player_by_name(name) static int l_get_player_by_name(lua_State *L); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index f23282a95..1ce37bb6b 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1063,6 +1063,9 @@ int ObjectRef::l_get_luaentity(lua_State *L) int ObjectRef::l_is_player_connected(lua_State *L) { NO_MAP_LOCK_REQUIRED; + // This method was once added for a bugfix, but never documented + log_deprecated(L, "is_player_connected is undocumented and " + "will be removed in a future release"); ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT)); diff --git a/src/serverenvironment.h b/src/serverenvironment.h index cc4ecd797..3c7b7d059 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -358,6 +358,7 @@ public: RemotePlayer *getPlayer(const session_t peer_id); RemotePlayer *getPlayer(const char* name); + const std::vector getPlayers() const { return m_players; } u32 getPlayerCount() const { return m_players.size(); } static bool migratePlayersDatabase(const GameParams &game_params,