Example #1
0
        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);
                    }
                }
            }
        }