minetest_farming_super/grapes.lua

598 lines
15 KiB
Lua

--[[
TODO:
tension physics on wires
spots/bugs disease
check nearby nodes for yellowing decision
growth and aging of vines
]]
local grape_speed = {
rand = 60,
retry = 30,
cutting = 1600,
sapling = 2800,
fruit = 1000,
leaf_regrowth = 40,
wine = 60*60*2,
}
--[[
local grape_speed = {
retry = 2,
cutting = 6,
sapling = 6,
fruit = 4,
leaf_regrowth = 4,
}
]]
local function gr()
return math.random(grape_speed.rand)
end
minetest.register_craftitem("farming_super:grape_leaves", {
description = "Grape Leaves",
inventory_image = "farming_super_grapes_leaves_item.png",
on_use = minetest.item_eat(1),
groups = {flammable = 1},
})
local colors = {"red", "green", "purple", "black"}
local deco_seeds = {4673, 4674, 4675, 4676, 4677 }
for gi,color in ipairs(colors) do
minetest.register_node("farming_super:grape_cutting_"..color, {
description = "Grape Cutting",
drawtype = "plantlike",
-- waving = 1,
-- visual_scale = 1.69,
tiles = {"farming_super_grapes_cutting.png"},
inventory_image = "farming_super_grapes_cutting.png",
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
walkable = false,
buildable_to = false,
grape_color = color,
groups = {snappy = 2, oddly_breakable_by_hand = 2, flammable = 1, grape_cutting=1},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16},
},
place_param2 = 1,
on_place = function(itemstack, placer, pointed_thing)
minetest.set_node(pointed_thing.above, {name="farming_super:grape_cutting_"..color, param2 = 1})
local timer = minetest.get_node_timer(pointed_thing.above)
timer:start(grape_speed.cutting + gr())
itemstack:take_item(1)
return itemstack
end,
on_timer = function(pos, elapsed)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
local c = def.grape_color
pos.y = pos.y - 1
local soil = minetest.get_node(pos)
if soil.name ~= "farming:desert_sand_soil_wet" then
pos.y = pos.y + 1
-- print("wrong soil")
minetest.get_node_timer(pos):start(grape_speed.retry)
return
end
pos.y = pos.y + 1
minetest.set_node(pos, {name = "farming_super:grape_sapling_"..color, param2 = 1})
minetest.get_node_timer(pos):start(grape_speed.sapling + gr())
end,
})
minetest.register_node("farming_super:grape_sapling_"..color, {
description = "Grape Sapling",
drawtype = "plantlike",
waving = 1,
-- visual_scale = 1.69,
tiles = {"farming_super_grapes_sapling.png"},
inventory_image = "farming_super_grapes_sapling.png",
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
walkable = false,
buildable_to = false,
grape_color = color,
groups = {snappy = 2, oddly_breakable_by_hand = 2, flammable = 1, grape_sapling=1},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
place_param2 = 1,
on_place = function(itemstack, placer, pointed_thing)
minetest.set_node(pointed_thing.above, {name="farming_super:grape_sapling_"..color, param2 = 1})
local timer = minetest.get_node_timer(pointed_thing.above)
timer:start(grape_speed.sapling + gr())
itemstack:take_item(1)
return itemstack
end,
on_timer = function(pos, elapsed)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
local c = def.grape_color
pos.y = pos.y - 1
local soil = minetest.get_node(pos)
if soil.name ~= "farming:desert_sand_soil_wet" then
pos.y = pos.y + 1
-- print("wrong soil")
minetest.get_node_timer(pos):start(grape_speed.retry)
return
end
pos.y = pos.y + 3
local wire = minetest.get_node(pos)
if wire.name ~= "farming_super:wire" then
pos.y = pos.y - 2
minetest.get_node_timer(pos):start(grape_speed.retry)
-- print("no wire")
return
end
pos.y = pos.y - 1
minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color, param2 = 3})
minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
pos.y = pos.y - 1
minetest.set_node(pos, {name = "farming_super:grape_stem_"..color, param2 = 1})
end,
})
minetest.register_node("farming_super:grape_stem_"..color, {
description = "Grape Plant",
drawtype = "plantlike",
-- waving = 1,
-- visual_scale = 1.69,
tiles = {"farming_super_grape_vine_stem.png"},
wield_image = "farming_super_grape_vine_stem.png",
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
walkable = false,
buildable_to = false,
grape_color = color,
drop = {
max_items = 2,
items = {
{ items = {'farming_super:grape_cutting_'..color}, },
{ items = {'farming_super:grape_cutting_'..color}, rarity = 2 },
}
},
groups = {
snappy = 1, choppy=2, flammable = 1, grape_stem = 1, not_in_creative_inventory=1,
},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16},
},
place_param2 = 1,
after_destruct = function(pos, oldnode)
pos.y = pos.y + 1
local leaves = minetest.get_node(pos)
if minetest.get_item_group(leaves.name, "grape_leaves") > 0 then
minetest.set_node(pos, {name="air"})
end
end,
})
minetest.register_node("farming_super:grape_leaves_"..color, {
description = "Grape Leaves",
drawtype = "plantlike",
waving = 1,
visual_scale = 1.2,
tiles = {"default_aspen_leaves.png"},
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
-- walkable = false,
climbable = true,
groups = {
snappy=1, flammable=1, grape_leaves=1, grape_leaves_bare=1,
grape_healthy_leaves=1, not_in_creative_inventory=1, hangs_from_vines=1,
},
grape_color = color,
drop = {
max_items = 2,
items = {
{ items = {'farming_super:grape_leaves 1'} },
{ items = {'farming_super:grape_leaves 1'}, rarity = 4 },
{ items = {'farming_super:grape_cutting_'..color}, rarity = 10 },
}
},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
collision_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
place_param2 = 3,
on_timer = function(pos, elapsed)
local node = minetest.get_node(pos)
local color = minetest.registered_nodes[node.name].grape_color
minetest.set_node(pos, {name = "farming_super:grape_leaves_ripe_"..color, param2 = 3})
minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
end,
})
minetest.register_node("farming_super:grape_yellow_leaves_"..color, {
description = "Yellow Grape Leaves",
drawtype = "plantlike",
waving = 1,
visual_scale = 1.2,
tiles = {"default_aspen_leaves.png^[colorize:olive:150"},
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
-- walkable = false,
climbable = true,
grape_color = color,
groups = {
snappy=1, flammable=1, grape_leaves=1, grape_yellow_leaves=1,
not_in_creative_inventory=1, hangs_from_vines=1
},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
collision_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
place_param2 = 3,
})
minetest.register_node("farming_super:grape_leaves_ripe_"..color, {
description = "Grapes, "..color,
drawtype = "plantlike",
waving = 1,
visual_scale = 1.2,
tiles = {"default_aspen_leaves.png^farming_super_grapes_ripe_"..color..".png"},
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
-- walkable = true,
climbable = true,
grape_color = color,
groups = {
snappy=1, flammable=1, grape_leaves=1, grape_healthy_leaves=1,
not_in_creative_inventory=1, hangs_from_vines=1
},
sounds = default.node_sound_leaves_defaults(),
drop = {
max_items = 2,
items = {
{ items = {'farming_super:grape_cluster_'..color..' 2'} },
{ items = {'farming_super:grape_cluster_'..color..' 1'}, rarity = 2},
{ items = {'farming_super:grape_cluster_'..color..' 2'}, rarity = 6},
}
},
selection_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
collision_box = {
type = "fixed",
fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
},
place_param2 = 3,
-- after_dig_node = function(pos, oldnode, oldmetadata, digger)
-- minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color})
-- end,
on_punch = function(pos, node, puncher)
local inv = puncher:get_inventory()
local drops = minetest.get_node_drops(node.name)
for _,d in pairs(drops) do
inv:add_item("main", d)
end
minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color, param2 = 3})
minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
end,
})
minetest.register_craftitem("farming_super:grape_cluster_"..color, {
description = "Grapes, "..color,
-- inventory_image = "farming_super_grape_cluster_"..color..".png",
inventory_image = "farming_super_grapes_ripe_"..color..".png",
on_use = minetest.item_eat(4),
groups = {flammable = 1},
})
minetest.register_decoration({
name = "farming_super:grape_sapling_"..color,
deco_type = "simple",
place_on = {"default:desert_sand", "default:sand", "default:dry_dirt_with_dry_grass"},
sidelen = 16,
noise_params = {
offset = -0.0003,
scale = 0.0009,
spread = {x = 200, y = 200, z = 200},
seed = deco_seeds[gi],
octaves = 3,
persist = 0.6
},
biomes = {"desert_ocean", "savanna"},
y_max = 30,
y_min = 0,
decoration = "farming_super:grape_sapling_"..color,
param2 = 1,
})
-- grape products and crafts
minetest.register_craftitem("farming_super:grape_juice_"..color, {
description = "Grape Juice, "..color,
inventory_image = "farming_super_grapes_juice_"..color..".png",
on_use = minetest.item_eat(7, "vessels:glass_bottle"),
groups = {flammable = 1},
})
local bunch = "farming_super:grape_cluster_"..color
local juice = "farming_super:grape_juice_"..color
minetest.register_craft({
output = "farming_super:grape_juice_"..color,
recipe = {
{bunch, bunch, bunch},
{bunch, "vessels:glass_bottle", bunch},
{bunch, bunch, bunch},
},
})
minetest.register_node("farming_super:grape_juice_barrel_"..color, {
description = "Juice Barrel, "..color,
tiles = {
"default_wood.png^farming_super_barrel_bung.png",
"default_wood.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png"
},
paramtype2 = "facedir",
-- inventory_image = "bitumen_oil_drum.png",
groups = {
cracky=2,
choppy=2,
oddly_breakable_by_hand=2,
},
paramtype = "light",
drawtype = "nodebox",
grape_color = color,
node_box = {
type = "fixed",
fixed = {
--11.25
{-0.49, -0.5, -0.10, 0.49, 0.5, 0.10},
{-0.10, -0.5, -0.49, 0.10, 0.5, 0.49},
--22.5
{-0.46, -0.5, -0.19, 0.46, 0.5, 0.19},
{-0.19, -0.5, -0.46, 0.19, 0.5, 0.46},
-- 33.75
{-0.416, -0.5, -0.28, 0.416, 0.5, 0.28},
{-0.28, -0.5, -0.416, 0.28, 0.5, 0.416},
--45
{-0.35, -0.5, -0.35, 0.35, 0.5, 0.35},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
on_place = function(itemstack, placer, pointed_thing)
minetest.set_node(pointed_thing.above, {name = "farming_super:grape_juice_barrel_"..color})
local timer = minetest.get_node_timer(pointed_thing.above)
timer:start(grape_speed.wine)
itemstack:take_item(1)
return itemstack
end,
on_timer = function(pos, elapsed)
local node = minetest.get_node(pos)
local color = minetest.registered_nodes[node.name].grape_color
minetest.set_node(pos, {name = "farming_super:wine_barrel_"..color})
end,
})
minetest.register_node("farming_super:wine_barrel_"..color, {
description = "Wine Barrel, "..color,
tiles = {
"default_wood.png^farming_super_barrel_bung.png",
"default_wood.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png",
"default_wood.png^[transformR90^farming_super_barrel_rings.png"
},
paramtype2 = "facedir",
-- inventory_image = "bitumen_oil_drum.png",
groups = {
cracky=2,
choppy=2,
oddly_breakable_by_hand=2,
},
paramtype = "light",
drawtype = "nodebox",
grape_color = color,
node_box = {
type = "fixed",
fixed = {
--11.25
{-0.49, -0.5, -0.10, 0.49, 0.5, 0.10},
{-0.10, -0.5, -0.49, 0.10, 0.5, 0.49},
--22.5
{-0.46, -0.5, -0.19, 0.46, 0.5, 0.19},
{-0.19, -0.5, -0.46, 0.19, 0.5, 0.46},
-- 33.75
{-0.416, -0.5, -0.28, 0.416, 0.5, 0.28},
{-0.28, -0.5, -0.416, 0.28, 0.5, 0.416},
--45
{-0.35, -0.5, -0.35, 0.35, 0.5, 0.35},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
stack_max = 1,
})
minetest.register_craft({
output = "farming_super:grape_juice_barrel_"..color,
recipe = {
{juice, juice, juice},
{juice, "farming_super:barrel", juice},
{juice, juice, juice},
},
})
end
minetest.register_abm({
label = "Grape Vine Leaf Regrowth",
nodenames = {"group:grape_stem"},
interval = grape_speed.leaf_regrowth,
chance = 20,
action = function(pos, node)
pos.y = pos.y + 1
local n = minetest.get_node(pos)
if n.name == "air" then
local color = minetest.registered_nodes[node.name].grape_color
minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color, param2 = 3})
minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
end
end,
})
minetest.register_abm({
label = "Grape Vine Fruit",
nodenames = {"group:grape_leaves_bare"},
interval = 10,
chance = 10,
action = function(pos, node)
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(grape_speed.fruit + gr())
end
end,
})
minetest.register_abm({
label = "Grape Vine Fruit",
nodenames = {"group:grape_stem", "group:grape_cutting", "group:grape_sapling"},
interval = 30,
chance = 5,
action = function(pos, node)
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(grape_speed.fruit + gr())
end
end,
})
minetest.register_abm({
label = "Grape Leaf Disease Origin",
nodenames = {"group:grape_healthy_leaves"},
interval = 440,
chance = 900,
action = function(pos)
local node = minetest.get_node(pos)
local color = minetest.registered_nodes[node.name].grape_color
minetest.set_node(pos, {name = "farming_super:grape_yellow_leaves_"..color, param2 = 3})
minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
end,
})
minetest.register_abm({
label = "Grape Leaf Disease Spread",
nodenames = {"group:grape_yellow_leaves"},
neighbors = {"group:grape_healthy_leaves"},
interval = 20,
chance = 30,
action = function(pos)
local node = minetest.get_node(pos)
local color = minetest.registered_nodes[node.name].grape_color
minetest.set_node(pos, {name = "farming_super:grape_yellow_leaves_"..color, param2 = 3})
minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
end,
})