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.")
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
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
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);
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)
{
// Do it
const char *name = luaL_checkstring(L, 1);
- RemotePlayer *player = dynamic_cast<RemotePlayer *>(env->getPlayer(name));
+ RemotePlayer *player = env->getPlayer(name);
if (player == NULL){
lua_pushnil(L);
return 1;
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);
// 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);
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));
RemotePlayer *getPlayer(const session_t peer_id);
RemotePlayer *getPlayer(const char* name);
+ const std::vector<RemotePlayer *> getPlayers() const { return m_players; }
u32 getPlayerCount() const { return m_players.size(); }
static bool migratePlayersDatabase(const GameParams &game_params,