Fix grouped orders not being validated correctly
This commit is contained in:
@@ -27,13 +27,6 @@ namespace OpenRA.Network
|
|||||||
|
|
||||||
internal static void ProcessOrder(OrderManager orderManager, World world, int clientId, Order order)
|
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)
|
switch (order.OrderString)
|
||||||
{
|
{
|
||||||
// Server message
|
// Server message
|
||||||
@@ -336,20 +329,30 @@ namespace OpenRA.Network
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
if (world == null)
|
||||||
|
break;
|
||||||
|
|
||||||
if (order.GroupedActors == null)
|
if (order.GroupedActors == null)
|
||||||
ResolveOrder(order);
|
ResolveOrder(order, world.WorldActor.TraitsImplementing<IValidateOrder>(), orderManager, clientId);
|
||||||
else
|
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)
|
foreach (var subject in order.GroupedActors)
|
||||||
ResolveOrder(Order.FromGroupedOrder(order, subject));
|
ResolveOrder(Order.FromGroupedOrder(order, subject), validateOrders, orderManager, clientId);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
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>())
|
foreach (var t in order.Subject.TraitsImplementing<IResolveOrder>())
|
||||||
t.ResolveOrder(order.Subject, order);
|
t.ResolveOrder(order.Subject, order);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user