[CSM] Add function and chat command to disconnect from server. (#5487)

This commit is contained in:
red-001 2017-04-01 12:40:56 +01:00 committed by Loïc Blot
parent 813a9a36b2
commit 63ac62ec8a
6 changed files with 37 additions and 5 deletions

@ -127,3 +127,10 @@ core.register_chatcommand("list_players", {
core.display_chat_message(dump(core.get_player_names())) core.display_chat_message(dump(core.get_player_names()))
end end
}) })
core.register_chatcommand("disconnect", {
description = "Exit to main menu",
func = function(param)
core.disconnect()
end,
})

@ -698,6 +698,9 @@ Call these functions only at load time!
### Client Environment ### Client Environment
* `minetest.get_player_names()` * `minetest.get_player_names()`
* Returns list of player names on server * Returns list of player names on server
* `minetest.disconnect()`
* Disconnect from the server and exit to main menu.
* Returns `false` if the client is already disconnecting otherwise returns `true`.
### Misc. ### Misc.
* `minetest.parse_json(string[, nullvalue])`: returns something * `minetest.parse_json(string[, nullvalue])`: returns something

@ -260,7 +260,8 @@ Client::Client(
m_localdb(NULL), m_localdb(NULL),
m_script(NULL), m_script(NULL),
m_mod_storage_save_timer(10.0f), m_mod_storage_save_timer(10.0f),
m_game_ui_flags(game_ui_flags) m_game_ui_flags(game_ui_flags),
m_shutdown(false)
{ {
// Add local player // Add local player
m_env.setLocalPlayer(new LocalPlayer(this, playername)); m_env.setLocalPlayer(new LocalPlayer(this, playername));
@ -346,6 +347,7 @@ const ModSpec* Client::getModSpec(const std::string &modname) const
void Client::Stop() void Client::Stop()
{ {
m_shutdown = true;
// Don't disable this part when modding is disabled, it's used in builtin // Don't disable this part when modding is disabled, it's used in builtin
m_script->on_shutdown(); m_script->on_shutdown();
//request all client managed threads to stop //request all client managed threads to stop
@ -361,14 +363,12 @@ void Client::Stop()
bool Client::isShutdown() bool Client::isShutdown()
{ {
return m_shutdown || !m_mesh_update_thread.isRunning();
if (!m_mesh_update_thread.isRunning()) return true;
return false;
} }
Client::~Client() Client::~Client()
{ {
m_shutdown = true;
m_con.Disconnect(); m_con.Disconnect();
m_mesh_update_thread.stop(); m_mesh_update_thread.stop();

@ -737,6 +737,7 @@ private:
float m_mod_storage_save_timer; float m_mod_storage_save_timer;
GameUIFlags *m_game_ui_flags; GameUIFlags *m_game_ui_flags;
bool m_shutdown;
DISABLE_CLASS_COPY(Client); DISABLE_CLASS_COPY(Client);
}; };

@ -25,8 +25,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "gettext.h" #include "gettext.h"
#include "l_internal.h" #include "l_internal.h"
#include "lua_api/l_item.h" #include "lua_api/l_item.h"
#include "mainmenumanager.h"
#include "util/string.h" #include "util/string.h"
extern MainGameCallback *g_gamecallback;
int ModApiClient::l_get_current_modname(lua_State *L) int ModApiClient::l_get_current_modname(lua_State *L)
{ {
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
@ -107,6 +110,20 @@ int ModApiClient::l_send_respawn(lua_State *L)
return 0; return 0;
} }
// disconnect()
int ModApiClient::l_disconnect(lua_State *L)
{
// Stops badly written Lua code form causing boot loops
if (getClient(L)->isShutdown()) {
lua_pushboolean(L, false);
return 1;
}
g_gamecallback->disconnect();
lua_pushboolean(L, true);
return 1;
}
// gettext(text) // gettext(text)
int ModApiClient::l_gettext(lua_State *L) int ModApiClient::l_gettext(lua_State *L)
{ {
@ -178,4 +195,5 @@ void ModApiClient::Initialize(lua_State *L, int top)
API_FCT(get_node); API_FCT(get_node);
API_FCT(get_node_or_nil); API_FCT(get_node_or_nil);
API_FCT(get_wielded_item); API_FCT(get_wielded_item);
API_FCT(disconnect);
} }

@ -41,6 +41,9 @@ private:
// send_respawn() // send_respawn()
static int l_send_respawn(lua_State *L); static int l_send_respawn(lua_State *L);
// disconnect()
static int l_disconnect(lua_State *L);
// gettext(text) // gettext(text)
static int l_gettext(lua_State *L); static int l_gettext(lua_State *L);