diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 6214752d43..bd692b3b31 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -215,6 +215,7 @@ + diff --git a/OpenRA.Mods.RA/Scripting/Properties/AirstrikeProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/AirstrikeProperties.cs new file mode 100644 index 0000000000..90b4995756 --- /dev/null +++ b/OpenRA.Mods.RA/Scripting/Properties/AirstrikeProperties.cs @@ -0,0 +1,36 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Linq; +using Eluant; +using OpenRA.Mods.RA.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA.Scripting +{ + [ScriptGlobal("Air Support Powers")] + public class AirstrikeProperties : ScriptActorProperties, Requires + { + readonly AirstrikePower ap; + + public AirstrikeProperties(ScriptContext context, Actor self) + : base(context, self) + { + ap = self.TraitsImplementing().First(); + } + + [Desc("Activate the actor's Airstrike Power.")] + public void SendAirstrike(WPos target, bool randomize = true, int facing = 0) + { + ap.SendAirstrike(Self, target, randomize, facing); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs index 65711f1504..37fb741927 100644 --- a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs +++ b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs @@ -52,13 +52,20 @@ namespace OpenRA.Mods.RA.Traits { base.Activate(self, order, manager); + SendAirstrike(self, self.World.Map.CenterOfCell(order.TargetLocation)); + } + + public void SendAirstrike(Actor self, WPos target, bool randomize = true, int attackFacing = 0) + { var info = Info as AirstrikePowerInfo; - var attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); - var attackRotation = WRot.FromFacing(attackFacing); - var delta = new WVec(0, -1024, 0).Rotate(attackRotation); + + if (randomize) + attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get().CruiseAltitude.Range; - var target = self.World.Map.CenterOfCell(order.TargetLocation) + new WVec(0, 0, altitude); + var attackRotation = WRot.FromFacing(attackFacing); + var delta = new WVec(0, -1024, 0).Rotate(attackRotation); + target = target + new WVec(0, 0, altitude); var startEdge = target - (self.World.Map.DistanceToEdge(target, -delta) + info.Cordon).Range * delta / 1024; var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Range * delta / 1024; @@ -75,7 +82,7 @@ namespace OpenRA.Mods.RA.Traits { camera = w.CreateActor(info.CameraActor, new TypeDictionary { - new LocationInit(order.TargetLocation), + new LocationInit(self.World.Map.CellContaining(target)), new OwnerInit(self.Owner), }); }); @@ -149,6 +156,7 @@ namespace OpenRA.Mods.RA.Traits attack.OnExitedAttackRange += onExitRange; attack.OnRemovedFromWorld += onExitRange; + a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset))); a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset))); a.QueueActivity(new RemoveSelf()); aircraftInRange.Add(a, false); @@ -160,8 +168,8 @@ namespace OpenRA.Mods.RA.Traits var distance = (target - startEdge).HorizontalLength; beacon = new Beacon( - order.Player, - self.World.Map.CenterOfCell(order.TargetLocation), + self.Owner, + target, Info.BeaconPalettePrefix, Info.BeaconPoster, Info.BeaconPosterPalette,