Core/Misc: Fix various crashes, also related to multithreading (#19012)

* When iterating groups we have to either do it not in multithreaded context (map updates) or start with checking maps (they are guaranteed to change in single thread update).
* Properly clear ComboPoint references on player remove 
* remove some possible references item may have when it is deleted during save. 
* Also clear all hostile references when unit is removed from map.
This commit is contained in:
xinef1
2017-02-04 22:37:16 +01:00
committed by Shauren
parent 9e1b286984
commit 86da1a19bb
20 changed files with 175 additions and 126 deletions
@@ -148,7 +148,8 @@ void FollowerAI::JustDied(Unit* /*killer*/)
{
for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
if (Player* member = groupRef->GetSource())
member->FailQuest(m_pQuestForFollow->GetQuestId());
if (member->IsInMap(player))
member->FailQuest(m_pQuestForFollow->GetQuestId());
}
else
player->FailQuest(m_pQuestForFollow->GetQuestId());
@@ -226,7 +227,6 @@ void FollowerAI::UpdateAI(uint32 uiDiff)
for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
Player* member = groupRef->GetSource();
if (member && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE))
{
bIsMaxRangeExceeded = false;
@@ -333,8 +333,7 @@ Player* FollowerAI::GetLeaderForFollower()
for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
Player* member = groupRef->GetSource();
if (member && member->IsAlive() && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE))
if (member && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE) && member->IsAlive())
{
TC_LOG_DEBUG("scripts", "FollowerAI GetLeader changed and returned new leader.");
m_uiLeaderGUID = member->GetGUID();