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 IFacing facing;
readonly IHealth health; readonly IHealth health;
readonly IResolveOrder[] resolveOrders;
readonly IRenderModifier[] renderModifiers; readonly IRenderModifier[] renderModifiers;
readonly IRender[] renders; readonly IRender[] renders;
readonly IMouseBounds[] mouseBounds; readonly IMouseBounds[] mouseBounds;
@@ -156,6 +157,7 @@ namespace OpenRA
EffectiveOwner = TraitOrDefault<IEffectiveOwner>(); EffectiveOwner = TraitOrDefault<IEffectiveOwner>();
facing = TraitOrDefault<IFacing>(); facing = TraitOrDefault<IFacing>();
health = TraitOrDefault<IHealth>(); health = TraitOrDefault<IHealth>();
resolveOrders = TraitsImplementing<IResolveOrder>().ToArray();
renderModifiers = TraitsImplementing<IRenderModifier>().ToArray(); renderModifiers = TraitsImplementing<IRenderModifier>().ToArray();
renders = TraitsImplementing<IRender>().ToArray(); renders = TraitsImplementing<IRender>().ToArray();
mouseBounds = TraitsImplementing<IMouseBounds>().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. // TODO: move elsewhere.
public void ChangeOwner(Player newOwner) public void ChangeOwner(Player newOwner)
{ {

View File

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