diff --git a/OpenRA.Game/Network/Order.cs b/OpenRA.Game/Network/Order.cs index ea157e0746..f2ab3cbff9 100644 --- a/OpenRA.Game/Network/Order.cs +++ b/OpenRA.Game/Network/Order.cs @@ -112,11 +112,10 @@ namespace OpenRA if (world == null || !TryGetActorFromUInt(world, playerActorID, out playerActor)) break; - var frozenLayer = playerActor.TraitOrDefault(); - 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); diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 3933ecce50..40402d6fb5 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -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; /// The faction (including Random, etc) that was selected in the lobby. 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(); + FrozenActorLayer = PlayerActor.TraitOrDefault(); // Enable the bot logic on the host IsBot = BotType != null; diff --git a/OpenRA.Mods.Cnc/Effects/GpsDotEffect.cs b/OpenRA.Mods.Cnc/Effects/GpsDotEffect.cs index a73b6122a2..15f32dfb25 100644 --- a/OpenRA.Mods.Cnc/Effects/GpsDotEffect.cs +++ b/OpenRA.Mods.Cnc/Effects/GpsDotEffect.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Cnc.Effects visibilityModifiers = actor.TraitsImplementing().ToArray(); dotStates = new PlayerDictionary(actor.World, - p => new DotState(actor, p.PlayerActor.Trait(), p.PlayerActor.TraitOrDefault())); + p => new DotState(actor, p.PlayerActor.Trait(), p.FrozenActorLayer)); } bool ShouldRender(DotState state, Player toPlayer) diff --git a/OpenRA.Mods.Cnc/Traits/FrozenUnderFogUpdatedByGps.cs b/OpenRA.Mods.Cnc/Traits/FrozenUnderFogUpdatedByGps.cs index d16d8ca847..f3082d65bf 100644 --- a/OpenRA.Mods.Cnc/Traits/FrozenUnderFogUpdatedByGps.cs +++ b/OpenRA.Mods.Cnc/Traits/FrozenUnderFogUpdatedByGps.cs @@ -49,7 +49,7 @@ namespace OpenRA.Mods.Cnc.Traits public readonly GpsWatcher GpsWatcher; public Traits(Player player, FrozenUnderFogUpdatedByGps frozenUnderFogUpdatedByGps) { - FrozenActorLayer = player.PlayerActor.TraitOrDefault(); + FrozenActorLayer = player.FrozenActorLayer; GpsWatcher = player.PlayerActor.TraitOrDefault(); GpsWatcher.RegisterForOnGpsRefreshed(frozenUnderFogUpdatedByGps.self, frozenUnderFogUpdatedByGps); } diff --git a/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs b/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs index 0b59026ac4..a6cc850b15 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs @@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits } /// Evaluates the attractiveness of a position according to all considerations - 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) diff --git a/OpenRA.Mods.Common/Traits/BotModules/SupportPowerBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/SupportPowerBotModule.cs index 0bbee1e596..626bff9980 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/SupportPowerBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/SupportPowerBotModule.cs @@ -41,7 +41,6 @@ namespace OpenRA.Mods.Common.Traits { readonly World world; readonly Player player; - FrozenActorLayer frozenLayer; SupportPowerManager supportPowerManager; Dictionary waitingPowers = new Dictionary(); Dictionary powerDecisions = new Dictionary(); @@ -55,7 +54,6 @@ namespace OpenRA.Mods.Common.Traits protected override void TraitEnabled(Actor self) { - frozenLayer = player.PlayerActor.TraitOrDefault(); supportPowerManager = player.PlayerActor.Trait(); 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(); + var frozenTargets = player.FrozenActorLayer != null ? player.FrozenActorLayer.FrozenActorsInRegion(region) : Enumerable.Empty(); 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;