summaryrefslogtreecommitdiff
path: root/mods/vzxv_worldgen/init.lua
blob: 2d1f70f5024d820394e1cde6670d96256a84a3f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
minetest.set_mapgen_setting('mg_name','singlenode',true)
minetest.set_mapgen_setting('flags','nolight',true)

local stone = minetest.get_content_id("vzxv:stone")
local dirt = minetest.get_content_id("vzxv:moistdirt")
local grass = minetest.get_content_id("vzxv:moistgrass")
local water = minetest.get_content_id("vzxv:water")
local sand = minetest.get_content_id("vzxv:sand")
local tree = minetest.get_content_id("vzxv_trees:seed")

local data = {}
local dirt_height = 4
local water_level = 14
local trees_tbg = {}
-- chunks
minetest.register_on_generated(function(minp,maxp,seed)
	math.randomseed(seed)

	local voxmn, vmin, vmax = minetest.get_mapgen_object("voxelmanip")
	local va = VoxelArea:new{MinEdge=vmin,MaxEdge=vmax}

	local noisemap = PerlinNoiseMap({
		seed = 1,
		offset = -50, 
		scale = 50,
		spread = {x=2500,y=2500,z=500},
		octaves = 5,
		persistence = 0.8,
		lacunarity = 2.0,
		flags = "defaults, absvalue",
	}, {x=maxp.x-minp.x+1,y=maxp.z-minp.z+1})
	local heightmap = noisemap:get_2d_map{x=minp.x,y=minp.z}

	voxmn:get_data(data)
	for x=minp.x, maxp.x do
		for z=minp.z, maxp.z do
			local height = heightmap[z-minp.z+1][x-minp.x+1]
			for y=minp.y, maxp.y do
				local i = va:index(x,y,z)
				local underwater = (y <= water_level)
				if y < height then
					if not underwater then
						if y == math.floor(height) then
							if math.random(0,255) == 0 then
								table.insert(trees_tbg,{x=x,y=y,z=z})
							end
							data[i] = grass
						else
							data[i] = y > height - dirt_height and dirt or stone
						end
					else
						if y >= water_level - 1 and y > height - dirt_height then
							data[i] = sand
						else
							data[i] = stone
						end
					end
				elseif underwater then
					data[i] = water
				end
			end
		end
	end
	
	voxmn:set_data(data)
	voxmn:update_liquids()
	voxmn:write_to_map(true)
	voxmn:calc_lighting()
	
	minetest.after(0,function()
		minetest.fix_light(minp,maxp)
		for i, v in ipairs(trees_tbg) do
			vzxv.generate_tree(v)
		end
		trees_tbg = {}
	end)
end)