126 lines
3.0 KiB
Lua
126 lines
3.0 KiB
Lua
-- Rope mod. By Mirko K.
|
|
--
|
|
-- Three tree block in a vertical row = 9 meter of rope.
|
|
-- Placement automatically adds rope downwards until it runs out or some
|
|
-- non-air block is in the way.
|
|
-- Push (single left-click) cuts the rope at that position. Digging removes
|
|
-- the whole rope.
|
|
--
|
|
-- Licence:
|
|
-- Code: GPL
|
|
-- Texture: CC-BY-SA
|
|
|
|
minetest.register_on_placenode(function(pos, newnode, placer)
|
|
if newnode.name == "ropes:rope" then
|
|
place_rope(pos, newnode, placer)
|
|
end
|
|
end
|
|
)
|
|
|
|
minetest.register_on_dignode(function(pos, oldnode, digger)
|
|
if oldnode.name == "ropes:rope" then
|
|
remove_rope(pos, oldnode, digger, true)
|
|
end
|
|
end
|
|
)
|
|
|
|
minetest.register_on_punchnode(function(pos, oldnode, digger)
|
|
if oldnode.name == "ropes:rope" then
|
|
remove_rope(pos, oldnode, digger, false)
|
|
end
|
|
end
|
|
)
|
|
|
|
-- helper function
|
|
inventory_find_item = function (object, name, item)
|
|
local inventory = object:inventory_get_list(name)
|
|
for key, value in pairs(inventory) do
|
|
if value == item then
|
|
return key, value
|
|
end
|
|
end
|
|
return nil, nil
|
|
end
|
|
|
|
place_rope = function (pos, newnode, placer)
|
|
local inventory = placer:inventory_get_list("main")
|
|
local witem = placer:get_wielded_itemstring()
|
|
local windex, witem = inventory_find_item(placer, "main", witem)
|
|
local param2 = newnode.param2
|
|
while witem ~= nil and witem:len() ~= 0 do
|
|
pos.y = pos.y - 1
|
|
if minetest.env:get_node(pos).name ~= "air" then
|
|
break
|
|
end
|
|
if minetest.env:add_node(pos, {name="ropes:rope", param2=param2}) ~= true
|
|
then
|
|
break
|
|
end
|
|
witem = stackstring_take_item(witem)
|
|
end
|
|
if windex == nil then
|
|
else
|
|
inventory[windex] = witem
|
|
placer:inventory_set_list("main", inventory)
|
|
end
|
|
end
|
|
|
|
remove_rope = function(pos, oldnode, digger, completely)
|
|
local num = 0
|
|
local below = pos
|
|
local above = pos
|
|
if completely == true then
|
|
above.y = above.y + 1
|
|
while minetest.env:get_node(above).name == "ropes:rope" do
|
|
minetest.env:remove_node(above)
|
|
above.y = above.y + 1
|
|
num = num + 1
|
|
end
|
|
end
|
|
below.y = below.y - 1
|
|
while minetest.env:get_node(below).name == "ropes:rope" do
|
|
minetest.env:remove_node(below)
|
|
below.y = below.y -1
|
|
num = num + 1
|
|
end
|
|
if num ~= 0 then
|
|
digger:add_to_inventory_later('node "ropes:rope" ' .. num)
|
|
end
|
|
return true
|
|
end
|
|
|
|
minetest.register_craft({
|
|
output = 'node "ropes:rope" 9',
|
|
recipe = {
|
|
{'', 'node "tree"', ''},
|
|
{'', 'node "tree"', ''},
|
|
{'', 'node "tree"', ''},
|
|
}
|
|
})
|
|
|
|
minetest.register_node("ropes:rope", {
|
|
drawtype = "signlike",
|
|
tile_images = {"rope.png"},
|
|
inventory_image = "rope.png",
|
|
light_propagates = true,
|
|
paramtype = "light",
|
|
is_ground_content = true,
|
|
wall_mounted = true,
|
|
walkable = false,
|
|
climbable = true,
|
|
selection_box = {
|
|
type = "wallmounted",
|
|
--wall_top = = <default>
|
|
--wall_bottom = = <default>
|
|
--wall_side = = <default>
|
|
},
|
|
furnace_burntime = 5,
|
|
material = {
|
|
diggablity = "normal",
|
|
cuttability = 1.5,
|
|
},
|
|
})
|
|
|
|
|
|
|