Make airlift landing direction configurable.
This commit is contained in:
@@ -33,14 +33,14 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
[Desc("The cargo aircraft will spawn at the player baseline (map edge closest to the player spawn)")]
|
[Desc("The cargo aircraft will spawn at the player baseline (map edge closest to the player spawn)")]
|
||||||
public readonly bool BaselineSpawn = false;
|
public readonly bool BaselineSpawn = false;
|
||||||
|
|
||||||
|
[Desc("Direction the aircraft should face to land.")]
|
||||||
|
public readonly int Facing = 64;
|
||||||
|
|
||||||
public override object Create(ActorInitializer init) { return new ProductionAirdrop(init, this); }
|
public override object Create(ActorInitializer init) { return new ProductionAirdrop(init, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class ProductionAirdrop : Production
|
class ProductionAirdrop : Production
|
||||||
{
|
{
|
||||||
CPos startPos;
|
|
||||||
CPos endPos;
|
|
||||||
|
|
||||||
public ProductionAirdrop(ActorInitializer init, ProductionAirdropInfo info)
|
public ProductionAirdrop(ActorInitializer init, ProductionAirdropInfo info)
|
||||||
: base(init, info) { }
|
: base(init, info) { }
|
||||||
|
|
||||||
@@ -55,6 +55,10 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
var aircraftInfo = self.World.Map.Rules.Actors[info.ActorType].TraitInfo<AircraftInfo>();
|
var aircraftInfo = self.World.Map.Rules.Actors[info.ActorType].TraitInfo<AircraftInfo>();
|
||||||
var mpStart = owner.World.WorldActor.TraitOrDefault<MPStartLocations>();
|
var mpStart = owner.World.WorldActor.TraitOrDefault<MPStartLocations>();
|
||||||
|
|
||||||
|
CPos startPos;
|
||||||
|
CPos endPos;
|
||||||
|
int spawnFacing;
|
||||||
|
|
||||||
if (info.BaselineSpawn && mpStart != null)
|
if (info.BaselineSpawn && mpStart != null)
|
||||||
{
|
{
|
||||||
var spawn = mpStart.Start[owner];
|
var spawn = mpStart.Start[owner];
|
||||||
@@ -63,6 +67,8 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
var spawnVec = spawn - center;
|
var spawnVec = spawn - center;
|
||||||
startPos = spawn + spawnVec * (Exts.ISqrt((bounds.Height * bounds.Height + bounds.Width * bounds.Width) / (4 * spawnVec.LengthSquared)));
|
startPos = spawn + spawnVec * (Exts.ISqrt((bounds.Height * bounds.Height + bounds.Width * bounds.Width) / (4 * spawnVec.LengthSquared)));
|
||||||
endPos = startPos;
|
endPos = startPos;
|
||||||
|
var spawnDirection = new WVec((self.Location - startPos).X, (self.Location - startPos).Y, 0);
|
||||||
|
spawnFacing = spawnDirection.Yaw.Facing;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -71,6 +77,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
var loc = self.Location.ToMPos(map);
|
var loc = self.Location.ToMPos(map);
|
||||||
startPos = new MPos(loc.U + map.Bounds.Width, loc.V).ToCPos(map);
|
startPos = new MPos(loc.U + map.Bounds.Width, loc.V).ToCPos(map);
|
||||||
endPos = new MPos(map.Bounds.Left, loc.V).ToCPos(map);
|
endPos = new MPos(map.Bounds.Left, loc.V).ToCPos(map);
|
||||||
|
spawnFacing = info.Facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assume a single exit point for simplicity
|
// Assume a single exit point for simplicity
|
||||||
@@ -88,11 +95,11 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
{
|
{
|
||||||
new CenterPositionInit(w.Map.CenterOfCell(startPos) + new WVec(WDist.Zero, WDist.Zero, aircraftInfo.CruiseAltitude)),
|
new CenterPositionInit(w.Map.CenterOfCell(startPos) + new WVec(WDist.Zero, WDist.Zero, aircraftInfo.CruiseAltitude)),
|
||||||
new OwnerInit(owner),
|
new OwnerInit(owner),
|
||||||
new FacingInit(64)
|
new FacingInit(spawnFacing)
|
||||||
});
|
});
|
||||||
|
|
||||||
var exitCell = self.Location + exit.ExitCell;
|
var exitCell = self.Location + exit.ExitCell;
|
||||||
actor.QueueActivity(new Land(actor, Target.FromActor(self), WDist.Zero, WVec.Zero, 64, clearCells: new CPos[1] { exitCell }));
|
actor.QueueActivity(new Land(actor, Target.FromActor(self), WDist.Zero, WVec.Zero, info.Facing, clearCells: new CPos[1] { exitCell }));
|
||||||
actor.QueueActivity(new CallFunc(() =>
|
actor.QueueActivity(new CallFunc(() =>
|
||||||
{
|
{
|
||||||
if (!self.IsInWorld || self.IsDead)
|
if (!self.IsInWorld || self.IsDead)
|
||||||
|
|||||||
Reference in New Issue
Block a user