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 = {