public void SetArea(int x1, int y1, int z1, int x2, int y2, int z2, Material material, IFilter filter = null, bool paintMode = false) { bool create = material != null; int chunkX1 = Mathf.Min(x1 >> 4, x2 >> 4); int chunkY1 = Mathf.Min(y1 >> 4, y2 >> 4); int chunkZ1 = Mathf.Min(z1 >> 4, z2 >> 4); int chunkX2 = Mathf.Max(x1 >> 4, x2 >> 4); int chunkY2 = Mathf.Max(y1 >> 4, y2 >> 4); int chunkZ2 = Mathf.Max(z1 >> 4, z2 >> 4); int blockX1 = Mathf.Min(x1, x2); int blockY1 = Mathf.Min(y1, y2); int blockZ1 = Mathf.Min(z1, z2); int blockX2 = Mathf.Max(x1, x2); int blockY2 = Mathf.Max(y1, y2); int blockZ2 = Mathf.Max(z1, z2); if (filter != null) { filter.InitalizeFilter(new BlockLocation(blockX1, blockY1, blockZ1), new BlockLocation(blockX2, blockY2, blockZ2), material); } for (int a = chunkX1; a <= chunkX2; a++) { for (int b = chunkY1; b <= chunkY2; b++) { for (int c = chunkZ1; c <= chunkZ2; c++) { Chunk chunk = GetChunkByCoords(a, b, c, create); if (chunk == null) { continue; } chunk.MarkUndo(); for (int a2 = blockX1; a2 <= blockX2; a2++) { for (int b2 = blockY1; b2 <= blockY2; b2++) { for (int c2 = blockZ1; c2 <= blockZ2; c2++) { if (a2 >> 4 != a) { continue; } if (b2 >> 4 != b) { continue; } if (c2 >> 4 != c) { continue; } Material cur = chunk.GetBlock(a2 & 15, b2 & 15, c2 & 15); if (paintMode && cur == null) { continue; } if (filter != null && !filter.CanPlaceBlock(cur, new BlockLocation(a2, b2, c2))) { continue; } chunk.SetBlock(a2 & 15, b2 & 15, c2 & 15, material); } } } } } } if (autoRemesh) { UpdateAllChunks(); } }