Merge pull request #9357 from UberWaffe/LineImpactProjectile

Added a LineImpactProjectile (Attempt 2)
This commit is contained in:
Matthias Mailänder
2015-12-05 18:09:12 +01:00
13 changed files with 457 additions and 28 deletions

View File

@@ -187,7 +187,7 @@ namespace OpenRA.Mods.Common.Traits
return null;
var barrel = Barrels[Burst % Barrels.Length];
var muzzlePosition = self.CenterPosition + MuzzleOffset(self, barrel);
Func<WPos> muzzlePosition = () => self.CenterPosition + MuzzleOffset(self, barrel);
var legacyFacing = MuzzleOrientation(self, barrel).Yaw.Angle / 4;
var args = new ProjectileArgs
@@ -204,7 +204,8 @@ namespace OpenRA.Mods.Common.Traits
RangeModifiers = self.TraitsImplementing<IRangeModifier>()
.Select(a => a.GetRangeModifier()).ToArray(),
Source = muzzlePosition,
Source = muzzlePosition(),
CurrentSource = muzzlePosition,
SourceActor = self,
PassiveTarget = target.CenterPosition,
GuidedTarget = target

View File

@@ -34,5 +34,31 @@ namespace OpenRA.Mods.Common.Traits
.Where(t => t.Info.Height.Length >= dat.Length)
.Any(Exts.IsTraitEnabled));
}
public static bool AnyBlockingActorsBetween(World world, WPos start, WPos end, WDist width, WDist overscan, out WPos hit)
{
var actors = world.FindActorsOnLine(start, end, width, overscan);
var length = (end - start).Length;
foreach (var a in actors)
{
var blockers = a.TraitsImplementing<BlocksProjectiles>()
.Where(Exts.IsTraitEnabled).ToList();
if (!blockers.Any())
continue;
var hitPos = WorldExtensions.MinimumPointLineProjection(start, end, a.CenterPosition);
var dat = world.Map.DistanceAboveTerrain(hitPos);
if ((hitPos - start).Length < length && blockers.Any(t => t.Info.Height.Length >= dat.Length))
{
hit = hitPos;
return true;
}
}
hit = WPos.Zero;
return false;
}
}
}

View File

@@ -70,6 +70,7 @@ namespace OpenRA.Mods.Common.Traits
.Select(a => a.GetRangeModifier()).ToArray(),
Source = self.CenterPosition,
CurrentSource = () => self.CenterPosition,
SourceActor = self,
PassiveTarget = self.CenterPosition + new WVec(range, 0, 0).Rotate(rotation)
};