diff options
| author | treeston <treeston.mmoc@gmail.com> | 2017-07-09 02:07:29 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-08-18 18:53:13 +0200 |
| commit | 2dfafa69ebc422feba1aa01e0c4fab76366f552f (patch) | |
| tree | c5499048f5e797da591f365709d965cd8f2edd74 /src/server/game/Entities/Unit | |
| parent | befbfbb655731f0202b79586c98f2780ca507edf (diff) | |
Hi, I'm Treeston, and welcome to Combat PR Prep Refactors.
Today, we're moving UNIT_FLAG_IMMUNE_TO_PC and UNIT_FLAG_IMMUNE_TO_NPC to higher-level abstraction so combat manager can react to it.
New methods on Unit:
- void SetImmuneTo<All/PC/NPC>(apply, keepCombat = false);
- bool IsImmuneTo<All/PC/NPC>() const;
(cherry picked from commit 74af880217fc567c9949d7557408718af889402f)
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 7 |
2 files changed, 30 insertions, 5 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 59e4f28c592..0469b1ec66e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7987,6 +7987,24 @@ void Unit::SetInCombatWith(Unit* enemy) SetInCombatState(false, enemy); } +void Unit::SetImmuneToPC(bool apply, bool keepCombat) +{ + (void)keepCombat; + if (apply) + AddUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + else + RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); +} + +void Unit::SetImmuneToNPC(bool apply, bool keepCombat) +{ + (void)keepCombat; + if (apply) + AddUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); + else + RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); +} + void Unit::CombatStart(Unit* target, bool initialAggro) { if (initialAggro) @@ -8178,12 +8196,12 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo // check flags if (target->HasUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_TAXI_FLIGHT | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_UNK_16)) - || (!HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE) && target->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC)) - || (!target->HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE) && HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC))) + || (!HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE) && target->IsImmuneToNPC()) + || (!target->HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE) && IsImmuneToNPC())) return false; if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR8_ATTACK_IGNORE_IMMUNE_TO_PC_FLAG)) - && (HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE) && target->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC)) + && (HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE) && target->IsImmuneToPC()) // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly && GetEntry() != WORLD_TRIGGER) return false; @@ -8289,12 +8307,12 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co { if (HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE)) { - if (target->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC)) + if (target->IsImmuneToPC()) return false; } else { - if (target->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC)) + if (target->IsImmuneToNPC()) return false; } } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 571dcecbeeb..fb04300b841 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1274,6 +1274,13 @@ class TC_GAME_API Unit : public WorldObject bool IsThreatened() const { return CanHaveThreatList() && !GetThreatManager().IsThreatListEmpty(); } bool IsThreatenedBy(Unit const* who) const { return who && CanHaveThreatList() && GetThreatManager().IsThreatenedBy(who); } + void SetImmuneToAll(bool apply, bool keepCombat = false) { SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); } + bool IsImmuneToAll() const { return IsImmuneToPC() && IsImmuneToNPC(); } + void SetImmuneToPC(bool apply, bool keepCombat = false); + bool IsImmuneToPC() const { return HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); } + void SetImmuneToNPC(bool apply, bool keepCombat = false); + bool IsImmuneToNPC() const { return HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); } + bool IsInCombat() const { return HasUnitFlag(UNIT_FLAG_IN_COMBAT); } bool IsPetInCombat() const { return HasUnitFlag(UNIT_FLAG_PET_IN_COMBAT); } bool IsInCombatWith(Unit const* who) const; |
