Replace duplicate BlockedByActor with BlocksProjectiles.AnyBlockingActorAt

This commit is contained in:
reaperrr
2015-09-30 22:26:28 +02:00
parent 7e1f29d4c5
commit 4cf27fc207
3 changed files with 11 additions and 21 deletions

View File

@@ -167,12 +167,8 @@ namespace OpenRA.Mods.Common.Effects
if (info.ContrailLength > 0) if (info.ContrailLength > 0)
contrail.Update(pos); contrail.Update(pos);
var cell = world.Map.CellContaining(pos); var shouldExplode = ticks++ >= length // Flight length reached/exceeded
var height = world.Map.DistanceAboveTerrain(pos); || (info.Blockable && BlocksProjectiles.AnyBlockingActorAt(world, pos)); // Hit a wall or other blocking obstacle
var shouldExplode = height.Length <= 0 // Hit the ground
|| ticks++ >= length // Flight length reached/exceeded
|| BlockedByActor(world, pos); // Hit a wall or other blocking obstacle
if (shouldExplode) if (shouldExplode)
Explode(world); Explode(world);
@@ -212,11 +208,5 @@ namespace OpenRA.Mods.Common.Effects
args.Weapon.Impact(Target.FromPos(pos), args.SourceActor, args.DamageModifiers); 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<BlocksProjectiles>().Any(Exts.IsTraitEnabled));
}
} }
} }

View File

@@ -20,7 +20,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Effects namespace OpenRA.Mods.Common.Effects
{ {
class MissileInfo : IProjectileInfo public class MissileInfo : IProjectileInfo
{ {
public readonly string Image = null; public readonly string Image = null;
[SequenceReference("Image")] public readonly string Sequence = "idle"; [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); } public IEffect Create(ProjectileArgs args) { return new Missile(this, args); }
} }
class Missile : IEffect, ISync public class Missile : IEffect, ISync
{ {
readonly MissileInfo info; readonly MissileInfo info;
readonly ProjectileArgs args; readonly ProjectileArgs args;
@@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Effects
var shouldExplode = (pos.Z < 0) // Hit the ground var shouldExplode = (pos.Z < 0) // Hit the ground
|| (dist.LengthSquared < info.CloseEnough.LengthSquared) // Within range || (dist.LengthSquared < info.CloseEnough.LengthSquared) // Within range
|| (info.RangeLimit != 0 && ticks > info.RangeLimit) // Ran out of fuel || (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. || !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 || (!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); 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<BlocksProjectiles>().Any(Exts.IsTraitEnabled));
}
public IEnumerable<IRenderable> Render(WorldRenderer wr) public IEnumerable<IRenderable> Render(WorldRenderer wr)
{ {
if (info.ContrailLength > 0) if (info.ContrailLength > 0)

View File

@@ -24,5 +24,11 @@ namespace OpenRA.Mods.Common.Traits
{ {
public BlocksProjectiles(Actor self, BlocksProjectilesInfo info) public BlocksProjectiles(Actor self, BlocksProjectilesInfo info)
: base(info) { } : base(info) { }
public static bool AnyBlockingActorAt(World world, WPos pos)
{
return world.ActorMap.GetUnitsAt(world.Map.CellContaining(pos))
.Any(a => a.TraitsImplementing<BlocksProjectiles>().Any(Exts.IsTraitEnabled));
}
} }
} }