commit 8de54495d48eaa1f27f193612a792e8d452ea5df Author: paramat Date: Sat Jan 25 06:56:28 2014 +0000 First commit diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..afdd0c9 --- /dev/null +++ b/README.txt @@ -0,0 +1,6 @@ +highlandpools 0.1.0 by paramat +For latest stable Minetest back to 0.4.8 +Depends default +Licenses: code WTFPL + +For use with mapgen V6 \ No newline at end of file diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ +default diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..b7c1930 --- /dev/null +++ b/init.lua @@ -0,0 +1,247 @@ +-- highlandpools 0.1.0 by paramat +-- For latest stable Minetest back to 0.4.8 +-- Depends default +-- Licenses: code WTFPL + +-- Parameters + +local FLOW = 256 + +-- Stuff + +highlandpools = {} + +-- Functions + +function highlandpools_remtree(x, y, z, area, data) + 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_air = minetest.get_content_id("air") + for j = 1, 7 do + for i = -2, 2 do + for k = -2, 2 do + local vi = area:index(x+i, y+j, z+k) + if data[vi] == c_tree + or data[vi] == c_apple + or data[vi] == c_leaves then + data[vi] = c_air + end + end + end + end + for j = 1, 7 do + for i = -2, 2 do + for k = -2, 2 do + local vi = area:index(x+i, y-j, z+k) + if data[vi] == c_tree + or data[vi] == c_apple + or data[vi] == c_leaves then + data[vi] = c_air + end + end + end + end +end + +-- On generated function + +minetest.register_on_generated(function(minp, maxp, seed) + local y0 = minp.y + if y0 ~= -32 then + return + end + + local t1 = os.clock() + local x0 = minp.x + local z0 = minp.z + print ("[highlandpools] chunk ("..x0.." "..y0.." "..z0..")") + local x1 = maxp.x + local y1 = maxp.y + local z1 = maxp.z + local sidelen = x1 - x0 -- actually sidelen - 1 + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + local data = vm:get_data() + + 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_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") + + for xcen = x0 + 8, x1 - 7, 8 do + for zcen = z0 + 8, z1 - 7, 8 do + local yasurf = false -- y of above surface node + for y = y1, 2, -1 do + local vi = area:index(xcen, y, zcen) + local c_node = data[vi] + if c_node == c_watsour then + break + elseif c_node == c_grass then + yasurf = y + 1 + break + end + end + if yasurf then + local abort = false + for ser = 1, 80 do + local vi = area:index(xcen + ser, yasurf, zcen) + local c_node = data[vi] + if xcen + ser == x1 then + abort = true + elseif c_node ~= c_air + and c_node ~= c_ignore + and c_node ~= c_tree + and c_node ~= c_leaves + and c_node ~= c_apple then + break + end + end + for ser = 1, 80 do + local vi = area:index(xcen - ser, yasurf, zcen) + local c_node = data[vi] + if xcen - ser == x0 then + abort = true + elseif c_node ~= c_air + and c_node ~= c_ignore + and c_node ~= c_tree + and c_node ~= c_leaves + and c_node ~= c_apple then + break + end + end + for ser = 1, 80 do + local vi = area:index(xcen, yasurf, zcen + ser) + local c_node = data[vi] + if zcen + ser == z1 then + abort = true + elseif c_node ~= c_air + and c_node ~= c_ignore + and c_node ~= c_tree + and c_node ~= c_leaves + and c_node ~= c_apple then + break + end + end + for ser = 1, 80 do + local vi = area:index(xcen, yasurf, zcen - ser) + local c_node = data[vi] + if zcen - ser == z0 then + abort = true + elseif c_node ~= c_air + and c_node ~= c_ignore + and c_node ~= c_tree + and c_node ~= c_leaves + and c_node ~= c_apple then + break + end + end + if abort then + break + end + + local vi = area:index(xcen, yasurf, zcen) + data[vi] = c_watsour + local flab = false -- flow abort + 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_watsour 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 + highlandpools_remtree(x + 1, yasurf, z, area, data) + data[vie] = c_watsour + elseif data[vie] == c_air + or data[vie] == c_apple + or data[vie] == c_leaves then + data[vie] = c_watsour + end + if data[viw] == c_tree then + highlandpools_remtree(x - 1, yasurf, z, area, data) + data[viw] = c_watsour + elseif data[viw] == c_air + or data[viw] == c_apple + or data[viw] == c_leaves then + data[viw] = c_watsour + end + if data[vin] == c_tree then + highlandpools_remtree(x, yasurf, z + 1, area, data) + data[vin] = c_watsour + elseif data[vin] == c_air + or data[vin] == c_apple + or data[vin] == c_leaves then + data[vin] = c_watsour + end + if data[vis] == c_tree then + highlandpools_remtree(x, yasurf, z - 1, area, data) + data[vis] = c_watsour + elseif data[vis] == c_air + or data[vis] == c_apple + or data[vis] == c_leaves then + data[vis] = c_watsour + end + end + end + end + if flab then + break + end + end + if flab then + break + 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_watsour then + data[vi] = c_air + end + end + end + 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_watsour then + for y = yasurf - 1, y0, -1 do + local viu = area:index(x, y, z) + if data[viu] == c_air then + data[viu] = c_watsour + elseif data[viu] == c_grass then + data[viu] = c_dirt + break + else + break + end + end + end + end + end + end + end + end + end + + vm:set_data(data) + vm:set_lighting({day=0, night=0}) + vm:calc_lighting() + vm:write_to_map(data) + + local chugent = math.ceil((os.clock() - t1) * 1000) + print ("[highlandpools] time "..chugent.." ms") +end) \ No newline at end of file diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..c73f8ae --- /dev/null +++ b/license.txt @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. +