Disable treespawning on mapgen
[minetest_hades.git] / mods / highlandpools2 / init.lua
blob1c96a22fd94d8c63e301f50cbd7214d3cd364d4e
1 -- highlandpools 0.1.1 by paramat
2 -- For latest stable Minetest back to 0.4.8
3 -- Depends default
4 -- Licenses: code WTFPL
7 -- Parameters
10 local YMAX = 33000 -- Maximum altitude for pools
11 local FLOW = 256
14 -- Stuff
17 highlandpools2 = {}
20 -- Functions
23 function highlandpools2_remtree(x, y, z, area, data)
24 local c_tree = minetest.get_content_id("default:tree")
25 local c_apple = minetest.get_content_id("default:apple")
26 local c_leaves = minetest.get_content_id("default:leaves")
27 local c_air = minetest.get_content_id("air")
28 for j = 1, 7 do
29 for i = -2, 2 do
30 for k = -2, 2 do
31 local vi = area:index(x+i, y+j, z+k)
32 if data[vi] == c_tree
33 or data[vi] == c_apple
34 or data[vi] == c_leaves then
35 data[vi] = c_air
36 end
37 end
38 end
39 end
40 for j = 1, 7 do
41 for i = -2, 2 do
42 for k = -2, 2 do
43 local vi = area:index(x+i, y-j, z+k)
44 if data[vi] == c_tree
45 or data[vi] == c_apple
46 or data[vi] == c_leaves then
47 data[vi] = c_air
48 end
49 end
50 end
51 end
52 end
55 -- On generated function
58 minetest.register_on_generated(function(minp, maxp, seed)
59 local y0 = minp.y
60 if y0 < -32 or y0 > YMAX then
61 return
62 end
65 local t1 = os.clock()
66 local x0 = minp.x
67 local z0 = minp.z
68 print ("[highlandpools2] chunk ("..x0.." "..y0.." "..z0..")")
69 local x1 = maxp.x
70 local y1 = maxp.y
71 local z1 = maxp.z
72 local sidelen = x1 - x0 -- actually sidelen - 1
75 local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
76 local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
77 local data = vm:get_data()
80 local c_air = minetest.get_content_id("air")
81 local c_ignore = minetest.get_content_id("ignore")
82 local c_watsour = minetest.get_content_id("default:water_source")
83 local c_grass = minetest.get_content_id("default:tuff")
84 local c_tree = minetest.get_content_id("default:tree")
85 local c_apple = minetest.get_content_id("default:apple")
86 local c_leaves = minetest.get_content_id("default:leaves")
87 local c_dirt = minetest.get_content_id("default:gravel")
90 for xcen = x0 + 8, x1 - 7, 8 do
91 for zcen = z0 + 8, z1 - 7, 8 do
92 local yasurf = false -- y of above surface node
93 for y = y1, 2, -1 do
94 local vi = area:index(xcen, y, zcen)
95 local c_node = data[vi]
96 if y == y1 and c_node ~= c_air then -- if top node solid
97 break
98 elseif c_node == c_watsour then
99 break
100 elseif c_node == c_grass then
101 yasurf = y + 1
102 break
105 if yasurf then
106 local abort = false
107 for ser = 1, 80 do
108 local vi = area:index(xcen + ser, yasurf, zcen)
109 local c_node = data[vi]
110 if xcen + ser == x1 then
111 abort = true
112 elseif c_node ~= c_air
113 and c_node ~= c_tree
114 and c_node ~= c_leaves
115 and c_node ~= c_apple then
116 break
119 for ser = 1, 80 do
120 local vi = area:index(xcen - ser, yasurf, zcen)
121 local c_node = data[vi]
122 if xcen - ser == x0 then
123 abort = true
124 elseif c_node ~= c_air
125 and c_node ~= c_tree
126 and c_node ~= c_leaves
127 and c_node ~= c_apple then
128 break
131 for ser = 1, 80 do
132 local vi = area:index(xcen, yasurf, zcen + ser)
133 local c_node = data[vi]
134 if zcen + ser == z1 then
135 abort = true
136 elseif c_node ~= c_air
137 and c_node ~= c_tree
138 and c_node ~= c_leaves
139 and c_node ~= c_apple then
140 break
143 for ser = 1, 80 do
144 local vi = area:index(xcen, yasurf, zcen - ser)
145 local c_node = data[vi]
146 if zcen - ser == z0 then
147 abort = true
148 elseif c_node ~= c_air
149 and c_node ~= c_tree
150 and c_node ~= c_leaves
151 and c_node ~= c_apple then
152 break
155 if abort then
156 break
160 local vi = area:index(xcen, yasurf, zcen)
161 data[vi] = c_watsour
162 local flab = false -- flow abort
163 for flow = 1, FLOW do
164 for z = z0, z1 do
165 for x = x0, x1 do
166 local vif = area:index(x, yasurf, z)
167 if data[vif] == c_watsour then
168 if x == x0 or x == x1 or z == z0 or z == z1 then
169 flab = true -- if water at chunk edge abort flow
170 break
171 else -- flow water
172 local vie = area:index(x + 1, yasurf, z)
173 local viw = area:index(x - 1, yasurf, z)
174 local vin = area:index(x, yasurf, z + 1)
175 local vis = area:index(x, yasurf, z - 1)
176 if data[vie] == c_tree then
177 highlandpools2_remtree(x + 1, yasurf, z, area, data)
178 data[vie] = c_watsour
179 elseif data[vie] == c_air
180 or data[vie] == c_apple
181 or data[vie] == c_leaves then
182 data[vie] = c_watsour
184 if data[viw] == c_tree then
185 highlandpools2_remtree(x - 1, yasurf, z, area, data)
186 data[viw] = c_watsour
187 elseif data[viw] == c_air
188 or data[viw] == c_apple
189 or data[viw] == c_leaves then
190 data[viw] = c_watsour
192 if data[vin] == c_tree then
193 highlandpools2_remtree(x, yasurf, z + 1, area, data)
194 data[vin] = c_watsour
195 elseif data[vin] == c_air
196 or data[vin] == c_apple
197 or data[vin] == c_leaves then
198 data[vin] = c_watsour
200 if data[vis] == c_tree then
201 highlandpools2_remtree(x, yasurf, z - 1, area, data)
202 data[vis] = c_watsour
203 elseif data[vis] == c_air
204 or data[vis] == c_apple
205 or data[vis] == c_leaves then
206 data[vis] = c_watsour
211 if flab then
212 break
215 if flab then
216 break
219 if flab then -- erase water from this y level
220 for z = z0, z1 do
221 for x = x0, x1 do
222 local vi = area:index(x, yasurf, z)
223 if data[vi] == c_watsour then
224 data[vi] = c_air
228 else -- flow downwards add dirt
229 for z = z0, z1 do
230 for x = x0, x1 do
231 local vi = area:index(x, yasurf, z)
232 if data[vi] == c_watsour then
233 for y = yasurf - 1, y0, -1 do
234 local viu = area:index(x, y, z)
235 if data[viu] == c_air then
236 data[viu] = c_watsour
237 elseif data[viu] == c_grass then
238 data[viu] = c_dirt
239 break
240 else
241 break
253 vm:set_data(data)
254 vm:set_lighting({day=0, night=0})
255 vm:calc_lighting()
256 vm:write_to_map(data)
259 local chugent = math.ceil((os.clock() - t1) * 1000)
260 print ("[highlandpools2] time "..chugent.." ms")
261 end)