From 6220d7e62e5e58c929b0dd3d94bd122979603af1 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sun, 12 May 2019 23:29:35 +0200 Subject: [PATCH] Introduce WarheadArgs - Passes additional arguments to warheads on impact - Uses that to reduce parameter count of DoImpact by 1 --- OpenRA.Game/Effects/DelayedImpact.cs | 12 +++--- OpenRA.Game/GameRules/WeaponInfo.cs | 43 +++++++++++++++++-- OpenRA.Game/Traits/TraitsInterfaces.cs | 3 +- OpenRA.Mods.Cnc/Projectiles/IonCannon.cs | 11 ++++- OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs | 2 +- OpenRA.Mods.Cnc/Traits/EnergyWall.cs | 2 +- OpenRA.Mods.Cnc/Traits/MadTank.cs | 4 +- .../Activities/Air/FallToEarth.cs | 2 +- OpenRA.Mods.Common/Projectiles/AreaBeam.cs | 9 +++- OpenRA.Mods.Common/Projectiles/Bullet.cs | 2 +- OpenRA.Mods.Common/Projectiles/GravityBomb.cs | 3 +- OpenRA.Mods.Common/Projectiles/InstantHit.cs | 2 +- OpenRA.Mods.Common/Projectiles/LaserZap.cs | 2 +- OpenRA.Mods.Common/Projectiles/Missile.cs | 2 +- OpenRA.Mods.Common/Projectiles/NukeLaunch.cs | 12 +++++- OpenRA.Mods.Common/Projectiles/Railgun.cs | 4 +- OpenRA.Mods.Common/Traits/Buildings/Bridge.cs | 2 +- .../Traits/Buildings/GroundLevelBridge.cs | 2 +- .../Traits/Crates/ExplodeCrateAction.cs | 2 +- OpenRA.Mods.Common/Traits/Explodes.cs | 4 +- .../Traits/ExplosionOnDamageTransition.cs | 2 +- .../Warheads/ChangeOwnerWarhead.cs | 4 +- .../Warheads/CreateEffectWarhead.cs | 4 +- .../Warheads/CreateResourceWarhead.cs | 4 +- OpenRA.Mods.Common/Warheads/DamageWarhead.cs | 9 ++-- .../Warheads/DestroyResourceWarhead.cs | 4 +- .../Warheads/FireClusterWarhead.cs | 4 +- .../Warheads/GrantExternalConditionWarhead.cs | 4 +- .../Warheads/LeaveSmudgeWarhead.cs | 4 +- OpenRA.Mods.Common/Warheads/Warhead.cs | 3 +- .../Warheads/DamagesConcreteWarhead.cs | 4 +- 31 files changed, 127 insertions(+), 44 deletions(-) diff --git a/OpenRA.Game/Effects/DelayedImpact.cs b/OpenRA.Game/Effects/DelayedImpact.cs index 5e54de8a4a..ab77dc3095 100644 --- a/OpenRA.Game/Effects/DelayedImpact.cs +++ b/OpenRA.Game/Effects/DelayedImpact.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Traits; @@ -18,26 +19,23 @@ namespace OpenRA.Effects public class DelayedImpact : IEffect { readonly Target target; - readonly Actor firedBy; - readonly IEnumerable damageModifiers; readonly IWarhead wh; + readonly WarheadArgs args; int delay; - public DelayedImpact(int delay, IWarhead wh, Target target, Actor firedBy, IEnumerable damageModifiers) + public DelayedImpact(int delay, IWarhead wh, Target target, WarheadArgs args) { this.wh = wh; this.delay = delay; - this.target = target; - this.firedBy = firedBy; - this.damageModifiers = damageModifiers; + this.args = args; } public void Tick(World world) { if (--delay <= 0) - world.AddFrameEndTask(w => { w.Remove(this); wh.DoImpact(target, firedBy, damageModifiers); }); + world.AddFrameEndTask(w => { w.Remove(this); wh.DoImpact(target, args); }); } public IEnumerable Render(WorldRenderer wr) { yield break; } diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index c547ebc879..e3f013ecad 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -33,6 +33,27 @@ namespace OpenRA.GameRules public Target GuidedTarget; } + public class WarheadArgs + { + public WeaponInfo Weapon; + public int[] DamageModifiers = { }; + public WPos Source; + public Actor SourceActor; + public Target WeaponTarget; + + public WarheadArgs(ProjectileArgs args) + { + Weapon = args.Weapon; + DamageModifiers = args.DamageModifiers; + Source = args.Source; + SourceActor = args.SourceActor; + WeaponTarget = args.GuidedTarget; + } + + // Default empty constructor for callers that want to initialize fields themselves + public WarheadArgs() { } + } + public interface IProjectile : IEffect { } public interface IProjectileInfo { IProjectile Create(ProjectileArgs args); } @@ -177,17 +198,33 @@ namespace OpenRA.GameRules } /// Applies all the weapon's warheads to the target. - public void Impact(Target target, Actor firedBy, IEnumerable damageModifiers) + public void Impact(Target target, WarheadArgs args) { + var world = args.SourceActor.World; foreach (var warhead in Warheads) { var wh = warhead; // force the closure to bind to the current warhead if (wh.Delay > 0) - firedBy.World.AddFrameEndTask(w => w.Add(new DelayedImpact(wh.Delay, wh, target, firedBy, damageModifiers))); + world.AddFrameEndTask(w => w.Add(new DelayedImpact(wh.Delay, wh, target, args))); else - wh.DoImpact(target, firedBy, damageModifiers); + wh.DoImpact(target, args); } } + + /// Applies all the weapon's warheads to the target. Only use for projectile-less, special-case impacts. + public void Impact(Target target, Actor firedBy) + { + // The impact will happen immediately at target.CenterPosition. + var args = new WarheadArgs + { + Weapon = this, + Source = firedBy.CenterPosition, + SourceActor = firedBy, + WeaponTarget = target + }; + + Impact(target, args); + } } } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 4e9cb9323b..b5a099378d 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -14,6 +14,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using OpenRA.Activities; using OpenRA.FileSystem; +using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Network; using OpenRA.Primitives; @@ -490,7 +491,7 @@ namespace OpenRA.Traits int Delay { get; } bool IsValidAgainst(Actor victim, Actor firedBy); bool IsValidAgainst(FrozenActor victim, Actor firedBy); - void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers); + void DoImpact(Target target, WarheadArgs args); } public interface IRulesetLoaded { void RulesetLoaded(Ruleset rules, TInfo info); } diff --git a/OpenRA.Mods.Cnc/Projectiles/IonCannon.cs b/OpenRA.Mods.Cnc/Projectiles/IonCannon.cs index c42ffa4bc0..5be0b1ab33 100644 --- a/OpenRA.Mods.Cnc/Projectiles/IonCannon.cs +++ b/OpenRA.Mods.Cnc/Projectiles/IonCannon.cs @@ -45,9 +45,18 @@ namespace OpenRA.Mods.Cnc.Effects public void Tick(World world) { anim.Tick(); + if (!impacted && weaponDelay-- <= 0) { - weapon.Impact(target, firedBy.PlayerActor, Enumerable.Empty()); + var warheadArgs = new WarheadArgs + { + Weapon = weapon, + Source = target.CenterPosition, + SourceActor = firedBy.PlayerActor, + WeaponTarget = target + }; + + weapon.Impact(target, warheadArgs); impacted = true; } } diff --git a/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs b/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs index bff63579ad..c15e5ac269 100644 --- a/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs +++ b/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs @@ -72,7 +72,7 @@ namespace OpenRA.Mods.Cnc.Projectiles target = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source); if (damageDuration-- > 0) - args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(target), new WarheadArgs(args)); } public IEnumerable Render(WorldRenderer wr) diff --git a/OpenRA.Mods.Cnc/Traits/EnergyWall.cs b/OpenRA.Mods.Cnc/Traits/EnergyWall.cs index 33b082a16f..6713a837cc 100644 --- a/OpenRA.Mods.Cnc/Traits/EnergyWall.cs +++ b/OpenRA.Mods.Cnc/Traits/EnergyWall.cs @@ -90,7 +90,7 @@ namespace OpenRA.Mods.Cnc.Traits { var blockers = self.World.ActorMap.GetActorsAt(loc).Where(a => !a.IsDead && a != self); foreach (var blocker in blockers) - info.WeaponInfo.Impact(Target.FromActor(blocker), self, Enumerable.Empty()); + info.WeaponInfo.Impact(Target.FromActor(blocker), self); } } diff --git a/OpenRA.Mods.Cnc/Traits/MadTank.cs b/OpenRA.Mods.Cnc/Traits/MadTank.cs index 53c1d7ec66..f408e61c2e 100644 --- a/OpenRA.Mods.Cnc/Traits/MadTank.cs +++ b/OpenRA.Mods.Cnc/Traits/MadTank.cs @@ -217,7 +217,7 @@ namespace OpenRA.Mods.Cnc.Traits if (mad.info.ThumpDamageWeapon != null) { // Use .FromPos since this weapon needs to affect more than just the MadTank actor - mad.info.ThumpDamageWeaponInfo.Impact(Target.FromPos(self.CenterPosition), self, Enumerable.Empty()); + mad.info.ThumpDamageWeaponInfo.Impact(Target.FromPos(self.CenterPosition), self); } screenShaker.AddEffect(mad.info.ThumpShakeTime, self.CenterPosition, mad.info.ThumpShakeIntensity, mad.info.ThumpShakeMultiplier); @@ -241,7 +241,7 @@ namespace OpenRA.Mods.Cnc.Traits if (mad.info.DetonationWeapon != null) { // Use .FromPos since this actor is killed. Cannot use Target.FromActor - mad.info.DetonationWeaponInfo.Impact(Target.FromPos(self.CenterPosition), self, Enumerable.Empty()); + mad.info.DetonationWeaponInfo.Impact(Target.FromPos(self.CenterPosition), self); } self.Kill(self, mad.info.DamageTypes); diff --git a/OpenRA.Mods.Common/Activities/Air/FallToEarth.cs b/OpenRA.Mods.Common/Activities/Air/FallToEarth.cs index 717bd9a13f..47b1c9dcf7 100644 --- a/OpenRA.Mods.Common/Activities/Air/FallToEarth.cs +++ b/OpenRA.Mods.Common/Activities/Air/FallToEarth.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Activities if (info.ExplosionWeapon != null) { // Use .FromPos since this actor is killed. Cannot use Target.FromActor - info.ExplosionWeapon.Impact(Target.FromPos(self.CenterPosition), self, Enumerable.Empty()); + info.ExplosionWeapon.Impact(Target.FromPos(self.CenterPosition), self); } self.Kill(self); diff --git a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs index 4765441b6d..5d9130af7d 100644 --- a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs +++ b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Mods.Common.Graphics; @@ -231,7 +232,13 @@ namespace OpenRA.Mods.Common.Projectiles foreach (var a in actors) { var adjustedModifiers = args.DamageModifiers.Append(GetFalloff((args.Source - a.CenterPosition).Length)); - args.Weapon.Impact(Target.FromActor(a), args.SourceActor, adjustedModifiers); + + var warheadArgs = new WarheadArgs(args) + { + DamageModifiers = adjustedModifiers.ToArray(), + }; + + args.Weapon.Impact(Target.FromActor(a), warheadArgs); } } diff --git a/OpenRA.Mods.Common/Projectiles/Bullet.cs b/OpenRA.Mods.Common/Projectiles/Bullet.cs index df16d03d05..f7975d6486 100644 --- a/OpenRA.Mods.Common/Projectiles/Bullet.cs +++ b/OpenRA.Mods.Common/Projectiles/Bullet.cs @@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Projectiles world.AddFrameEndTask(w => w.Remove(this)); - args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(pos), new WarheadArgs(args)); } bool AnyValidTargetsInRadius(World world, WPos pos, WDist radius, Actor firedBy, bool checkTargetType) diff --git a/OpenRA.Mods.Common/Projectiles/GravityBomb.cs b/OpenRA.Mods.Common/Projectiles/GravityBomb.cs index 9cc53f47e8..590a2b22f9 100644 --- a/OpenRA.Mods.Common/Projectiles/GravityBomb.cs +++ b/OpenRA.Mods.Common/Projectiles/GravityBomb.cs @@ -89,7 +89,8 @@ namespace OpenRA.Mods.Common.Projectiles { pos += new WVec(0, 0, args.PassiveTarget.Z - pos.Z); world.AddFrameEndTask(w => w.Remove(this)); - args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); + + args.Weapon.Impact(Target.FromPos(pos), new WarheadArgs(args)); } if (anim != null) diff --git a/OpenRA.Mods.Common/Projectiles/InstantHit.cs b/OpenRA.Mods.Common/Projectiles/InstantHit.cs index 00e9587762..fdf58afd63 100644 --- a/OpenRA.Mods.Common/Projectiles/InstantHit.cs +++ b/OpenRA.Mods.Common/Projectiles/InstantHit.cs @@ -78,7 +78,7 @@ namespace OpenRA.Mods.Common.Projectiles target = Target.FromPos(blockedPos); } - args.Weapon.Impact(target, args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(target, new WarheadArgs(args)); world.AddFrameEndTask(w => w.Remove(this)); } diff --git a/OpenRA.Mods.Common/Projectiles/LaserZap.cs b/OpenRA.Mods.Common/Projectiles/LaserZap.cs index eec6ae5793..0087e69e78 100644 --- a/OpenRA.Mods.Common/Projectiles/LaserZap.cs +++ b/OpenRA.Mods.Common/Projectiles/LaserZap.cs @@ -165,7 +165,7 @@ namespace OpenRA.Mods.Common.Projectiles if (ticks < info.DamageDuration && --interval <= 0) { - args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(target), new WarheadArgs(args)); interval = info.DamageInterval; } diff --git a/OpenRA.Mods.Common/Projectiles/Missile.cs b/OpenRA.Mods.Common/Projectiles/Missile.cs index 7fcb1b574b..2b27a48d3d 100644 --- a/OpenRA.Mods.Common/Projectiles/Missile.cs +++ b/OpenRA.Mods.Common/Projectiles/Missile.cs @@ -891,7 +891,7 @@ namespace OpenRA.Mods.Common.Projectiles if (ticks <= info.Arm) return; - args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(pos), new WarheadArgs(args)); } public IEnumerable Render(WorldRenderer wr) diff --git a/OpenRA.Mods.Common/Projectiles/NukeLaunch.cs b/OpenRA.Mods.Common/Projectiles/NukeLaunch.cs index 7278d70068..1752fa7d04 100644 --- a/OpenRA.Mods.Common/Projectiles/NukeLaunch.cs +++ b/OpenRA.Mods.Common/Projectiles/NukeLaunch.cs @@ -140,7 +140,17 @@ namespace OpenRA.Mods.Common.Effects if (detonated) return; - weapon.Impact(Target.FromPos(pos), firedBy.PlayerActor, Enumerable.Empty()); + var target = Target.FromPos(pos); + var warheadArgs = new WarheadArgs + { + Weapon = weapon, + Source = target.CenterPosition, + SourceActor = firedBy.PlayerActor, + WeaponTarget = target + }; + + weapon.Impact(target, warheadArgs); + world.WorldActor.Trait().AddEffect(20, pos, 5); foreach (var flash in world.WorldActor.TraitsImplementing()) diff --git a/OpenRA.Mods.Common/Projectiles/Railgun.cs b/OpenRA.Mods.Common/Projectiles/Railgun.cs index 9943a82771..7fa50f427a 100644 --- a/OpenRA.Mods.Common/Projectiles/Railgun.cs +++ b/OpenRA.Mods.Common/Projectiles/Railgun.cs @@ -188,12 +188,12 @@ namespace OpenRA.Mods.Common.Projectiles animationComplete = true; if (!info.DamageActorsInLine) - args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(target), new WarheadArgs(args)); else { var actors = world.FindActorsOnLine(args.Source, target, info.BeamWidth); foreach (var a in actors) - args.Weapon.Impact(Target.FromActor(a), args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromActor(a), new WarheadArgs(args)); } } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs index c31cfda734..302cadac9c 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs @@ -376,7 +376,7 @@ namespace OpenRA.Mods.Common.Traits self.World.AddFrameEndTask(w => { // Use .FromPos since this actor is killed. Cannot use Target.FromActor - info.DemolishWeaponInfo.Impact(Target.FromPos(self.CenterPosition), saboteur, Enumerable.Empty()); + info.DemolishWeaponInfo.Impact(Target.FromPos(self.CenterPosition), saboteur); self.Kill(saboteur); }); diff --git a/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs b/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs index a55bcbf303..cce9a6e770 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs @@ -116,7 +116,7 @@ namespace OpenRA.Mods.Common.Traits return; // Use .FromPos since this actor is dead. Cannot use Target.FromActor - Info.DemolishWeaponInfo.Impact(Target.FromPos(self.CenterPosition), saboteur, Enumerable.Empty()); + Info.DemolishWeaponInfo.Impact(Target.FromPos(self.CenterPosition), saboteur); self.Kill(saboteur); }); diff --git a/OpenRA.Mods.Common/Traits/Crates/ExplodeCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/ExplodeCrateAction.cs index 1c8bd053de..0383d1515f 100644 --- a/OpenRA.Mods.Common/Traits/Crates/ExplodeCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/ExplodeCrateAction.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits public override void Activate(Actor collector) { var weapon = collector.World.Map.Rules.Weapons[info.Weapon.ToLowerInvariant()]; - weapon.Impact(Target.FromPos(collector.CenterPosition), collector, Enumerable.Empty()); + weapon.Impact(Target.FromPos(collector.CenterPosition), collector); base.Activate(collector); } diff --git a/OpenRA.Mods.Common/Traits/Explodes.cs b/OpenRA.Mods.Common/Traits/Explodes.cs index 7d41e03db6..5681327a2e 100644 --- a/OpenRA.Mods.Common/Traits/Explodes.cs +++ b/OpenRA.Mods.Common/Traits/Explodes.cs @@ -120,13 +120,13 @@ namespace OpenRA.Mods.Common.Traits { var cells = buildingInfo.OccupiedTiles(self.Location); foreach (var c in cells) - weapon.Impact(Target.FromPos(self.World.Map.CenterOfCell(c)), source, Enumerable.Empty()); + weapon.Impact(Target.FromPos(self.World.Map.CenterOfCell(c)), source); return; } // Use .FromPos since this actor is killed. Cannot use Target.FromActor - weapon.Impact(Target.FromPos(self.CenterPosition), source, Enumerable.Empty()); + weapon.Impact(Target.FromPos(self.CenterPosition), source); } WeaponInfo ChooseWeaponForExplosion(Actor self) diff --git a/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs b/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs index de1b7f6412..951f261f9e 100644 --- a/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs +++ b/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs @@ -71,7 +71,7 @@ namespace OpenRA.Mods.Common.Traits triggered = true; // Use .FromPos since the actor might have been killed, don't use Target.FromActor - info.WeaponInfo.Impact(Target.FromPos(self.CenterPosition), e.Attacker, Enumerable.Empty()); + info.WeaponInfo.Impact(Target.FromPos(self.CenterPosition), e.Attacker); } } } diff --git a/OpenRA.Mods.Common/Warheads/ChangeOwnerWarhead.cs b/OpenRA.Mods.Common/Warheads/ChangeOwnerWarhead.cs index 8610204769..3f9466c7ce 100644 --- a/OpenRA.Mods.Common/Warheads/ChangeOwnerWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/ChangeOwnerWarhead.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -23,8 +24,9 @@ namespace OpenRA.Mods.Common.Warheads public readonly WDist Range = WDist.FromCells(1); - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; var actors = target.Type == TargetType.Actor ? new[] { target.Actor } : firedBy.World.FindActorsInCircle(target.CenterPosition, Range); diff --git a/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs b/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs index 557db9602f..90a7ba2e40 100644 --- a/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.GameRules; using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; @@ -103,8 +104,9 @@ namespace OpenRA.Mods.Common.Warheads return invalidHit ? ImpactTargetType.InvalidActor : ImpactTargetType.NoActor; } - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; if (!target.IsValidFor(firedBy)) return; diff --git a/OpenRA.Mods.Common/Warheads/CreateResourceWarhead.cs b/OpenRA.Mods.Common/Warheads/CreateResourceWarhead.cs index fa38b4d1dd..9a2fe5f867 100644 --- a/OpenRA.Mods.Common/Warheads/CreateResourceWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/CreateResourceWarhead.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -25,11 +26,12 @@ namespace OpenRA.Mods.Common.Warheads public readonly string AddsResourceType = null; // TODO: Allow maximum resource splatter to be defined. (Per tile, and in total). - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { if (string.IsNullOrEmpty(AddsResourceType)) return; + var firedBy = args.SourceActor; var world = firedBy.World; var targetTile = world.Map.CellContaining(target.CenterPosition); var resLayer = world.WorldActor.Trait(); diff --git a/OpenRA.Mods.Common/Warheads/DamageWarhead.cs b/OpenRA.Mods.Common/Warheads/DamageWarhead.cs index ccabefcf02..9795fa1ef1 100644 --- a/OpenRA.Mods.Common/Warheads/DamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/DamageWarhead.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -57,8 +58,10 @@ namespace OpenRA.Mods.Common.Warheads victim.InflictDamage(firedBy, new Damage(damage, DamageTypes)); } - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; + // Used by traits or warheads that damage a single actor, rather than a position if (target.Type == TargetType.Actor) { @@ -74,10 +77,10 @@ namespace OpenRA.Mods.Common.Warheads if (closestActiveShape == null) return; - InflictDamage(victim, firedBy, closestActiveShape.Info, damageModifiers); + InflictDamage(victim, firedBy, closestActiveShape.Info, args.DamageModifiers); } else if (target.Type != TargetType.Invalid) - DoImpact(target.CenterPosition, firedBy, damageModifiers); + DoImpact(target.CenterPosition, firedBy, args.DamageModifiers); } public abstract void DoImpact(WPos pos, Actor firedBy, IEnumerable damageModifiers); diff --git a/OpenRA.Mods.Common/Warheads/DestroyResourceWarhead.cs b/OpenRA.Mods.Common/Warheads/DestroyResourceWarhead.cs index a4ad3c0818..fc3371a616 100644 --- a/OpenRA.Mods.Common/Warheads/DestroyResourceWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/DestroyResourceWarhead.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -21,8 +22,9 @@ namespace OpenRA.Mods.Common.Warheads public readonly int[] Size = { 0, 0 }; // TODO: Allow maximum resource removal to be defined. (Per tile, and in total). - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; var world = firedBy.World; var targetTile = world.Map.CellContaining(target.CenterPosition); var resLayer = world.WorldActor.Trait(); diff --git a/OpenRA.Mods.Common/Warheads/FireClusterWarhead.cs b/OpenRA.Mods.Common/Warheads/FireClusterWarhead.cs index 064c45ecc2..3e9ec10a48 100644 --- a/OpenRA.Mods.Common/Warheads/FireClusterWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/FireClusterWarhead.cs @@ -44,13 +44,15 @@ namespace OpenRA.Mods.Common.Warheads throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(Weapon.ToLowerInvariant())); } - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; if (!target.IsValidFor(firedBy)) return; var map = firedBy.World.Map; var targetCell = map.CellContaining(target.CenterPosition); + var damageModifiers = args.DamageModifiers; var targetCells = CellsMatching(targetCell, false); foreach (var c in targetCells) diff --git a/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs b/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs index 9d97da3599..e26dd23f73 100644 --- a/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -27,8 +28,9 @@ namespace OpenRA.Mods.Common.Warheads public readonly WDist Range = WDist.FromCells(1); - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; var actors = target.Type == TargetType.Actor ? new[] { target.Actor } : firedBy.World.FindActorsInCircle(target.CenterPosition, Range); diff --git a/OpenRA.Mods.Common/Warheads/LeaveSmudgeWarhead.cs b/OpenRA.Mods.Common/Warheads/LeaveSmudgeWarhead.cs index 0475159d52..bfaf040acc 100644 --- a/OpenRA.Mods.Common/Warheads/LeaveSmudgeWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/LeaveSmudgeWarhead.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.Linq; +using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -31,8 +32,9 @@ namespace OpenRA.Mods.Common.Warheads [Desc("Percentual chance the smudge is created.")] public readonly int Chance = 100; - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { + var firedBy = args.SourceActor; var world = firedBy.World; if (Chance < world.LocalRandom.Next(100)) diff --git a/OpenRA.Mods.Common/Warheads/Warhead.cs b/OpenRA.Mods.Common/Warheads/Warhead.cs index c209662443..e3f69b5638 100644 --- a/OpenRA.Mods.Common/Warheads/Warhead.cs +++ b/OpenRA.Mods.Common/Warheads/Warhead.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.GameRules; using OpenRA.Primitives; using OpenRA.Traits; @@ -59,7 +60,7 @@ namespace OpenRA.Mods.Common.Warheads } /// Applies the warhead's effect against the target. - public abstract void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers); + public abstract void DoImpact(Target target, WarheadArgs args); /// Checks if the warhead is valid against (can do something to) the actor. public virtual bool IsValidAgainst(Actor victim, Actor firedBy) diff --git a/OpenRA.Mods.D2k/Warheads/DamagesConcreteWarhead.cs b/OpenRA.Mods.D2k/Warheads/DamagesConcreteWarhead.cs index 478a6253ca..098dc061f6 100644 --- a/OpenRA.Mods.D2k/Warheads/DamagesConcreteWarhead.cs +++ b/OpenRA.Mods.D2k/Warheads/DamagesConcreteWarhead.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.GameRules; using OpenRA.Mods.Common.Warheads; using OpenRA.Mods.D2k.Traits; using OpenRA.Traits; @@ -23,11 +24,12 @@ namespace OpenRA.Mods.D2k.Warheads [FieldLoader.Require] public readonly int Damage = 0; - public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) + public override void DoImpact(Target target, WarheadArgs args) { if (target.Type == TargetType.Invalid) return; + var firedBy = args.SourceActor; var world = firedBy.World; var layer = world.WorldActor.Trait(); var cell = world.Map.CellContaining(target.CenterPosition);