diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Transport/Transport.cpp | 7 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectAccessor.cpp | 14 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectAccessor.h | 5 | ||||
-rwxr-xr-x | src/server/game/Maps/MapManager.cpp | 26 | ||||
-rwxr-xr-x | src/server/worldserver/Main.cpp | 4 | ||||
-rwxr-xr-x | src/server/worldserver/Master.cpp | 10 | ||||
-rwxr-xr-x | src/server/worldserver/WorldThread/WorldRunnable.cpp | 2 |
7 files changed, 36 insertions, 32 deletions
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 2687f1ea233..7381f059940 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -180,8 +180,11 @@ Transport::Transport(uint32 period, uint32 script) : GameObject(), m_period(peri Transport::~Transport() { - for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();) - (*(itr++))->ForcedDespawn(); + for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr) + { + (*itr)->SetTransport(NULL); + GetMap()->AddObjectToRemoveList(*itr); + } m_NPCPassengerSet.clear(); diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index af04b6c7f65..2405d6c2b40 100755 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -45,11 +45,6 @@ ObjectAccessor::ObjectAccessor() ObjectAccessor::~ObjectAccessor() { - for (Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr) - { - itr->second->RemoveFromWorld(); - delete itr->second; - } } WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, uint64 guid) @@ -385,6 +380,15 @@ void ObjectAccessor::Update(uint32 /*diff*/) } } +void ObjectAccessor::UnloadAll() +{ + for (Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr) + { + itr->second->RemoveFromWorld(); + delete itr->second; + } +} + /// Define the static members of HashMapHolder template <class T> UNORDERED_MAP< uint64, T* > HashMapHolder<T>::m_objectMap; diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index b8087a84f1e..c8be042ef8d 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -40,6 +40,7 @@ class DynamicObject; class WorldObject; class Vehicle; class Map; +class WorldRunnable; template <class T> class HashMapHolder @@ -84,6 +85,7 @@ class HashMapHolder class ObjectAccessor { friend class ACE_Singleton<ObjectAccessor, ACE_Thread_Mutex>; + friend class WorldRunnable; ObjectAccessor(); ~ObjectAccessor(); ObjectAccessor(const ObjectAccessor&); @@ -254,6 +256,9 @@ class ObjectAccessor typedef ACE_Thread_Mutex LockType; + protected: + void UnloadAll(); + private: Player2CorpsesMapType i_player2corpse; diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index d829c8e30d3..7b6d0a64460 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -45,16 +45,6 @@ MapManager::MapManager() MapManager::~MapManager() { - for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - delete iter->second; - - for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) - { - (*i)->RemoveFromWorld(); - delete *i; - } - - Map::DeleteStateMachine(); } void MapManager::Initialize() @@ -305,17 +295,23 @@ bool MapManager::IsValidMAP(uint32 mapid) void MapManager::UnloadAll() { - for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - iter->second->UnloadAll(); + for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) + { + (*i)->RemoveFromWorld(); + delete *i; + } - while (!i_maps.empty()) + for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();) { - delete i_maps.begin()->second; - i_maps.erase(i_maps.begin()); + iter->second->UnloadAll(); + delete iter->second; + i_maps.erase(iter++); } if (m_updater.activated()) m_updater.deactivate(); + + Map::DeleteStateMachine(); } void MapManager::InitMaxInstanceId() diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index bc861e6b039..10b7e00aa99 100755 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -72,8 +72,6 @@ void usage(const char *prog) /// Launch the Trinity server extern int main(int argc, char **argv) { - ACE::init(); - ///- Command line parsing to get the configuration file name char const* cfg_file = _TRINITY_CORE_CONFIG; int c=1; @@ -151,8 +149,6 @@ extern int main(int argc, char **argv) // 1 - shutdown at error // 2 - restart command used, this code can be used by restarter for restart Trinityd - ACE::fini(); - return ret; } diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index 7dd4c1fa930..b4d9fa7eb7c 100755 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -174,7 +174,7 @@ int Master::Run() CoredSignalHandler SignalBREAK; #endif /* _WIN32 */ - // Register realmd's signal handlers + // Register core's signal handlers ACE_Sig_Handler Handler; Handler.register_handler(SIGINT, &SignalINT); Handler.register_handler(SIGTERM, &SignalTERM); @@ -290,7 +290,7 @@ int Master::Run() } // set server offline - LoginDatabase.PExecute("UPDATE realmlist SET color = color | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET color = color | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); // when the main thread closes the singletons get unloaded // since worldrunnable uses them, it will crash if unloaded after master @@ -484,12 +484,12 @@ void Master::clearOnlineAccounts() { // Cleanup online status for characters hosted at current realm /// \todo Only accounts with characters logged on *this* realm should have online status reset. Move the online column from 'account' to 'realmcharacters'? - LoginDatabase.PExecute( + LoginDatabase.DirectPExecute( "UPDATE account SET online = 0 WHERE online > 0 " "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')",realmID); - CharacterDatabase.Execute("UPDATE characters SET online = 0 WHERE online<>0"); + CharacterDatabase.DirectExecute("UPDATE characters SET online = 0 WHERE online<>0"); // Battleground instance ids reset at server restart - CharacterDatabase.Execute("UPDATE character_battleground_data SET instance_id = 0"); + CharacterDatabase.DirectExecute("UPDATE character_battleground_data SET instance_id = 0"); } diff --git a/src/server/worldserver/WorldThread/WorldRunnable.cpp b/src/server/worldserver/WorldThread/WorldRunnable.cpp index df07a4e3bf0..acf71223791 100755 --- a/src/server/worldserver/WorldThread/WorldRunnable.cpp +++ b/src/server/worldserver/WorldThread/WorldRunnable.cpp @@ -90,6 +90,6 @@ void WorldRunnable::run() sWorldSocketMgr->StopNetwork(); + sObjectAccessor->UnloadAll(); // unload 'i_player2corpse' storage and remove from world sMapMgr->UnloadAll(); // unload all grids (including locked in memory) - } |