diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index 796bef68da..6a40d3186b 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -144,13 +144,14 @@ namespace OpenRA.GameRules return true; } - public void Impact(WPos pos, Actor firedBy, IEnumerable damageModifiers) + ///Applies all the weapon's warheads to the target. + public void Impact(Target target, Actor firedBy, IEnumerable damageModifiers) { foreach (var wh in Warheads) { Action a; - a = () => wh.DoImpact(Target.FromPos(pos), firedBy, damageModifiers); + a = () => wh.DoImpact(target, firedBy, damageModifiers); if (wh.Delay > 0) firedBy.World.AddFrameEndTask( w => w.Add(new DelayedAction(wh.Delay, a))); diff --git a/OpenRA.Mods.Cnc/Effects/IonCannon.cs b/OpenRA.Mods.Cnc/Effects/IonCannon.cs index 2dac66756c..05589561ca 100644 --- a/OpenRA.Mods.Cnc/Effects/IonCannon.cs +++ b/OpenRA.Mods.Cnc/Effects/IonCannon.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.Cnc.Effects if (!impacted && weaponDelay-- <= 0) { var weapon = world.Map.Rules.Weapons[this.weapon.ToLowerInvariant()]; - weapon.Impact(target.CenterPosition, firedBy.PlayerActor, Enumerable.Empty()); + weapon.Impact(target, firedBy.PlayerActor, Enumerable.Empty()); impacted = true; } } diff --git a/OpenRA.Mods.Cnc/PoisonedByTiberium.cs b/OpenRA.Mods.Cnc/PoisonedByTiberium.cs index 80f4aebb3e..1925498054 100644 --- a/OpenRA.Mods.Cnc/PoisonedByTiberium.cs +++ b/OpenRA.Mods.Cnc/PoisonedByTiberium.cs @@ -43,7 +43,8 @@ namespace OpenRA.Mods.Cnc if (!info.Resources.Contains(r.Info.Name)) return; var weapon = self.World.Map.Rules.Weapons[info.Weapon.ToLowerInvariant()]; - weapon.Impact(self.CenterPosition, self.World.WorldActor, Enumerable.Empty()); + + weapon.Impact(Target.FromActor(self), self.World.WorldActor, Enumerable.Empty()); poisonTicks = weapon.ReloadDelay; } } diff --git a/OpenRA.Mods.D2k/DamagedWithoutFoundation.cs b/OpenRA.Mods.D2k/DamagedWithoutFoundation.cs index 4ce49437e1..471280179c 100644 --- a/OpenRA.Mods.D2k/DamagedWithoutFoundation.cs +++ b/OpenRA.Mods.D2k/DamagedWithoutFoundation.cs @@ -65,7 +65,7 @@ namespace OpenRA.Mods.D2k if (health.HP <= damageThreshold || --damageTicks > 0) return; - weapon.Impact(self.CenterPosition, self.World.WorldActor, Enumerable.Empty()); + weapon.Impact(Target.FromActor(self), self.World.WorldActor, Enumerable.Empty()); damageTicks = weapon.ReloadDelay; } } diff --git a/OpenRA.Mods.RA/Air/FallsToEarth.cs b/OpenRA.Mods.RA/Air/FallsToEarth.cs index 2d6654fc8f..f35654c5e9 100755 --- a/OpenRA.Mods.RA/Air/FallsToEarth.cs +++ b/OpenRA.Mods.RA/Air/FallsToEarth.cs @@ -55,7 +55,8 @@ namespace OpenRA.Mods.RA.Air if (info.Explosion != null) { var weapon = self.World.Map.Rules.Weapons[info.Explosion.ToLowerInvariant()]; - weapon.Impact(self.CenterPosition, self, Enumerable.Empty()); + // Use .FromPos since this actor is killed. Cannot use Target.FromActor + weapon.Impact(Target.FromPos(self.CenterPosition), self, Enumerable.Empty()); } self.Destroy(); diff --git a/OpenRA.Mods.RA/Bridge.cs b/OpenRA.Mods.RA/Bridge.cs index 72cbf990af..99ce0780ac 100644 --- a/OpenRA.Mods.RA/Bridge.cs +++ b/OpenRA.Mods.RA/Bridge.cs @@ -299,7 +299,9 @@ namespace OpenRA.Mods.RA self.World.AddFrameEndTask(w => { var weapon = saboteur.World.Map.Rules.Weapons[Info.DemolishWeapon.ToLowerInvariant()]; - weapon.Impact(self.CenterPosition, saboteur, Enumerable.Empty()); + // Use .FromPos since this actor is killed. Cannot use Target.FromActor + weapon.Impact(Target.FromPos(self.CenterPosition), saboteur, Enumerable.Empty()); + self.World.WorldActor.Trait().AddEffect(15, self.CenterPosition, 6); self.Kill(saboteur); }); diff --git a/OpenRA.Mods.RA/Crates/ExplodeCrateAction.cs b/OpenRA.Mods.RA/Crates/ExplodeCrateAction.cs index 27521ffc24..1996d89750 100644 --- a/OpenRA.Mods.RA/Crates/ExplodeCrateAction.cs +++ b/OpenRA.Mods.RA/Crates/ExplodeCrateAction.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA public override void Activate(Actor collector) { var weapon = self.World.Map.Rules.Weapons[((ExplodeCrateActionInfo)info).Weapon.ToLowerInvariant()]; - weapon.Impact(collector.CenterPosition, self, Enumerable.Empty()); + weapon.Impact(Target.FromPos(collector.CenterPosition), self, Enumerable.Empty()); base.Activate(collector); } } diff --git a/OpenRA.Mods.RA/Effects/Bullet.cs b/OpenRA.Mods.RA/Effects/Bullet.cs index 9a4d171285..bda2e0a9a7 100755 --- a/OpenRA.Mods.RA/Effects/Bullet.cs +++ b/OpenRA.Mods.RA/Effects/Bullet.cs @@ -172,7 +172,7 @@ namespace OpenRA.Mods.RA.Effects world.AddFrameEndTask(w => w.Remove(this)); - args.Weapon.Impact(pos, args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); } } } diff --git a/OpenRA.Mods.RA/Effects/GravityBomb.cs b/OpenRA.Mods.RA/Effects/GravityBomb.cs index e2eeeaf5ba..6368667e79 100644 --- a/OpenRA.Mods.RA/Effects/GravityBomb.cs +++ b/OpenRA.Mods.RA/Effects/GravityBomb.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using OpenRA.Effects; using OpenRA.GameRules; using OpenRA.Graphics; +using OpenRA.Traits; namespace OpenRA.Mods.RA.Effects { @@ -56,7 +57,7 @@ namespace OpenRA.Mods.RA.Effects { pos += new WVec(0, 0, args.PassiveTarget.Z - pos.Z); world.AddFrameEndTask(w => w.Remove(this)); - args.Weapon.Impact(pos, args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); } anim.Tick(); diff --git a/OpenRA.Mods.RA/Effects/LaserZap.cs b/OpenRA.Mods.RA/Effects/LaserZap.cs index a38c38c09a..c105d98d0a 100644 --- a/OpenRA.Mods.RA/Effects/LaserZap.cs +++ b/OpenRA.Mods.RA/Effects/LaserZap.cs @@ -13,6 +13,7 @@ using System.Drawing; using OpenRA.Effects; using OpenRA.GameRules; using OpenRA.Graphics; +using OpenRA.Traits; using OpenRA.Mods.RA.Graphics; namespace OpenRA.Mods.RA.Effects @@ -69,7 +70,7 @@ namespace OpenRA.Mods.RA.Effects if (hitanim != null) hitanim.PlayThen("idle", () => animationComplete = true); - args.Weapon.Impact(target, args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers); doneDamage = true; } diff --git a/OpenRA.Mods.RA/Effects/Missile.cs b/OpenRA.Mods.RA/Effects/Missile.cs index 20eba6f224..97167085a3 100755 --- a/OpenRA.Mods.RA/Effects/Missile.cs +++ b/OpenRA.Mods.RA/Effects/Missile.cs @@ -180,7 +180,7 @@ namespace OpenRA.Mods.RA.Effects if (ticks <= info.Arm) return; - args.Weapon.Impact(pos, args.SourceActor, args.DamageModifiers); + args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); } public IEnumerable Render(WorldRenderer wr) diff --git a/OpenRA.Mods.RA/Effects/NukeLaunch.cs b/OpenRA.Mods.RA/Effects/NukeLaunch.cs index bce7fab50f..bf19626ebd 100755 --- a/OpenRA.Mods.RA/Effects/NukeLaunch.cs +++ b/OpenRA.Mods.RA/Effects/NukeLaunch.cs @@ -81,7 +81,7 @@ namespace OpenRA.Mods.RA.Effects { world.AddFrameEndTask(w => w.Remove(this)); var weapon = world.Map.Rules.Weapons[this.weapon.ToLowerInvariant()]; - weapon.Impact(pos, firedBy.PlayerActor, Enumerable.Empty()); + weapon.Impact(Target.FromPos(pos), firedBy.PlayerActor, Enumerable.Empty()); world.WorldActor.Trait().AddEffect(20, pos, 5); foreach (var a in world.ActorsWithTrait()) diff --git a/OpenRA.Mods.RA/Effects/TeslaZap.cs b/OpenRA.Mods.RA/Effects/TeslaZap.cs index 59b5f1dc36..21ac24398a 100644 --- a/OpenRA.Mods.RA/Effects/TeslaZap.cs +++ b/OpenRA.Mods.RA/Effects/TeslaZap.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using OpenRA.Effects; using OpenRA.GameRules; using OpenRA.Graphics; +using OpenRA.Traits; namespace OpenRA.Mods.RA.Effects { @@ -47,7 +48,7 @@ namespace OpenRA.Mods.RA.Effects if (!doneDamage) { var pos = Args.GuidedTarget.IsValidFor(Args.SourceActor) ? Args.GuidedTarget.CenterPosition : Args.PassiveTarget; - Args.Weapon.Impact(pos, Args.SourceActor, Args.DamageModifiers); + Args.Weapon.Impact(Target.FromPos(pos), Args.SourceActor, Args.DamageModifiers); doneDamage = true; } } diff --git a/OpenRA.Mods.RA/Explodes.cs b/OpenRA.Mods.RA/Explodes.cs index a2af881410..eb2f9871c0 100644 --- a/OpenRA.Mods.RA/Explodes.cs +++ b/OpenRA.Mods.RA/Explodes.cs @@ -51,7 +51,8 @@ namespace OpenRA.Mods.RA if (weapon.Report != null && weapon.Report.Any()) Sound.Play(weapon.Report.Random(e.Attacker.World.SharedRandom), self.CenterPosition); - weapon.Impact(self.CenterPosition, e.Attacker, Enumerable.Empty()); + // Use .FromPos since this actor is killed. Cannot use Target.FromActor + weapon.Impact(Target.FromPos(self.CenterPosition), e.Attacker, Enumerable.Empty()); } } diff --git a/OpenRA.Mods.RA/MadTank.cs b/OpenRA.Mods.RA/MadTank.cs index cb6ed97a4c..b46bf5848c 100644 --- a/OpenRA.Mods.RA/MadTank.cs +++ b/OpenRA.Mods.RA/MadTank.cs @@ -72,7 +72,8 @@ namespace OpenRA.Mods.RA if (info.ThumpDamageWeapon != null) { var weapon = self.World.Map.Rules.Weapons[info.ThumpDamageWeapon.ToLowerInvariant()]; - weapon.Impact(self.CenterPosition, self, Enumerable.Empty()); + // Use .FromPos since this weapon needs to affect more than just the MadTank actor + weapon.Impact(Target.FromPos(self.CenterPosition), self, Enumerable.Empty()); } screenShaker.AddEffect(info.ThumpShakeTime, self.CenterPosition, info.ThumpShakeIntensity, info.ThumpShakeMultiplier); tick = 0; @@ -111,7 +112,8 @@ namespace OpenRA.Mods.RA if (info.DetonationWeapon != null) { var weapon = self.World.Map.Rules.Weapons[info.DetonationWeapon.ToLowerInvariant()]; - weapon.Impact(self.CenterPosition, self, Enumerable.Empty()); + // Use .FromPos since this actor is killed. Cannot use Target.FromActor + weapon.Impact(Target.FromPos(self.CenterPosition), self, Enumerable.Empty()); } self.Kill(self); });