434 lines
11 KiB
Lua
434 lines
11 KiB
Lua
-- how often node timers for plants will tick, +/- some random value
|
|
local function tick(pos)
|
|
minetest.get_node_timer(pos):start(math.random(332, 572))
|
|
end
|
|
|
|
-- how often a growth failure tick is retried (e.g. too dark)
|
|
local function tick_again(pos)
|
|
minetest.get_node_timer(pos):start(math.random(80, 160))
|
|
end
|
|
|
|
function x_farming.grow_cocoa_plant(pos, elapsed)
|
|
local node = minetest.get_node(pos)
|
|
local name = node.name
|
|
local def = minetest.registered_nodes[name]
|
|
|
|
if not def.next_plant then
|
|
-- disable timer for fully grown plant
|
|
return
|
|
end
|
|
|
|
-- check if on jungletree
|
|
local direction = minetest.facedir_to_dir(node.param2)
|
|
local below_pos = vector.add(pos, direction)
|
|
local below = minetest.get_node(below_pos)
|
|
if below.name ~= "default:jungletree" and below.name ~= "x_farming:jungle_tree" then
|
|
tick_again(pos)
|
|
return
|
|
end
|
|
|
|
-- check light
|
|
local light = minetest.get_node_light(pos)
|
|
if not light or light < def.minlight or light > def.maxlight then
|
|
tick_again(pos)
|
|
return
|
|
end
|
|
|
|
-- grow
|
|
minetest.swap_node(pos, {name = def.next_plant, param2 = node.param2})
|
|
|
|
-- new timer needed?
|
|
if minetest.registered_nodes[def.next_plant].next_plant then
|
|
tick(pos)
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
function x_farming.place_cocoa_bean(itemstack, placer, pointed_thing)
|
|
local pt = pointed_thing
|
|
-- check if pointing at a node
|
|
if not pt then
|
|
return itemstack
|
|
end
|
|
if pt.type ~= "node" then
|
|
return itemstack
|
|
end
|
|
|
|
local under = minetest.get_node(pt.under)
|
|
local above = minetest.get_node(pt.above)
|
|
|
|
local udef = minetest.registered_nodes[under.name]
|
|
if udef and udef.on_rightclick and
|
|
not (placer and placer:is_player() and
|
|
placer:get_player_control().sneak) then
|
|
return udef.on_rightclick(pt.under, under, placer, itemstack,
|
|
pointed_thing) or itemstack
|
|
end
|
|
|
|
local player_name = placer and placer:get_player_name() or ""
|
|
|
|
if minetest.is_protected(pt.under, player_name) then
|
|
minetest.record_protection_violation(pt.under, player_name)
|
|
return
|
|
end
|
|
if minetest.is_protected(pt.above, player_name) then
|
|
minetest.record_protection_violation(pt.above, player_name)
|
|
return
|
|
end
|
|
|
|
-- return if any of the nodes is not registered
|
|
if not minetest.registered_nodes[under.name] then
|
|
return itemstack
|
|
end
|
|
if not minetest.registered_nodes[above.name] then
|
|
return itemstack
|
|
end
|
|
|
|
-- check if NOT pointing at the top/below of the node
|
|
if pt.above.y == pt.under.y-1 or
|
|
pt.above.y == pt.under.y+1 then
|
|
return itemstack
|
|
end
|
|
|
|
-- check if you can replace the node above the pointed node
|
|
if not minetest.registered_nodes[above.name].buildable_to then
|
|
return itemstack
|
|
end
|
|
|
|
-- check if pointing at soil
|
|
if under.name ~= "default:jungletree" and under.name ~= "x_farming:jungle_tree" then
|
|
return itemstack
|
|
end
|
|
|
|
local direction = vector.direction(pt.above, pt.under)
|
|
local new_param2 = minetest.dir_to_facedir(direction)
|
|
|
|
-- add the node and remove 1 item from the itemstack
|
|
minetest.set_node(pt.above, {name = "x_farming:cocoa_1", param2 = new_param2})
|
|
|
|
tick(pt.above)
|
|
if not (creative and creative.is_enabled_for
|
|
and creative.is_enabled_for(player_name)) then
|
|
itemstack:take_item()
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
-- COCOA
|
|
minetest.register_craftitem("x_farming:cocoa_bean", {
|
|
description = "Cocoa bean (plant on jungle tree)",
|
|
tiles = {"x_farming_cocoa_bean.png"},
|
|
inventory_image = "x_farming_cocoa_bean.png",
|
|
wield_image = "x_farming_cocoa_bean.png",
|
|
on_place = x_farming.place_cocoa_bean,
|
|
})
|
|
|
|
-- 1
|
|
minetest.register_node("x_farming:cocoa_1", {
|
|
description = "Cocoa 1",
|
|
drawtype = "nodebox",
|
|
tiles = {
|
|
"x_farming_cocoa_top_1.png",
|
|
"x_farming_cocoa_bottom_1.png",
|
|
"x_farming_cocoa_right_1.png",
|
|
"x_farming_cocoa_left_1.png",
|
|
"x_farming_cocoa_front_1.png",
|
|
"x_farming_cocoa_front_1.png"
|
|
},
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
wield_scale = {x=2, y=2, z=2},
|
|
on_rotate = screwdriver.disallow,
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
drop = {
|
|
items = {
|
|
{items = {"x_farming:cocoa_bean"}, rarity = 3},
|
|
}
|
|
},
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.125, -0.0625, 0.1875, 0.125, 0.25, 0.4375}, -- fruit
|
|
{0, 0.25, 0.3125, 0, 0.375, 0.375}, -- stem_1
|
|
{0, 0.375, 0.4375, 0, 0.4375, 0.5}, -- stem_2
|
|
{0, 0.3125, 0.375, 0, 0.4375, 0.4375}, -- stem_3
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.125, -0.0625, 0.1875, 0.125, 0.5, 0.5},
|
|
},
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.125, -0.0625, 0.1875, 0.125, 0.5, 0.5},
|
|
},
|
|
},
|
|
groups = {choppy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
next_plant = "x_farming:cocoa_2",
|
|
on_timer = x_farming.grow_cocoa_plant,
|
|
minlight = 13,
|
|
maxlight = 15
|
|
})
|
|
|
|
-- 2
|
|
minetest.register_node("x_farming:cocoa_2", {
|
|
description = "Cocoa 2",
|
|
drawtype = "nodebox",
|
|
tiles = {
|
|
"x_farming_cocoa_top_2.png",
|
|
"x_farming_cocoa_bottom_2.png",
|
|
"x_farming_cocoa_right_2.png",
|
|
"x_farming_cocoa_left_2.png",
|
|
"x_farming_cocoa_front_2.png",
|
|
"x_farming_cocoa_front_2.png"
|
|
},
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
wield_scale = {x=1.5, y=1.5, z=1.5},
|
|
on_rotate = screwdriver.disallow,
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
drop = {
|
|
items = {
|
|
{items = {"x_farming:cocoa_bean"}, rarity = 2},
|
|
}
|
|
},
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, -0.1875, 0.0625, 0.1875, 0.25, 0.4375}, -- fruit
|
|
{0, 0.25, 0.25, 0, 0.375, 0.375}, -- stem_1
|
|
{0, 0.375, 0.375, 0, 0.5, 0.5}, -- stem_2
|
|
{0, 0.375, 0.3125, 0, 0.4375, 0.375}, -- stem_3
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, -0.1875, 0.0625, 0.1875, 0.5, 0.5},
|
|
},
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, -0.1875, 0.0625, 0.1875, 0.5, 0.5},
|
|
},
|
|
},
|
|
groups = {choppy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
next_plant = "x_farming:cocoa_3",
|
|
on_timer = x_farming.grow_cocoa_plant,
|
|
minlight = 13,
|
|
maxlight = 15
|
|
})
|
|
|
|
-- 3
|
|
minetest.register_node("x_farming:cocoa_3", {
|
|
description = "Cocoa 3",
|
|
drawtype = "nodebox",
|
|
tiles = {
|
|
"x_farming_cocoa_top_3.png",
|
|
"x_farming_cocoa_bottom_3.png",
|
|
"x_farming_cocoa_right_3.png",
|
|
"x_farming_cocoa_left_3.png",
|
|
"x_farming_cocoa_front_3.png",
|
|
"x_farming_cocoa_front_3.png"
|
|
},
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
wield_scale = {x=1.5, y=1.5, z=1.5},
|
|
on_rotate = screwdriver.disallow,
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
drop = {
|
|
items = {
|
|
{items = {"x_farming:cocoa_bean"}, rarity = 1},
|
|
{items = {"x_farming:cocoa_bean"}, rarity = 2},
|
|
}
|
|
},
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.25, -0.3125, -0.0625, 0.25, 0.25, 0.4375},
|
|
{-0.0624999, 0.25, 0.25, 0.0625, 0.375, 0.4375},
|
|
{-0.0625, 0.375, 0.375, 0.0625, 0.5, 0.5},
|
|
{-0.0624999, 0.375, 0.3125, 0.0625, 0.4375, 0.375},
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.25, -0.3125, -0.0625, 0.25, 0.5, 0.5},
|
|
},
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.25, -0.3125, -0.0625, 0.25, 0.5, 0.5},
|
|
},
|
|
},
|
|
groups = {choppy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, leafdecay = 3, leafdecay_drop = 1},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
minlight = 13,
|
|
maxlight = 15
|
|
})
|
|
|
|
-- replacement LBM for pre-nodetimer plants
|
|
minetest.register_lbm({
|
|
name = "x_farming:start_nodetimer_cocoa",
|
|
nodenames = {
|
|
"x_farming:cocoa_1",
|
|
"x_farming:cocoa_2"
|
|
},
|
|
action = function(pos, node)
|
|
tick_again(pos)
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("x_farming:jungle_with_cocoa_sapling", {
|
|
description = "Jungle Tree with Cocoa Sapling",
|
|
drawtype = "plantlike",
|
|
tiles = {"x_farming_junglesapling.png"},
|
|
inventory_image = "x_farming_junglesapling.png",
|
|
wield_image = "x_farming_junglesapling.png",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
on_timer = x_farming.grow_jungle_tree,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
|
|
},
|
|
groups = {snappy = 2, dig_immediate = 3, flammable = 2,
|
|
attached_node = 1, sapling = 1},
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
|
|
on_construct = function(pos)
|
|
minetest.get_node_timer(pos):start(math.random(300, 1500))
|
|
end,
|
|
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
|
|
"x_farming:jungle_with_cocoa_sapling",
|
|
-- minp, maxp to be checked, relative to sapling pos
|
|
{x = -3, y = -5, z = -3},
|
|
{x = 3, y = 31, z = 3},
|
|
-- maximum interval of interior volume check
|
|
4)
|
|
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
-- trunk
|
|
minetest.register_node("x_farming:jungle_tree", {
|
|
description = "Jungle Tree",
|
|
tiles = {"x_farming_jungle_tree_top.png", "x_farming_jungle_tree_top.png", "x_farming_jungle_tree.png"},
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
|
|
on_place = minetest.rotate_node
|
|
})
|
|
|
|
-- leaves
|
|
minetest.register_node("x_farming:jungle_leaves", {
|
|
description = "Jungle Tree Leaves",
|
|
drawtype = "allfaces_optional",
|
|
waving = 1,
|
|
tiles = {"x_farming_jungleleaves.png"},
|
|
special_tiles = {"x_farming_jungleleaves.png"},
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
|
|
drop = {
|
|
max_items = 1,
|
|
items = {
|
|
{
|
|
-- player will get sapling with 1/20 chance
|
|
items = {"x_farming:jungle_with_cocoa_sapling"},
|
|
rarity = 20,
|
|
},
|
|
{
|
|
-- player will get leaves only if he get no saplings,
|
|
-- this is because max_items is 1
|
|
items = {"x_farming:jungle_leaves"},
|
|
}
|
|
}
|
|
},
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
|
|
after_place_node = default.after_place_leaves,
|
|
})
|
|
|
|
-- leafdecay
|
|
default.register_leafdecay({
|
|
trunks = {"x_farming:jungle_tree"},
|
|
leaves = {"x_farming:cocoa_3", "x_farming:jungle_leaves"},
|
|
radius = 2,
|
|
})
|
|
|
|
-- planks
|
|
minetest.register_node("x_farming:jungle_wood", {
|
|
description = "Jungle Wood Planks",
|
|
paramtype2 = "facedir",
|
|
place_param2 = 0,
|
|
tiles = {"x_farming_jungle_wood.png"},
|
|
is_ground_content = false,
|
|
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "x_farming:jungle_wood 4",
|
|
recipe = {
|
|
{"x_farming:jungle_tree"},
|
|
}
|
|
})
|
|
|
|
minetest.register_craft({
|
|
type = "fuel",
|
|
recipe = "x_farming:jungle_tree",
|
|
burntime = 38,
|
|
})
|
|
|
|
minetest.register_craft({
|
|
type = "fuel",
|
|
recipe = "x_farming:jungle_wood",
|
|
burntime = 9,
|
|
})
|
|
|
|
if minetest.global_exists("stairs") and minetest.get_modpath("stairs") then
|
|
stairs.register_stair_and_slab(
|
|
"jungle_wood",
|
|
"x_farming:jungle_wood",
|
|
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
|
{"x_farming_jungle_wood.png"},
|
|
"Jungle Wooden Stair",
|
|
"Jungle Wooden Slab",
|
|
default.node_sound_wood_defaults(),
|
|
false
|
|
)
|
|
end
|
|
|
|
minetest.register_decoration({
|
|
name = "x_farming:jungle_tree",
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_rainforest_litter"},
|
|
sidelen = 80,
|
|
fill_ratio = 0.025,
|
|
biomes = {"rainforest"},
|
|
y_max = 31000,
|
|
y_min = 1,
|
|
schematic = minetest.get_modpath("x_farming") .. "/schematics/x_farming_jungle_tree_with_cocoa.mts",
|
|
flags = "place_center_x, place_center_z",
|
|
rotation = "0",
|
|
})
|