mirror of
https://github.com/luanti-org/luanti.git
synced 2025-10-27 22:05:17 +01:00
Guard new object from being added at shutdown (#16610)
This commit is contained in:
@@ -278,8 +278,12 @@ void ServerEnvironment::init()
|
|||||||
|
|
||||||
void ServerEnvironment::deactivateBlocksAndObjects()
|
void ServerEnvironment::deactivateBlocksAndObjects()
|
||||||
{
|
{
|
||||||
|
// Prevent any funny business from happening in case further callbacks
|
||||||
|
// try to add new objects.
|
||||||
|
m_shutting_down = true;
|
||||||
|
|
||||||
// Clear active block list.
|
// Clear active block list.
|
||||||
// This makes the next one delete all active objects.
|
// This makes the next code delete all active objects.
|
||||||
m_active_blocks.clear();
|
m_active_blocks.clear();
|
||||||
|
|
||||||
deactivateFarObjects(true);
|
deactivateFarObjects(true);
|
||||||
@@ -287,6 +291,7 @@ void ServerEnvironment::deactivateBlocksAndObjects()
|
|||||||
|
|
||||||
ServerEnvironment::~ServerEnvironment()
|
ServerEnvironment::~ServerEnvironment()
|
||||||
{
|
{
|
||||||
|
m_script = nullptr;
|
||||||
assert(m_active_blocks.size() == 0); // deactivateBlocksAndObjects does this
|
assert(m_active_blocks.size() == 0); // deactivateBlocksAndObjects does this
|
||||||
|
|
||||||
// Drop/delete map
|
// Drop/delete map
|
||||||
@@ -301,9 +306,12 @@ ServerEnvironment::~ServerEnvironment()
|
|||||||
for (RemotePlayer *m_player : m_players) {
|
for (RemotePlayer *m_player : m_players) {
|
||||||
delete m_player;
|
delete m_player;
|
||||||
}
|
}
|
||||||
|
m_players.clear();
|
||||||
|
|
||||||
delete m_player_database;
|
delete m_player_database;
|
||||||
|
m_player_database = nullptr;
|
||||||
delete m_auth_database;
|
delete m_auth_database;
|
||||||
|
m_auth_database = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map & ServerEnvironment::getMap()
|
Map & ServerEnvironment::getMap()
|
||||||
@@ -1208,6 +1216,11 @@ void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object)
|
|||||||
u16 ServerEnvironment::addActiveObject(std::unique_ptr<ServerActiveObject> object)
|
u16 ServerEnvironment::addActiveObject(std::unique_ptr<ServerActiveObject> object)
|
||||||
{
|
{
|
||||||
assert(object); // Pre-condition
|
assert(object); // Pre-condition
|
||||||
|
if (m_shutting_down) {
|
||||||
|
warningstream << "ServerEnvironment: refusing to add active object "
|
||||||
|
"during shutdown: " << object->getDescription() << std::endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
m_added_objects++;
|
m_added_objects++;
|
||||||
u16 id = addActiveObjectRaw(std::move(object), nullptr, 0);
|
u16 id = addActiveObjectRaw(std::move(object), nullptr, 0);
|
||||||
return id;
|
return id;
|
||||||
@@ -1569,7 +1582,7 @@ std::unique_ptr<ServerActiveObject> ServerEnvironment::createSAO(ActiveObjectTyp
|
|||||||
*/
|
*/
|
||||||
void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
|
void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
|
||||||
{
|
{
|
||||||
if (block == NULL)
|
if (!block || m_shutting_down)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!block->onObjectsActivation())
|
if (!block->onObjectsActivation())
|
||||||
|
|||||||
@@ -357,9 +357,9 @@ private:
|
|||||||
// The map
|
// The map
|
||||||
std::unique_ptr<ServerMap> m_map;
|
std::unique_ptr<ServerMap> m_map;
|
||||||
// Lua state
|
// Lua state
|
||||||
ServerScripting* m_script;
|
ServerScripting *m_script = nullptr;
|
||||||
// Server definition
|
// Server definition
|
||||||
Server *m_server;
|
Server *m_server = nullptr;
|
||||||
// Active Object Manager
|
// Active Object Manager
|
||||||
server::ActiveObjectMgr m_ao_manager;
|
server::ActiveObjectMgr m_ao_manager;
|
||||||
// on_mapblocks_changed map event receiver
|
// on_mapblocks_changed map event receiver
|
||||||
@@ -378,6 +378,8 @@ private:
|
|||||||
IntervalLimiter m_active_blocks_nodemetadata_interval;
|
IntervalLimiter m_active_blocks_nodemetadata_interval;
|
||||||
// Whether the variables below have been read from file yet
|
// Whether the variables below have been read from file yet
|
||||||
bool m_meta_loaded = false;
|
bool m_meta_loaded = false;
|
||||||
|
// Are we shutting down?
|
||||||
|
bool m_shutting_down = false;
|
||||||
// Time from the beginning of the game in seconds.
|
// Time from the beginning of the game in seconds.
|
||||||
// Incremented in step().
|
// Incremented in step().
|
||||||
u32 m_game_time = 0;
|
u32 m_game_time = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user