[CSM] Add function and chat command to disconnect from server. (#5487)
parent
813a9a36b2
commit
63ac62ec8a
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue