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.cpp12
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();