summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Server/Plugins/APIDump/APIDesc.lua10
-rw-r--r--src/Root.cpp20
-rw-r--r--src/Server.cpp1
-rw-r--r--src/Server.h3
4 files changed, 34 insertions, 0 deletions
diff --git a/Server/Plugins/APIDump/APIDesc.lua b/Server/Plugins/APIDump/APIDesc.lua
index f9fed612f..94082cd94 100644
--- a/Server/Plugins/APIDump/APIDesc.lua
+++ b/Server/Plugins/APIDump/APIDesc.lua
@@ -13061,6 +13061,16 @@ end
},
Notes = "Returns the server description set in the settings.ini.",
},
+ GetShutdownMessage =
+ {
+ Returns =
+ {
+ {
+ Type = "string",
+ },
+ },
+ Notes = "Returns the shutdown message set in the settings.ini.",
+ },
GetMaxPlayers =
{
Returns =
diff --git a/src/Root.cpp b/src/Root.cpp
index 3d3930975..8390cac7b 100644
--- a/src/Root.cpp
+++ b/src/Root.cpp
@@ -332,6 +332,26 @@ void cRoot::Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo)
void cRoot::StopServer()
{
+ // Kick all players from the server with custom disconnect message
+ class cPlayerCallback : public cPlayerListCallback
+ {
+ AString m_ShutdownMessage;
+ virtual bool Item(cPlayer * a_Player)
+ {
+ a_Player->GetClientHandlePtr()->Kick(m_ShutdownMessage);
+ m_HasSentDisconnect = true;
+ return false;
+ }
+ public:
+ bool m_HasSentDisconnect;
+ cPlayerCallback(AString a_ShutdownMessage) : m_ShutdownMessage(a_ShutdownMessage) { m_HasSentDisconnect = false; }
+ } PlayerCallback(m_Server->GetShutdownMessage());
+
+ cRoot::Get()->ForEachPlayer(PlayerCallback);
+ if (PlayerCallback.m_HasSentDisconnect)
+ {
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ }
m_TerminateEventRaised = true;
m_StopEvent.Set();
m_InputThreadRunFlag.clear();
diff --git a/src/Server.cpp b/src/Server.cpp
index ba469bd3e..95e0b535b 100644
--- a/src/Server.cpp
+++ b/src/Server.cpp
@@ -190,6 +190,7 @@ void cServer::PlayerDestroying(const cPlayer * a_Player)
bool cServer::InitServer(cSettingsRepositoryInterface & a_Settings, bool a_ShouldAuth)
{
m_Description = a_Settings.GetValueSet("Server", "Description", "Cuberite - in C++!");
+ m_ShutdownMessage = a_Settings.GetValueSet("Server", "ShutdownMessage", "Server shutdown");
m_MaxPlayers = a_Settings.GetValueSetI("Server", "MaxPlayers", 100);
m_bIsHardcore = a_Settings.GetValueSetB("Server", "HardcoreEnabled", false);
m_bAllowMultiLogin = a_Settings.GetValueSetB("Server", "AllowMultiLogin", false);
diff --git a/src/Server.h b/src/Server.h
index 600e7ca97..74f9581ae 100644
--- a/src/Server.h
+++ b/src/Server.h
@@ -64,6 +64,8 @@ public:
const AString & GetDescription(void) const {return m_Description; }
+ const AString & GetShutdownMessage(void) const { return m_ShutdownMessage; }
+
// Player counts:
int GetMaxPlayers(void) const { return m_MaxPlayers; }
int GetNumPlayers(void) const;
@@ -204,6 +206,7 @@ private:
cRCONServer m_RCONServer;
AString m_Description;
+ AString m_ShutdownMessage;
AString m_FaviconData;
int m_MaxPlayers;
bool m_bIsHardcore;