aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
authortreeston <treeston.mmoc@gmail.com>2017-07-09 02:07:29 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-18 18:53:13 +0200
commit2dfafa69ebc422feba1aa01e0c4fab76366f552f (patch)
treec5499048f5e797da591f365709d965cd8f2edd74 /src/server/game/Entities/Unit
parentbefbfbb655731f0202b79586c98f2780ca507edf (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.cpp28
-rw-r--r--src/server/game/Entities/Unit/Unit.h7
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;