From fa76057e7f6811a8e7388a70d6fde7af61aa0bee Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 1 Dec 2012 13:32:32 +0100 Subject: Add the group attached_node Nodes in this group will be dropped as items if the node under them or the node in the wallmounted direction is not walkable. --- builtin/falling.lua | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ builtin/item.lua | 7 +++++++ 2 files changed, 56 insertions(+) (limited to 'builtin') diff --git a/builtin/falling.lua b/builtin/falling.lua index 3912727c3..903c5dfd0 100644 --- a/builtin/falling.lua +++ b/builtin/falling.lua @@ -91,6 +91,48 @@ function spawn_falling_node(p, nodename) obj:get_luaentity():set_node(nodename) end +function drop_attached_node(p) + local nn = minetest.env:get_node(p).name + minetest.env:remove_node(p) + for _,item in ipairs(minetest.get_node_drops(nn, "")) do + local pos = { + x = p.x + math.random(60)/60-0.3, + y = p.y + math.random(60)/60-0.3, + z = p.z + math.random(60)/60-0.3, + } + minetest.env:add_item(pos, item) + end +end + +function 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 + if n.param2 == 0 then + d.y = 1 + elseif n.param2 == 1 then + d.y = -1 + elseif n.param2 == 2 then + d.x = 1 + elseif n.param2 == 3 then + d.x = -1 + elseif n.param2 == 4 then + d.z = 1 + elseif n.param2 == 5 then + d.z = -1 + end + else + d.y = -1 + end + local p2 = {x=p.x+d.x, y=p.y+d.y, z=p.z+d.z} + local nn = minetest.env:get_node(p2).name + local def2 = minetest.registered_nodes[nn] + if def2 and not def2.walkable then + return false + end + return true +end + -- -- Some common functions -- @@ -108,6 +150,13 @@ function nodeupdate_single(p) nodeupdate(p) end end + + if minetest.get_node_group(n.name, "attached_node") ~= 0 then + if not check_attached_node(p, n) then + drop_attached_node(p) + nodeupdate(p) + end + end end function nodeupdate(p) diff --git a/builtin/item.lua b/builtin/item.lua index 0f8dcff1f..9352a43fc 100644 --- a/builtin/item.lua +++ b/builtin/item.lua @@ -181,6 +181,13 @@ function minetest.item_place_node(itemstack, placer, pointed_thing) end end + -- Check if the node is attached and if it can be placed there + if not check_attached_node(place_to, newnode) then + minetest.log("action", "attached node " .. def.name .. + " can not be placed at " .. minetest.pos_to_string(place_to)) + return + end + -- Add node and update minetest.env:add_node(place_to, newnode) -- cgit v1.2.3