237 lines
6.2 KiB
Lua
237 lines
6.2 KiB
Lua
|
--pools code
|
||
|
local FLOW = 256
|
||
|
|
||
|
|
||
|
function skylands:gen_pool(lakepoints, area, data, x0, z0, x1, z1)
|
||
|
local c_air = minetest.get_content_id("air")
|
||
|
local c_ignore = minetest.get_content_id("ignore")
|
||
|
local c_watsour = minetest.get_content_id("default:water_source")
|
||
|
local c_lavasour = minetest.get_content_id("default:lava_source")
|
||
|
local c_ice = minetest.get_content_id("default:ice")
|
||
|
local c_grass = minetest.get_content_id("default:dirt_with_grass")
|
||
|
local c_tree = minetest.get_content_id("default:tree")
|
||
|
local c_apple = minetest.get_content_id("default:apple")
|
||
|
local c_leaves = minetest.get_content_id("default:leaves")
|
||
|
local c_dirt = minetest.get_content_id("default:dirt")
|
||
|
local c_snow = minetest.get_content_id("default:dirt_with_snow")
|
||
|
local c_cinder = minetest.get_content_id("skylands:cinder")
|
||
|
local c_gravel = minetest.get_content_id("default:gravel")
|
||
|
local c_obsidian = minetest.get_content_id("skylands:obsidian")
|
||
|
|
||
|
local sidelen = x1 - x0 -- actually sidelen - 1
|
||
|
|
||
|
|
||
|
--for xcen = x0 + 8, x1 - 7, 8 do
|
||
|
--for zcen = z0 + 8, z1 - 7, 8 do
|
||
|
for _, p in pairs(lakepoints) do --for index, point in table do
|
||
|
--print("there are points. This is "..minetest.pos_to_string(p)..".")
|
||
|
local xcen = p.x
|
||
|
local yasurf = p.y -- y of above surface node
|
||
|
local zcen = p.z
|
||
|
local surf = false
|
||
|
|
||
|
local ftype = "water"
|
||
|
--for y = y1, 2, -1 do
|
||
|
local vi = area:index(xcen, yasurf - 1, zcen)
|
||
|
local c_node = data[vi]
|
||
|
--if y == y1 and c_node ~= c_air then -- if top node solid
|
||
|
--break
|
||
|
if c_node == c_watsour then
|
||
|
break
|
||
|
elseif c_node == c_grass then
|
||
|
ftype = "water"
|
||
|
surf = true
|
||
|
elseif c_node == c_snow then
|
||
|
ftype = "ice"
|
||
|
surf = true
|
||
|
elseif c_node == c_cinder then
|
||
|
ftype = "lava"
|
||
|
surf = true
|
||
|
elseif c_node == c_gravel then
|
||
|
ftype = "lava"
|
||
|
surf = true
|
||
|
elseif c_node == c_obsidian then
|
||
|
ftype = "lava"
|
||
|
surf = true
|
||
|
end
|
||
|
--end
|
||
|
if surf then
|
||
|
--print("now proceeding")
|
||
|
local abort = false
|
||
|
for ser = 1, 80 do
|
||
|
--print("x+")
|
||
|
local vi = area:index(xcen + ser, yasurf, zcen)
|
||
|
local c_node = data[vi]
|
||
|
if xcen + ser == x1 then
|
||
|
--print("Abort x+")
|
||
|
abort = true
|
||
|
elseif c_node ~= c_air
|
||
|
and c_node ~= c_tree
|
||
|
and c_node ~= c_leaves
|
||
|
and c_node ~= c_apple then
|
||
|
--print("found x+ edge")
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
for ser = 1, 80 do
|
||
|
--print("x-")
|
||
|
local vi = area:index(xcen - ser, yasurf, zcen)
|
||
|
local c_node = data[vi]
|
||
|
if xcen - ser == x0 then
|
||
|
--print("Abort x-")
|
||
|
abort = true
|
||
|
elseif c_node ~= c_air
|
||
|
and c_node ~= c_tree
|
||
|
and c_node ~= c_leaves
|
||
|
and c_node ~= c_apple then
|
||
|
--print("found x-")
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
for ser = 1, 80 do
|
||
|
--print("y+")
|
||
|
local vi = area:index(xcen, yasurf, zcen + ser)
|
||
|
local c_node = data[vi]
|
||
|
if zcen + ser == z1 then
|
||
|
--print("abort y+")
|
||
|
abort = true
|
||
|
elseif c_node ~= c_air
|
||
|
and c_node ~= c_tree
|
||
|
and c_node ~= c_leaves
|
||
|
and c_node ~= c_apple then
|
||
|
--print("y+ found")
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
for ser = 1, 80 do
|
||
|
--print("y-")
|
||
|
local vi = area:index(xcen, yasurf, zcen - ser)
|
||
|
local c_node = data[vi]
|
||
|
if zcen - ser == z0 then
|
||
|
--print("y- aborted")
|
||
|
abort = true
|
||
|
elseif c_node ~= c_air
|
||
|
and c_node ~= c_tree
|
||
|
and c_node ~= c_leaves
|
||
|
and c_node ~= c_apple then
|
||
|
--print("y- found")
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
local flab = false
|
||
|
if abort then
|
||
|
--print("aborted?!")
|
||
|
flab = true
|
||
|
end
|
||
|
|
||
|
--create an easy, clean reference for the current fluid type
|
||
|
local c_fluid = c_watsour
|
||
|
local c_under = c_watsour
|
||
|
if ftype == "lava" then
|
||
|
c_fluid = c_lavasour
|
||
|
c_under = c_lavasour
|
||
|
elseif c_fluid == "ice" then
|
||
|
c_fluid = c_ice
|
||
|
c_under = c_watsour
|
||
|
end
|
||
|
|
||
|
local vi = area:index(xcen, yasurf, zcen)
|
||
|
data[vi] = c_fluid
|
||
|
--local flab = false -- flow abort
|
||
|
--print("wow, made it to here")
|
||
|
for flow = 1, FLOW do
|
||
|
for z = z0, z1 do
|
||
|
for x = x0, x1 do
|
||
|
local vif = area:index(x, yasurf, z)
|
||
|
if data[vif] == c_fluid then
|
||
|
if x == x0 or x == x1 or z == z0 or z == z1 then
|
||
|
flab = true -- if water at chunk edge abort flow
|
||
|
break
|
||
|
else -- flow water
|
||
|
local vie = area:index(x + 1, yasurf, z)
|
||
|
local viw = area:index(x - 1, yasurf, z)
|
||
|
local vin = area:index(x, yasurf, z + 1)
|
||
|
local vis = area:index(x, yasurf, z - 1)
|
||
|
if data[vie] == c_tree then
|
||
|
skylands:remtree(x + 1, yasurf, z, area, data)
|
||
|
data[vie] = c_fluid
|
||
|
elseif data[vie] == c_air
|
||
|
or data[vie] == c_apple
|
||
|
or data[vie] == c_leaves then
|
||
|
data[vie] = c_fluid
|
||
|
end
|
||
|
if data[viw] == c_tree then
|
||
|
skylands:remtree(x - 1, yasurf, z, area, data)
|
||
|
data[viw] = c_fluid
|
||
|
elseif data[viw] == c_air
|
||
|
or data[viw] == c_apple
|
||
|
or data[viw] == c_leaves then
|
||
|
data[viw] = c_fluid
|
||
|
end
|
||
|
if data[vin] == c_tree then
|
||
|
skylands:remtree(x, yasurf, z + 1, area, data)
|
||
|
data[vin] = c_fluid
|
||
|
elseif data[vin] == c_air
|
||
|
or data[vin] == c_apple
|
||
|
or data[vin] == c_leaves then
|
||
|
data[vin] = c_fluid
|
||
|
end
|
||
|
if data[vis] == c_tree then
|
||
|
skylands:remtree(x, yasurf, z - 1, area, data)
|
||
|
data[vis] = c_fluid
|
||
|
elseif data[vis] == c_air
|
||
|
or data[vis] == c_apple
|
||
|
or data[vis] == c_leaves then
|
||
|
data[vis] = c_fluid
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if flab then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
if flab then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
--end
|
||
|
|
||
|
|
||
|
if flab then -- erase water from this y level
|
||
|
for z = z0, z1 do
|
||
|
for x = x0, x1 do
|
||
|
local vi = area:index(x, yasurf, z)
|
||
|
if data[vi] == c_fluid then
|
||
|
data[vi] = c_air
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
--print("no basin found at "..minetest.pos_to_string(p)..".")
|
||
|
else -- flow downwards add dirt
|
||
|
for z = z0, z1 do
|
||
|
for x = x0, x1 do
|
||
|
local vi = area:index(x, yasurf, z)
|
||
|
if data[vi] == c_fluid then
|
||
|
for y = yasurf - 1, yasurf - 15, -1 do
|
||
|
local viu = area:index(x, y, z)
|
||
|
if data[viu] == c_air then
|
||
|
data[viu] = c_under
|
||
|
elseif data[viu] == c_grass then
|
||
|
data[viu] = c_dirt
|
||
|
break
|
||
|
else
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
--end
|
||
|
--end
|
||
|
end
|