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,