diff options
| author | treeston <treeston.mmoc@gmail.com> | 2016-03-03 20:57:03 +0100 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-04-08 23:38:49 +0200 | 
| commit | c23a6085c35f41240bde1eaf3e002a99fa6cdbcc (patch) | |
| tree | d832edb5beb3e85a095f675372d62118f6d73214 /src/server/game/Entities | |
| parent | 3d668ffa8af9c642e2a9461f15954b2332ec37eb (diff) | |
Core/AI: Fix an edge case crash with PlayerAI. Again. Sheesh.
(cherry picked from commit fe707db96f711f94a461306748274fa0bffa0226)
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 45 | 
1 files changed, 29 insertions, 16 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 439a3621d69..77d6687f77a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11832,28 +11832,41 @@ void Unit::UpdateCharmAI()              break;          case TYPEID_PLAYER:          { -            if (Unit* charmer = GetCharmer()) // if we are currently being charmed, then we should apply charm AI +            if (IsCharmed()) // if we are currently being charmed, then we should apply charm AI              { -                if (Creature* creatureCharmer = charmer->ToCreature()) // this should only ever happen for creature charmers -                { -                    i_disabledAI = i_AI; -                    // first, we check if the creature's own AI specifies an override playerai for its owned players -                    if (PlayerAI* charmAI = creatureCharmer->IsAIEnabled ? creatureCharmer->AI()->GetAIForCharmedPlayer(ToPlayer()) : nullptr) -                        i_AI = charmAI; -                    else // otherwise, we default to the generic one -                        i_AI = new SimpleCharmedPlayerAI(ToPlayer()); -                } -                else +                i_disabledAI = i_AI; + +                UnitAI* newAI = nullptr; +                // first, we check if the creature's own AI specifies an override playerai for its owned players +                if (Unit* charmer = GetCharmer())                  { -                    TC_LOG_ERROR("misc", "Attempt to assign charm AI to player %s who is charmed by non-creature %s.", GetGUID().ToString().c_str(), charmer->GetGUID().ToString().c_str()); +                    if (Creature* creatureCharmer = charmer->ToCreature()) +                    { +                        if (PlayerAI* charmAI = creatureCharmer->IsAIEnabled ? creatureCharmer->AI()->GetAIForCharmedPlayer(ToPlayer()) : nullptr) +                            newAI = charmAI; +                    } +                    else +                    { +                        TC_LOG_ERROR("misc", "Attempt to assign charm AI to player %s who is charmed by non-creature %s.", GetGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str()); +                    }                  } +                if (!newAI) // otherwise, we default to the generic one +                    newAI = new SimpleCharmedPlayerAI(ToPlayer()); +                i_AI = newAI;              }              else              { -                // we allow the charmed PlayerAI to clean up -                i_AI->OnCharmed(false); -                // then delete it -                delete i_AI; +                if (i_AI) +                { +                    // we allow the charmed PlayerAI to clean up +                    i_AI->OnCharmed(false); +                    // then delete it +                    delete i_AI; +                } +                else +                { +                    TC_LOG_ERROR("misc", "Attempt to remove charm AI from player %s who doesn't currently have charm AI.", GetGUID().ToString().c_str()); +                }                  // and restore our previous PlayerAI (if we had one)                  i_AI = i_disabledAI;                  i_disabledAI = nullptr;  | 
