From fbd7df7c3fb9048bb4ede4f411a08d81ce9f30a1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 18 Jun 2021 15:19:41 -0400 Subject: [PATCH] Some missed stuff. --- Source/Game/AI/CoreAI/CreatureAI.cs | 3 ++- Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs | 6 +++--- Source/Game/Combat/CombatManager.cs | 8 ++++---- Source/Game/Entities/Creature/Creature.cs | 10 ++++++---- Source/Game/Entities/GameObject/GameObject.cs | 2 +- Source/Game/Entities/Unit/Unit.Combat.cs | 10 +++++----- Source/Game/Entities/Unit/Unit.cs | 18 +++++++++++++++--- Source/Game/Spells/SpellEffects.cs | 2 +- Source/Scripts/Spells/Quest.cs | 4 ++-- Source/Scripts/World/ItemScripts.cs | 2 +- 10 files changed, 40 insertions(+), 25 deletions(-) diff --git a/Source/Game/AI/CoreAI/CreatureAI.cs b/Source/Game/AI/CoreAI/CreatureAI.cs index d11309d14..d0b058d83 100644 --- a/Source/Game/AI/CoreAI/CreatureAI.cs +++ b/Source/Game/AI/CoreAI/CreatureAI.cs @@ -336,7 +336,8 @@ namespace Game.AI if (point) { point.SetObjectScale(SharedConst.BoundaryVisualizeCreatureScale); - point.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.Stunned | UnitFlags.ImmuneToNpc); + point.AddUnitFlag(UnitFlags.Stunned); + point.SetImmuneToAll(true); if (!hasOutOfBoundsNeighbor) point.AddUnitFlag(UnitFlags.NotSelectable); } diff --git a/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs b/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs index d4750a636..7d2bb11dd 100644 --- a/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs +++ b/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs @@ -163,7 +163,7 @@ namespace Game.AI { me.GetMotionMaster().MoveTargetedHome(); if (_hasImmuneToNPCFlags) - me.AddUnitFlag(UnitFlags.ImmuneToNpc); + me.SetImmuneToNPC(true); Reset(); } } @@ -443,10 +443,10 @@ namespace Game.AI //disable npcflags me.SetNpcFlags(NPCFlags.None); me.SetNpcFlags2(NPCFlags2.None); - if (me.HasUnitFlag(UnitFlags.ImmuneToNpc)) + if (me.IsImmuneToNPC()) { _hasImmuneToNPCFlags = true; - me.RemoveUnitFlag(UnitFlags.ImmuneToNpc); + me.SetImmuneToNPC(false); } Log.outDebug(LogFilter.Scripts, $"EscortAI.Start: (script: {me.GetScriptName()}, creature entry: {me.GetEntry()}) started with {_path.nodes.Count} waypoints. ActiveAttacker = {_activeAttacker}, Run = {_running}, Player = {_playerGUID}"); diff --git a/Source/Game/Combat/CombatManager.cs b/Source/Game/Combat/CombatManager.cs index 13d5e7afa..9c1a20abd 100644 --- a/Source/Game/Combat/CombatManager.cs +++ b/Source/Game/Combat/CombatManager.cs @@ -167,8 +167,8 @@ namespace Game.Combat if (!IsInCombatWith(refe.Key)) { Unit target = refe.Value.GetOther(who); - if ((_owner.HasUnitFlag(UnitFlags.ImmuneToPc) && target.HasUnitFlag(UnitFlags.PvpAttackable)) || - (_owner.HasUnitFlag(UnitFlags.ImmuneToNpc) && !target.HasUnitFlag(UnitFlags.PvpAttackable))) + if ((_owner.IsImmuneToPC() && target.HasUnitFlag(UnitFlags.PvpAttackable)) || + (_owner.IsImmuneToNPC() && !target.HasUnitFlag(UnitFlags.PvpAttackable))) continue; SetInCombatWith(target); } @@ -178,8 +178,8 @@ namespace Game.Combat if (!IsInCombatWith(refe.Key)) { Unit target = refe.Value.GetOther(who); - if ((_owner.HasUnitFlag(UnitFlags.ImmuneToPc) && target.HasUnitFlag(UnitFlags.PvpAttackable)) || - (_owner.HasUnitFlag(UnitFlags.ImmuneToNpc) && !target.HasUnitFlag(UnitFlags.PvpAttackable))) + if ((_owner.IsImmuneToPC() && target.HasUnitFlag(UnitFlags.PvpAttackable)) || + (_owner.IsImmuneToNPC() && !target.HasUnitFlag(UnitFlags.PvpAttackable))) continue; SetInCombatWith(target); } diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 4a2d45ce4..6ea85ecb8 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -1718,9 +1718,7 @@ namespace Game.Entities return false; // This set of checks is should be done only for creatures - if ((HasUnitFlag(UnitFlags.ImmuneToNpc) && !who.IsTypeId(TypeId.Player)) // flag is valid only for non player characters - || (HasUnitFlag(UnitFlags.ImmuneToPc) && who.IsTypeId(TypeId.Player)) // immune to PC and target is a player, return false - || (who.GetOwner() && who.GetOwner().IsTypeId(TypeId.Player) && HasUnitFlag(UnitFlags.ImmuneToPc))) // player pets are immune to pc as well + if ((IsImmuneToNPC() && !who.HasUnitFlag(UnitFlags.PvpAttackable)) || (IsImmuneToPC() && who.HasUnitFlag(UnitFlags.PvpAttackable))) return false; // Do not attack non-combat pets @@ -2219,7 +2217,7 @@ namespace Game.Entities if (IsCivilian()) return false; - if (HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.ImmuneToPc)) + if (HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable) || IsImmuneToNPC()) return false; // skip fighting creature @@ -3115,6 +3113,10 @@ namespace Game.Entities return (reactState == state); } + public override void SetImmuneToAll(bool apply) { SetImmuneToAll(apply, HasReactState(ReactStates.Passive)); } + public override void SetImmuneToPC(bool apply) { SetImmuneToPC(apply, HasReactState(ReactStates.Passive)); } + public override void SetImmuneToNPC(bool apply) { SetImmuneToNPC(apply, HasReactState(ReactStates.Passive)); } + public bool IsInEvadeMode() { return HasUnitState(UnitState.Evade); } public bool IsEvadingAttacks() { return IsInEvadeMode() || CanNotReachTarget(); } diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index dc14de92b..2ca9e4ff5 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -2074,7 +2074,7 @@ namespace Game.Entities return; // remove immunity flags, to allow spell to target anything - trigger.RemoveUnitFlag(UnitFlags.ImmuneToNpc | UnitFlags.ImmuneToPc); + trigger.SetImmuneToAll(false); PhasingHandler.InheritPhaseShift(trigger, this); diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index eb2d9f417..6db6fe815 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -1660,12 +1660,12 @@ namespace Game.Entities // check flags if (target.HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.TaxiFlight | UnitFlags.NotAttackable1 | UnitFlags.Unk16) - || (!HasUnitFlag(UnitFlags.PvpAttackable) && target.HasUnitFlag(UnitFlags.ImmuneToNpc)) - || (!target.HasUnitFlag(UnitFlags.PvpAttackable) && HasUnitFlag(UnitFlags.ImmuneToNpc))) + || (!HasUnitFlag(UnitFlags.PvpAttackable) && target.IsImmuneToNPC()) + || (!target.HasUnitFlag(UnitFlags.PvpAttackable) && IsImmuneToNPC())) return false; if ((bySpell == null || !bySpell.HasAttribute(SpellAttr8.AttackIgnoreImmuneToPCFlag)) - && (HasUnitFlag(UnitFlags.PvpAttackable) && target.HasUnitFlag(UnitFlags.ImmuneToPc)) + && (HasUnitFlag(UnitFlags.PvpAttackable) && 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() != SharedConst.WorldTrigger) return false; @@ -1782,12 +1782,12 @@ namespace Game.Entities { if (HasUnitFlag(UnitFlags.PvpAttackable)) { - if (target.HasUnitFlag(UnitFlags.ImmuneToPc)) + if (target.IsImmuneToPC()) return false; } else { - if (target.HasUnitFlag(UnitFlags.ImmuneToNpc)) + if (target.IsImmuneToNPC()) return false; } } diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 2141393c7..5165bf15c 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -3115,7 +3115,9 @@ namespace Game.Entities return gain; } - void SetImmuneToAll(bool apply, bool keepCombat) + public bool IsImmuneToAll() { return IsImmuneToPC() && IsImmuneToNPC(); } + + public void SetImmuneToAll(bool apply, bool keepCombat) { if (apply) { @@ -3133,7 +3135,11 @@ namespace Game.Entities } } - void SetImmuneToPC(bool apply, bool keepCombat) + public virtual void SetImmuneToAll(bool apply) { SetImmuneToAll(apply, false); } + + public bool IsImmuneToPC() { return HasUnitFlag(UnitFlags.ImmuneToPc); } + + public void SetImmuneToPC(bool apply, bool keepCombat) { if (apply) { @@ -3163,7 +3169,11 @@ namespace Game.Entities } } - void SetImmuneToNPC(bool apply, bool keepCombat) + public virtual void SetImmuneToPC(bool apply) { SetImmuneToPC(apply, false); } + + public bool IsImmuneToNPC() { return HasUnitFlag(UnitFlags.ImmuneToNpc); } + + public void SetImmuneToNPC(bool apply, bool keepCombat) { if (apply) { @@ -3193,6 +3203,8 @@ namespace Game.Entities } } + public virtual void SetImmuneToNPC(bool apply) { SetImmuneToNPC(apply, false); } + public virtual float GetBlockPercent(uint attackerLevel) { return 30.0f; } void UpdateReactives(uint p_time) diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 1b8c6f1c5..9c8d356a7 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -1685,7 +1685,7 @@ namespace Game.Spells summon.SetNpcFlags((NPCFlags)((int)summon.GetCreatureTemplate().Npcflag & 0xFFFFFFFF)); summon.SetNpcFlags2((NPCFlags2)((int)summon.GetCreatureTemplate().Npcflag >> 32)); - summon.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); + summon.SetImmuneToAll(true); summon.GetAI().EnterEvadeMode(); break; diff --git a/Source/Scripts/Spells/Quest.cs b/Source/Scripts/Spells/Quest.cs index 0bfceebc4..f90841f39 100644 --- a/Source/Scripts/Spells/Quest.cs +++ b/Source/Scripts/Spells/Quest.cs @@ -434,13 +434,13 @@ namespace Scripts.Spells.Quest void HandleEffectApply(AuraEffect aurEff, AuraEffectHandleModes mode) { Unit target = GetTarget(); - target.AddUnitFlag(UnitFlags.ImmuneToPc); + target.SetImmuneToPC(true); target.AddUnitState(UnitState.Root); } void HandleEffectRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { - GetTarget().RemoveUnitFlag(UnitFlags.ImmuneToPc); + GetTarget().SetImmuneToPC(false); } public override void Register() diff --git a/Source/Scripts/World/ItemScripts.cs b/Source/Scripts/World/ItemScripts.cs index 2372534a0..830acf6b6 100644 --- a/Source/Scripts/World/ItemScripts.cs +++ b/Source/Scripts/World/ItemScripts.cs @@ -241,7 +241,7 @@ namespace Scripts.World.ItemScripts { summon.SetVisible(false); summon.SetReactState(ReactStates.Passive); - summon.AddUnitFlag(UnitFlags.ImmuneToPc); + summon.SetImmuneToPC(true); } return false; }