diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 08188f794a..4a744a4b1a 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -336,14 +336,10 @@ namespace OpenRA.Network break; if (order.GroupedActors == null) - ResolveOrder(order, world.WorldActor.TraitsImplementing(), orderManager, clientId); + ResolveOrder(order, world.OrderValidators, orderManager, clientId); else - { - // PERF: Cache the result of TraitsImplementing as we are likely to use it for several order subjects - var validateOrders = world.WorldActor.TraitsImplementing().ToArray(); foreach (var subject in order.GroupedActors) - ResolveOrder(Order.FromGroupedOrder(order, subject), validateOrders, orderManager, clientId); - } + ResolveOrder(Order.FromGroupedOrder(order, subject), world.OrderValidators, orderManager, clientId); break; } diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 8f8f68ad58..55d94fefc9 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -142,6 +142,8 @@ namespace OpenRA public readonly ScreenMap ScreenMap; public readonly WorldType Type; + public readonly IValidateOrder[] OrderValidators; + readonly GameInformation gameInfo; // Hide the OrderManager from mod code @@ -203,6 +205,7 @@ namespace OpenRA ActorMap = WorldActor.Trait(); ScreenMap = WorldActor.Trait(); Selection = WorldActor.Trait(); + OrderValidators = WorldActor.TraitsImplementing().ToArray(); // Reset mask LongBitSet.Reset();