Added a lua function for airstrikes

This commit is contained in:
abcdefg30
2014-12-25 23:26:17 +01:00
parent 3ea70e891d
commit 660f43cc66
3 changed files with 52 additions and 7 deletions

View File

@@ -215,6 +215,7 @@
<Compile Include="Widgets\Logic\LobbyMapPreviewLogic.cs" />
<Compile Include="Widgets\Logic\ControlGroupLogic.cs" />
<Compile Include="Scripting\Global\ReinforcementsGlobal.cs" />
<Compile Include="Scripting\Properties\AirstrikeProperties.cs" />
<Compile Include="Scripting\Properties\ProductionProperties.cs" />
<Compile Include="Scripting\Properties\MissionObjectiveProperties.cs" />
<Compile Include="Scripting\Properties\MobileProperties.cs" />

View File

@@ -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<AirstrikePowerInfo>
{
readonly AirstrikePower ap;
public AirstrikeProperties(ScriptContext context, Actor self)
: base(context, self)
{
ap = self.TraitsImplementing<AirstrikePower>().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);
}
}
}

View File

@@ -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<PlaneInfo>().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,