diff --git a/init.lua b/init.lua index f52b924..7440d49 100644 --- a/init.lua +++ b/init.lua @@ -173,19 +173,71 @@ default.cool_lava_source = function()end default.cool_lava_flowing = function()end lavacooling_abm("default:lava_source", WATER, "default:obsidian") + +local function cool_wf_vm(pos) + local t1 = os.clock() + local minp = vector.subtract(pos, 10) + local maxp = vector.add(pos, 10) + local manip = minetest.get_voxel_manip() + local emerged_pos1, emerged_pos2 = manip:read_from_map(minp, maxp) + local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) + local nodes = manip:get_data() + + local basalt = minetest.get_content_id("default:basalt") + local cobble = minetest.get_content_id("default:cobble") + local lava = minetest.get_content_id("default:lava_flowing") + + for x = minp.x, maxp.x do + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + local p = {x=x, y=y, z=z} + local p_p = area:indexp(p) + if nodes[p_p] == lava then + if find_coolingnodes(WATER, p) then + if y < -10+math.random(5) then + nodes[p_p] = basalt + else + nodes[p_p] = cobble + end + end + end + end + end + end + + + manip:set_data(nodes) + manip:write_to_map() + print(string.format("[lavacooling] cooled at ("..pos.x.."|"..pos.y.."|"..pos.z..") after ca. %.2fs", os.clock() - t1)) + local t1 = os.clock() + manip:update_map() + print(string.format("[lavacooling] map updated after ca. %.2fs", os.clock() - t1)) +end + +local del1 = 0 +local count = 0 + minetest.register_abm ({ nodenames = {"default:lava_flowing"}, interval = 0, chance = 1, action = function (pos) - if find_coolingnodes(WATER, pos) then + local del2 = tonumber(os.clock()) + if del2-del1 < 0.1 + and count > 10 then + cool_wf_vm(pos) + count = 0 + elseif find_coolingnodes(WATER, pos) then if pos.y < -10+math.random(5) then coolnode("default:basalt", pos) else coolnode("default:cobble", pos) end - + if del2-del1 < 0.1 then + count = count+1 + end end + del1 = del2 end, })