mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
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.
This commit is contained in:
parent
c657fb343f
commit
0b8d3f99a5
@ -40,9 +40,6 @@ function core.check_player_privs(name, ...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local player_list = {}
|
|
||||||
|
|
||||||
|
|
||||||
function core.send_join_message(player_name)
|
function core.send_join_message(player_name)
|
||||||
if not core.is_singleplayer() then
|
if not core.is_singleplayer() then
|
||||||
core.chat_send_all("*** " .. player_name .. " joined the game.")
|
core.chat_send_all("*** " .. player_name .. " joined the game.")
|
||||||
@ -61,7 +58,6 @@ end
|
|||||||
|
|
||||||
core.register_on_joinplayer(function(player)
|
core.register_on_joinplayer(function(player)
|
||||||
local player_name = player:get_player_name()
|
local player_name = player:get_player_name()
|
||||||
player_list[player_name] = player
|
|
||||||
if not core.is_singleplayer() then
|
if not core.is_singleplayer() then
|
||||||
local status = core.get_server_status(player_name, true)
|
local status = core.get_server_status(player_name, true)
|
||||||
if status and status ~= "" then
|
if status and status ~= "" then
|
||||||
@ -74,22 +70,10 @@ end)
|
|||||||
|
|
||||||
core.register_on_leaveplayer(function(player, timed_out)
|
core.register_on_leaveplayer(function(player, timed_out)
|
||||||
local player_name = player:get_player_name()
|
local player_name = player:get_player_name()
|
||||||
player_list[player_name] = nil
|
|
||||||
core.send_leave_message(player_name, timed_out)
|
core.send_leave_message(player_name, timed_out)
|
||||||
end)
|
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)
|
function core.is_player(player)
|
||||||
-- a table being a player is also supported because it quacks sufficiently
|
-- a table being a player is also supported because it quacks sufficiently
|
||||||
-- like a player if it has the is_player function
|
-- like a player if it has the is_player function
|
||||||
|
@ -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_error(lua_State *L, int pcall_result, const char *mod, const char *fxn);
|
||||||
void script_run_callbacks_f(lua_State *L, int nargs,
|
void script_run_callbacks_f(lua_State *L, int nargs,
|
||||||
RunCallbacksMode mode, const char *fxn);
|
RunCallbacksMode mode, const char *fxn);
|
||||||
|
|
||||||
void log_deprecated(lua_State *L, const std::string &message,
|
void log_deprecated(lua_State *L, const std::string &message,
|
||||||
int stack_depth=1);
|
int stack_depth=1);
|
||||||
|
@ -640,6 +640,23 @@ int ModApiEnvMod::l_add_item(lua_State *L)
|
|||||||
return 1;
|
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)
|
// get_player_by_name(name)
|
||||||
int ModApiEnvMod::l_get_player_by_name(lua_State *L)
|
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
|
// Do it
|
||||||
const char *name = luaL_checkstring(L, 1);
|
const char *name = luaL_checkstring(L, 1);
|
||||||
RemotePlayer *player = dynamic_cast<RemotePlayer *>(env->getPlayer(name));
|
RemotePlayer *player = env->getPlayer(name);
|
||||||
if (player == NULL){
|
if (player == NULL){
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1319,6 +1336,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top)
|
|||||||
API_FCT(find_nodes_with_meta);
|
API_FCT(find_nodes_with_meta);
|
||||||
API_FCT(get_meta);
|
API_FCT(get_meta);
|
||||||
API_FCT(get_node_timer);
|
API_FCT(get_node_timer);
|
||||||
|
API_FCT(get_connected_players);
|
||||||
API_FCT(get_player_by_name);
|
API_FCT(get_player_by_name);
|
||||||
API_FCT(get_objects_inside_radius);
|
API_FCT(get_objects_inside_radius);
|
||||||
API_FCT(set_timeofday);
|
API_FCT(set_timeofday);
|
||||||
|
@ -101,6 +101,9 @@ private:
|
|||||||
// pos = {x=num, y=num, z=num}
|
// pos = {x=num, y=num, z=num}
|
||||||
static int l_add_item(lua_State *L);
|
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)
|
// get_player_by_name(name)
|
||||||
static int l_get_player_by_name(lua_State *L);
|
static int l_get_player_by_name(lua_State *L);
|
||||||
|
|
||||||
|
@ -1063,6 +1063,9 @@ int ObjectRef::l_get_luaentity(lua_State *L)
|
|||||||
int ObjectRef::l_is_player_connected(lua_State *L)
|
int ObjectRef::l_is_player_connected(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
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);
|
ObjectRef *ref = checkobject(L, 1);
|
||||||
RemotePlayer *player = getplayer(ref);
|
RemotePlayer *player = getplayer(ref);
|
||||||
lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT));
|
lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT));
|
||||||
|
@ -358,6 +358,7 @@ public:
|
|||||||
|
|
||||||
RemotePlayer *getPlayer(const session_t peer_id);
|
RemotePlayer *getPlayer(const session_t peer_id);
|
||||||
RemotePlayer *getPlayer(const char* name);
|
RemotePlayer *getPlayer(const char* name);
|
||||||
|
const std::vector<RemotePlayer *> getPlayers() const { return m_players; }
|
||||||
u32 getPlayerCount() const { return m_players.size(); }
|
u32 getPlayerCount() const { return m_players.size(); }
|
||||||
|
|
||||||
static bool migratePlayersDatabase(const GameParams &game_params,
|
static bool migratePlayersDatabase(const GameParams &game_params,
|
||||||
|
Loading…
Reference in New Issue
Block a user