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;