Merged in HybridDog's handling of rope destruction, did some other tweaks

I moved the rope length settings to the main init.lua to make them
easier to find, and reduced standard rope length to 50 meters (5x max is
now 250m). Also set ladders to sunlight propagates, and fixed some minor
bugs in the code.
This commit is contained in:
FaceDeer
2016-06-08 01:30:00 -06:00
parent 2a5a536fd6
commit 0483566b72
4 changed files with 67 additions and 39 deletions

@ -33,7 +33,7 @@ vines.register_vine = function( name, defs, biome )
paramtype = "light",
paramtype2 = "wallmounted",
buildable_to = true,
tile_images = { vine_image_end },
tiles = { vine_image_end },
drawtype = drawtype,
inventory_image = vine_image_end,
groups = groups,
@ -71,7 +71,7 @@ vines.register_vine = function( name, defs, biome )
paramtype = "light",
paramtype2 = "wallmounted",
buildable_to = true,
tile_images = { vine_image_middle },
tiles = { vine_image_middle },
wield_image = vine_image_middle,
drawtype = drawtype,
inventory_image = vine_image_middle,
@ -94,7 +94,7 @@ vines.register_vine = function( name, defs, biome )
biome_lib:spawn_on_surfaces( biome )
local override_nodes = function( nodes, defs )
function override( index, registered )
local function override( index, registered )
local node = nodes[ index ]
if index > #nodes then return registered end
if minetest.registered_nodes[node] then
@ -130,3 +130,45 @@ vines.dig_vine = function( pos, node_name, user )
end
end
end
local c_air = minetest.get_content_id("air")
vines.destroy_rope_starting = function( p, targetnode, bottomnode, topnode )
local n = minetest.get_node(p).name
if n ~= targetnode and n ~= bottomnode then
return
end
local y1 = p.y
local tab = {}
local i = 1
while n == targetnode do
tab[i] = p
i = i+1
p.y = p.y-1
n = minetest.get_node(p).name
end
if n == bottomnode then
tab[i] = p
end
local y0 = p.y
local manip = minetest.get_voxel_manip()
local p0 = {x=p.x, y=y0, z=p.z}
local p1 = {x=p.x, y=y0+1, z=p.z}
local p2 = {x=p.x, y=y1, z=p.z}
local pos1, pos2 = manip:read_from_map(p0, p2)
area = VoxelArea:new({MinEdge=pos1, MaxEdge=pos2})
nodes = manip:get_data()
for i in area:iterp(p1, p2) do
nodes[i] = c_air
end
nodes[area:indexp(p0)] = minetest.get_content_id(topnode)
manip:set_data(nodes)
manip:write_to_map()
manip:update_map() -- <— this takes time
local timer = minetest.get_node_timer( p0 )
timer:start( 1 )
end

@ -1,20 +1,15 @@
vines = {
name = 'vines',
recipes = {}
ropeLadderLength = 50,
ropeLength = 50,
}
local enableVines = true
if enableVines then
dofile( minetest.get_modpath( vines.name ) .. "/functions.lua" )
end
dofile( minetest.get_modpath( vines.name ) .. "/functions.lua" )
dofile( minetest.get_modpath( vines.name ) .. "/aliases.lua" )
dofile( minetest.get_modpath( vines.name ) .. "/crafts.lua" )
dofile( minetest.get_modpath( vines.name ) .. "/ropeboxes.lua" )
dofile( minetest.get_modpath( vines.name ) .. "/ladder.lua" )
dofile( minetest.get_modpath( vines.name ) .. "/shear.lua" )
if enableVines then
dofile( minetest.get_modpath( vines.name ) .. "/vines.lua" )
end
dofile( minetest.get_modpath( vines.name ) .. "/vines.lua" )
print("[Vines] Loaded!")

@ -1,5 +1,3 @@
local ropeLadderLength = 50
minetest.register_node("vines:ropeladder_top", {
description = "Rope ladder",
drawtype = "signlike",
@ -11,6 +9,7 @@ minetest.register_node("vines:ropeladder_top", {
paramtype2 = "wallmounted",
walkable = false,
climbable = true,
sunlight_propagates = true,
selection_box = {
type = "wallmounted",
--wall_top = = <default>
@ -30,15 +29,12 @@ minetest.register_node("vines:ropeladder_top", {
if n.name == "air" and o.param2 > 1 then
minetest.add_node(p, {name="vines:ropeladder_bottom", param2=o.param2})
local meta = minetest.get_meta(p)
meta:set_int("length_remaining", ropeLadderLength)
meta:set_int("length_remaining", vines.ropeLadderLength)
end
end,
after_dig_node = function(pos, node, digger)
after_destruct = function(pos)
local p = {x=pos.x, y=pos.y-1, z=pos.z}
local n = minetest.get_node(p)
if (n.name == 'vines:ropeladder' or n.name == 'vines:ropeladder_bottom' ) then
minetest.add_node(p, {name="vines:ropeladder_falling", param2=n.param2})
end
vines.destroy_rope_starting(p, 'vines:ropeladder', 'vines:ropeladder_bottom', 'vines:ropeladder_falling')
end
})
@ -61,6 +57,7 @@ minetest.register_node("vines:ropeladder", {
paramtype2 = "wallmounted",
walkable = false,
climbable = true,
sunlight_propagates = true,
selection_box = {
type = "wallmounted",
--wall_top = = <default>
@ -84,6 +81,7 @@ minetest.register_node("vines:ropeladder_bottom", {
paramtype2 = "wallmounted",
walkable = false,
climbable = true,
sunlight_propagates = true,
selection_box = {
type = "wallmounted",
--wall_top = = <default>
@ -128,6 +126,7 @@ minetest.register_node("vines:ropeladder_falling", {
paramtype2 = "wallmounted",
walkable = false,
climbable = true,
sunlight_propagates = true,
selection_box = {
type = "wallmounted",
--wall_top = = <default>
@ -145,11 +144,9 @@ minetest.register_node("vines:ropeladder_falling", {
on_timer = function( pos, elapsed )
local p = {x=pos.x, y=pos.y-1, z=pos.z}
local n = minetest.get_node(p)
local o = minetest.get_node(pos)
if (n.name == 'vines:ropeladder' or n.name == 'vines:ropeladder_bottom') then
minetest.add_node(p, {name="vines:ropeladder_falling", param2=o.param2})
end
if (n.name ~= "ignore") then
vines.destroy_rope_starting(p, 'vines:ropeladder', 'vines:ropeladder_bottom', 'vines:ropeladder_falling')
minetest.set_node(pos, {name="air"})
else
local timer = minetest.get_node_timer( pos )

@ -1,8 +1,6 @@
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),
description = string.format("Rope %im", vines.ropeLength*multiple),
drawtype="nodebox",
sunlight_propagates = true,
paramtype = "light",
@ -36,15 +34,12 @@ local function register_rope_block(multiple, pixels)
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)
meta:set_int("length_remaining", vines.ropeLength*multiple)
end
end,
after_dig_node = function(pos, node, digger)
after_destruct = function(pos)
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
vines.destroy_rope_starting(p, 'vines:rope', 'vines:rope_bottom', 'vines:rope_top')
end
})
@ -93,7 +88,7 @@ minetest.register_node("vines:rope", {
sunlight_propagates = true,
paramtype = "light",
drop = "",
tile_images = { "vines_rope.png" },
tiles = { "vines_rope.png" },
drawtype = "plantlike",
groups = {flammable=2, not_in_creative_inventory=1},
sounds = default.node_sound_leaves_defaults(),
@ -110,7 +105,7 @@ minetest.register_node("vines:rope_bottom", {
sunlight_propagates = true,
paramtype = "light",
drop = "",
tile_images = { "vines_rope_bottom.png" },
tiles = { "vines_rope_bottom.png" },
drawtype = "plantlike",
groups = {flammable=2, not_in_creative_inventory=1},
sounds = default.node_sound_leaves_defaults(),
@ -147,7 +142,7 @@ minetest.register_node("vines:rope_top", {
sunlight_propagates = true,
paramtype = "light",
drop = "",
tile_images = { "vines_rope_top.png" },
tiles = { "vines_rope_top.png" },
drawtype = "plantlike",
groups = {not_in_creative_inventory=1},
sounds = default.node_sound_leaves_defaults(),
@ -162,10 +157,9 @@ minetest.register_node("vines:rope_top", {
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
vines.destroy_rope_starting(p, 'vines:rope', 'vines:rope_bottom', 'vines:rope_top')
minetest.set_node(pos, {name="air"})
else
local timer = minetest.get_node_timer( pos )