diff --git a/OpenRA.Mods.RA/Activities/Rearm.cs b/OpenRA.Mods.RA/Activities/Rearm.cs index e62abe851b..48f050f33d 100644 --- a/OpenRA.Mods.RA/Activities/Rearm.cs +++ b/OpenRA.Mods.RA/Activities/Rearm.cs @@ -9,6 +9,7 @@ #endregion using System.Linq; +using OpenRA.Mods.RA.Air; using OpenRA.Mods.RA.Render; using OpenRA.Traits; @@ -34,11 +35,17 @@ namespace OpenRA.Mods.RA.Activities if (--remainingTicks == 0) { - if (!limitedAmmo.GiveAmmo()) return NextActivity; - var hostBuilding = self.World.ActorMap.GetUnitsAt(self.Location) .FirstOrDefault(a => a.HasTrait()); + if (!limitedAmmo.GiveAmmo()) + { + var helicopter = self.TraitOrDefault(); + if (helicopter != null) + return helicopter.TakeOff(hostBuilding); + else return NextActivity; + } + if (hostBuilding != null) hostBuilding.Trait().PlayCustomAnim(hostBuilding, "active"); diff --git a/OpenRA.Mods.RA/Activities/Repair.cs b/OpenRA.Mods.RA/Activities/Repair.cs index 0e07c53563..70247863f1 100644 --- a/OpenRA.Mods.RA/Activities/Repair.cs +++ b/OpenRA.Mods.RA/Activities/Repair.cs @@ -9,6 +9,7 @@ #endregion using System; +using OpenRA.Mods.RA.Air; using OpenRA.Mods.RA.Render; using OpenRA.Traits; @@ -30,7 +31,13 @@ namespace OpenRA.Mods.RA.Activities health = self.TraitOrDefault(); if (health == null) return NextActivity; if (health.DamageState == DamageState.Undamaged) + { + var helicopter = self.TraitOrDefault(); + if (helicopter != null) + return helicopter.TakeOff(host); + return NextActivity; + } if (remainingTicks == 0) { @@ -44,6 +51,7 @@ namespace OpenRA.Mods.RA.Activities remainingTicks = 1; return this; } + self.InflictDamage(self, -hpToRepair, null); if (host != null) diff --git a/OpenRA.Mods.RA/Air/Aircraft.cs b/OpenRA.Mods.RA/Air/Aircraft.cs index 1672a3548b..aff9c13b31 100755 --- a/OpenRA.Mods.RA/Air/Aircraft.cs +++ b/OpenRA.Mods.RA/Air/Aircraft.cs @@ -171,7 +171,7 @@ namespace OpenRA.Mods.RA.Air return info.LandableTerrainTypes.Contains(type); } - public IEnumerable GetResupplyActivities(Actor a) + public virtual IEnumerable GetResupplyActivities(Actor a) { var name = a.Info.Name; if (info.RearmBuildings.Contains(name)) diff --git a/OpenRA.Mods.RA/Air/Helicopter.cs b/OpenRA.Mods.RA/Air/Helicopter.cs index 8996daec2b..f6e22e1b98 100755 --- a/OpenRA.Mods.RA/Air/Helicopter.cs +++ b/OpenRA.Mods.RA/Air/Helicopter.cs @@ -8,6 +8,7 @@ */ #endregion +using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.Mods.RA.Activities; @@ -114,6 +115,12 @@ namespace OpenRA.Mods.RA.Air firstTick = false; if (!self.HasTrait()) // TODO: Aircraft husks don't properly unreserve. ReserveSpawnBuilding(); + + var afld = GetActorBelow(); + if (afld == null) + return; + + self.QueueActivity(TakeOff(afld)); } // Repulsion only applies when we're flying! @@ -170,5 +177,31 @@ namespace OpenRA.Mods.RA.Air // TODO: Ignore repulsion when moving return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new HeliFly(self, Target.FromPos(toPos))); } + + public override IEnumerable GetResupplyActivities(Actor a) + { + foreach (var b in base.GetResupplyActivities(a)) + yield return b; + } + + public Activity TakeOff(Actor a) + { + self.CancelActivity(); + if (Reservation != null) + { + Reservation.Dispose(); + Reservation = null; + } + + if (a != null) + { + if (a.HasTrait()) + return new HeliFly(self, Target.FromCell(a.Trait().rallyPoint)); + + return new HeliFly(self, Target.FromPos(a.CenterPosition)); + } + + return new HeliFly(self, Target.FromPos(self.CenterPosition)); + } } } diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 4cb0180325..8e4c781af3 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -928,6 +928,7 @@ HPAD: SpawnOffset: 0,-256,0 ExitCell: 0,0 MoveIntoWorld: false + RallyPoint: Production: Produces: Helicopter Reservable: