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
|
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)
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)
|