]> git.lizzy.rs Git - dragonblocks3d-lua.git/blobdiff - modules/MapGen/src/init.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / MapGen / src / init.lua
index 5d2c4cb135a2d4e78aebee65322ba6f0a61c172c..21a0a3f55a7eee252b4154ec880a8e6edc572736 100644 (file)
@@ -4,42 +4,32 @@ local grass = BlockSystem:get_def("game:grass")
 local leaves = BlockSystem:get_def("game:leaves")
 local tree = BlockSystem:get_def("game:tree")
 
-math.randomseed(os.time())
+local grass_layer_start, grass_layer_end = 0, 30
+local grass_layer_height = grass_layer_end - grass_layer_start
 
-function MapGen:generate(chunk)
-       local grass_layer_table, old_grass_layer_table
-       local grass_layer
-       for x = 0, 15 do
-               grass_layer_table, old_grass_layer_table = {}, grass_layer_table
-               grass_layer = old_grass_layer_table and old_grass_layer_table[1] or 8 + math.random(5)
-               for z = 0, 15 do
-                       local old_grass_layer = old_grass_layer_table and old_grass_layer_table[z] or grass_layer
-                       grass_layer = math.floor((grass_layer + old_grass_layer) / 2)
-                       if math.random(3) == 1 then
-                               grass_layer = grass_layer + math.random(3) - 2
-                       end
-                       grass_layer = glm.clamp(grass_layer, 0, 15)
-                       grass_layer_table[z] = grass_layer
-                       if math.random(25) == 1 then
-                               chunk:add_block(glm.vec3(x, grass_layer, z), dirt)
-                               self:add_tree(chunk, glm.vec3(x, grass_layer + 1, z))
-                       else
-                               chunk:add_block(glm.vec3(x, grass_layer, z), grass)
-                       end
-                       local dirt_start, dirt_end = grass_layer - 1, math.max(grass_layer - 5, 0)
-                       local stone_start, stone_end = grass_layer - 6, 0
-                       if dirt_start >= 0 then
-                               for y = dirt_start, dirt_end, -1  do
-                                       chunk:add_block(glm.vec3(x, y, z), dirt)
-                               end
-                       end
-                       if stone_start >= 0 then
-                               for y = stone_start, stone_end, -1  do
-                                       chunk:add_block(glm.vec3(x, y, z), stone)
+function MapGen.generate(minp, maxp)
+       local data = {}
+       local minx, miny, minz, maxx, maxy, maxz = minp.x, minp.y, minp.z, maxp.x - 1, maxp.y - 1, maxp.z - 1
+       for x = minx, maxx do
+               for z = minz, maxz do
+                       local grass_layer = math.floor(grass_layer_start + grass_layer_height * perlin:noise(x / grass_layer_height, z / grass_layer_height))
+                       for y = miny, maxy do
+                               local pos = glm.vec3(x - minx, y - miny, z - minz)
+                               local block
+                               if y <= grass_layer - 5 then
+                                       block = stone
+                               elseif y <= grass_layer - 1 then
+                                       block = dirt
+                               elseif y <= grass_layer then
+                                       block = grass
+                               end 
+                               if block then
+                                       data[WorldSystem.Chunk.get_pos_hash(pos)] = WorldSystem.Block(pos, block)
                                end
                        end
                end
        end
+       return data
 end
 
 local tree_blocks = {