private Array <byte> DefineTerrain(Array <byte> globalMap) { var terrain = new Array <byte>(globalMap.Size); for (int z = globalMap.Size.minZ; z < globalMap.Size.maxZ; z += globalMap.Size.scale) { for (int x = globalMap.Size.minX; x < globalMap.Size.maxX; x += globalMap.Size.scale) { terrain[x, z] = GRASS; } } UniqueQueue <ChunkCoords> checkChunks = new UniqueQueue <ChunkCoords>(); for (int z = globalMap.Size.minZ; z < globalMap.Size.maxZ; z += globalMap.Size.scale) { if (globalMap[globalMap.Size.minX, z] < Settings.waterLevel) { checkChunks.Enqueue(new ChunkCoords(globalMap.Size.minX, z)); } if (globalMap[globalMap.Size.maxX - 1, z] < Settings.waterLevel) { checkChunks.Enqueue(new ChunkCoords(globalMap.Size.maxX - 1, z)); } } for (int x = globalMap.Size.minX; x < globalMap.Size.maxX; x += globalMap.Size.scale) { if (globalMap[x, globalMap.Size.minZ] < Settings.waterLevel) { checkChunks.Enqueue(new ChunkCoords(x, globalMap.Size.minZ)); } if (globalMap[x, globalMap.Size.maxZ - 1] < Settings.waterLevel) { checkChunks.Enqueue(new ChunkCoords(x, globalMap.Size.maxZ - 1)); } } while (checkChunks.Count > 0) { var pos = checkChunks.Dequeue(); if (globalMap.IsValidCoord(pos.X, pos.Z) && terrain[pos.X, pos.Z] != WATER && globalMap[pos.X, pos.Z] < Settings.waterLevel) { terrain[pos.X, pos.Z] = WATER; checkChunks.Enqueue(new ChunkCoords(pos.X + globalMap.Size.scale, pos.Z)); checkChunks.Enqueue(new ChunkCoords(pos.X - globalMap.Size.scale, pos.Z)); checkChunks.Enqueue(new ChunkCoords(pos.X, pos.Z + globalMap.Size.scale)); checkChunks.Enqueue(new ChunkCoords(pos.X, pos.Z - globalMap.Size.scale)); } } return(terrain); }
private void GenerateChunkCells(UniqueQueue <Position> generateQueue) { while (generateQueue.Count > 0) { var pos = generateQueue.Dequeue(); if (pos == null) { Log.WriteError("Null position in queue?"); continue; } var x = pos.X; var y = pos.Y; var z = pos.Z; if (worldInstance.GetBlock(x, y, z).Type == BlockType.Unknown) { var block = GenerateCell(x, y, z); if (block.Type == BlockType.Unknown) { Log.WriteError("Unknown block type generated?"); } worldInstance.SetBlock(x, y, z, block); if (worldInstance.GetBlock(x, y, z).Type == BlockType.Unknown) { Log.WriteError("Block not set?"); } if (block.IsTransparent) { ExpandSearchCheckBlock(x - 1, y, z, generateQueue); ExpandSearchCheckBlock(x + 1, y, z, generateQueue); if (y - 1 >= Settings.minNoiseHeight) { ExpandSearchCheckBlock(x, y - 1, z, generateQueue); } if (y + 1 < Settings.maxNoiseHeight) { ExpandSearchCheckBlock(x, y + 1, z, generateQueue); } ExpandSearchCheckBlock(x, y, z - 1, generateQueue); ExpandSearchCheckBlock(x, y, z + 1, generateQueue); } } } }