mirror of
https://github.com/minetest/minetest_game.git
synced 2025-06-29 21:30:26 +02:00
Make farming more flexible
- API {farming.register_hoe(), farming.register_plant()} - Fertilities -> Plant only grow on soil with a fitting fertility, e.g. Wheat only grows on grassland, while cotton grows in deserts and grassland) - New soil: Desert Sand - Place seeds instead of plants
This commit is contained in:
139
mods/farming/nodes.lua
Normal file
139
mods/farming/nodes.lua
Normal file
@ -0,0 +1,139 @@
|
||||
minetest.override_item("default:dirt", {
|
||||
groups = {crumbly=3,soil=1},
|
||||
soil = {
|
||||
base = "default:dirt",
|
||||
dry = "farming:soil",
|
||||
wet = "farming:soil_wet"
|
||||
}
|
||||
})
|
||||
|
||||
minetest.override_item("default:dirt_with_grass", {
|
||||
groups = {crumbly=3,soil=1},
|
||||
soil = {
|
||||
base = "default:dirt_with_grass",
|
||||
dry = "farming:soil",
|
||||
wet = "farming:soil_wet"
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("farming:soil", {
|
||||
description = "Soil",
|
||||
tiles = {"farming_soil.png", "default_dirt.png"},
|
||||
drop = "default:dirt",
|
||||
is_ground_content = true,
|
||||
groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1},
|
||||
sounds = default.node_sound_dirt_defaults(),
|
||||
soil = {
|
||||
base = "default:dirt",
|
||||
dry = "farming:soil",
|
||||
wet = "farming:soil_wet"
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("farming:soil_wet", {
|
||||
description = "Wet Soil",
|
||||
tiles = {"farming_soil_wet.png", "farming_soil_wet_side.png"},
|
||||
drop = "default:dirt",
|
||||
is_ground_content = true,
|
||||
groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1},
|
||||
sounds = default.node_sound_dirt_defaults(),
|
||||
soil = {
|
||||
base = "default:dirt",
|
||||
dry = "farming:soil",
|
||||
wet = "farming:soil_wet"
|
||||
}
|
||||
})
|
||||
|
||||
minetest.override_item("default:desert_sand", {
|
||||
groups = {crumbly=3, falling_node=1, sand=1, soil = 1},
|
||||
soil = {
|
||||
base = "default:desert_sand",
|
||||
dry = "farming:desert_sand_soil",
|
||||
wet = "farming:desert_sand_soil_wet"
|
||||
}
|
||||
})
|
||||
minetest.register_node("farming:desert_sand_soil", {
|
||||
description = "Desert Sand",
|
||||
tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"},
|
||||
is_ground_content = true,
|
||||
groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1},
|
||||
sounds = default.node_sound_sand_defaults(),
|
||||
soil = {
|
||||
base = "default:desert_sand",
|
||||
dry = "farming:desert_sand_soil",
|
||||
wet = "farming:desert_sand_soil_wet"
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("farming:desert_sand_soil_wet", {
|
||||
description = "Desert Sand",
|
||||
drop = "default:desert_sand",
|
||||
tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"},
|
||||
is_ground_content = true,
|
||||
groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1},
|
||||
sounds = default.node_sound_sand_defaults(),
|
||||
soil = {
|
||||
base = "default:desert_sand",
|
||||
dry = "farming:desert_sand_soil",
|
||||
wet = "farming:desert_sand_soil_wet"
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"group:soil", "group:wet"},
|
||||
interval = 5,
|
||||
chance = 10,
|
||||
action = function(pos, node)
|
||||
pos.y = pos.y+1
|
||||
local nn = minetest.get_node(pos).name
|
||||
node = minetest.registered_nodes[node.name]
|
||||
pos.y = pos.y-1
|
||||
|
||||
if node.soil == nil or node.soil.wet == nil or node.soil.base == nil or node.soil.dry == nil then
|
||||
minetest.log("error", "Could not process soil information of node " .. nn)
|
||||
return
|
||||
end
|
||||
|
||||
if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].walkable and minetest.get_item_group(nn, "plant") == 0 and node.name ~= node.soil.base then
|
||||
minetest.set_node(pos, {name = node.soil.base})
|
||||
end
|
||||
-- check if there is water nearby
|
||||
if minetest.find_node_near(pos, 3, {"group:water"}) then
|
||||
-- if it is dry soil and not base node, turn it into wet soil
|
||||
if node.name ~= node.soil.base and minetest.get_item_group(node.name, "wet") == 0 then
|
||||
minetest.set_node(pos, {name = node.soil.wet})
|
||||
end
|
||||
else
|
||||
-- turn it back into base if it is already dry
|
||||
if minetest.get_item_group(node.name, "wet") == 0 then
|
||||
-- only turn it back if there is no plant/seed on top of it
|
||||
if minetest.get_item_group(nn, "plant") == 0 and minetest.get_item_group(nn, "seed") == 0 then
|
||||
minetest.set_node(pos, {name = node.soil.base})
|
||||
end
|
||||
|
||||
-- if its wet turn it back into dry soil
|
||||
elseif minetest.get_item_group(node.name, "wet") == 1 then
|
||||
minetest.set_node(pos, {name = node.soil.dry})
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
for i = 1, 5 do
|
||||
minetest.override_item("default:grass_"..i, {drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{items = {'farming:seed_wheat'},rarity = 5},
|
||||
{items = {'default:grass_1'}},
|
||||
}
|
||||
}})
|
||||
end
|
||||
|
||||
minetest.override_item("default:junglegrass", {drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{items = {'farming:seed_cotton'},rarity = 8},
|
||||
{items = {'default:junglegrass'}},
|
||||
}
|
||||
}})
|
Reference in New Issue
Block a user