From 86da1a19bb36edf3242dafac6e45e87434ddff73 Mon Sep 17 00:00:00 2001 From: xinef1 Date: Sat, 4 Feb 2017 22:37:16 +0100 Subject: 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. --- src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp | 3 ++- src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'src/server/game/AI/ScriptedAI') diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 369c92d4153..93f31a0f57a 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -150,7 +150,8 @@ void npc_escortAI::JustDied(Unit* /*killer*/) { for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next()) if (Player* member = groupRef->GetSource()) - member->FailQuest(m_pQuestForEscort->GetQuestId()); + if (member->IsInMap(player)) + member->FailQuest(m_pQuestForEscort->GetQuestId()); } else player->FailQuest(m_pQuestForEscort->GetQuestId()); diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index a2677b3bdf2..cf6c693fb7a 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -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(); -- cgit v1.2.3