diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 0aca544852..492a7640cc 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -170,6 +170,7 @@ + diff --git a/OpenRA.Game/Traits/RejectsOrders.cs b/OpenRA.Game/Traits/RejectsOrders.cs new file mode 100644 index 0000000000..c0eb61675c --- /dev/null +++ b/OpenRA.Game/Traits/RejectsOrders.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 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 OpenRA.Network; + +namespace OpenRA.Traits +{ + public class RejectsOrdersInfo : ITraitInfo + { + public readonly string[] Except = { }; + + public object Create(ActorInitializer init) { return new RejectsOrders(this); } + } + + public class RejectsOrders + { + public string[] Except { get { return info.Except; } } + + readonly RejectsOrdersInfo info; + + public RejectsOrders(RejectsOrdersInfo info) + { + this.info = info; + } + } + + public static class RejectsOrdersExts + { + public static bool AcceptsOrder(this Actor self, string orderString) + { + var r = self.TraitOrDefault(); + return r == null || r.Except.Contains(orderString); + } + } +} diff --git a/OpenRA.Game/Traits/ValidateOrder.cs b/OpenRA.Game/Traits/ValidateOrder.cs index fe50800bde..56fa58acdb 100644 --- a/OpenRA.Game/Traits/ValidateOrder.cs +++ b/OpenRA.Game/Traits/ValidateOrder.cs @@ -8,7 +8,6 @@ */ #endregion -using System.Collections.Generic; using OpenRA.Network; namespace OpenRA.Traits @@ -40,7 +39,7 @@ namespace OpenRA.Traits return false; } - return true; + return order.Subject.AcceptsOrder(order.OrderString); } } } diff --git a/mods/cnc/rules/aircraft.yaml b/mods/cnc/rules/aircraft.yaml index 88ae13c4eb..af1edf5993 100644 --- a/mods/cnc/rules/aircraft.yaml +++ b/mods/cnc/rules/aircraft.yaml @@ -166,6 +166,7 @@ C17: -TargetableUnit: -GainsExperience: FlyAwayOnIdle: + RejectsOrders: A10: Inherits: ^Plane @@ -194,6 +195,7 @@ A10: -Selectable: -GainsExperience: FlyAwayOnIdle: + RejectsOrders: TRAN.Husk: Inherits: ^HelicopterHusk diff --git a/mods/cnc/rules/ships.yaml b/mods/cnc/rules/ships.yaml index 820cebe690..520c144d20 100644 --- a/mods/cnc/rules/ships.yaml +++ b/mods/cnc/rules/ships.yaml @@ -29,6 +29,7 @@ BOAT: AutoTarget: AllowMovement: false WithSmoke: + RejectsOrders: LST: Inherits: ^Ship @@ -68,4 +69,4 @@ LST: PipCount: 5 AttackMove: JustMove: true - + RejectsOrders: diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index 131c92955f..c7194ccde4 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -60,6 +60,7 @@ FRIGATE: -Selectable: -GainsExperience: FlyAwayOnIdle: + RejectsOrders: ORNI: Inherits: ^Helicopter @@ -120,6 +121,7 @@ ORNI.bomber: Name: Ornithopter LeavesHusk: HuskActor: ORNI.bomber.Husk + RejectsOrders: CARRYALL.infantry: ParaDrop: @@ -149,6 +151,7 @@ CARRYALL.infantry: Name: Carryall LeavesHusk: HuskActor: CARRYALL.infantry.Husk + RejectsOrders: BADR: Inherits: CARRYALL.infantry diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index f0986f1599..48a25e81c7 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -33,6 +33,7 @@ BADR: Interval: 2 -EjectOnDeath: -GpsDot: + RejectsOrders: BADR.Bomber: CarpetBomb: @@ -70,6 +71,7 @@ BADR.Bomber: Interval: 2 -EjectOnDeath: -GpsDot: + RejectsOrders: MIG: Inherits: ^Plane @@ -341,6 +343,7 @@ U2: SmokeTrailWhenDamaged: Offset: -1c43,0,0 Interval: 2 + RejectsOrders: BADR.Husk: Inherits: ^PlaneHusk