diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2019-07-21 01:49:58 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-12-17 00:23:33 +0100 |
| commit | c13d83796f7b2111c5dcf8546bdd84eccd232ae3 (patch) | |
| tree | 03c4220a955113e46b3aa2f9cc270574ba3a79c4 /src/server/game/Entities | |
| parent | f9fe00bf8c4c913bcfedd8df7d8e1001129962a0 (diff) | |
Core/AI: Finally move the "is creature engaged" flag to be a property of the creature AI, where it honestly always belonged. Fixes #17981 and #23602 for real this time.
(cherry picked from commit 0e7c66cb4c7ff7d44e232d0b50703a48605ffd24)
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 10 |
4 files changed, 14 insertions, 6 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d966adbdd66..007664ec134 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3397,6 +3397,13 @@ bool Creature::CanGiveExperience() const && !(GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL); } +bool Creature::IsEngaged() const +{ + if (CreatureAI const* ai = AI()) + return ai->IsEngaged(); + return false; +} + void Creature::AtEngage(Unit* target) { Unit::AtEngage(target); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 119408a2f2e..a13dff72238 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -367,6 +367,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool CanGiveExperience() const; + bool IsEngaged() const override; void AtEngage(Unit* target) override; void AtDisengage() override; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index cb059be8d7a..2b1dbfdf74e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -304,7 +304,7 @@ Unit::Unit(bool isWorldObject) : m_removedAurasCount(0), m_interruptMask(SpellAuraInterruptFlags::None), m_interruptMask2(SpellAuraInterruptFlags2::None), m_unitMovedByMe(nullptr), m_playerMovingMe(nullptr), m_charmer(nullptr), m_charmed(nullptr), i_motionMaster(new MotionMaster(this)), m_regenTimer(0), m_vehicle(nullptr), - m_vehicleKit(nullptr), m_unitTypeMask(UNIT_MASK_NONE), m_Diminishing(), m_isEngaged(false), m_combatManager(this), + m_vehicleKit(nullptr), m_unitTypeMask(UNIT_MASK_NONE), m_Diminishing(), m_combatManager(this), m_threatManager(this), m_aiLocked(false), _playHoverAnim(false), _aiAnimKitId(0), _movementAnimKitId(0), _meleeAnimKitId(0), _spellHistory(new SpellHistory(this)) { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index e42cce1e913..e88bcf953eb 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1099,10 +1099,10 @@ class TC_GAME_API Unit : public WorldObject /// ====================== THREAT & COMBAT ==================== bool CanHaveThreatList() const { return m_threatManager.CanHaveThreatList(); } - // This value can be different from IsInCombat: + // This value can be different from IsInCombat, for example: // - when a projectile spell is midair against a creature (combat on launch - threat+aggro on impact) // - when the creature has no targets left, but the AI has not yet ceased engaged logic - bool IsEngaged() const { return m_isEngaged; } + virtual bool IsEngaged() const { return IsInCombat(); } bool IsEngagedBy(Unit const* who) const { return CanHaveThreatList() ? IsThreatenedBy(who) : IsInCombatWith(who); } void EngageWithTarget(Unit* who); // Adds target to threat list if applicable, otherwise just sets combat state // Combat handling @@ -1938,11 +1938,12 @@ class TC_GAME_API Unit : public WorldObject virtual void ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData); virtual void SetInWater(bool inWater); + // notifiers virtual void AtEnterCombat(); virtual void AtExitCombat(); - virtual void AtEngage(Unit* /*target*/) { m_isEngaged = true; } - virtual void AtDisengage() { m_isEngaged = false; } + virtual void AtEngage(Unit* /*target*/) {} + virtual void AtDisengage() {} private: @@ -1971,7 +1972,6 @@ class TC_GAME_API Unit : public WorldObject Diminishing m_Diminishing; // Threat+combat management - bool m_isEngaged; friend class CombatManager; CombatManager m_combatManager; friend class ThreatManager; |
