diff --git a/OpenRA.Mods.Common/Effects/Bullet.cs b/OpenRA.Mods.Common/Effects/Bullet.cs index aa8a3be3a3..8953db64c6 100644 --- a/OpenRA.Mods.Common/Effects/Bullet.cs +++ b/OpenRA.Mods.Common/Effects/Bullet.cs @@ -167,12 +167,8 @@ namespace OpenRA.Mods.Common.Effects if (info.ContrailLength > 0) contrail.Update(pos); - var cell = world.Map.CellContaining(pos); - var height = world.Map.DistanceAboveTerrain(pos); - - var shouldExplode = height.Length <= 0 // Hit the ground - || ticks++ >= length // Flight length reached/exceeded - || BlockedByActor(world, pos); // Hit a wall or other blocking obstacle + var shouldExplode = ticks++ >= length // Flight length reached/exceeded + || (info.Blockable && BlocksProjectiles.AnyBlockingActorAt(world, pos)); // Hit a wall or other blocking obstacle if (shouldExplode) Explode(world); @@ -212,11 +208,5 @@ namespace OpenRA.Mods.Common.Effects args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); } - - bool BlockedByActor(World world, WPos pos) - { - return info.Blockable && world.ActorMap.GetUnitsAt(world.Map.CellContaining(pos)) - .Any(a => a.TraitsImplementing().Any(Exts.IsTraitEnabled)); - } } } diff --git a/OpenRA.Mods.Common/Effects/Missile.cs b/OpenRA.Mods.Common/Effects/Missile.cs index 1695636492..c82d959a6b 100644 --- a/OpenRA.Mods.Common/Effects/Missile.cs +++ b/OpenRA.Mods.Common/Effects/Missile.cs @@ -20,7 +20,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Effects { - class MissileInfo : IProjectileInfo + public class MissileInfo : IProjectileInfo { public readonly string Image = null; [SequenceReference("Image")] public readonly string Sequence = "idle"; @@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Effects public IEffect Create(ProjectileArgs args) { return new Missile(this, args); } } - class Missile : IEffect, ISync + public class Missile : IEffect, ISync { readonly MissileInfo info; readonly ProjectileArgs args; @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Effects var shouldExplode = (pos.Z < 0) // Hit the ground || (dist.LengthSquared < info.CloseEnough.LengthSquared) // Within range || (info.RangeLimit != 0 && ticks > info.RangeLimit) // Ran out of fuel - || BlockedByActor(world, pos) // Hit a wall or other blocking obstacle + || (info.Blockable && BlocksProjectiles.AnyBlockingActorAt(world, pos)) // Hit a wall or other blocking obstacle || !world.Map.Contains(cell) // This also avoids an IndexOutOfRangeException in GetTerrainInfo below. || (!string.IsNullOrEmpty(info.BoundToTerrainType) && world.Map.GetTerrainInfo(cell).Type != info.BoundToTerrainType); // Hit incompatible terrain @@ -223,12 +223,6 @@ namespace OpenRA.Mods.Common.Effects args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); } - bool BlockedByActor(World world, WPos pos) - { - return info.Blockable && world.ActorMap.GetUnitsAt(world.Map.CellContaining(pos)) - .Any(a => a.TraitsImplementing().Any(Exts.IsTraitEnabled)); - } - public IEnumerable Render(WorldRenderer wr) { if (info.ContrailLength > 0) diff --git a/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs b/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs index ac495d3179..249b2e8ea7 100644 --- a/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs +++ b/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs @@ -24,5 +24,11 @@ namespace OpenRA.Mods.Common.Traits { public BlocksProjectiles(Actor self, BlocksProjectilesInfo info) : base(info) { } + + public static bool AnyBlockingActorAt(World world, WPos pos) + { + return world.ActorMap.GetUnitsAt(world.Map.CellContaining(pos)) + .Any(a => a.TraitsImplementing().Any(Exts.IsTraitEnabled)); + } } }