diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs index 5a8178192a..d8cf8430ba 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs @@ -65,10 +65,11 @@ namespace OpenRA.Mods.Common.Widgets var underCursor = editorLayer.PreviewsAt(worldRenderer.Viewport.ViewToWorldPx(mi.Location)) .FirstOrDefault(); + var mapResources = world.Map.MapResources.Value; ResourceType type; if (underCursor != null) editorWidget.SetTooltip(underCursor.Tooltip); - else if (world.Map.Contains(cell) && resources.TryGetValue(world.Map.MapResources.Value[cell].Type, out type)) + else if (mapResources.Contains(cell) && resources.TryGetValue(mapResources[cell].Type, out type)) editorWidget.SetTooltip(type.Info.Name); else editorWidget.SetTooltip(null); @@ -84,8 +85,8 @@ namespace OpenRA.Mods.Common.Widgets if (underCursor != null) editorLayer.Remove(underCursor); - if (world.Map.MapResources.Value[cell].Type != 0) - world.Map.MapResources.Value[cell] = new ResourceTile(); + if (mapResources.Contains(cell) && mapResources[cell].Type != 0) + mapResources[cell] = new ResourceTile(); } else if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down) { diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorResourceBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorResourceBrush.cs index bfd73fe4f6..965d4285c6 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorResourceBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorResourceBrush.cs @@ -82,7 +82,8 @@ namespace OpenRA.Mods.Common.Widgets public bool AllowResourceAt(CPos cell) { - if (!world.Map.Contains(cell)) + var mapResources = world.Map.MapResources.Value; + if (!mapResources.Contains(cell)) return false; var tile = world.Map.MapTiles.Value[cell]; @@ -92,7 +93,7 @@ namespace OpenRA.Mods.Common.Widgets var terrainType = world.TileSet.TerrainInfo[tileInfo.TerrainType]; - if (world.Map.MapResources.Value[cell].Type == ResourceType.ResourceType) + if (mapResources[cell].Type == ResourceType.ResourceType) return false; if (!ResourceType.AllowedTerrainTypes.Contains(terrainType.Type)) diff --git a/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs index 1c6ba077f5..f90f549466 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs @@ -86,11 +86,7 @@ namespace OpenRA.Mods.Common.Traits // so we must also touch all the neighbouring tiles Dirty.Add(cell); foreach (var d in CVec.Directions) - { - var c = cell + d; - if (Map.Contains(c)) - Dirty.Add(c); - } + Dirty.Add(cell + d); } protected virtual string ChooseRandomVariant(ResourceType t) @@ -103,10 +99,16 @@ namespace OpenRA.Mods.Common.Traits // Set density based on the number of neighboring resources var adjacent = 0; var type = Tiles[c].Type; + var resources = Map.MapResources.Value; for (var u = -1; u < 2; u++) + { for (var v = -1; v < 2; v++) - if (Map.MapResources.Value[c + new CVec(u, v)].Type == type.Info.ResourceType) + { + var cell = c + new CVec(u, v); + if (resources.Contains(cell) && resources[cell].Type == type.Info.ResourceType) adjacent++; + } + } return Math.Max(int2.Lerp(0, type.Info.MaxDensity, adjacent, 9), 1); } @@ -139,7 +141,8 @@ namespace OpenRA.Mods.Common.Traits return; foreach (var c in Dirty) - Tiles[c] = UpdateDirtyTile(c); + if (Tiles.Contains(c)) + Tiles[c] = UpdateDirtyTile(c); Dirty.Clear(); diff --git a/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs b/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs index 84a16d522a..5827cdb329 100644 --- a/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs @@ -50,9 +50,14 @@ namespace OpenRA.Mods.Common.Traits { var sum = 0; for (var u = -1; u < 2; u++) + { for (var v = -1; v < 2; v++) - if (content[cell + new CVec(u, v)].Type == t) + { + var c = cell + new CVec(u, v); + if (content.Contains(c) && content[c].Type == t) ++sum; + } + } return sum; } diff --git a/OpenRA.Mods.D2k/Traits/World/D2kEditorResourceLayer.cs b/OpenRA.Mods.D2k/Traits/World/D2kEditorResourceLayer.cs index f46354380f..0c2f3cb538 100644 --- a/OpenRA.Mods.D2k/Traits/World/D2kEditorResourceLayer.cs +++ b/OpenRA.Mods.D2k/Traits/World/D2kEditorResourceLayer.cs @@ -65,31 +65,36 @@ namespace OpenRA.Mods.D2k.Traits return D2kResourceLayer.Variants.Keys.Random(Game.CosmeticRandom); } + bool CellContains(CPos c, ResourceType t) + { + return Tiles.Contains(c) && Tiles[c].Type == t; + } + ClearSides FindClearSides(ResourceType t, CPos p) { var ret = ClearSides.None; - if (Tiles[p + new CVec(0, -1)].Type != t) + if (!CellContains(p + new CVec(0, -1), t)) ret |= ClearSides.Top | ClearSides.TopLeft | ClearSides.TopRight; - if (Tiles[p + new CVec(-1, 0)].Type != t) + if (!CellContains(p + new CVec(-1, 0), t)) ret |= ClearSides.Left | ClearSides.TopLeft | ClearSides.BottomLeft; - if (Tiles[p + new CVec(1, 0)].Type != t) + if (!CellContains(p + new CVec(1, 0), t)) ret |= ClearSides.Right | ClearSides.TopRight | ClearSides.BottomRight; - if (Tiles[p + new CVec(0, 1)].Type != t) + if (!CellContains(p + new CVec(0, 1), t)) ret |= ClearSides.Bottom | ClearSides.BottomLeft | ClearSides.BottomRight; - if (Tiles[p + new CVec(-1, -1)].Type != t) + if (!CellContains(p + new CVec(-1, -1), t)) ret |= ClearSides.TopLeft; - if (Tiles[p + new CVec(1, -1)].Type != t) + if (!CellContains(p + new CVec(1, -1), t)) ret |= ClearSides.TopRight; - if (Tiles[p + new CVec(-1, 1)].Type != t) + if (!CellContains(p + new CVec(-1, 1), t)) ret |= ClearSides.BottomLeft; - if (Tiles[p + new CVec(1, 1)].Type != t) + if (!CellContains(p + new CVec(1, 1), t)) ret |= ClearSides.BottomRight; return ret; diff --git a/OpenRA.Mods.D2k/Traits/World/D2kResourceLayer.cs b/OpenRA.Mods.D2k/Traits/World/D2kResourceLayer.cs index dce447e39c..e63d1ea45d 100644 --- a/OpenRA.Mods.D2k/Traits/World/D2kResourceLayer.cs +++ b/OpenRA.Mods.D2k/Traits/World/D2kResourceLayer.cs @@ -96,31 +96,36 @@ namespace OpenRA.Mods.D2k.Traits { ClearSides.Bottom | ClearSides.TopLeft | ClearSides.BottomLeft | ClearSides.BottomRight, 49 }, }; + bool CellContains(CPos c, ResourceType t) + { + return render.Contains(c) && render[c].Type == t; + } + ClearSides FindClearSides(ResourceType t, CPos p) { var ret = ClearSides.None; - if (render[p + new CVec(0, -1)].Type != t) + if (!CellContains(p + new CVec(0, -1), t)) ret |= ClearSides.Top | ClearSides.TopLeft | ClearSides.TopRight; - if (render[p + new CVec(-1, 0)].Type != t) + if (!CellContains(p + new CVec(-1, 0), t)) ret |= ClearSides.Left | ClearSides.TopLeft | ClearSides.BottomLeft; - if (render[p + new CVec(1, 0)].Type != t) + if (!CellContains(p + new CVec(1, 0), t)) ret |= ClearSides.Right | ClearSides.TopRight | ClearSides.BottomRight; - if (render[p + new CVec(0, 1)].Type != t) + if (!CellContains(p + new CVec(0, 1), t)) ret |= ClearSides.Bottom | ClearSides.BottomLeft | ClearSides.BottomRight; - if (render[p + new CVec(-1, -1)].Type != t) + if (!CellContains(p + new CVec(-1, -1), t)) ret |= ClearSides.TopLeft; - if (render[p + new CVec(1, -1)].Type != t) + if (!CellContains(p + new CVec(1, -1), t)) ret |= ClearSides.TopRight; - if (render[p + new CVec(-1, 1)].Type != t) + if (!CellContains(p + new CVec(-1, 1), t)) ret |= ClearSides.BottomLeft; - if (render[p + new CVec(1, 1)].Type != t) + if (!CellContains(p + new CVec(1, 1), t)) ret |= ClearSides.BottomRight; return ret; @@ -128,6 +133,9 @@ namespace OpenRA.Mods.D2k.Traits void UpdateRenderedTileInner(CPos p) { + if (!render.Contains(p)) + return; + var t = render[p]; if (t.Density > 0) {