Fix armaments/projectiles to aim at closest Target.Positions

Instead of CenterPosition.
TargetablePositions were already used for targeting/attack decisions, but not armaments/projectiles.
This commit is contained in:
reaperrr
2017-04-21 14:06:56 +02:00
committed by Oliver Brakmann
parent 73577e3a7e
commit 7acc6dacbc
7 changed files with 13 additions and 6 deletions

View File

@@ -157,7 +157,7 @@ namespace OpenRA.Mods.Common.Projectiles
if (args.GuidedTarget.IsValidFor(args.SourceActor)) if (args.GuidedTarget.IsValidFor(args.SourceActor))
{ {
var guidedTargetPos = args.GuidedTarget.CenterPosition; var guidedTargetPos = args.GuidedTarget.Positions.PositionClosestTo(args.Source);
var targetDistance = new WDist((guidedTargetPos - args.Source).Length); var targetDistance = new WDist((guidedTargetPos - args.Source).Length);
// Only continue tracking target if it's within weapon range + // Only continue tracking target if it's within weapon range +

View File

@@ -21,6 +21,9 @@ namespace OpenRA.Mods.Common.Projectiles
[Desc("Simple, invisible, usually direct-on-target projectile.")] [Desc("Simple, invisible, usually direct-on-target projectile.")]
public class InstantHitInfo : IProjectileInfo, IRulesetLoaded<WeaponInfo> public class InstantHitInfo : IProjectileInfo, IRulesetLoaded<WeaponInfo>
{ {
[Desc("Apply warheads directly to center of target actor.")]
public readonly bool TargetCenterPosition = false;
[Desc("Maximum offset at the maximum range.")] [Desc("Maximum offset at the maximum range.")]
public readonly WDist Inaccuracy = WDist.Zero; public readonly WDist Inaccuracy = WDist.Zero;
@@ -57,14 +60,16 @@ namespace OpenRA.Mods.Common.Projectiles
this.info = info; this.info = info;
source = args.Source; source = args.Source;
if (info.Inaccuracy.Length > 0) if (info.TargetCenterPosition)
target = args.GuidedTarget;
else if (!info.TargetCenterPosition && info.Inaccuracy.Length > 0)
{ {
var inaccuracy = Util.ApplyPercentageModifiers(info.Inaccuracy.Length, args.InaccuracyModifiers); var inaccuracy = Util.ApplyPercentageModifiers(info.Inaccuracy.Length, args.InaccuracyModifiers);
var maxOffset = inaccuracy * (args.PassiveTarget - source).Length / args.Weapon.Range.Length; var maxOffset = inaccuracy * (args.PassiveTarget - source).Length / args.Weapon.Range.Length;
target = Target.FromPos(args.PassiveTarget + WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * maxOffset / 1024); target = Target.FromPos(args.PassiveTarget + WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * maxOffset / 1024);
} }
else else
target = args.GuidedTarget; target = Target.FromPos(args.PassiveTarget);
} }
public void Tick(World world) public void Tick(World world)

View File

@@ -128,7 +128,7 @@ namespace OpenRA.Mods.Common.Projectiles
{ {
// Beam tracks target // Beam tracks target
if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor)) if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor))
target = args.GuidedTarget.CenterPosition; target = args.GuidedTarget.Positions.PositionClosestTo(source);
// Check for blocking actors // Check for blocking actors
WPos blockedPos; WPos blockedPos;

View File

@@ -799,7 +799,7 @@ namespace OpenRA.Mods.Common.Projectiles
// Check if target position should be updated (actor visible & locked on) // Check if target position should be updated (actor visible & locked on)
var newTarPos = targetPosition; var newTarPos = targetPosition;
if (args.GuidedTarget.IsValidFor(args.SourceActor) && lockOn) if (args.GuidedTarget.IsValidFor(args.SourceActor) && lockOn)
newTarPos = args.GuidedTarget.CenterPosition newTarPos = args.GuidedTarget.Positions.PositionClosestTo(args.Source)
+ new WVec(WDist.Zero, WDist.Zero, info.AirburstAltitude); + new WVec(WDist.Zero, WDist.Zero, info.AirburstAltitude);
// Compute target's predicted velocity vector (assuming uniform circular motion) // Compute target's predicted velocity vector (assuming uniform circular motion)

View File

@@ -229,7 +229,7 @@ namespace OpenRA.Mods.Common.Traits
Source = muzzlePosition(), Source = muzzlePosition(),
CurrentSource = muzzlePosition, CurrentSource = muzzlePosition,
SourceActor = self, SourceActor = self,
PassiveTarget = target.CenterPosition, PassiveTarget = target.Positions.PositionClosestTo(muzzlePosition()),
GuidedTarget = target GuidedTarget = target
}; };

View File

@@ -201,6 +201,7 @@ TurretLaserFire:
LaserFence: LaserFence:
Projectile: InstantHit Projectile: InstantHit
TargetCenterPosition: true
Warhead@1Dam: TargetDamage Warhead@1Dam: TargetDamage
DebugOverlayColor: FF0000 DebugOverlayColor: FF0000
Damage: 99999 Damage: 99999

View File

@@ -4,6 +4,7 @@
Report: healer1.aud Report: healer1.aud
ValidTargets: Infantry ValidTargets: Infantry
Projectile: InstantHit Projectile: InstantHit
TargetCenterPosition: true
Warhead@1Dam: TargetDamage Warhead@1Dam: TargetDamage
DebugOverlayColor: 00FF00 DebugOverlayColor: 00FF00
Damage: -50 Damage: -50