259 lines
8.1 KiB
Lua
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()
|
|
})
|