diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index dbd9d1a7d9..420f33d069 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -69,6 +69,9 @@ namespace OpenRA.GameRules [Desc("The minimum range the weapon can fire.")] public readonly WDist MinRange = WDist.Zero; + [Desc("Does this weapon aim at the target's center regardless of other targetable offsets?")] + public readonly bool TargetActorCenter = false; + [FieldLoader.LoadUsing("LoadProjectile")] public readonly IProjectileInfo Projectile; diff --git a/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs b/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs index da7eb8a067..633cee1167 100644 --- a/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs +++ b/OpenRA.Mods.Cnc/Projectiles/TeslaZap.cs @@ -36,9 +36,6 @@ namespace OpenRA.Mods.Cnc.Projectiles 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); } } @@ -67,7 +64,7 @@ namespace OpenRA.Mods.Cnc.Projectiles // Zap tracks target if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor)) - target = info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source); + target = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source); if (damageDuration-- > 0) args.Weapon.Impact(Target.FromPos(target), args.SourceActor, args.DamageModifiers); diff --git a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs index 5df9e9bfba..1334fab12c 100644 --- a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs +++ b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs @@ -57,9 +57,6 @@ namespace OpenRA.Mods.Common.Projectiles [Desc("Does the beam follow the target.")] 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.")] public readonly bool RenderBeam = true; @@ -160,7 +157,7 @@ namespace OpenRA.Mods.Common.Projectiles if (args.GuidedTarget.IsValidFor(args.SourceActor)) { - var guidedTargetPos = info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source); + var guidedTargetPos = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source); var targetDistance = new WDist((guidedTargetPos - args.Source).Length); // Only continue tracking target if it's within weapon range + diff --git a/OpenRA.Mods.Common/Projectiles/InstantHit.cs b/OpenRA.Mods.Common/Projectiles/InstantHit.cs index 8c8e837ee2..c79dbbf44e 100644 --- a/OpenRA.Mods.Common/Projectiles/InstantHit.cs +++ b/OpenRA.Mods.Common/Projectiles/InstantHit.cs @@ -21,9 +21,6 @@ namespace OpenRA.Mods.Common.Projectiles [Desc("Simple, invisible, usually direct-on-target projectile.")] public class InstantHitInfo : IProjectileInfo, IRulesetLoaded { - [Desc("Apply warheads directly to center of target actor.")] - public readonly bool TargetCenterPosition = false; - [Desc("Maximum offset at the maximum range.")] public readonly WDist Inaccuracy = WDist.Zero; @@ -60,9 +57,9 @@ namespace OpenRA.Mods.Common.Projectiles this.info = info; source = args.Source; - if (info.TargetCenterPosition) + if (args.Weapon.TargetActorCenter) target = args.GuidedTarget; - else if (!info.TargetCenterPosition && info.Inaccuracy.Length > 0) + else if (info.Inaccuracy.Length > 0) { var inaccuracy = Util.ApplyPercentageModifiers(info.Inaccuracy.Length, args.InaccuracyModifiers); var maxOffset = inaccuracy * (args.PassiveTarget - source).Length / args.Weapon.Range.Length; diff --git a/OpenRA.Mods.Common/Projectiles/LaserZap.cs b/OpenRA.Mods.Common/Projectiles/LaserZap.cs index c12c12a0d9..14fa1b0617 100644 --- a/OpenRA.Mods.Common/Projectiles/LaserZap.cs +++ b/OpenRA.Mods.Common/Projectiles/LaserZap.cs @@ -49,9 +49,6 @@ namespace OpenRA.Mods.Common.Projectiles [Desc("Beam can be blocked.")] 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).")] public readonly bool SecondaryBeam = false; @@ -131,7 +128,7 @@ namespace OpenRA.Mods.Common.Projectiles { // Beam tracks target if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor)) - target = info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(source); + target = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(source); // Check for blocking actors WPos blockedPos; diff --git a/OpenRA.Mods.Common/Projectiles/Missile.cs b/OpenRA.Mods.Common/Projectiles/Missile.cs index 3e11417157..1d15fa9e8d 100644 --- a/OpenRA.Mods.Common/Projectiles/Missile.cs +++ b/OpenRA.Mods.Common/Projectiles/Missile.cs @@ -137,9 +137,6 @@ namespace OpenRA.Mods.Common.Projectiles "the missile enters the radius of the current speed around the target.")] 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.", "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.")] @@ -802,7 +799,7 @@ namespace OpenRA.Mods.Common.Projectiles // Check if target position should be updated (actor visible & locked on) var newTarPos = targetPosition; if (args.GuidedTarget.IsValidFor(args.SourceActor) && lockOn) - newTarPos = (info.TargetCenterPosition ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source)) + newTarPos = (args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source)) + new WVec(WDist.Zero, WDist.Zero, info.AirburstAltitude); // Compute target's predicted velocity vector (assuming uniform circular motion) diff --git a/OpenRA.Mods.Common/Traits/Armament.cs b/OpenRA.Mods.Common/Traits/Armament.cs index 8d48277e8e..4dba224224 100644 --- a/OpenRA.Mods.Common/Traits/Armament.cs +++ b/OpenRA.Mods.Common/Traits/Armament.cs @@ -102,8 +102,6 @@ namespace OpenRA.Mods.Common.Traits public readonly Barrel[] Barrels; readonly Actor self; - readonly AttackBase[] attackTraits; - AttackBase attack; Turreted turret; AmmoPool ammoPool; BodyOrientation coords; @@ -143,7 +141,6 @@ namespace OpenRA.Mods.Common.Traits barrels.Add(new Barrel { Offset = WVec.Zero, Yaw = WAngle.Zero }); Barrels = barrels.ToArray(); - attackTraits = self.TraitsImplementing().Where(a => a.Info.Armaments.Contains(Info.Name)).ToArray(); } public virtual WDist MaxRange() @@ -206,10 +203,6 @@ namespace OpenRA.Mods.Common.Traits // The world coordinate model uses Actor.Orientation public virtual Barrel CheckFire(Actor self, IFacing facing, Target target) { - attack = attackTraits.FirstOrDefault(Exts.IsTraitEnabled); - if (attack == null) - return null; - if (IsReloading) return null; @@ -246,7 +239,7 @@ namespace OpenRA.Mods.Common.Traits Source = muzzlePosition(), CurrentSource = muzzlePosition, SourceActor = self, - PassiveTarget = attack.Info.AttackTargetCenter ? target.CenterPosition : target.Positions.PositionClosestTo(muzzlePosition()), + PassiveTarget = Weapon.TargetActorCenter ? target.CenterPosition : target.Positions.PositionClosestTo(muzzlePosition()), GuidedTarget = target }; diff --git a/mods/cnc/weapons/ballistics.yaml b/mods/cnc/weapons/ballistics.yaml index b1506bb03a..31002ced27 100644 --- a/mods/cnc/weapons/ballistics.yaml +++ b/mods/cnc/weapons/ballistics.yaml @@ -64,6 +64,7 @@ ArtilleryShell: Range: 11c0 MinRange: 3c0 Report: tnkfire2.aud + TargetActorCenter: true Projectile: Bullet Speed: 204 Blockable: false diff --git a/mods/cnc/weapons/missiles.yaml b/mods/cnc/weapons/missiles.yaml index b1d6b2f48b..fa38976502 100644 --- a/mods/cnc/weapons/missiles.yaml +++ b/mods/cnc/weapons/missiles.yaml @@ -142,6 +142,7 @@ MammothMissiles: BurstDelay: 4 Report: rocket1.aud ValidTargets: Ground + TargetActorCenter: true Projectile: Bullet Inaccuracy: 853 LaunchAngle: 62 diff --git a/mods/ra/weapons/ballistics.yaml b/mods/ra/weapons/ballistics.yaml index eb19399b85..246e1004f0 100644 --- a/mods/ra/weapons/ballistics.yaml +++ b/mods/ra/weapons/ballistics.yaml @@ -106,6 +106,7 @@ TurretGun: Inherits: ^Artillery MinRange: 3c0 Report: tank5.aud + TargetActorCenter: true Projectile: Bullet ContrailLength: 30 @@ -116,6 +117,7 @@ TurretGun: Range: 16c0 Burst: 2 Report: turret1.aud + TargetActorCenter: true Projectile: Bullet Inaccuracy: 2c938 ContrailLength: 30 diff --git a/mods/ra/weapons/missiles.yaml b/mods/ra/weapons/missiles.yaml index 9b5aa21c59..f34f475d6f 100644 --- a/mods/ra/weapons/missiles.yaml +++ b/mods/ra/weapons/missiles.yaml @@ -295,6 +295,7 @@ TorpTube: SubMissile: Inherits: ^SubMissileDefault Range: 16c0 + TargetActorCenter: true -Projectile: Projectile: Bullet Speed: 162 diff --git a/mods/ts/weapons/ballisticweapons.yaml b/mods/ts/weapons/ballisticweapons.yaml index 24e6c68fa1..acf833c402 100644 --- a/mods/ts/weapons/ballisticweapons.yaml +++ b/mods/ts/weapons/ballisticweapons.yaml @@ -98,6 +98,7 @@ RPGTower: Inherits: ^ArtilleryWeapon ReloadDelay: 110 Range: 18c0 + TargetActorCenter: true Projectile: Bullet Speed: 384 LaunchAngle: 165 @@ -117,6 +118,7 @@ Jugg90mm: BurstDelay: 3 -Report: StartBurstReport: jugger1.aud + TargetActorCenter: true Projectile: Bullet Speed: 384 LaunchAngle: 165 diff --git a/mods/ts/weapons/energyweapons.yaml b/mods/ts/weapons/energyweapons.yaml index a83e7a0fa0..c30aef18f0 100644 --- a/mods/ts/weapons/energyweapons.yaml +++ b/mods/ts/weapons/energyweapons.yaml @@ -200,8 +200,8 @@ TurretLaserFire: Damage: 30 LaserFence: + TargetActorCenter: true Projectile: InstantHit - TargetCenterPosition: true Warhead@1Dam: TargetDamage DebugOverlayColor: FF0000 Damage: 99999 diff --git a/mods/ts/weapons/healweapons.yaml b/mods/ts/weapons/healweapons.yaml index da57d23352..21a228869a 100644 --- a/mods/ts/weapons/healweapons.yaml +++ b/mods/ts/weapons/healweapons.yaml @@ -3,8 +3,8 @@ Range: 2c849 Report: healer1.aud ValidTargets: Infantry + TargetActorCenter: true Projectile: InstantHit - TargetCenterPosition: true Warhead@1Dam: TargetDamage DebugOverlayColor: 00FF00 Damage: -50 diff --git a/mods/ts/weapons/otherweapons.yaml b/mods/ts/weapons/otherweapons.yaml index 238f61601f..ae96e3c0c4 100644 --- a/mods/ts/weapons/otherweapons.yaml +++ b/mods/ts/weapons/otherweapons.yaml @@ -28,6 +28,7 @@ Bomb: Burst: 5 BurstDelay: 6 Range: 2c512 + TargetActorCenter: true Projectile: GravityBomb Velocity: 72, 0, -90 Acceleration: 0, 0, -8