From 0b38096d10740fb8af78b617c9d16fabc7373669 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 3 Mar 2022 13:26:46 -0500 Subject: [PATCH] Core/Units: add new functionality for units to block or enable combat interactions Port From (https://github.com/TrinityCore/TrinityCore/commit/2819951dce545438724719836e3a13d3039b8690) --- Source/Game/Combat/CombatManager.cs | 7 ++----- Source/Game/Entities/Creature/Creature.cs | 6 ++---- Source/Game/Entities/Unit/Unit.Combat.cs | 12 +++++++++++- Source/Game/Entities/Unit/Unit.Fields.cs | 1 + 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Source/Game/Combat/CombatManager.cs b/Source/Game/Combat/CombatManager.cs index b36bbc6d5..542f48f95 100644 --- a/Source/Game/Combat/CombatManager.cs +++ b/Source/Game/Combat/CombatManager.cs @@ -57,11 +57,8 @@ namespace Game.Combat return false; if (a.HasUnitState(UnitState.InFlight) || b.HasUnitState(UnitState.InFlight)) return false; - Creature aCreature = a.ToCreature(); - if (aCreature != null && aCreature.IsCombatDisallowed()) - return false; - Creature bCreature = b.ToCreature(); - if (bCreature != null && bCreature.IsCombatDisallowed()) + // ... both units must not be ignoring combat + if (a.IsIgnoringCombat() || b.IsIgnoringCombat()) return false; if (a.IsFriendlyTo(b) || b.IsFriendlyTo(a)) return false; diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 12c0a9462..738f75955 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -420,6 +420,8 @@ namespace Game.Entities ApplySpellImmune(0, SpellImmunity.Effect, SpellEffectName.AttackMe, true); } + SetIgnoringCombat(cInfo.FlagsExtra.HasFlag(CreatureFlagsExtra.NoCombat)); + LoadTemplateRoot(); InitializeMovementFlags(); @@ -3096,10 +3098,6 @@ namespace Game.Entities { return GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Guard); } - public bool IsCombatDisallowed() - { - return GetCreatureTemplate().FlagsExtra.HasFlag(CreatureFlagsExtra.NoCombat); - } public bool CanWalk() { return GetMovementTemplate().IsGroundAllowed(); } public override bool CanSwim() { return GetMovementTemplate().IsSwimAllowed() || IsPet();} diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index 2e502845d..7f89f85ec 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -1420,7 +1420,7 @@ namespace Game.Entities } public bool IsWithinMeleeRange(Unit obj) { return IsWithinMeleeRangeAt(GetPosition(), obj); } - + public bool IsWithinMeleeRangeAt(Position pos, Unit obj) { if (!obj || !IsInMap(obj) || !IsInPhase(obj)) @@ -1491,5 +1491,15 @@ namespace Game.Entities UpdateAttackTimeField(att); m_attackTimer[(int)att] = (uint)(m_baseAttackSpeed[(int)att] * m_modAttackSpeedPct[(int)att] * remainingTimePct); } + + /// + /// returns if the unit is ignoring any combat interaction + /// + public bool IsIgnoringCombat() { return _isIgnoringCombat; } + + /// + /// enables/disables combat interaction of this unit. + /// + public void SetIgnoringCombat(bool apply) { _isIgnoringCombat = apply; } } } diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 2966e38d9..2e057bab4 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -55,6 +55,7 @@ namespace Game.Entities uint[] m_baseAttackSpeed = new uint[(int)WeaponAttackType.Max]; internal float[] m_modAttackSpeedPct = new float[(int)WeaponAttackType.Max]; protected uint[] m_attackTimer = new uint[(int)WeaponAttackType.Max]; + bool _isIgnoringCombat; // Threat+combat management CombatManager m_combatManager;