diff --git a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs index 159277685c5b..c094ec40c9cd 100644 --- a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs +++ b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs @@ -42,6 +42,9 @@ public class AreaBeamInfo : IProjectileInfo [Desc("How far beyond the target the projectile keeps on travelling.")] public readonly WDist BeyondTargetRange = new WDist(0); + [Desc("The minimum distance the beam travels.")] + public readonly WDist MinDistance = WDist.Zero; + [Desc("Damage modifier applied at each range step.")] public readonly int[] Falloff = { 100, 100 }; @@ -136,7 +139,19 @@ public AreaBeam(AreaBeamInfo info, ProjectileArgs args, Color color) // Update the target position with the range we shoot beyond the target by // I.e. we can deliberately overshoot, so aim for that position var dir = new WVec(0, -1024, 0).Rotate(WRot.FromYaw(towardsTargetFacing)); - target += dir * info.BeyondTargetRange.Length / 1024; + var dist = (args.SourceActor.CenterPosition - target).Length; + int extraDist; + if (info.MinDistance.Length > dist) + { + if (info.MinDistance.Length - dist < info.BeyondTargetRange.Length) + extraDist = info.BeyondTargetRange.Length; + else + extraDist = info.MinDistance.Length - dist; + } + else + extraDist = info.BeyondTargetRange.Length; + + target += dir * extraDist / 1024; length = Math.Max((target - headPos).Length / speed.Length, 1); weaponRange = new WDist(Util.ApplyPercentageModifiers(args.Weapon.Range.Length, args.RangeModifiers)); diff --git a/mods/d2k/weapons/other.yaml b/mods/d2k/weapons/other.yaml index f4d718bb6a1b..c7f5d8df4378 100644 --- a/mods/d2k/weapons/other.yaml +++ b/mods/d2k/weapons/other.yaml @@ -13,6 +13,7 @@ Sound: Falloff: 0, 0, 100, 0 Range: 0, 0c450, 4c0, 8c0 BeyondTargetRange: 1c0 + MinDistance: 5c0 Color: 00FFFFC8 Warhead@1Dam: SpreadDamage Range: 0, 32