diff options
author | Treeston <treeston.mmoc@gmail.com> | 2016-05-05 11:56:25 +0200 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2016-05-05 11:56:25 +0200 |
commit | 35a66a33fc089b2fbafec3528ecc39d03b896f2c (patch) | |
tree | c96ef91c9dff75a47f6ef2395473bf34f0ec7ebc | |
parent | 769b7ff7fd2cb86f5b9978d15ea20c398273ec48 (diff) | |
parent | 26b084a90ff3e4f0601e72c283bd3296d4640585 (diff) |
Merge pull request #16020 from Treeston/3.3.5-CharmAiFix
CreatureAI: Adjust AI behavior when a charm ends
-rw-r--r-- | src/server/game/AI/CoreAI/PassiveAI.cpp | 6 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/PassiveAI.h | 2 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/PetAI.cpp | 6 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/PetAI.h | 2 | ||||
-rw-r--r-- | src/server/game/AI/CreatureAI.cpp | 10 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 3 |
7 files changed, 27 insertions, 6 deletions
diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index aafde3c1d9a..3ed2f927645 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -58,6 +58,12 @@ void PossessedAI::KilledUnit(Unit* victim) victim->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } +void PossessedAI::OnCharmed(bool /*apply*/) +{ + me->NeedChangeAI = true; + me->IsAIEnabled = false; +} + void CritterAI::DamageTaken(Unit* /*done_by*/, uint32&) { if (!me->HasUnitState(UNIT_STATE_FLEEING)) diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h index 5a6dba7046d..9ca9e75bd9f 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.h +++ b/src/server/game/AI/CoreAI/PassiveAI.h @@ -46,6 +46,8 @@ class TC_GAME_API PossessedAI : public CreatureAI void JustDied(Unit*) override; void KilledUnit(Unit* victim) override; + void OnCharmed(bool /*apply*/) override; + static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; } }; diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 68554722db6..2abe20f0ae6 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -588,6 +588,12 @@ void PetAI::ReceiveEmote(Player* player, uint32 emote) } } +void PetAI::OnCharmed(bool /*apply*/) +{ + me->NeedChangeAI = true; + me->IsAIEnabled = false; +} + void PetAI::ClearCharmInfoFlags() { // Quick access to set all flags to FALSE diff --git a/src/server/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h index 3ad34047b01..93ee6c41ece 100644 --- a/src/server/game/AI/CoreAI/PetAI.h +++ b/src/server/game/AI/CoreAI/PetAI.h @@ -49,6 +49,8 @@ class TC_GAME_API PetAI : public CreatureAI void MoveInLineOfSight_Safe(Unit* /*who*/) { } // CreatureAI interferes with returning pets void EnterEvadeMode(EvadeReason /*why*/) override { } // For fleeing, pets don't use this type of Evade mechanic + void OnCharmed(bool /*apply*/) override; + private: bool _isVisible(Unit*) const; bool _needToStop(void); diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 6ceb4f01c48..8e6540ed89c 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -29,11 +29,13 @@ #include "Language.h" //Disable CreatureAI when charmed -void CreatureAI::OnCharmed(bool /*apply*/) +void CreatureAI::OnCharmed(bool apply) { - //me->IsAIEnabled = !apply;*/ - me->NeedChangeAI = true; - me->IsAIEnabled = false; + if (apply) + { + me->NeedChangeAI = true; + me->IsAIEnabled = false; + } } AISpellInfoType* UnitAI::AISpellInfo; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 8e9bd7cdff7..2bf97086957 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -653,8 +653,8 @@ void SmartAI::OnCharmed(bool apply) { GetScript()->ProcessEventsFor(SMART_EVENT_CHARMED, NULL, 0, 0, apply); - if (!apply && !me->IsInEvadeMode() && me->GetCharmerGUID()) - if (Unit* charmer = ObjectAccessor::GetUnit(*me, me->GetCharmerGUID())) + if (!apply && !me->IsInEvadeMode()) + if (Unit* charmer = me->GetCharmer()) AttackStart(charmer); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d2d85dbfca6..1b60f5d730b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13712,6 +13712,9 @@ void Unit::UpdateCharmAI() delete i_AI; i_AI = i_disabledAI; i_disabledAI = nullptr; + + if (GetTypeId() == TYPEID_UNIT) + ToCreature()->AI()->OnCharmed(false); } } else |