Kick players when shutting down server and there is a crash due to a Lua stack exception
This commit is contained in:
parent
655fc6010f
commit
f9dbec6edf
|
@ -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";
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue