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.
This commit is contained in:
Oliver Brakmann
2016-07-26 21:15:25 +02:00
parent d36be5b4ee
commit 30cf8c204b

View File

@@ -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)