Kick players when shutting down server and there is a crash due to a Lua stack exception

This commit is contained in:
nerzhul 2015-07-16 17:37:46 +02:00 committed by Loic Blot
parent 655fc6010f
commit f9dbec6edf
3 changed files with 17 additions and 2 deletions

View File

@ -39,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapblock_mesh.h" #include "mapblock_mesh.h"
#include "event.h" #include "event.h"
#endif #endif
#include "server.h"
#include "daynightratio.h" #include "daynightratio.h"
#include "map.h" #include "map.h"
#include "emerge.h" #include "emerge.h"
@ -425,6 +426,15 @@ bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16
return true; 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() void ServerEnvironment::saveLoadedPlayers()
{ {
std::string players_path = m_path_world + DIR_DELIM "players"; std::string players_path = m_path_world + DIR_DELIM "players";

View File

@ -221,6 +221,7 @@ public:
float getSendRecommendedInterval() float getSendRecommendedInterval()
{ return m_recommended_send_interval; } { return m_recommended_send_interval; }
void kickAllPlayers(const std::string &reason);
// Save players // Save players
void saveLoadedPlayers(); void saveLoadedPlayers();
void savePlayer(const std::string &playername); void savePlayer(const std::string &playername);

View File

@ -394,10 +394,13 @@ Server::~Server()
// Execute script shutdown hooks // Execute script shutdown hooks
m_script->on_shutdown(); m_script->on_shutdown();
infostream<<"Server: Saving players"<<std::endl; infostream << "Server: Saving players" << std::endl;
m_env->saveLoadedPlayers(); 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(); m_env->saveMeta();
} }
@ -499,6 +502,7 @@ void Server::step(float dtime)
throw ServerError(async_err); throw ServerError(async_err);
} }
else { else {
m_env->kickAllPlayers("The server has crashed. Disconnecting all players. Please reconnect soon...");
errorstream << "UNRECOVERABLE error occurred. Stopping server. " errorstream << "UNRECOVERABLE error occurred. Stopping server. "
<< "Please fix the following error:" << std::endl << "Please fix the following error:" << std::endl
<< async_err << std::endl; << async_err << std::endl;