From 218738812e857a234713082a952156116e7b8600 Mon Sep 17 00:00:00 2001 From: Craig Robbins Date: Fri, 4 Jul 2014 15:09:51 +1000 Subject: [PATCH] Bug fix (falling nodes) Without this fix falling nodes (e.g. sand) do not work correctly. For example, placing sand on top of water the sand will drop and disappear. --- falling_ice.lua | 26 +++++++++++++------------- init.lua | 29 ++++++++++++++++------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/falling_ice.lua b/falling_ice.lua index dffe92e..4e04b5f 100644 --- a/falling_ice.lua +++ b/falling_ice.lua @@ -63,7 +63,7 @@ minetest.register_entity("caverealms:falling_ice", { if obj:is_player() then obj:set_hp(obj:get_hp() - 8) end - end + end -- Note: walkable is in the node definition, not in item groups if not bcd or (bcd.walkable or @@ -103,19 +103,19 @@ minetest.register_entity("caverealms:falling_ice", { -- remove entity --minetest.add_node(np, self.node) self.object:remove() - nodeupdate(np) + caverealms:nodeupdate(np) else -- Do nothing end end }) -function spawn_falling_node(p, node) +function caverealms:spawn_falling_node(p, node) obj = minetest.add_entity(p, "caverealms:falling_ice") obj:get_luaentity():set_node(node) end -function drop_attached_node(p) +function caverealms:drop_attached_node(p) local nn = minetest.get_node(p).name minetest.remove_node(p) for _,item in ipairs(minetest.get_node_drops(nn, "")) do @@ -128,7 +128,7 @@ function drop_attached_node(p) end end -function check_attached_node(p, n) +function caverealms:check_attached_node(p, n) local def = minetest.registered_nodes[n.name] local d = {x=0, y=0, z=0} if def.paramtype2 == "wallmounted" then @@ -161,7 +161,7 @@ end -- Some common functions -- -function nodeupdate_single(p, delay) +function caverealms:nodeupdate_single(p, delay) n = minetest.get_node(p) if minetest.get_item_group(n.name, "falling_node") ~= 0 then p_bottom = {x=p.x, y=p.y-1, z=p.z} @@ -175,25 +175,25 @@ function nodeupdate_single(p, delay) (not minetest.registered_nodes[n_bottom.name].walkable or minetest.registered_nodes[n_bottom.name].buildable_to) then if delay then - minetest.after(0.1, nodeupdate_single, {x=p.x, y=p.y, z=p.z}, false) + minetest.after(0.1, caverealms.nodeupdate_single, {x=p.x, y=p.y, z=p.z}, false) else n.level = minetest.env:get_node_level(p) minetest.remove_node(p) - spawn_falling_node(p, n) - nodeupdate(p) + caverealms:spawn_falling_node(p, n) + caverealms:nodeupdate(p) end end end if minetest.get_item_group(n.name, "attached_node") ~= 0 then if not check_attached_node(p, n) then - drop_attached_node(p) - nodeupdate(p) + caverealms:drop_attached_node(p) + caverealms:nodeupdate(p) end end end -function nodeupdate(p, delay) +function caverealms:nodeupdate(p, delay) -- Round p to prevent falling entities to get stuck p.x = math.floor(p.x+0.5) p.y = math.floor(p.y+0.5) @@ -202,7 +202,7 @@ function nodeupdate(p, delay) for x = -1,1 do for y = -1,1 do for z = -1,1 do - nodeupdate_single({x=p.x+x, y=p.y+y, z=p.z+z}, delay or not (x==0 and y==0 and z==0)) + caverealms:nodeupdate_single({x=p.x+x, y=p.y+y, z=p.z+z}, delay or not (x==0 and y==0 and z==0)) end end end diff --git a/init.lua b/init.lua index 18cf49e..67c3523 100644 --- a/init.lua +++ b/init.lua @@ -90,13 +90,13 @@ minetest.register_on_generated(function(minp, maxp, seed) local x0 = minp.x local y0 = minp.y local z0 = minp.z - + print ("[caverealms] chunk minp ("..x0.." "..y0.." "..z0..")") --tell people you are generating a chunk - + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} local data = vm:get_data() - + --grab content IDs local c_air = minetest.get_content_id("air") local c_stone = minetest.get_content_id("default:stone") @@ -118,21 +118,21 @@ minetest.register_on_generated(function(minp, maxp, seed) local c_worm = minetest.get_content_id("caverealms:glow_worm") local c_iciu = minetest.get_content_id("caverealms:icicle_up") local c_icid = minetest.get_content_id("caverealms:icicle_down") - + --mandatory values local sidelen = x1 - x0 + 1 --length of a mapblock local chulens = {x=sidelen, y=sidelen, z=sidelen} --table of chunk edges local minposxyz = {x=x0, y=y0, z=z0} --bottom corner local minposxz = {x=x0, y=z0} --2D bottom corner - + local nvals_cave = minetest.get_perlin_map(np_cave, chulens):get3dMap_flat(minposxyz) --cave noise for structure local nvals_wave = minetest.get_perlin_map(np_wave, chulens):get3dMap_flat(minposxyz) --wavy structure of cavern ceilings and floors local nvals_biome = minetest.get_perlin_map(np_biome, chulens):get2dMap_flat({x=x0+150, y=z0+50}) --2D noise for biomes (will be 3D humidity/temp later) - + local nixyz = 1 --3D node index local nixz = 1 --2D node index local nixyz2 = 1 --second 3D index for second loop - + for z = z0, z1 do -- for each xy plane progressing northwards --structure loop for y = y0, y1 do -- for each x row progressing upwards @@ -155,7 +155,7 @@ minetest.register_on_generated(function(minp, maxp, seed) vi = vi + 1 end end - + --decoration loop for y = y0, y1 do -- for each x row progressing upwards local tcave --same as above @@ -168,7 +168,7 @@ minetest.register_on_generated(function(minp, maxp, seed) end local vi = area:index(x0, y, z) for x = x0, x1 do -- for each node do - + --determine biome local biome = false --preliminary declaration n_biome = nvals_biome[nixz] --make an easier reference to the noise @@ -186,7 +186,7 @@ minetest.register_on_generated(function(minp, maxp, seed) else biome = 3 --algae end - + if math.floor(((nvals_cave[nixyz2] + nvals_wave[nixyz2])/2)*100) == math.floor(tcave*100) then --ceiling local ai = area:index(x,y+1,z) --above index @@ -259,7 +259,7 @@ minetest.register_on_generated(function(minp, maxp, seed) data[ai] = c_iciu end end - + if math.random() < STAGCHA then caverealms:stalagmite(x,y,z, area, data) end @@ -267,7 +267,7 @@ minetest.register_on_generated(function(minp, maxp, seed) caverealms:crystal_stalagmite(x,y,z, area, data, biome) end end - + end nixyz2 = nixyz2 + 1 nixz = nixz + 1 @@ -277,7 +277,7 @@ minetest.register_on_generated(function(minp, maxp, seed) end nixz = nixz + sidelen --shift the 2D index up a layer end - + --send data back to voxelmanip vm:set_data(data) --calc lighting @@ -289,3 +289,6 @@ minetest.register_on_generated(function(minp, maxp, seed) local chugent = math.ceil((os.clock() - t1) * 1000) --grab how long it took print ("[caverealms] "..chugent.." ms") --tell people how long end) + + +print("[caverealms] loaded!")