Properly handle mod-errors in on_shutdown

This commit is contained in:
Desour 2020-08-23 19:44:25 +02:00 committed by celeron55
parent 3e5bce2251
commit f27cf47779
3 changed files with 23 additions and 4 deletions

@ -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