diff --git a/src/server/game/Combat/HostileRefMgr.cpp b/src/server/game/Combat/HostileRefMgr.cpp index 957bbce19..7bac65780 100644 --- a/src/server/game/Combat/HostileRefMgr.cpp +++ b/src/server/game/Combat/HostileRefMgr.cpp @@ -4,6 +4,7 @@ * Copyright (C) 2005-2009 MaNGOS */ +#include "CreatureAI.h" #include "HostileRefMgr.h" #include "SpellInfo.h" #include "SpellMgr.h" @@ -99,13 +100,28 @@ void HostileRefMgr::updateThreatTables() // The references are not needed anymore // tell the source to remove them from the list and free the mem -void HostileRefMgr::deleteReferences() +void HostileRefMgr::deleteReferences(bool removeFromMap /*= false*/) { HostileReference* ref = getFirst(); while (ref) { HostileReference* nextRef = ref->next(); ref->removeReference(); + + if (removeFromMap) + { + if (ThreatMgr const* threatMgr = ref->GetSource()) + { + if (threatMgr->areThreatListsEmpty()) + { + if (Creature* creature = threatMgr->GetOwner()->ToCreature()) + { + creature->AI()->EnterEvadeMode(); + } + } + } + } + delete ref; ref = nextRef; } diff --git a/src/server/game/Combat/HostileRefMgr.h b/src/server/game/Combat/HostileRefMgr.h index 784ee916f..29c02c1f9 100644 --- a/src/server/game/Combat/HostileRefMgr.h +++ b/src/server/game/Combat/HostileRefMgr.h @@ -38,7 +38,7 @@ public: // The references are not needed anymore // tell the source to remove them from the list and free the mem - void deleteReferences(); + void deleteReferences(bool removeFromMap = false); // Remove specific faction references void deleteReferencesForFaction(uint32 faction); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1175c118d..29d038163 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14769,7 +14769,7 @@ void Unit::CleanupBeforeRemoveFromMap(bool finalCleanup) CombatStop(); ClearComboPointHolders(); DeleteThreatList(); - getHostileRefMgr().deleteReferences(); + getHostileRefMgr().deleteReferences(true); GetMotionMaster()->Clear(false); // remove different non-standard movement generators. } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index d968e4ef0..d459a57a8 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -116,7 +116,7 @@ void WorldSession::HandleMoveWorldportAck() } if (!_player->getHostileRefMgr().isEmpty()) - _player->getHostileRefMgr().deleteReferences(); // pussywizard: multithreading crashfix + _player->getHostileRefMgr().deleteReferences(true); // pussywizard: multithreading crashfix CellCoord pair(Acore::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY())); Cell cell(pair); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 71e6b426b..fef31d998 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -882,7 +882,7 @@ struct ResetNotifier void Map::RemovePlayerFromMap(Player* player, bool remove) { - player->getHostileRefMgr().deleteReferences(); // pussywizard: multithreading crashfix + player->getHostileRefMgr().deleteReferences(true); // pussywizard: multithreading crashfix bool inWorld = player->IsInWorld(); player->RemoveFromWorld(); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 3b60e1078..416c354a1 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -524,7 +524,7 @@ void WorldSession::LogoutPlayer(bool save) //FIXME: logout must be delayed in case lost connection with client in time of combat if (_player->GetDeathTimer()) { - _player->getHostileRefMgr().deleteReferences(); + _player->getHostileRefMgr().deleteReferences(true); _player->BuildPlayerRepop(); _player->RepopAtGraveyard(); }