From a8f7b0e2debf0118aabd69fd862da57dce2b8f8e Mon Sep 17 00:00:00 2001 From: reaperrr Date: Wed, 25 Jan 2017 18:46:35 +0100 Subject: [PATCH] Add TargetDamageWarhead Only deals damage to the actor that was targeted by the carrying projectile. Currently only supported by InstantHit projectile. --- OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 1 + .../Warheads/TargetDamageWarhead.cs | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 OpenRA.Mods.Common/Warheads/TargetDamageWarhead.cs diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 770fd27890..6cac6b07e1 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -574,6 +574,7 @@ + diff --git a/OpenRA.Mods.Common/Warheads/TargetDamageWarhead.cs b/OpenRA.Mods.Common/Warheads/TargetDamageWarhead.cs new file mode 100644 index 0000000000..751a261b31 --- /dev/null +++ b/OpenRA.Mods.Common/Warheads/TargetDamageWarhead.cs @@ -0,0 +1,62 @@ +#region Copyright & License Information +/* + * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Warheads +{ + public class TargetDamageWarhead : DamageWarhead + { + public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + { + // Damages a single actor, rather than a position. Only support by InstantHit for now. + // TODO: Add support for 'area of damage' + if (target.Type == TargetType.Actor) + DoImpact(target.Actor, firedBy, damageModifiers); + } + + public override void DoImpact(WPos pos, Actor firedBy, IEnumerable damageModifiers) + { + // For now this only displays debug overlay + // TODO: Add support for 'area of effect' / multiple targets + var world = firedBy.World; + var debugOverlayRange = new[] { WDist.Zero, new WDist(128) }; + + if (world.LocalPlayer != null) + { + var devMode = world.LocalPlayer.PlayerActor.TraitOrDefault(); + if (devMode != null && devMode.ShowCombatGeometry) + world.WorldActor.Trait().AddImpact(pos, debugOverlayRange, DebugOverlayColor); + } + } + + public override void DoImpact(Actor victim, Actor firedBy, IEnumerable damageModifiers) + { + if (!IsValidAgainst(victim, firedBy)) + return; + + var damage = Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(DamageVersus(victim))); + victim.InflictDamage(firedBy, new Damage(damage, DamageTypes)); + + var world = firedBy.World; + if (world.LocalPlayer != null) + { + var debugOverlayRange = new[] { WDist.Zero, new WDist(128) }; + var devMode = world.LocalPlayer.PlayerActor.TraitOrDefault(); + if (devMode != null && devMode.ShowCombatGeometry) + world.WorldActor.Trait().AddImpact(victim.CenterPosition, debugOverlayRange, DebugOverlayColor); + } + } + } +}