From 95dc9cb1d29ce5dcecac7649a2426ef7a0aa0eb7 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 4 Feb 2019 19:21:27 +0000 Subject: [PATCH] Defer UpdateFrozenActor until the end of the tick. Updating the frozen actor calls Actor.GetTargetablePositions, and so we must guarantee that Created has been called for the ITargetablePositions traits first. --- .../Traits/Modifiers/FrozenUnderFog.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs index 95a74cec70..7897c6b83b 100644 --- a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs @@ -74,11 +74,16 @@ namespace OpenRA.Mods.Common.Traits return new FrozenState(frozenActor) { IsVisible = startsRevealed }; }); - if (startsRevealed) - for (var playerIndex = 0; playerIndex < frozenStates.Count; playerIndex++) - UpdateFrozenActor(self, frozenStates[playerIndex].FrozenActor, playerIndex); + // Defer updating the frozen actor until we are sure that the + // actor's ITargetablePositions traits have been initialized + self.World.AddFrameEndTask(w => + { + if (startsRevealed) + for (var playerIndex = 0; playerIndex < frozenStates.Count; playerIndex++) + UpdateFrozenActor(self, frozenStates[playerIndex].FrozenActor, playerIndex); - created = true; + created = true; + }); } void UpdateFrozenActor(Actor self, FrozenActor frozenActor, int playerIndex)