From 56f2f7377612e477acf945542369fff4d037aa20 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sun, 11 May 2014 20:30:58 +0200 Subject: [PATCH] change lavacooling functions fix a lava flow bug, add smoke and call it default instead of lavacooling use 2 vector helpers --- mods/default/functions.lua | 85 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 82c9282a..5f74bc16 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -87,14 +87,91 @@ end -- Lavacooling -- -default.cool_lava_source = function(pos) - minetest.set_node(pos, {name="default:obsidian"}) +local function smoke_and_sound(pos) minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) + minetest.add_particlespawner({ + amount = 3, + time = 0.1, + minpos = vector.subtract(pos, 0.2), + maxpos = vector.add(pos, 0.2), + minacc = {x=-0.5,y=5,z=-0.5}, + maxacc = {x=0.5,y=5,z=0.5}, + minexptime = 0.1, + minsize = 2, + maxsize = 8, + texture = "smoke_puff.png" + }) +end + +local function cool_wf_vm(pos, node1, node2) + 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 stone = minetest.get_content_id(node2) + local lava = minetest.get_content_id(node1) + + 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 + and minetest.find_node_near(p, 1, {"group:water"}) then + nodes[p_p] = stone + end + end + end + end + + + manip:set_data(nodes) + manip:write_to_map() + print(string.format("[default] lava cooled at ("..pos.x.."|"..pos.y.."|"..pos.z..") after ca. %.2fs", os.clock() - t1)) + local t1 = os.clock() + manip:update_map() + manip:update_liquids() + print(string.format("[default] map updated after ca. %.2fs", os.clock() - t1)) +end + + +local del1 = 0 +local count = 0 + +default.cool_lava_source = function(pos) + local del2 = tonumber(os.clock()) + if del2-del1 < 0.1 + and count > 10 then + cool_wf_vm(pos, "default:lava_source", "default:obsidian") + count = 0 + else + minetest.set_node(pos, {name="default:obsidian"}) + smoke_and_sound(pos) + if del2-del1 < 0.1 then + count = count+1 + end + end + del1 = del2 end default.cool_lava_flowing = function(pos) - minetest.set_node(pos, {name="default:stone"}) - minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) + local del2 = tonumber(os.clock()) + if del2-del1 < 0.1 + and count > 10 then + cool_wf_vm(pos, "default:lava_flowing", "default:stone") + count = 0 + else + minetest.set_node(pos, {name="default:stone"}) + smoke_and_sound(pos) + if del2-del1 < 0.1 then + count = count+1 + end + end + del1 = del2 end minetest.register_abm({