From 2dfafa69ebc422feba1aa01e0c4fab76366f552f Mon Sep 17 00:00:00 2001 From: treeston Date: Sun, 9 Jul 2017 02:07:29 +0200 Subject: 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(apply, keepCombat = false); - bool IsImmuneTo() const; (cherry picked from commit 74af880217fc567c9949d7557408718af889402f) --- src/server/game/Entities/Creature/Creature.cpp | 7 +++--- src/server/game/Entities/GameObject/GameObject.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 28 ++++++++++++++++++---- src/server/game/Entities/Unit/Unit.h | 7 ++++++ 4 files changed, 34 insertions(+), 10 deletions(-) (limited to 'src/server/game/Entities') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 589a9e969ff..3bf69feecca 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1790,9 +1790,8 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const return false; // This set of checks is should be done only for creatures - if ((HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC) && who->GetTypeId() != TYPEID_PLAYER) // flag is valid only for non player characters - || (HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC) && who->GetTypeId() == TYPEID_PLAYER) // immune to PC and target is a player, return false - || (who->GetOwner() && who->GetOwner()->GetTypeId() == TYPEID_PLAYER && HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC))) // player pets are immune to pc as well + if ((IsImmuneToNPC() && !who->HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE)) + || (IsImmuneToPC() && who->HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE))) return false; // Do not attack non-combat pets @@ -2364,7 +2363,7 @@ bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction / if (IsCivilian()) return false; - if (HasUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC))) + if (HasUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE)) || IsImmuneToNPC()) return false; // skip fighting creature diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index dba1023849f..cccf3a8bf29 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2101,7 +2101,7 @@ void GameObject::CastSpell(Unit* target, uint32 spellId, TriggerCastFlags trigge return; // remove immunity flags, to allow spell to target anything - trigger->RemoveUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC)); + trigger->SetImmuneToAll(false); if (Unit* owner = GetOwner()) { 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; -- cgit v1.2.3