From 30cf8c204bb77a7dda176c206d0295119c589db3 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Tue, 26 Jul 2016 21:15:25 +0200 Subject: [PATCH] Fix desync when removing smudges The cause of the crash was that the `RemoveSmudge` method only invokes `SharedRandom` in the else-branch of an if condition that is only taken when the `RenderPlayer` has fog visibility on the location (locations the `RenderPlayer` can see get removed from `dirty` in `TickRender`). To add insult to injury, the `Type` field does not even need to get set since we are only using the `Sprite` field's `null` value as a marker to be picked up by the `TickRender` method. The `Type` field is only ever used twice in `AddSmudge`, in a branch of an if-condition that will not be taken when the `Sprite` field is null, which we set explicitly. The same holds true for the `Depth` field. --- OpenRA.Mods.Common/Traits/World/SmudgeLayer.cs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/World/SmudgeLayer.cs b/OpenRA.Mods.Common/Traits/World/SmudgeLayer.cs index 1cd7714c12..2d42270d0d 100644 --- a/OpenRA.Mods.Common/Traits/World/SmudgeLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/SmudgeLayer.cs @@ -165,18 +165,10 @@ namespace OpenRA.Mods.Common.Traits public void RemoveSmudge(CPos loc) { - if (dirty.ContainsKey(loc)) - { - var tile = dirty[loc]; - tile.Depth = 0; - tile.Sprite = null; - dirty[loc] = tile; - } - else - { - var st = smudges.Keys.Random(world.SharedRandom); - dirty[loc] = new Smudge { Type = st, Depth = 0, Sprite = null }; - } + var tile = dirty.ContainsKey(loc) ? dirty[loc] : new Smudge(); + + tile.Sprite = null; + dirty[loc] = tile; } public void TickRender(WorldRenderer wr, Actor self)