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