Imports Substrate

' FlatMap is an example of generating worlds from scratch with Substrate.
' It will produce a completely flat, solid map with grass, dirt, stone,
' and bedrock layers.  On a powerful workstation, creating 400 of these
' chunks only takes a few seconds.

Module Module1

    Sub Main()
        Dim dest As String = "F:\Minecraft\test"
        Dim xmin As Integer = -20
        Dim xmax As Integer = 20
        Dim zmin As Integer = -20
        Dim zmaz As Integer = 20

        ' This will instantly create any necessary directory structure
        Dim world As BetaWorld = BetaWorld.Create(dest)
        Dim cm As BetaChunkManager = world.GetChunkManager()

        ' We can set different world parameters
        world.Level.LevelName = "Flatlands"
        world.Level.Spawn = New SpawnPoint(20, 20, 70)

        ' world.Level.SetDefaultPlayer();
        ' We'll let MC create the player for us, but you could use the above
        ' line to create the SSP player entry in level.dat.

        ' We'll create chunks at chunk coordinates xmin,zmin to xmax,zmax
        For xi As Integer = xmin To xmax - 1
            For zi As Integer = zmin To zmaz - 1
                ' This line will create a default empty chunk, and create a
                ' backing region file if necessary (which will immediately be
                ' written to disk)
                Dim chunk As ChunkRef = cm.CreateChunk(xi, zi)

                ' This will suppress generating caves, ores, and all those
                ' other goodies.
                chunk.IsTerrainPopulated = True

                ' Auto light recalculation is horrifically bad for creating
                ' chunks from scratch, because we're placing thousands
                ' of blocks.  Turn it off.
                chunk.Blocks.AutoLight = False

                ' Set the blocks
                FlatChunk(chunk, 64)

                ' Reset and rebuild the lighting for the entire chunk at once
                chunk.Blocks.RebuildBlockLight()
                chunk.Blocks.RebuildSkyLight()

                Console.WriteLine("Built Chunk {0},{1}", chunk.X, chunk.Z)

                ' Save the chunk to disk so it doesn't hang around in RAM
                cm.Save()
            Next
        Next

        ' Save all remaining data (including a default level.dat)
        ' If we didn't save chunks earlier, they would be saved here
        world.Save()
    End Sub

    Private Sub FlatChunk(chunk As ChunkRef, height As Integer)
        ' Create bedrock
        For y As Integer = 0 To 1
            For x As Integer = 0 To 15
                For z As Integer = 0 To 15
                    chunk.Blocks.SetID(x, y, z, CInt(BlockType.BEDROCK))
                Next
            Next
        Next

        ' Create stone
        For y As Integer = 2 To height - 6
            For x As Integer = 0 To 15
                For z As Integer = 0 To 15
                    chunk.Blocks.SetID(x, y, z, CInt(BlockType.STONE))
                Next
            Next
        Next

        ' Create dirt
        For y As Integer = height - 5 To height - 2
            For x As Integer = 0 To 15
                For z As Integer = 0 To 15
                    chunk.Blocks.SetID(x, y, z, CInt(BlockType.DIRT))
                Next
            Next
        Next

        ' Create grass
        For y As Integer = height - 1 To height - 1
            For x As Integer = 0 To 15
                For z As Integer = 0 To 15
                    chunk.Blocks.SetID(x, y, z, CInt(BlockType.GRASS))
                Next
            Next
        Next
    End Sub

End Module