Cache FrozenActorLayer on the Player object.
This avoids unnecessary trait queries.
This commit is contained in:
committed by
Oliver Brakmann
parent
f238e2c5cc
commit
3e490e5843
@@ -112,11 +112,10 @@ namespace OpenRA
|
||||
if (world == null || !TryGetActorFromUInt(world, playerActorID, out playerActor))
|
||||
break;
|
||||
|
||||
var frozenLayer = playerActor.TraitOrDefault<FrozenActorLayer>();
|
||||
if (frozenLayer == null)
|
||||
if (playerActor.Owner.FrozenActorLayer == null)
|
||||
break;
|
||||
|
||||
var frozen = frozenLayer.FromID(frozenActorID);
|
||||
var frozen = playerActor.Owner.FrozenActorLayer.FromID(frozenActorID);
|
||||
if (frozen != null)
|
||||
target = Target.FromFrozenActor(frozen);
|
||||
|
||||
|
||||
@@ -56,6 +56,8 @@ namespace OpenRA
|
||||
public readonly PlayerReference PlayerReference;
|
||||
public readonly bool IsBot;
|
||||
public readonly string BotType;
|
||||
public readonly Shroud Shroud;
|
||||
public readonly FrozenActorLayer FrozenActorLayer;
|
||||
|
||||
/// <summary>The faction (including Random, etc) that was selected in the lobby.</summary>
|
||||
public readonly FactionInfo DisplayFaction;
|
||||
@@ -65,7 +67,6 @@ namespace OpenRA
|
||||
public bool HasObjectives = false;
|
||||
public bool Spectating;
|
||||
|
||||
public Shroud Shroud;
|
||||
public World World { get; private set; }
|
||||
|
||||
readonly bool inMissionMap;
|
||||
@@ -156,6 +157,7 @@ namespace OpenRA
|
||||
var playerActorType = world.Type == WorldType.Editor ? "EditorPlayer" : "Player";
|
||||
PlayerActor = world.CreateActor(playerActorType, new TypeDictionary { new OwnerInit(this) });
|
||||
Shroud = PlayerActor.Trait<Shroud>();
|
||||
FrozenActorLayer = PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
||||
|
||||
// Enable the bot logic on the host
|
||||
IsBot = BotType != null;
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace OpenRA.Mods.Cnc.Effects
|
||||
visibilityModifiers = actor.TraitsImplementing<IVisibilityModifier>().ToArray();
|
||||
|
||||
dotStates = new PlayerDictionary<DotState>(actor.World,
|
||||
p => new DotState(actor, p.PlayerActor.Trait<GpsWatcher>(), p.PlayerActor.TraitOrDefault<FrozenActorLayer>()));
|
||||
p => new DotState(actor, p.PlayerActor.Trait<GpsWatcher>(), p.FrozenActorLayer));
|
||||
}
|
||||
|
||||
bool ShouldRender(DotState state, Player toPlayer)
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
||||
public readonly GpsWatcher GpsWatcher;
|
||||
public Traits(Player player, FrozenUnderFogUpdatedByGps frozenUnderFogUpdatedByGps)
|
||||
{
|
||||
FrozenActorLayer = player.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
||||
FrozenActorLayer = player.FrozenActorLayer;
|
||||
GpsWatcher = player.PlayerActor.TraitOrDefault<GpsWatcher>();
|
||||
GpsWatcher.RegisterForOnGpsRefreshed(frozenUnderFogUpdatedByGps.self, frozenUnderFogUpdatedByGps);
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
}
|
||||
|
||||
/// <summary>Evaluates the attractiveness of a position according to all considerations</summary>
|
||||
public int GetAttractiveness(WPos pos, Player firedBy, FrozenActorLayer frozenLayer)
|
||||
public int GetAttractiveness(WPos pos, Player firedBy)
|
||||
{
|
||||
var answer = 0;
|
||||
var world = firedBy.World;
|
||||
@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var delta = new WVec(radiusToUse, radiusToUse, WDist.Zero);
|
||||
var tl = world.Map.CellContaining(pos - delta);
|
||||
var br = world.Map.CellContaining(pos + delta);
|
||||
var checkFrozen = frozenLayer.FrozenActorsInRegion(new CellRegion(world.Map.Grid.Type, tl, br));
|
||||
var checkFrozen = firedBy.FrozenActorLayer.FrozenActorsInRegion(new CellRegion(world.Map.Grid.Type, tl, br));
|
||||
|
||||
// IsValid check filters out Frozen Actors that have not initizialized their Owner
|
||||
foreach (var scrutinized in checkFrozen)
|
||||
|
||||
@@ -41,7 +41,6 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
readonly World world;
|
||||
readonly Player player;
|
||||
FrozenActorLayer frozenLayer;
|
||||
SupportPowerManager supportPowerManager;
|
||||
Dictionary<SupportPowerInstance, int> waitingPowers = new Dictionary<SupportPowerInstance, int>();
|
||||
Dictionary<string, SupportPowerDecision> powerDecisions = new Dictionary<string, SupportPowerDecision>();
|
||||
@@ -55,7 +54,6 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
protected override void TraitEnabled(Actor self)
|
||||
{
|
||||
frozenLayer = player.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
||||
supportPowerManager = player.PlayerActor.Trait<SupportPowerManager>();
|
||||
foreach (var decision in Info.Decisions)
|
||||
powerDecisions.Add(decision.OrderName, decision);
|
||||
@@ -140,7 +138,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var wbr = world.Map.CenterOfCell(br.ToCPos(map));
|
||||
var targets = world.ActorMap.ActorsInBox(wtl, wbr);
|
||||
|
||||
var frozenTargets = frozenLayer != null ? frozenLayer.FrozenActorsInRegion(region) : Enumerable.Empty<FrozenActor>();
|
||||
var frozenTargets = player.FrozenActorLayer != null ? player.FrozenActorLayer.FrozenActorsInRegion(region) : Enumerable.Empty<FrozenActor>();
|
||||
var consideredAttractiveness = powerDecision.GetAttractiveness(targets, player) + powerDecision.GetAttractiveness(frozenTargets, player);
|
||||
if (consideredAttractiveness <= bestAttractiveness || consideredAttractiveness < powerDecision.MinimumAttractiveness)
|
||||
continue;
|
||||
@@ -176,7 +174,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var y = checkPos.Y + j;
|
||||
var pos = world.Map.CenterOfCell(new CPos(x, y));
|
||||
var consideredAttractiveness = 0;
|
||||
consideredAttractiveness += powerDecision.GetAttractiveness(pos, player, frozenLayer);
|
||||
consideredAttractiveness += powerDecision.GetAttractiveness(pos, player);
|
||||
|
||||
if (consideredAttractiveness <= bestAttractiveness || consideredAttractiveness < powerDecision.MinimumAttractiveness)
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user