crops-cd2025/potato.lua
Auke Kok aa239c4ae3 Potatoes.
The plants themselves don't drop anything. Only if the plant matures
can you dig potatoes from the soil. If you can reach the soil from the
side you can save yourself one dig by digging the soil as that will
remove the plant from the top, but otherwise you need to dig twice:
once to remove the plant, once to dig out the potatoes.

You get 3-5 potatoes. Each potato gives one (set of) "potato eyes"
which are the clones that can grow back to potatoes.

The plant itself is purposedly drawn "low" and not as a full block as
that's how the plant grows without support, mostly close to the ground.

Be careful not to dig the plant when there's flowers! You have to
wait until the soil below shows potatoes. It's fairly easy to see
the difference, though.
2015-04-14 01:09:35 -07:00

149 lines
4.2 KiB
Lua

--[[
Copyright (C) 2015 - Auke Kok <sofar@foo-projects.org>
"crops" 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.
--]]
local interval = crops_interval
local chance = crops_chance
minetest.register_node("crops:potato_eyes", {
description = "potato eyes",
inventory_image = "crops_potato_eyes.png",
wield_image = "crops_potato_eyes.png",
tiles = { "crops_potato_plant_1.png" },
drawtype = "plantlike",
sunlight_propagates = false,
use_texture_alpha = true,
walkable = false,
paramtype = "light",
groups = { snappy=3,flammable=3,flora=1,attached_node=1 },
on_place = function(itemstack, placer, pointed_thing)
local under = minetest.get_node(pointed_thing.under)
if minetest.get_item_group(under.name, "soil") <= 1 then
return
end
minetest.set_node(pointed_thing.above, {name="crops:potato_plant_1"})
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end
})
for stage = 1, 4 do
minetest.register_node("crops:potato_plant_" .. stage , {
description = "potato plant",
tiles = { "crops_potato_plant_" .. stage .. ".png" },
drawtype = "plantlike",
sunlight_propagates = true,
use_texture_alpha = true,
walkable = false,
paramtype = "light",
groups = { snappy=3, flammable=3, flora=1, attached_node=1, not_in_creative_inventory=1 },
drop = {},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -0.5 + (((math.min(stage, 4)) + 1) / 5), 0.5}
}
})
end
minetest.register_craftitem("crops:potato", {
description = "potato",
inventory_image = "crops_potato.png",
on_use = minetest.item_eat(1)
})
minetest.register_craft({
type = "shapeless",
output = "crops:potato_eyes",
recipe = { "crops:potato" }
})
--
-- the potatoes "block"
--
minetest.register_node("crops:soil_with_potatoes", {
description = "Soil with potatoes",
tiles = { "default_dirt.png^crops_potato_soil.png", "default_dirt.png" },
sunlight_propagates = false,
use_texture_alpha = false,
walkable = true,
groups = { snappy=3, flammable=3, oddly_breakable_by_hand=2, soil=1 },
paramtype2 = "facedir",
drop = {max_items = 5, items = {
{ items = {'crops:potato'}, rarity = 1 },
{ items = {'crops:potato'}, rarity = 1 },
{ items = {'crops:potato'}, rarity = 1 },
{ items = {'crops:potato'}, rarity = 2 },
{ items = {'crops:potato'}, rarity = 5 },
}},
sounds = default.node_sound_dirt_defaults(),
on_dig = function(pos, node, digger)
local drops = {}
for i = 1, math.random(3, 5) do
table.insert(drops, "crops:potato")
end
core.handle_node_drops(pos, drops, digger)
minetest.set_node(pos, { name = "farming:soil" })
local above = { x = pos.x, y = pos.y + 1, z = pos.z }
if minetest.get_node(above).name == "crops:potato_plant_4" then
minetest.set_node(above, { name = "air" })
end
end
})
--
-- grows a plant to mature size
--
minetest.register_abm({
nodenames = { "crops:potato_plant_1", "crops:potato_plant_2", "crops:potato_plant_3" },
neighbors = { "group:soil" },
interval = interval,
chance = chance,
action = function(pos, node, active_object_count, active_object_count_wider)
local below = { x = pos.x, y = pos.y - 1, z = pos.z }
if not minetest.registered_nodes[minetest.get_node(below).name].groups.soil then
return
end
if minetest.get_node_light(pos, nil) < 13 then
return
end
local n = string.gsub(node.name, "3", "4")
n = string.gsub(n, "2", "3")
n = string.gsub(n, "1", "2")
minetest.set_node(pos, { name = n })
end
})
--
-- grows the final potatoes in the soil beneath
--
minetest.register_abm({
nodenames = { "crops:potato_plant_4" },
neighbors = { "group:soil" },
interval = interval,
chance = chance,
action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.get_node_light(pos, nil) < 13 then
return
end
local below = { x = pos.x, y = pos.y - 1, z = pos.z }
if not minetest.registered_nodes[minetest.get_node(below).name].groups.soil then
return
end
local below = { x = pos.x, y = pos.y - 1, z = pos.z}
minetest.set_node(below, { name = "crops:soil_with_potatoes" })
end
})