diff options
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 4004d7c03ed..a58f36b8e07 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -959,10 +959,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 @@ -975,11 +980,14 @@ 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(); |