forked from Mirrorlandia_minetest/minetest
Properly handle mod-errors in on_shutdown
This commit is contained in:
parent
3e5bce2251
commit
f27cf47779
@ -1300,7 +1300,8 @@ bool Game::createSingleplayerServer(const std::string &map_dir,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr, false);
|
server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr,
|
||||||
|
false, nullptr, error_message);
|
||||||
server->start();
|
server->start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -213,7 +213,8 @@ Server::Server(
|
|||||||
bool simple_singleplayer_mode,
|
bool simple_singleplayer_mode,
|
||||||
Address bind_addr,
|
Address bind_addr,
|
||||||
bool dedicated,
|
bool dedicated,
|
||||||
ChatInterface *iface
|
ChatInterface *iface,
|
||||||
|
std::string *on_shutdown_errmsg
|
||||||
):
|
):
|
||||||
m_bind_addr(bind_addr),
|
m_bind_addr(bind_addr),
|
||||||
m_path_world(path_world),
|
m_path_world(path_world),
|
||||||
@ -232,6 +233,7 @@ Server::Server(
|
|||||||
m_thread(new ServerThread(this)),
|
m_thread(new ServerThread(this)),
|
||||||
m_clients(m_con),
|
m_clients(m_con),
|
||||||
m_admin_chat(iface),
|
m_admin_chat(iface),
|
||||||
|
m_on_shutdown_errmsg(on_shutdown_errmsg),
|
||||||
m_modchannel_mgr(new ModChannelMgr())
|
m_modchannel_mgr(new ModChannelMgr())
|
||||||
{
|
{
|
||||||
if (m_path_world.empty())
|
if (m_path_world.empty())
|
||||||
@ -314,7 +316,18 @@ Server::~Server()
|
|||||||
|
|
||||||
// Execute script shutdown hooks
|
// Execute script shutdown hooks
|
||||||
infostream << "Executing shutdown hooks" << std::endl;
|
infostream << "Executing shutdown hooks" << std::endl;
|
||||||
m_script->on_shutdown();
|
try {
|
||||||
|
m_script->on_shutdown();
|
||||||
|
} catch (ModError &e) {
|
||||||
|
errorstream << "ModError: " << e.what() << std::endl;
|
||||||
|
if (m_on_shutdown_errmsg) {
|
||||||
|
if (m_on_shutdown_errmsg->empty()) {
|
||||||
|
*m_on_shutdown_errmsg = std::string("ModError: ") + e.what();
|
||||||
|
} else {
|
||||||
|
*m_on_shutdown_errmsg += std::string("\nModError: ") + e.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
infostream << "Server: Saving environment metadata" << std::endl;
|
infostream << "Server: Saving environment metadata" << std::endl;
|
||||||
m_env->saveMeta();
|
m_env->saveMeta();
|
||||||
|
@ -131,7 +131,8 @@ public:
|
|||||||
bool simple_singleplayer_mode,
|
bool simple_singleplayer_mode,
|
||||||
Address bind_addr,
|
Address bind_addr,
|
||||||
bool dedicated,
|
bool dedicated,
|
||||||
ChatInterface *iface = nullptr
|
ChatInterface *iface = nullptr,
|
||||||
|
std::string *on_shutdown_errmsg = nullptr
|
||||||
);
|
);
|
||||||
~Server();
|
~Server();
|
||||||
DISABLE_CLASS_COPY(Server);
|
DISABLE_CLASS_COPY(Server);
|
||||||
@ -596,6 +597,10 @@ private:
|
|||||||
ChatInterface *m_admin_chat;
|
ChatInterface *m_admin_chat;
|
||||||
std::string m_admin_nick;
|
std::string m_admin_nick;
|
||||||
|
|
||||||
|
// if a mod-error occurs in the on_shutdown callback, the error message will
|
||||||
|
// be written into this
|
||||||
|
std::string *const m_on_shutdown_errmsg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Map edit event queue. Automatically receives all map edits.
|
Map edit event queue. Automatically receives all map edits.
|
||||||
The constructor of this class registers us to receive them through
|
The constructor of this class registers us to receive them through
|
||||||
|
Loading…
Reference in New Issue
Block a user