mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 03:23:45 +01:00
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.
This commit is contained in:
parent
bb454b1846
commit
fa76057e7f
@ -91,6 +91,48 @@ function spawn_falling_node(p, nodename)
|
|||||||
obj:get_luaentity():set_node(nodename)
|
obj:get_luaentity():set_node(nodename)
|
||||||
end
|
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
|
-- Some common functions
|
||||||
--
|
--
|
||||||
@ -108,6 +150,13 @@ function nodeupdate_single(p)
|
|||||||
nodeupdate(p)
|
nodeupdate(p)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
||||||
function nodeupdate(p)
|
function nodeupdate(p)
|
||||||
|
@ -181,6 +181,13 @@ function minetest.item_place_node(itemstack, placer, pointed_thing)
|
|||||||
end
|
end
|
||||||
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
|
-- Add node and update
|
||||||
minetest.env:add_node(place_to, newnode)
|
minetest.env:add_node(place_to, newnode)
|
||||||
|
|
||||||
|
@ -457,6 +457,9 @@ Special groups
|
|||||||
- fall_damage_add_percent: damage speed = speed * (1 + value/100)
|
- fall_damage_add_percent: damage speed = speed * (1 + value/100)
|
||||||
- bouncy: value is bounce speed in percent
|
- bouncy: value is bounce speed in percent
|
||||||
- falling_node: if there is no walkable block under the node it will fall
|
- falling_node: if there is no walkable block under the node it will fall
|
||||||
|
- attached_node: if the node under it is not a walkable block the node will be
|
||||||
|
dropped as an item. If the node is wallmounted the
|
||||||
|
wallmounted direction is checked.
|
||||||
|
|
||||||
Known damage and digging time defining groups
|
Known damage and digging time defining groups
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
@ -837,7 +837,7 @@ minetest.register_node("default:junglegrass", {
|
|||||||
wield_image = "default_junglegrass.png",
|
wield_image = "default_junglegrass.png",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
groups = {snappy=3},
|
groups = {snappy=3,attached_node=1},
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
sounds = default.node_sound_leaves_defaults(),
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1106,7 +1106,7 @@ minetest.register_node("default:torch", {
|
|||||||
wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
||||||
wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
|
wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
|
||||||
},
|
},
|
||||||
groups = {choppy=2,dig_immediate=3},
|
groups = {choppy=2,dig_immediate=3,attached_node=1},
|
||||||
legacy_wallmounted = true,
|
legacy_wallmounted = true,
|
||||||
sounds = default.node_sound_defaults(),
|
sounds = default.node_sound_defaults(),
|
||||||
})
|
})
|
||||||
@ -1127,7 +1127,7 @@ minetest.register_node("default:sign_wall", {
|
|||||||
--wall_bottom = <default>
|
--wall_bottom = <default>
|
||||||
--wall_side = <default>
|
--wall_side = <default>
|
||||||
},
|
},
|
||||||
groups = {choppy=2,dig_immediate=2},
|
groups = {choppy=2,dig_immediate=2,attached_node=1},
|
||||||
legacy_wallmounted = true,
|
legacy_wallmounted = true,
|
||||||
sounds = default.node_sound_defaults(),
|
sounds = default.node_sound_defaults(),
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
@ -1495,7 +1495,7 @@ minetest.register_node("default:sapling", {
|
|||||||
wield_image = "default_sapling.png",
|
wield_image = "default_sapling.png",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
groups = {snappy=2,dig_immediate=3},
|
groups = {snappy=2,dig_immediate=3,attached_node=1},
|
||||||
sounds = default.node_sound_defaults(),
|
sounds = default.node_sound_defaults(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user