diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index d17f859dd7..69a8ae50b8 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -111,6 +111,9 @@ namespace OpenRA return null; if (!World.Map.IsInMap(xy.X, xy.Y)) + return null; + + if (Destroyed) return null; var underCursor = World.FindUnitsAtMouse(mi.Location) diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index 5dcbe6c3ad..7756578cb5 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -65,6 +65,7 @@ namespace OpenRA.GameRules public Target target; public int2 dest; public int destAltitude; + public float firepowerModifier = 1.0f; } public interface IProjectileInfo { IEffect Create(ProjectileArgs args); } diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index e331de381b..c420ff5a7b 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -38,17 +38,19 @@ namespace OpenRA.Orders public void RenderBeforeWorld(World world) { foreach (var a in world.Selection.Actors) - foreach (var t in a.TraitsImplementing()) - t.RenderBeforeWorld(a); + if (!a.Destroyed) + foreach (var t in a.TraitsImplementing()) + t.RenderBeforeWorld(a); Game.Renderer.Flush(); } public void RenderAfterWorld( World world ) { - foreach (var a in world.Selection.Actors) - foreach (var t in a.TraitsImplementing()) - t.RenderAfterWorld(a); + foreach (var a in world.Selection.Actors) + if (!a.Destroyed) + foreach (var t in a.TraitsImplementing()) + t.RenderAfterWorld(a); Game.Renderer.Flush(); } diff --git a/OpenRA.Mods.RA/AttackBase.cs b/OpenRA.Mods.RA/AttackBase.cs index a436ead659..7ede247a1e 100644 --- a/OpenRA.Mods.RA/AttackBase.cs +++ b/OpenRA.Mods.RA/AttackBase.cs @@ -144,6 +144,10 @@ namespace OpenRA.Mods.RA facing = barrel.Facing + (self.HasTrait() ? self.Trait().turretFacing : facing != null ? facing.Facing : Util.GetFacing(target.CenterLocation - self.CenterLocation, 0)), + + firepowerModifier = self.TraitsImplementing() + .Select(a => a.GetFirepowerModifier()) + .Product() }; ScheduleDelayedAction( FireDelay( self, self.Info.Traits.Get() ), () => diff --git a/OpenRA.Mods.RA/Combat.cs b/OpenRA.Mods.RA/Combat.cs index 8cca574c05..38e29912f5 100755 --- a/OpenRA.Mods.RA/Combat.cs +++ b/OpenRA.Mods.RA/Combat.cs @@ -70,11 +70,6 @@ namespace OpenRA.Mods.RA if (warhead.Ore) world.WorldActor.Trait().Destroy(targetTile); - var firepowerModifier = args.firedBy - .TraitsImplementing() - .Select(a => a.GetFirepowerModifier()) - .Product(); - switch (warhead.DamageModel) { case DamageModel.Normal: @@ -84,7 +79,7 @@ namespace OpenRA.Mods.RA foreach (var victim in hitActors) { - var damage = (int)GetDamageToInflict(victim, args, warhead, firepowerModifier); + var damage = (int)GetDamageToInflict(victim, args, warhead, args.firepowerModifier); victim.InflictDamage(args.firedBy, damage, warhead); } } break;