EinsDreiDreiSieben/mods/x_farming/ropes.lua
2025-05-04 16:01:41 +02:00

259 lines
8.1 KiB
Lua

--[[
X Farming. Extends Minetest farming mod with new plants, crops and ice fishing.
Copyright (C) 2024 SaKeL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to juraj.vajda@gmail.com
--]]
local S = minetest.get_translator(minetest.get_current_modname())
local function place_rope(pos, itemstack)
local next_node = minetest.get_node(pos)
local stack_name = itemstack:get_name()
while next_node.name == 'air' and not itemstack:is_empty() do
minetest.set_node(pos, { name = stack_name, param1 = 0 })
itemstack:take_item()
pos.y = pos.y - 1
next_node = minetest.get_node(pos)
end
return itemstack
end
minetest.register_node('x_farming:rope', {
description = S('Rope\n') .. '. ' .. minetest.colorize('#d0ffd0',S('Place on rope to extend down')),
drawtype = 'plantlike',
walkable = false,
paramtype = 'light',
sunlight_propagates = true,
climbable = true,
wield_scale = { x = 2, y = 2, z = 1 },
groups = {
-- MTG
snappy = 3,
flammable = 3,
rope = 1,
},
tiles = { 'x_farming_rope.png' },
inventory_image = 'x_farming_rope_item.png',
wield_image = 'x_farming_rope_item.png',
selection_box = {
type = 'fixed',
fixed = { -2 / 16, -0.5, -2 / 16, 2 / 16, 0.5, 2 / 16 }
},
sounds = x_farming.node_sound_rope_defaults(),
on_place = function(itemstack, placer, pointed_thing)
local control = placer:get_player_control()
local pt_pos = minetest.get_pointed_thing_position(pointed_thing)
if pt_pos and pointed_thing.type == 'node' then
local pt_node = minetest.get_node(pt_pos)
if minetest.is_protected(pt_pos, placer:get_player_name()) then
return itemstack
end
local pt_node_def = minetest.registered_nodes[pt_node.name]
-- check if we have to use default on_place first
if pt_node_def.on_rightclick then
return pt_node_def.on_rightclick(pt_pos, pt_node, placer, itemstack, pointed_thing)
end
end
-- placing rope on rope
if pt_pos and not control.sneak then
local pt_node = minetest.get_node(pt_pos)
if minetest.get_item_group(pt_node.name, 'rope') > 0 then
-- add to rope
local _pos = vector.new(pt_pos)
local next_node = minetest.get_node(_pos)
while minetest.get_item_group(next_node.name, 'rope') > 0 do
_pos.y = _pos.y - 1
next_node = minetest.get_node(_pos)
end
return place_rope(_pos, itemstack)
end
end
if pointed_thing.type == 'node' then
local pos = pointed_thing.above
if minetest.is_protected(pos, placer:get_player_name()) then
return itemstack
end
return place_rope(pos, itemstack)
end
return itemstack
end,
on_punch = function(pos, node, puncher, pointed_thing)
if minetest.is_protected(pos, puncher:get_player_name()) then
return
end
local count = 0
local below = vector.new(pos)
local node_below = minetest.get_node(below)
while minetest.get_item_group(node_below.name, 'rope') > 0 do
minetest.remove_node(below)
below.y = below.y - 1
count = count + 1
node_below = minetest.get_node(below)
end
if count == 0 then
return
end
local stacks = {}
local node_stack = ItemStack({ name = node.name })
local stack_max = node_stack:get_stack_max()
local stack_count = count
if stack_count > stack_max then
while stack_count > 0 do
if stack_count > stack_max then
stack_count = stack_count - stack_max
table.insert(stacks, ItemStack({ name = node.name, count = stack_max }))
else
table.insert(stacks, ItemStack({ name = node.name, count = stack_count }))
stack_count = 0
end
end
else
table.insert(stacks, ItemStack({ name = node.name, count = count }))
end
local inv = puncher:get_inventory()
for _, stack in ipairs(stacks) do
if inv and inv:room_for_item('main', stack) then
inv:add_item('main', stack)
else
-- drop on the ground
minetest.add_item(puncher:get_pos(), stack)
end
end
return true
end,
})
minetest.register_node('x_farming:safety_net', {
description = S('Safety Net. No fall damage when landing on this net.'),
drawtype = 'nodebox',
node_box = {
type = 'fixed',
fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -7 / 16, 8 / 16 },
},
selection_box = {
type = 'fixed',
fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -6 / 16, 8 / 16 }
},
tiles = {
'x_farming_safety_net.png',
'x_farming_safety_net.png',
'x_farming_safety_net_side.png',
},
use_texture_alpha = 'clip',
wield_image = 'x_farming_safety_net.png',
inventory_image = 'x_farming_safety_net.png',
paramtype = 'light',
sunlight_propagates = true,
wield_scale = { x = 2, y = 2, z = 1 },
groups = {
-- MTG
snappy = 3,
flammable = 3,
bouncy = 33,
fall_damage_add_percent = -100,
-- MCL
handy = 1,
hoey = 1,
shearsy = 1,
swordy = 1
},
_mcl_hardness = 0.2,
sounds = x_farming.node_sound_rope_defaults()
})
minetest.register_node('x_farming:rope_fence', {
description = S('Rope') .. ' ' .. S('Fence'),
drawtype = 'nodebox',
paramtype = 'light',
climbable = true,
wield_scale = { x = 2, y = 2, z = 1 },
node_box = {
type = 'connected',
fixed = { -1 / 16, -1 / 2, -1 / 16, 1 / 16, 1 / 2, 1 / 16 },
-- connect_top =
-- connect_bottom =
connect_front = {
{ 0, -8 / 16, -8 / 16, 0, 7 / 16, -1 / 16 }
},
connect_left = {
{ -1 / 2, -1 / 2, 0, -1 / 16, 7 / 16, 0 }
},
connect_back = {
{ 0, -8 / 16, 1 / 16, 0, 7 / 16, 1 / 2 }
},
connect_right = {
{ 1 / 16, -1 / 2, 0, 1 / 2, 7 / 16, 0 }
}
},
collision_box = {
type = 'connected',
fixed = { -1 / 8, -1 / 2, -1 / 8, 1 / 8, 1 / 2, 1 / 8 },
-- connect_top =
-- connect_bottom =
connect_front = { -1 / 8, -1 / 2, -1 / 2, 1 / 8, 1 / 2, -1 / 8 },
connect_left = { -1 / 2, -1 / 2, -1 / 8, -1 / 8, 1 / 2, 1 / 8 },
connect_back = { -1 / 8, -1 / 2, 1 / 8, 1 / 8, 1 / 2, 1 / 2 },
connect_right = { 1 / 8, -1 / 2, -1 / 8, 1 / 2, 1 / 2, 1 / 8 }
},
connects_to = {
-- MTG
'group:fence',
'group:wood',
'group:tree',
'group:wall',
'group:stone',
},
inventory_image = 'x_farming_rope_fence_item.png',
wield_image = 'x_farming_rope_fence_item.png',
tiles = { 'x_farming_rope_fence.png' },
use_texture_alpha = 'clip',
sunlight_propagates = true,
is_ground_content = false,
groups = {
-- MTG
fence = 1,
snappy = 3,
flammable = 2,
-- MCL
handy = 1,
hoey = 1,
shearsy = 1,
swordy = 1
},
_mcl_hardness = 0.2,
sounds = x_farming.node_sound_rope_defaults()
})