]> git.lizzy.rs Git - minetest.git/commitdiff
Properly handle mod-errors in on_shutdown
authorDesour <vorunbekannt75@web.de>
Sun, 23 Aug 2020 17:44:25 +0000 (19:44 +0200)
committerceleron55 <celeron55@gmail.com>
Mon, 24 Aug 2020 16:55:25 +0000 (19:55 +0300)
src/client/game.cpp
src/server.cpp
src/server.h

index 0d3a0ca152e4241a69102f863bea764703f01bbf..920383aafd0075bcc140df19a0b443805fcdd32b 100644 (file)
@@ -1300,7 +1300,8 @@ bool Game::createSingleplayerServer(const std::string &map_dir,
                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();
 
        return true;
index ef36aedcaf58f820d3487686fff2917acae6ce6d..7b3978462673cc57c08070b001b1154a3817717f 100644 (file)
@@ -213,7 +213,8 @@ Server::Server(
                bool simple_singleplayer_mode,
                Address bind_addr,
                bool dedicated,
-               ChatInterface *iface
+               ChatInterface *iface,
+               std::string *on_shutdown_errmsg
        ):
        m_bind_addr(bind_addr),
        m_path_world(path_world),
@@ -232,6 +233,7 @@ Server::Server(
        m_thread(new ServerThread(this)),
        m_clients(m_con),
        m_admin_chat(iface),
+       m_on_shutdown_errmsg(on_shutdown_errmsg),
        m_modchannel_mgr(new ModChannelMgr())
 {
        if (m_path_world.empty())
@@ -314,7 +316,18 @@ Server::~Server()
 
                // Execute script shutdown hooks
                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;
                m_env->saveMeta();
index f44716531f2d3c6cf49576f6ee2f64ed8bc42ac7..be6f60abcdb97edf7b5b26b1867b88be247c802c 100644 (file)
@@ -131,7 +131,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
                bool simple_singleplayer_mode,
                Address bind_addr,
                bool dedicated,
-               ChatInterface *iface = nullptr
+               ChatInterface *iface = nullptr,
+               std::string *on_shutdown_errmsg = nullptr
        );
        ~Server();
        DISABLE_CLASS_COPY(Server);
@@ -596,6 +597,10 @@ class Server : public con::PeerHandler, public MapEventReceiver,
        ChatInterface *m_admin_chat;
        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.
                The constructor of this class registers us to receive them through