Adapt tracking projectiles to support targeting CenterPosition
Instead of closest targetable position.
This commit is contained in:
@@ -36,6 +36,9 @@ namespace OpenRA.Mods.Cnc.Projectiles
|
|||||||
|
|
||||||
public readonly bool TrackTarget = true;
|
public readonly bool TrackTarget = true;
|
||||||
|
|
||||||
|
[Desc("Ignore any other targetable positions and aim directly at center of target actor.")]
|
||||||
|
public readonly bool TargetCenterPosition = false;
|
||||||
|
|
||||||
public IProjectile Create(ProjectileArgs args) { return new TeslaZap(this, args); }
|
public IProjectile Create(ProjectileArgs args) { return new TeslaZap(this, args); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +67,7 @@ namespace OpenRA.Mods.Cnc.Projectiles
|
|||||||
|
|
||||||
// Zap tracks target
|
// Zap tracks target
|
||||||
if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor))
|
if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor))
|
||||||
target = args.GuidedTarget.Positions.PositionClosestTo(args.Source);
|
target = info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source);
|
||||||
|
|
||||||
if (damageDuration-- > 0)
|
if (damageDuration-- > 0)
|
||||||
args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers);
|
args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers);
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ namespace OpenRA.Mods.Common.Projectiles
|
|||||||
[Desc("Does the beam follow the target.")]
|
[Desc("Does the beam follow the target.")]
|
||||||
public readonly bool TrackTarget = false;
|
public readonly bool TrackTarget = false;
|
||||||
|
|
||||||
|
[Desc("Ignore any other targetable positions and aim directly at center of target actor.")]
|
||||||
|
public readonly bool TargetCenterPosition = false;
|
||||||
|
|
||||||
[Desc("Should the beam be visually rendered? False = Beam is invisible.")]
|
[Desc("Should the beam be visually rendered? False = Beam is invisible.")]
|
||||||
public readonly bool RenderBeam = true;
|
public readonly bool RenderBeam = true;
|
||||||
|
|
||||||
@@ -157,7 +160,7 @@ namespace OpenRA.Mods.Common.Projectiles
|
|||||||
|
|
||||||
if (args.GuidedTarget.IsValidFor(args.SourceActor))
|
if (args.GuidedTarget.IsValidFor(args.SourceActor))
|
||||||
{
|
{
|
||||||
var guidedTargetPos = args.GuidedTarget.Positions.PositionClosestTo(args.Source);
|
var guidedTargetPos = info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : 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 +
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ namespace OpenRA.Mods.Common.Projectiles
|
|||||||
[Desc("Beam can be blocked.")]
|
[Desc("Beam can be blocked.")]
|
||||||
public readonly bool Blockable = false;
|
public readonly bool Blockable = false;
|
||||||
|
|
||||||
|
[Desc("Ignore any other targetable positions and aim directly at center of target actor.")]
|
||||||
|
public readonly bool TargetCenterPosition = false;
|
||||||
|
|
||||||
[Desc("Draw a second beam (for 'glow' effect).")]
|
[Desc("Draw a second beam (for 'glow' effect).")]
|
||||||
public readonly bool SecondaryBeam = false;
|
public readonly bool SecondaryBeam = false;
|
||||||
|
|
||||||
@@ -128,7 +131,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.Positions.PositionClosestTo(source);
|
target = info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(source);
|
||||||
|
|
||||||
// Check for blocking actors
|
// Check for blocking actors
|
||||||
WPos blockedPos;
|
WPos blockedPos;
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ namespace OpenRA.Mods.Common.Projectiles
|
|||||||
"the missile enters the radius of the current speed around the target.")]
|
"the missile enters the radius of the current speed around the target.")]
|
||||||
public readonly bool AllowSnapping = false;
|
public readonly bool AllowSnapping = false;
|
||||||
|
|
||||||
|
[Desc("Ignore any other targetable positions and aim directly at center of target actor.")]
|
||||||
|
public readonly bool TargetCenterPosition = false;
|
||||||
|
|
||||||
[Desc("Explodes when inside this proximity radius to target.",
|
[Desc("Explodes when inside this proximity radius to target.",
|
||||||
"Note: If this value is lower than the missile speed, this check might",
|
"Note: If this value is lower than the missile speed, this check might",
|
||||||
"not trigger fast enough, causing the missile to fly past the target.")]
|
"not trigger fast enough, causing the missile to fly past the target.")]
|
||||||
@@ -799,7 +802,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.Positions.PositionClosestTo(args.Source)
|
newTarPos = (info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : 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)
|
||||||
|
|||||||
Reference in New Issue
Block a user