diff --git a/OpenRA.Mods.RA/EngineerCapture.cs b/OpenRA.Mods.RA/EngineerCapture.cs index 7bb9325762..46fafb44a5 100644 --- a/OpenRA.Mods.RA/EngineerCapture.cs +++ b/OpenRA.Mods.RA/EngineerCapture.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA { get { - yield return new EnterBuildingOrderTargeter( "CaptureBuilding", 5, true, false, + yield return new EnterOrderTargeter( "CaptureBuilding", 5, true, false, _ => true, target => target.Info.Traits.Get().Capturable ); } } diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index 1a52d24419..f7bc8c5a4b 100644 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -98,7 +98,7 @@ namespace OpenRA.Mods.RA { get { - yield return new EnterBuildingOrderTargeter( "Deliver", 5, false, true, _ => true, _ => !IsEmpty ); + yield return new EnterOrderTargeter( "Deliver", 5, false, true, _ => true, _ => !IsEmpty ); yield return new HarvestOrderTargeter(); } } diff --git a/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs b/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs index 38b6205372..5ca7dced31 100755 --- a/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs +++ b/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs @@ -6,12 +6,12 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA.Orders { - class EnterBuildingOrderTargeter : UnitTraitOrderTargeter + class EnterOrderTargeter : UnitTraitOrderTargeter { readonly Func canTarget; readonly Func useEnterCursor; - public EnterBuildingOrderTargeter( string order, int priority, bool targetEnemy, bool targetAlly, + public EnterOrderTargeter( string order, int priority, bool targetEnemy, bool targetAlly, Func canTarget, Func useEnterCursor ) : base( order, priority, "enter", targetEnemy, targetAlly ) { diff --git a/OpenRA.Mods.RA/Passenger.cs b/OpenRA.Mods.RA/Passenger.cs index 12044368ed..3ecef19257 100644 --- a/OpenRA.Mods.RA/Passenger.cs +++ b/OpenRA.Mods.RA/Passenger.cs @@ -14,58 +14,58 @@ using OpenRA.Mods.RA.Activities; using OpenRA.Traits; using OpenRA.Traits.Activities; using System.Linq; +using System.Collections.Generic; +using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA { - class PassengerInfo : TraitInfo + class PassengerInfo : ITraitInfo { public readonly string CargoType = null; public readonly PipType PipType = PipType.Green; + + public object Create( ActorInitializer init ) { return new Passenger( init.self ); } } - class Passenger : IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice + class Passenger : IIssueOrder2, IResolveOrder, IOrderVoice { - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + readonly Actor self; + public Passenger( Actor self ) { this.self = self; } + + public IEnumerable Orders { - return 5; + get + { + yield return new EnterOrderTargeter( "EnterTransport", 6, false, true, + target => IsCorrectCargoType( target ), target => CanEnter( target ) ); + } } - - public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) - { - if (mi.Button != MouseButton.Right) - return null; - if (underCursor == null || underCursor.Owner != self.Owner) - return null; + public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) + { + if( order.OrderID == "EnterTransport" ) + return new Order( order.OrderID, self, target.Actor ); - var cargo = underCursor.TraitOrDefault(); - if (cargo == null) - return null; - + return null; + } + + bool IsCorrectCargoType( Actor target ) + { var pi = self.Info.Traits.Get(); - var ci = underCursor.Info.Traits.Get(); - if (!ci.Types.Contains(pi.CargoType)) - return null; - - return new Order("EnterTransport", self, underCursor); - } - - bool CanEnter(Actor self, Actor a) - { - var cargo = a.TraitOrDefault(); - return (cargo != null && !cargo.IsFull(a)); - } - - public string CursorForOrder(Actor self, Order order) - { - if (order.OrderString != "EnterTransport") return null; - return CanEnter(self, order.TargetActor) ? "enter" : "enter-blocked"; + var ci = target.Info.Traits.Get(); + return ci.Types.Contains( pi.CargoType ); } + bool CanEnter( Actor target ) + { + var cargo = target.TraitOrDefault(); + return (cargo != null && !cargo.IsFull(target)); + } + public string VoicePhraseForOrder(Actor self, Order order) { if (order.OrderString != "EnterTransport" || - !CanEnter(self, order.TargetActor)) return null; + !CanEnter(order.TargetActor)) return null; return "Move"; } @@ -73,7 +73,7 @@ namespace OpenRA.Mods.RA { if (order.OrderString == "EnterTransport") { - if (!CanEnter(self, order.TargetActor)) return; + if (!CanEnter(order.TargetActor)) return; if (self.Owner == self.World.LocalPlayer) self.World.AddFrameEndTask(w => diff --git a/OpenRA.Mods.RA/Repairable.cs b/OpenRA.Mods.RA/Repairable.cs index 3d544a1f74..ad45b9d98d 100644 --- a/OpenRA.Mods.RA/Repairable.cs +++ b/OpenRA.Mods.RA/Repairable.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.RA public IEnumerable Orders { - get { yield return new EnterBuildingOrderTargeter( "Repair", 5, false, true, target => CanRepairAt( target ), _ => CanRepair() ); } + get { yield return new EnterOrderTargeter( "Repair", 5, false, true, target => CanRepairAt( target ), _ => CanRepair() ); } } public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) diff --git a/OpenRA.Mods.RA/RepairableNear.cs b/OpenRA.Mods.RA/RepairableNear.cs index e28959d0e8..c0e3240795 100644 --- a/OpenRA.Mods.RA/RepairableNear.cs +++ b/OpenRA.Mods.RA/RepairableNear.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.RA { get { - yield return new EnterBuildingOrderTargeter( "RepairNear", 5, false, true, + yield return new EnterOrderTargeter( "RepairNear", 5, false, true, target => CanRepairAt( target ), _ => ShouldRepair() ); } }