crops catch up when away
parent
6459e14dfa
commit
d015db12e1
188
api.lua
188
api.lua
|
@ -41,15 +41,19 @@ end
|
|||
|
||||
|
||||
|
||||
local base_speed = 100
|
||||
local base_speed = 350
|
||||
|
||||
-- how often node timers for plants will tick, +/- some random value
|
||||
local function tick(pos, mul)
|
||||
minetest.get_node_timer(pos):start(math.random(base_speed * 2 * mul, base_speed * 3 * mul))
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:stop()
|
||||
timer:start(math.random(base_speed * mul, base_speed * mul))
|
||||
end
|
||||
-- how often a growth failure tick is retried (e.g. too dark)
|
||||
local function tick_again(pos, mul)
|
||||
minetest.get_node_timer(pos):start(math.random(base_speed * mul, base_speed * 2 * mul))
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:stop()
|
||||
timer:start(math.random(base_speed * mul, base_speed * mul))
|
||||
end
|
||||
|
||||
farming_super.tick_node = tick
|
||||
|
@ -221,65 +225,15 @@ farming_super.grow_plant = function(pos, elapsed)
|
|||
local name = node.name
|
||||
local def = minetest.registered_nodes[name]
|
||||
local bp = def.base_plant
|
||||
print("base_plant ".. bp)
|
||||
print("next_growth_step ".. (def.next_growth_step or "end"))
|
||||
|
||||
|
||||
|
||||
|
||||
-- grow seed
|
||||
if minetest.get_item_group(node.name, "seed") and def.fertility then
|
||||
local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
|
||||
if not soil_node then
|
||||
print("no soil")
|
||||
tick_again(pos, def.step_len)
|
||||
return
|
||||
end
|
||||
|
||||
-- omitted is a check for light, we assume seeds can germinate in the dark.
|
||||
for _, v in pairs(def.fertility) do
|
||||
print("fertility: " ..v)
|
||||
if minetest.get_item_group(soil_node.name, v) ~= 0 then
|
||||
|
||||
local soil_meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
|
||||
local nlevel = soil_meta:get_int("nitrogen")
|
||||
if nlevel == 0 then
|
||||
nlevel = 9
|
||||
soil_meta:set_int("nitrogen", nlevel)
|
||||
end
|
||||
print("nlevel: " ..nlevel)
|
||||
local var_name = get_seed_variant(def, nlevel) .. "_1_1"
|
||||
local var_def = minetest.registered_items[var_name]
|
||||
|
||||
if var_name == "death" or var_def == nil then
|
||||
minetest.set_node(pos, {name="air"})
|
||||
return
|
||||
end
|
||||
|
||||
install_plant(var_def, pos, 1)
|
||||
|
||||
if var_def.groups.use_nitrogen then
|
||||
soil_meta:set_int("nitrogen", math.max(1, nlevel - var_def.groups.use_nitrogen))
|
||||
print("new nlevel: " ..nlevel - (var_def.groups.use_nitrogen or 0))
|
||||
end
|
||||
|
||||
--[[local placenode = {name = def.base_plant .. "_1_1"}
|
||||
if def.place_param2 then
|
||||
placenode.param2 = def.place_param2
|
||||
end
|
||||
]] -- minetest.swap_node(pos, placenode)
|
||||
-- if minetest.registered_nodes[def.base_plant .. "_1_1"].next_plant then
|
||||
tick(pos, def.step_len)
|
||||
return
|
||||
-- return
|
||||
-- end
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local fdef = farming_super.registered_plants[bp]
|
||||
-- print("base_plant ".. bp)
|
||||
-- print("next_growth_step ".. (def.next_growth_step or "end"))
|
||||
|
||||
local next_step = def.next_growth_step or (fdef.last_step + 1)
|
||||
-- print(dump(def))
|
||||
-- print(dump(fdef))
|
||||
-- print(dump(next_step))
|
||||
local step_len = fdef.step_len[next_step] or 1
|
||||
|
||||
|
||||
-- check if on wet soil
|
||||
|
@ -294,18 +248,88 @@ farming_super.grow_plant = function(pos, elapsed)
|
|||
-- check light
|
||||
local light = minetest.get_node_light(pos)
|
||||
if not light or light < def.minlight or light > def.maxlight then
|
||||
tick_again(pos, def.step_len)
|
||||
tick_again(pos, step_len)
|
||||
print("too dim ".. light.. ":"..def.minlight..":"..def.maxlight)
|
||||
return
|
||||
end
|
||||
|
||||
-- print(dump(step_len))
|
||||
-- print("elapsed "..elapsed)
|
||||
-- calculate how many steps should have elapsed
|
||||
while elapsed > step_len * base_speed do
|
||||
elapsed = elapsed - step_len * base_speed
|
||||
|
||||
next_step = next_step + 1
|
||||
step_len = fdef.step_len[next_step]
|
||||
if not step_len then
|
||||
step_len = 1
|
||||
break
|
||||
end
|
||||
|
||||
if next_step >= fdef.last_step then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- grow seed
|
||||
if minetest.get_item_group(node.name, "seed") and def.fertility then
|
||||
local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
|
||||
if not soil_node then
|
||||
-- print("no soil")
|
||||
tick_again(pos, step_len)
|
||||
return
|
||||
end
|
||||
|
||||
-- omitted is a check for light, we assume seeds can germinate in the dark.
|
||||
for _, v in pairs(def.fertility) do
|
||||
-- print("fertility: " ..v)
|
||||
if minetest.get_item_group(soil_node.name, v) ~= 0 then
|
||||
|
||||
local soil_meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
|
||||
local nlevel = soil_meta:get_int("nitrogen")
|
||||
if nlevel == 0 then
|
||||
nlevel = 9
|
||||
soil_meta:set_int("nitrogen", nlevel)
|
||||
end
|
||||
-- print("nlevel: " ..nlevel)
|
||||
local var_name = get_seed_variant(def, nlevel) .. "_1_1"
|
||||
local var_def = minetest.registered_items[var_name]
|
||||
|
||||
if var_name == "death" or var_def == nil then
|
||||
minetest.set_node(pos, {name="air"})
|
||||
return
|
||||
end
|
||||
|
||||
install_plant(var_def, pos, math.min(next_step, fdef.last_step))
|
||||
|
||||
if var_def.groups.use_nitrogen then
|
||||
soil_meta:set_int("nitrogen", math.max(1, nlevel - var_def.groups.use_nitrogen))
|
||||
-- print("new nlevel: " ..nlevel - (var_def.groups.use_nitrogen or 0))
|
||||
end
|
||||
|
||||
--[[local placenode = {name = def.base_plant .. "_1_1"}
|
||||
if def.place_param2 then
|
||||
placenode.param2 = def.place_param2
|
||||
end
|
||||
]] -- minetest.swap_node(pos, placenode)
|
||||
-- if minetest.registered_nodes[def.base_plant .. "_1_1"].next_plant then
|
||||
tick(pos, step_len)
|
||||
return
|
||||
-- return
|
||||
-- end
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
-- grow
|
||||
install_plant(def, pos, def.next_growth_step)
|
||||
|
||||
install_plant(def, pos, math.min(next_step, fdef.last_step))
|
||||
|
||||
-- new timer needed?
|
||||
if def.next_growth_step then
|
||||
tick(pos, def.step_len)
|
||||
if next_step < fdef.last_step then
|
||||
tick(pos, step_len)
|
||||
else -- end of growth, give nutrients
|
||||
local soil_meta = minetest.get_meta({x = pos.x, y = pos.y - 1, z = pos.z})
|
||||
if def.groups.fix_nitrogen then
|
||||
|
@ -362,7 +386,9 @@ farming_super.register_plant = function(name, def)
|
|||
end
|
||||
|
||||
local base_plant = mname .. ":" .. pname
|
||||
|
||||
def.step_len = def.step_len or {}
|
||||
def.step_len[1] = def.step_len[1] or 1
|
||||
|
||||
|
||||
-- Register seed -- attached node needs not be on 2nd tier nodes
|
||||
local g = {seed = 1, snappy = 3, attached_node = 1, flammable = 2}
|
||||
|
@ -403,7 +429,7 @@ farming_super.register_plant = function(name, def)
|
|||
base_plant = base_plant,
|
||||
next_growth_step = 1,
|
||||
tier_count = 1,
|
||||
step_len = (def.step_len and def.step_len[1]) or 1,
|
||||
step_len = def.step_len[1],
|
||||
groups = g,
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
@ -454,6 +480,8 @@ farming_super.register_plant = function(name, def)
|
|||
for _,numSteps in ipairs(def.steps) do
|
||||
totalSteps = totalSteps + numSteps
|
||||
end
|
||||
|
||||
def.last_step = totalSteps
|
||||
-- print("total steps " .. totalSteps)
|
||||
|
||||
local tex_base = mname.."_"..pname
|
||||
|
@ -461,6 +489,7 @@ farming_super.register_plant = function(name, def)
|
|||
tex_base = def.textures.base
|
||||
end
|
||||
|
||||
|
||||
local step = 1
|
||||
for tierCount,numSteps in ipairs(def.steps) do
|
||||
|
||||
|
@ -488,6 +517,20 @@ farming_super.register_plant = function(name, def)
|
|||
height = 0.5
|
||||
end
|
||||
|
||||
def.step_len[step+1] = def.step_len[step+1] or 1
|
||||
|
||||
local sbox = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
|
||||
}
|
||||
|
||||
if tierCount > 1 then
|
||||
sbox = {
|
||||
type = "fixed",
|
||||
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, height, 5 / 16},
|
||||
}
|
||||
end
|
||||
|
||||
--print(name.."-> ".. tier .. " / "..tierCount .. " " ..height)
|
||||
minetest.register_node(name, {
|
||||
drawtype = "plantlike",
|
||||
|
@ -499,16 +542,13 @@ farming_super.register_plant = function(name, def)
|
|||
walkable = false,
|
||||
buildable_to = true,
|
||||
drop = drops,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, height, 5 / 16},
|
||||
},
|
||||
selection_box = sbox,
|
||||
groups = gg,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
next_growth_step = ns,
|
||||
tier_count = tierCount,
|
||||
base_plant = base_plant,
|
||||
step_len = (def.step_len and def.step_len[step+1]) or 1,
|
||||
step_len = def.step_len[step+1],
|
||||
on_timer = farming_super.grow_plant,
|
||||
minlight = def.minlight,
|
||||
maxlight = def.maxlight,
|
||||
|
@ -542,7 +582,7 @@ farming_super.register_plant = function(name, def)
|
|||
def.next_node = next_node
|
||||
def.stack_height = stack_height
|
||||
-- print("def name "..pname)
|
||||
farming_super.registered_plants[pname] = def
|
||||
farming_super.registered_plants[base_plant] = def
|
||||
|
||||
|
||||
--[[
|
||||
|
|
15
init.lua
15
init.lua
|
@ -6,6 +6,7 @@ local modpath = minetest.get_modpath("farming_super")
|
|||
dofile(modpath.."/nodes.lua")
|
||||
dofile(modpath.."/api.lua")
|
||||
dofile(modpath.."/vines.lua")
|
||||
--dofile(modpath.."/hops.lua")
|
||||
|
||||
|
||||
|
||||
|
@ -54,7 +55,7 @@ yams
|
|||
|
||||
|
||||
much later:
|
||||
cucumber
|
||||
cucumber -- gourds
|
||||
grapes
|
||||
hops
|
||||
kiwi
|
||||
|
@ -494,6 +495,7 @@ farming_super.register_plant("farming_super:soybeans", {
|
|||
place_param2 = "X",
|
||||
inventory_image = "farming_super_seed_soybeans.png",
|
||||
-- visual_scale = 1.3,
|
||||
step_len = {1, 2, 2, 2},
|
||||
steps = {5}, -- phases, steps per tier
|
||||
default_drop = {},
|
||||
drops = {
|
||||
|
@ -545,6 +547,7 @@ farming_super.register_plant("farming_super:cabbage", {
|
|||
inventory_image = "farming_super_seed_cabbage.png",
|
||||
-- visual_scale = 1.3,
|
||||
steps = {4}, -- phases, steps per tier
|
||||
step_len = {1, 1, 2, 2},
|
||||
textures = { -- overrides default texture naming, allowing reuse
|
||||
p1s1t1 = "farming_super_green_pixels_1.png",
|
||||
p1s2t1 = "farming_super_green_pixels_2.png",
|
||||
|
@ -600,6 +603,7 @@ farming_super.register_plant("farming_super:cauliflower", {
|
|||
inventory_image = "farming_super_seed_cauliflower.png",
|
||||
-- visual_scale = 1.3,
|
||||
steps = {4}, -- phases, steps per tier
|
||||
step_len = {1, 1, 2, 2},
|
||||
textures = { -- overrides default texture naming, allowing reuse
|
||||
p1s1t1 = "farming_super_green_pixels_1.png",
|
||||
p1s2t1 = "farming_super_green_pixels_2.png",
|
||||
|
@ -822,7 +826,7 @@ farming_super.register_plant("farming_super:carrot", {
|
|||
-- visual_scale = 1.3,
|
||||
eat_value = 2,
|
||||
steps = {4}, -- phases, steps per tier
|
||||
step_len = {1, 2, 2, 2},
|
||||
step_len = {1, 2, 3, 3},
|
||||
textures = { -- overrides default texture naming, allowing reuse
|
||||
p1s1t1 = "farming_super_2x_green_pixels_1.png",
|
||||
p1s2t1 = "farming_super_2x_green_pixels_2.png",
|
||||
|
@ -878,7 +882,7 @@ farming_super.register_plant("farming_super:carrot_red", {
|
|||
-- visual_scale = 1.3,
|
||||
eat_value = 2,
|
||||
steps = {4}, -- phases, steps per tier
|
||||
step_len = {1, 2, 2, 2},
|
||||
step_len = {1, 2, 3, 3},
|
||||
textures = { -- overrides default texture naming, allowing reuse
|
||||
p1s1t1 = "farming_super_2x_green_pixels_1.png",
|
||||
p1s2t1 = "farming_super_2x_green_pixels_2.png",
|
||||
|
@ -934,7 +938,7 @@ farming_super.register_plant("farming_super:carrot_yellow", {
|
|||
-- visual_scale = 1.3,
|
||||
eat_value = 2,
|
||||
steps = {4}, -- phases, steps per tier
|
||||
step_len = {1, 2, 2, 2},
|
||||
step_len = {1, 2, 3, 3},
|
||||
textures = { -- overrides default texture naming, allowing reuse
|
||||
p1s1t1 = "farming_super_2x_green_pixels_1.png",
|
||||
p1s2t1 = "farming_super_2x_green_pixels_2.png",
|
||||
|
@ -990,7 +994,7 @@ farming_super.register_plant("farming_super:carrot_purple", {
|
|||
-- visual_scale = 1.3,
|
||||
eat_value = 2,
|
||||
steps = {4}, -- phases, steps per tier
|
||||
step_len = {1, 2, 2, 2},
|
||||
step_len = {1, 2, 3, 3},
|
||||
textures = { -- overrides default texture naming, allowing reuse
|
||||
p1s1t1 = "farming_super_2x_green_pixels_1.png",
|
||||
p1s2t1 = "farming_super_2x_green_pixels_2.png",
|
||||
|
@ -1044,6 +1048,7 @@ farming_super.register_plant("farming_super:rice", {
|
|||
paramtype2 = "meshoptions",
|
||||
place_param2 = "#",
|
||||
inventory_image = "farming_super_seed_rice.png",
|
||||
default_drop = {},
|
||||
-- visual_scale = 1.3,
|
||||
steps = {8}, -- phases, steps per tier
|
||||
drops = {
|
||||
|
|
|
@ -23,7 +23,6 @@ minetest.register_craftitem("farming_super:kiwi", {
|
|||
minetest.register_craftitem("farming_super:kiwi_sapling", {
|
||||
description = "Kiwi Sapling",
|
||||
inventory_image = "farming_super_kiwi_vine.png",
|
||||
on_use = minetest.item_eat(2),
|
||||
groups = {flammable = 2},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
|
Loading…
Reference in New Issue