aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index b52d9377e1a..27d784a8110 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -886,10 +886,15 @@ void Map::RemovePlayerFromMap(Player* player, bool remove)
{
sScriptMgr->OnPlayerLeaveMap(this, player);
+ player->getHostileRefManager().deleteReferences(); // multithreading crashfix
+
+ bool const inWorld = player->IsInWorld();
player->RemoveFromWorld();
SendRemoveTransports(player);
- player->UpdateObjectVisibility(true);
+ if (!inWorld) // if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
+ player->DestroyForNearbyPlayers(); // previous player->UpdateObjectVisibility(true)
+
if (player->IsInGrid())
player->RemoveFromGrid();
else
@@ -902,11 +907,15 @@ void Map::RemovePlayerFromMap(Player* player, bool remove)
template<class T>
void Map::RemoveFromMap(T *obj, bool remove)
{
+ bool const inWorld = obj->IsInWorld() && obj->GetTypeId() >= TYPEID_UNIT && obj->GetTypeId() <= TYPEID_GAMEOBJECT;
obj->RemoveFromWorld();
+
if (obj->isActiveObject())
RemoveFromActive(obj);
- obj->UpdateObjectVisibility(true);
+ if (!inWorld) // if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
+ obj->DestroyForNearbyPlayers(); // previous obj->UpdateObjectVisibility(true)
+
obj->RemoveFromGrid();
obj->ResetMap();