Cache IResolveOrder traits on Actor

Avoids looking up all of them each time
an actor is given an order.
This commit is contained in:
reaperrr
2020-09-15 10:55:40 +02:00
committed by Paul Chote
parent a4a409f39b
commit f67b7ad837
2 changed files with 9 additions and 2 deletions

View File

@@ -102,6 +102,7 @@ namespace OpenRA
readonly IFacing facing;
readonly IHealth health;
readonly IResolveOrder[] resolveOrders;
readonly IRenderModifier[] renderModifiers;
readonly IRender[] renders;
readonly IMouseBounds[] mouseBounds;
@@ -156,6 +157,7 @@ namespace OpenRA
EffectiveOwner = TraitOrDefault<IEffectiveOwner>();
facing = TraitOrDefault<IFacing>();
health = TraitOrDefault<IHealth>();
resolveOrders = TraitsImplementing<IResolveOrder>().ToArray();
renderModifiers = TraitsImplementing<IRenderModifier>().ToArray();
renders = TraitsImplementing<IRender>().ToArray();
mouseBounds = TraitsImplementing<IMouseBounds>().ToArray();
@@ -404,6 +406,12 @@ namespace OpenRA
});
}
public void ResolveOrder(Order order)
{
foreach (var r in resolveOrders)
r.ResolveOrder(this, order);
}
// TODO: move elsewhere.
public void ChangeOwner(Player newOwner)
{

View File

@@ -352,8 +352,7 @@ namespace OpenRA.Network
return;
if (world.OrderValidators.All(vo => vo.OrderValidation(orderManager, world, clientId, order)))
foreach (var t in order.Subject.TraitsImplementing<IResolveOrder>())
t.ResolveOrder(order.Subject, order);
order.Subject.ResolveOrder(order);
}
static void SetOrderLag(OrderManager o)