Crafter/mods/farming/init.lua
2020-03-10 23:56:27 -07:00

317 lines
8.0 KiB
Lua

--Quick definition of hoes
local material = {"wood","stone","iron","gold","diamond"}
local function till_soil(pos)
local is_dirt = minetest.get_node_group(minetest.get_node(pos).name, "dirt") > 0
local is_farmland = minetest.get_node_group(minetest.get_node(pos).name, "farmland") > 0
if is_dirt and not is_farmland then
minetest.sound_play("dirt",{pos=pos})
minetest.set_node(pos,{name="farming:farmland_dry"})
return(true)
end
end
for level,material in pairs(material) do
local wear = 5000-(950*level)
print(wear)
minetest.register_tool("farming:"..material.."hoe", {
description = material:gsub("^%l", string.upper).." Hoe",
inventory_image = material.."hoe.png",
tool_capabilities = {
--full_punch_interval = 1.2,
--max_drop_level=0,
groupcaps={
dirt = {times={[4]=4-level/4,[3]=3.5-level/4,[2]=3.0-level/4,[1]=2.8-level/4}, uses=(level/2)*3, maxlevel=level},
sand = {times={[4]=4-level/4,[3]=3.5-level/4,[2]=3.0-level/4,[1]=2.8-level/4}, uses=(level/2)*3, maxlevel=level},
},
damage_groups = {fleshy=1},
},
sound = {breaks = {name="tool_break",gain=0.4}}, -- change this
groups = {flammable = 2, tool=1 },
on_place = function(itemstack, placer, pointed_thing)
local tilled = till_soil(pointed_thing.under)
if tilled == true then itemstack:add_wear(wear) end
local damage = itemstack:get_wear()
if damage <= 0 then
minetest.sound_play("tool_break",{object=placer})
end
return(itemstack)
end,
})
minetest.register_craft({
output = "farming:"..material.."hoe",
recipe = {
{"","main:"..material, "main:"..material},
{"","main:stick", ""},
{"", "main:stick", ""}
}
})
minetest.register_craft({
output = "farming:"..material.."hoe",
recipe = {
{"main:"..material,"main:"..material, ""},
{"","main:stick", ""},
{"", "main:stick", ""}
}
})
end
local farmland = {"wet","dry"}
for level,dryness in pairs(farmland) do
local coloring = 160/level
minetest.register_node("farming:farmland_"..dryness,{
description = "Farmland",
paramtype = "light",
drawtype = "nodebox",
sounds = main.dirtSound(),
--paramtype2 = "wallmounted",
node_box = {
type = "fixed",
--{xmin, ymin, zmin, xmax, ymax, zmax}
fixed = {-0.5, -0.5, -0.5, 0.5, 6/16, 0.5},
},
wetness = math.abs(level-2),
collision_box = {
type = "fixed",
--{xmin, ymin, zmin, xmax, ymax, zmax}
fixed = {-0.5, -0.5, -0.5, 0.5, 6/16, 0.5},
},
tiles = {"dirt.png^farmland.png^[colorize:black:"..coloring,"dirt.png^[colorize:black:"..coloring,"dirt.png^[colorize:black:"..coloring,"dirt.png^[colorize:black:"..coloring,"dirt.png^[colorize:black:"..coloring,"dirt.png^[colorize:black:"..coloring},
groups = {dirt = 1, soft = 1, shovel = 1, hand = 1, soil=1,farmland=1},
drop="main:dirt",
})
end
--drying and wetting abm for farmland
minetest.register_abm({
label = "Farmland Wet",
nodenames = {"farming:farmland_dry"},
neighbors = {"air","group:crop"},
interval = 3,
chance = 150,
action = function(pos)
local found = minetest.find_node_near(pos, 3, {"main:water","main:waterflow"})
if found then
minetest.set_node(pos,{name="farming:farmland_wet"})
else
minetest.set_node(pos,{name="main:dirt"})
end
end,
})
minetest.register_abm({
label = "Farmland dry",
nodenames = {"farming:farmland_wet"},
neighbors = {"air"},
interval = 5,
chance = 500,
action = function(pos)
local found = minetest.find_node_near(pos, 3, {"main:water","main:waterflow"})
if not found then
minetest.set_node(pos,{name="farming:farmland_dry"})
end
end,
})
minetest.register_node("farming:grass", {
description = "Tall Grass",
drawtype = "plantlike",
waving = 1,
walkable = false,
climbable = false,
paramtype = "light",
is_ground_content = false,
tiles = {"tallgrass.png"},
paramtype2 = "degrotate",
buildable_to = true,
groups = {leaves = 1, plant = 1, axe = 1, hand = 0,dig_immediate=1,attached_node=1},
sounds = main.grassSound(),
selection_box = {
type = "fixed",
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16}
},
drop = {
max_items = 1,
items= {
{
-- Only drop if using a tool whose name is identical to one
-- of these.
rarity = 10,
items = {"farming:seeds"},
-- Whether all items in the dropped item list inherit the
-- hardware coloring palette color from the dug node.
-- Default is 'false'.
--inherit_color = true,
},
},
},
})
--wheat definitions
local wheat_max = 7
minetest.register_abm({
label = "crops grow",
nodenames = {"group:crops"},
neighbors = {"group:farmland"},
interval = 3,
chance = 150,
action = function(pos)
local node_under = minetest.get_node(vector.new(pos.x,pos.y-1,pos.z)).name
local wetness = minetest.registered_nodes[node_under].wetness
if wetness == 0 or not wetness then
return
end
local node = minetest.get_node(pos).name
local stage = minetest.registered_nodes[node].grow_stage
if stage < wheat_max then
minetest.set_node(pos,{name="farming:wheat_"..stage+1})
end
end,
})
for i = 0,wheat_max do
local drop = ""
if i == wheat_max then
drop = {
max_items = 2,
items= {
{
-- Only drop if using a tool whose name is identical to one
-- of these.
--rarity = 10,
items = {"farming:wheat"},
-- Whether all items in the dropped item list inherit the
-- hardware coloring palette color from the dug node.
-- Default is 'false'.
--inherit_color = true,
},
{
-- Only drop if using a tool whose name is identical to one
-- of these.
rarity = 3,
items = {"farming:seeds"},
-- Whether all items in the dropped item list inherit the
-- hardware coloring palette color from the dug node.
-- Default is 'false'.
--inherit_color = true,
},
},
}
end
minetest.register_node("farming:wheat_"..i, {
description = "Wheat Stage "..i,
drawtype = "plantlike",
waving = 1,
walkable = false,
climbable = false,
paramtype = "light",
is_ground_content = false,
tiles = {"wheat_stage_"..i..".png"},
paramtype2 = "degrotate",
buildable_to = true,
grow_stage = i,
groups = {leaves = 1, plant = 1, axe = 1, hand = 0,dig_immediate=1,attached_node=1,crops=1},
sounds = main.grassSound(),
selection_box = {
type = "fixed",
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16}
},
drop = drop,
})
end
minetest.register_craftitem("farming:seeds", {
description = "Seeds",
inventory_image = "seeds.png",
on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local pb = pointed_thing.above
if minetest.get_node_group(minetest.get_node(vector.new(pb.x,pb.y-1,pb.z)).name, "farmland") == 0 or minetest.get_node(pointed_thing.above).name ~= "air" then
return itemstack
end
local wdir = minetest.dir_to_wallmounted(vector.subtract(pointed_thing.under,pointed_thing.above))
local fakestack = itemstack
local retval = false
retval = fakestack:set_name("farming:wheat_0")
if not retval then
return itemstack
end
itemstack, retval = minetest.item_place(fakestack, placer, pointed_thing, wdir)
itemstack:set_name("farming:seeds")
if retval then
minetest.sound_play("leaves", {pos=pointed_thing.above, gain = 1.0})
end
return itemstack
end
})
minetest.register_decoration({
deco_type = "simple",
place_on = "main:grass",
sidelen = 16,
fill_ratio = 0.5,
--biomes = {"grassland"},
decoration = "farming:grass",
height = 1,
})
minetest.register_craftitem("farming:wheat", {
description = "Wheat",
inventory_image = "wheat_harvested.png",
})
minetest.register_craftitem("farming:bread", {
description = "Bread",
inventory_image = "bread.png",
health = 3,
})
minetest.register_craftitem("farming:toast", {
description = "Toast",
inventory_image = "bread.png^[colorize:black:100",
health = 5,
})
minetest.register_craft({
output = "farming:bread",
recipe = {
{"farming:wheat", "farming:wheat", "farming:wheat"}
}
})
minetest.register_craft({
type = "cooking",
output = "farming:toast",
recipe = "farming:bread",
cooktime = 3,
})