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