diff --git a/src/Perpetuum/Units/Unit.cs b/src/Perpetuum/Units/Unit.cs index df34a09d3..b5e9635e8 100644 --- a/src/Perpetuum/Units/Unit.cs +++ b/src/Perpetuum/Units/Unit.cs @@ -387,6 +387,8 @@ protected virtual void OnRemovedFromZone(IZone zone) { } protected virtual void OnBeforeRemovedFromZone(IZone zone) { } + public bool CannotTakeDamage => _damageProcessor?.CannotTakeDamage ?? true; + public void TakeDamage(DamageInfo damageInfo) { _damageProcessor.TakeDamage(damageInfo); diff --git a/src/Perpetuum/Zones/DamageProcessors/DamageProcessor.cs b/src/Perpetuum/Zones/DamageProcessors/DamageProcessor.cs index 6e192bfb0..10147c7e0 100644 --- a/src/Perpetuum/Zones/DamageProcessors/DamageProcessor.cs +++ b/src/Perpetuum/Zones/DamageProcessors/DamageProcessor.cs @@ -44,9 +44,12 @@ public void OnRequipUnit() }); } + public bool CannotTakeDamage => + !unit.InZone || unit.IsAttackable != ErrorCodes.NoError || unit.States.Dead || unit.IsInvulnerable; + public void TakeDamage(DamageInfo damageInfo) { - if (!unit.InZone || unit.IsAttackable != ErrorCodes.NoError || unit.States.Dead || unit.IsInvulnerable) + if (CannotTakeDamage) { return; } @@ -84,7 +87,7 @@ private void ProcessFirstDamage(DamageInfo info) private void ProcessDamage(DamageInfo damageInfo) { - if (!unit.InZone || unit.IsAttackable != ErrorCodes.NoError || unit.States.Dead || unit.IsInvulnerable) + if (CannotTakeDamage) { return; } diff --git a/src/Perpetuum/Zones/ZoneExtensions.cs b/src/Perpetuum/Zones/ZoneExtensions.cs index aeb128b14..52a6b882b 100644 --- a/src/Perpetuum/Zones/ZoneExtensions.cs +++ b/src/Perpetuum/Zones/ZoneExtensions.cs @@ -240,6 +240,11 @@ public static void DoAoeDamage(this IZone zone, IBuilder damageBuild continue; } + if (unit.CannotTakeDamage) + { + continue; + } + LOSResult losResult = zone.IsInLineOfSight(damageInfo.attacker, unit, false); if (losResult.hit) {