mirror of
https://github.com/minetest-mods/ropes.git
synced 2024-11-24 16:33:48 +01:00
2a5a536fd6
I did a bunch of work enhancing the rope blocks in this. I gave them a nodebox model, limited the length the rope will extend to, allowed blocks with rope of varying length to be crafted, and fixed a couple of problems with ropes - namely that removing the block wouldn't necessarily remove the whole rope (now there's a "rope top" that eats its way down to ensure the whole rope is removed) and that a rope couldn't be cut once it was in place. I also added a rope ladder variant, and made it possible to craft ropes using cotton as well as vines. I may have broken the vines part of this mod in the process, I'll do further testing and code cleanup soon.
176 lines
5.1 KiB
Lua
176 lines
5.1 KiB
Lua
local ropeLength = 100
|
|
|
|
local function register_rope_block(multiple, pixels)
|
|
minetest.register_node(string.format("vines:%irope_block", multiple), {
|
|
description = string.format("Rope %im", ropeLength*multiple),
|
|
drawtype="nodebox",
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
tiles = {
|
|
string.format("default_wood.png^vines_%irope.png", multiple),
|
|
string.format("default_wood.png^vines_%irope.png", multiple),
|
|
"default_wood.png^vines_side.png",
|
|
"default_wood.png^vines_side.png",
|
|
string.format("default_wood.png^vines_%irope_frontback.png", multiple),
|
|
string.format("default_wood.png^vines_%irope_frontback.png", multiple),
|
|
},
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.375, -0.1875, -0.3125, 0.375, 0.375, 0.3125}, -- Spool
|
|
{-0.5, -0.5, -0.1875, -0.375, 0.25, 0.1875}, -- Support_arm
|
|
{0.375, -0.5, -0.1875, 0.5, 0.25, 0.1875}, -- Support_arm
|
|
{-0.375, -0.5, -0.1875, 0.375, -0.375, 0.1875}, -- Base
|
|
{-0.0625*(pixels/2), -0.1875, -0.5, 0.0625*(pixels/2), 0.375, 0.5}, -- Longitudinal_rope
|
|
{-0.0625*(pixels/2), -0.3125, -0.375, 0.0625*(pixels/2), 0.5, 0.375}, -- Vertical_rope
|
|
},
|
|
},
|
|
selection_box = {type="regular"},
|
|
collision_box = {type="regular"},
|
|
groups = { flammable=2, choppy=2, oddly_breakable_by_hand=1 },
|
|
|
|
after_place_node = function(pos)
|
|
local p = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
local n = minetest.get_node(p)
|
|
if n.name == "air" then
|
|
minetest.add_node(p, {name="vines:rope_bottom"})
|
|
local meta = minetest.get_meta(p)
|
|
meta:set_int("length_remaining", ropeLength*multiple)
|
|
end
|
|
end,
|
|
after_dig_node = function(pos, node, digger)
|
|
local p = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
local n = minetest.get_node(p)
|
|
if (n.name == 'vines:rope' or n.name == 'vines:rope_bottom' ) then
|
|
minetest.add_node(p, {name="vines:rope_top"})
|
|
end
|
|
end
|
|
})
|
|
|
|
if (multiple == 1) then
|
|
minetest.register_craft({
|
|
output = "vines:1rope_block",
|
|
recipe = {
|
|
{'default:wood',},
|
|
{'group:vines',},
|
|
{'group:vines'}
|
|
}
|
|
})
|
|
else
|
|
local rec = {}
|
|
for i=1,multiple,1 do
|
|
rec[i] = "vines:1rope_block"
|
|
end
|
|
|
|
minetest.register_craft({
|
|
output = string.format("vines:%irope_block", multiple),
|
|
type = "shapeless",
|
|
recipe = rec
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = string.format("vines:1rope_block %i", multiple),
|
|
recipe = {
|
|
{string.format('vines:%irope_block', multiple)}
|
|
}
|
|
})
|
|
end
|
|
end
|
|
|
|
--creates rope blocks with length multiples 1-5.
|
|
--second parameter sets how many pixels wide the rope texture is
|
|
register_rope_block(1, 4)
|
|
register_rope_block(2, 8)
|
|
register_rope_block(3, 10)
|
|
register_rope_block(4, 10)
|
|
register_rope_block(5, 12)
|
|
|
|
minetest.register_node("vines:rope", {
|
|
description = "Rope",
|
|
walkable = false,
|
|
climbable = true,
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
drop = "",
|
|
tile_images = { "vines_rope.png" },
|
|
drawtype = "plantlike",
|
|
groups = {flammable=2, not_in_creative_inventory=1},
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
|
|
},
|
|
})
|
|
|
|
minetest.register_node("vines:rope_bottom", {
|
|
description = "Rope",
|
|
walkable = false,
|
|
climbable = true,
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
drop = "",
|
|
tile_images = { "vines_rope_bottom.png" },
|
|
drawtype = "plantlike",
|
|
groups = {flammable=2, not_in_creative_inventory=1},
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
|
|
},
|
|
on_construct = function( pos )
|
|
local timer = minetest.get_node_timer( pos )
|
|
timer:start( 1 )
|
|
end,
|
|
on_timer = function( pos, elapsed )
|
|
local currentend = minetest.get_node(pos)
|
|
local currentmeta = minetest.get_meta(pos)
|
|
local currentlength = currentmeta:get_int("length_remaining")
|
|
local p = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
local n = minetest.get_node(p)
|
|
if n.name == "air" and (currentlength > 1) then
|
|
minetest.add_node(p, {name="vines:rope_bottom"})
|
|
local newmeta = minetest.get_meta(p)
|
|
newmeta:set_int("length_remaining", currentlength-1)
|
|
minetest.set_node(pos, {name="vines:rope"})
|
|
else
|
|
local timer = minetest.get_node_timer( pos )
|
|
timer:start( 1 )
|
|
end
|
|
end
|
|
})
|
|
|
|
minetest.register_node("vines:rope_top", {
|
|
description = "Rope",
|
|
walkable = false,
|
|
climbable = true,
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
drop = "",
|
|
tile_images = { "vines_rope_top.png" },
|
|
drawtype = "plantlike",
|
|
groups = {not_in_creative_inventory=1},
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
|
|
},
|
|
on_construct = function( pos )
|
|
local timer = minetest.get_node_timer( pos )
|
|
timer:start( 1 )
|
|
end,
|
|
on_timer = function( pos, elapsed )
|
|
local p = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
local n = minetest.get_node(p)
|
|
if (n.name == 'vines:rope' or n.name == 'vines:rope_bottom') then
|
|
minetest.add_node(p, {name="vines:rope_top"})
|
|
end
|
|
if (n.name ~= "ignore") then
|
|
minetest.set_node(pos, {name="air"})
|
|
else
|
|
local timer = minetest.get_node_timer( pos )
|
|
timer:start( 1 )
|
|
end
|
|
end
|
|
})
|