summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/environment.cpp10
-rw-r--r--src/environment.h1
-rw-r--r--src/server.cpp8
3 files changed, 17 insertions, 2 deletions
diff --git a/src/environment.cpp b/src/environment.cpp
index 5affda6fa..cad1f298b 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -39,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapblock_mesh.h"
#include "event.h"
#endif
+#include "server.h"
#include "daynightratio.h"
#include "map.h"
#include "emerge.h"
@@ -425,6 +426,15 @@ bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16
return true;
}
+void ServerEnvironment::kickAllPlayers(const std::string &reason)
+{
+ for (std::vector<Player*>::iterator it = m_players.begin();
+ it != m_players.end();
+ ++it) {
+ ((Server*)m_gamedef)->DenyAccess_Legacy((*it)->peer_id, utf8_to_wide(reason));
+ }
+}
+
void ServerEnvironment::saveLoadedPlayers()
{
std::string players_path = m_path_world + DIR_DELIM "players";
diff --git a/src/environment.h b/src/environment.h
index b35ca4249..794f1971c 100644
--- a/src/environment.h
+++ b/src/environment.h
@@ -221,6 +221,7 @@ public:
float getSendRecommendedInterval()
{ return m_recommended_send_interval; }
+ void kickAllPlayers(const std::string &reason);
// Save players
void saveLoadedPlayers();
void savePlayer(const std::string &playername);
diff --git a/src/server.cpp b/src/server.cpp
index 9d70ad7b7..0cad82613 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -394,10 +394,13 @@ Server::~Server()
// Execute script shutdown hooks
m_script->on_shutdown();
- infostream<<"Server: Saving players"<<std::endl;
+ infostream << "Server: Saving players" << std::endl;
m_env->saveLoadedPlayers();
- infostream<<"Server: Saving environment metadata"<<std::endl;
+ infostream << "Server: kick players" << std::endl;
+ m_env->kickAllPlayers("Server shutting down...");
+
+ infostream << "Server: Saving environment metadata" << std::endl;
m_env->saveMeta();
}
@@ -499,6 +502,7 @@ void Server::step(float dtime)
throw ServerError(async_err);
}
else {
+ m_env->kickAllPlayers("The server has crashed. Disconnecting all players. Please reconnect soon...");
errorstream << "UNRECOVERABLE error occurred. Stopping server. "
<< "Please fix the following error:" << std::endl
<< async_err << std::endl;