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.

(cherrypicked from 86da1a19bb)
This commit is contained in:
xinef1
2017-02-04 22:37:16 +01:00
committed by Shauren
parent 92e95ddf55
commit ad008c43b7
20 changed files with 173 additions and 124 deletions
@@ -152,7 +152,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());
@@ -230,7 +231,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;
@@ -338,8 +338,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();