1 -- highlandpools 0.1.1 by paramat
2 -- For latest stable Minetest back to 0.4.8
4 -- Licenses: code WTFPL
10 local YMAX
= 33000 -- Maximum altitude for pools
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")
31 local vi
= area
:index(x
+i
, y
+j
, z
+k
)
33 or data
[vi
] == c_apple
34 or data
[vi
] == c_leaves
then
43 local vi
= area
:index(x
+i
, y
-j
, z
+k
)
45 or data
[vi
] == c_apple
46 or data
[vi
] == c_leaves
then
55 -- On generated function
58 minetest
.register_on_generated(function(minp
, maxp
, seed
)
60 if y0
< -32 or y0
> YMAX
then
68 print ("[highlandpools2] chunk ("..x0
.." "..y0
.." "..z0
..")")
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
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
98 elseif c_node
== c_watsour
then
100 elseif c_node
== c_grass
then
108 local vi
= area
:index(xcen
+ ser
, yasurf
, zcen
)
109 local c_node
= data
[vi
]
110 if xcen
+ ser
== x1
then
112 elseif c_node
~= c_air
114 and c_node
~= c_leaves
115 and c_node
~= c_apple
then
120 local vi
= area
:index(xcen
- ser
, yasurf
, zcen
)
121 local c_node
= data
[vi
]
122 if xcen
- ser
== x0
then
124 elseif c_node
~= c_air
126 and c_node
~= c_leaves
127 and c_node
~= c_apple
then
132 local vi
= area
:index(xcen
, yasurf
, zcen
+ ser
)
133 local c_node
= data
[vi
]
134 if zcen
+ ser
== z1
then
136 elseif c_node
~= c_air
138 and c_node
~= c_leaves
139 and c_node
~= c_apple
then
144 local vi
= area
:index(xcen
, yasurf
, zcen
- ser
)
145 local c_node
= data
[vi
]
146 if zcen
- ser
== z0
then
148 elseif c_node
~= c_air
150 and c_node
~= c_leaves
151 and c_node
~= c_apple
then
160 local vi
= area
:index(xcen
, yasurf
, zcen
)
162 local flab
= false -- flow abort
163 for flow
= 1, FLOW
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
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
219 if flab
then -- erase water from this y level
222 local vi
= area
:index(x
, yasurf
, z
)
223 if data
[vi
] == c_watsour
then
228 else -- flow downwards add dirt
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
254 vm
:set_lighting({day
=0, night
=0})
256 vm
:write_to_map(data
)
259 local chugent
= math
.ceil((os
.clock() - t1
) * 1000)
260 print ("[highlandpools2] time "..chugent
.." ms")