Fix grouped orders not being validated correctly

This commit is contained in:
abcdefg30
2020-08-12 22:27:19 +02:00
committed by reaperrr
parent b72a58b917
commit 82a2148300

View File

@@ -27,13 +27,6 @@ namespace OpenRA.Network
internal static void ProcessOrder(OrderManager orderManager, World world, int clientId, Order order)
{
if (world != null)
{
if (!world.WorldActor.TraitsImplementing<IValidateOrder>().All(vo =>
vo.OrderValidation(orderManager, world, clientId, order)))
return;
}
switch (order.OrderString)
{
// Server message
@@ -336,20 +329,30 @@ namespace OpenRA.Network
default:
{
if (world == null)
break;
if (order.GroupedActors == null)
ResolveOrder(order);
ResolveOrder(order, world.WorldActor.TraitsImplementing<IValidateOrder>(), 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<IValidateOrder>().ToArray();
foreach (var subject in order.GroupedActors)
ResolveOrder(Order.FromGroupedOrder(order, subject));
ResolveOrder(Order.FromGroupedOrder(order, subject), validateOrders, orderManager, clientId);
}
break;
}
}
}
static void ResolveOrder(Order order)
static void ResolveOrder(Order order, IEnumerable<IValidateOrder> validateOrders, OrderManager orderManager, int clientId)
{
if (order.Subject != null && !order.Subject.IsDead)
if (order.Subject == null || order.Subject.IsDead)
return;
if (validateOrders.All(vo => vo.OrderValidation(orderManager, order.Subject.World, clientId, order)))
foreach (var t in order.Subject.TraitsImplementing<IResolveOrder>())
t.ResolveOrder(order.Subject, order);
}