Cleanup farming code and small additional changes

Some additional changes:
Hoes only work if the node is pointed to from above.
Hoe description, inventory_image and max_uses must be specified (when registering).
Nodes with the field group must have all soil values in the node definition.
Field nodes do not loose their param2 value (e.g. rotation) when they dry, get wet or get hoed.
The node above the hoed one is not checked for protection because that node is not changed; similarly, the node under a seed is not tested for protection.
Document the fertility
test for nil player in the hoe on_use function
properly test for the creative mod
ensure that the on_place function returns an itemstack
change missing soil fields message
This commit is contained in:
HybridDog 2016-05-23 13:10:16 +02:00
parent dd91a1bfe5
commit 4e8db84635
4 changed files with 204 additions and 213 deletions

View file

@ -63,7 +63,8 @@ minetest.register_node("farming:soil", {
description = S("Soil"),
tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"},
drop = "default:dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1},
groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2,
grassland = 1, field = 1},
sounds = default.node_sound_dirt_defaults(),
soil = {
base = "default:dirt",
@ -74,9 +75,11 @@ minetest.register_node("farming:soil", {
minetest.register_node("farming:soil_wet", {
description = S("Wet Soil"),
tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"},
tiles = {"default_dirt.png^farming_soil_wet.png",
"default_dirt.png^farming_soil_wet_side.png"},
drop = "default:dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1},
groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, wet = 1,
grassland = 1, field = 1},
sounds = default.node_sound_dirt_defaults(),
soil = {
base = "default:dirt",
@ -89,7 +92,8 @@ minetest.register_node("farming:dry_soil", {
description = S("Savanna Soil"),
tiles = {"default_dry_dirt.png^farming_soil.png", "default_dry_dirt.png"},
drop = "default:dry_dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1},
groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1,
field = 1},
sounds = default.node_sound_dirt_defaults(),
soil = {
base = "default:dry_dirt",
@ -100,9 +104,11 @@ minetest.register_node("farming:dry_soil", {
minetest.register_node("farming:dry_soil_wet", {
description = S("Wet Savanna Soil"),
tiles = {"default_dry_dirt.png^farming_soil_wet.png", "default_dry_dirt.png^farming_soil_wet_side.png"},
tiles = {"default_dry_dirt.png^farming_soil_wet.png",
"default_dry_dirt.png^farming_soil_wet_side.png"},
drop = "default:dry_dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1},
groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1,
grassland = 1, field = 1},
sounds = default.node_sound_dirt_defaults(),
soil = {
base = "default:dry_dirt",
@ -123,7 +129,8 @@ minetest.register_node("farming:desert_sand_soil", {
description = S("Desert Sand Soil"),
drop = "default:desert_sand",
tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"},
groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1},
groups = {crumbly = 3, not_in_creative_inventory = 1, falling_node = 1,
sand = 1, soil = 2, desert = 1, field = 1},
sounds = default.node_sound_sand_defaults(),
soil = {
base = "default:desert_sand",
@ -135,8 +142,10 @@ minetest.register_node("farming:desert_sand_soil", {
minetest.register_node("farming:desert_sand_soil_wet", {
description = S("Wet Desert Sand Soil"),
drop = "default:desert_sand",
tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"},
groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1},
tiles = {"farming_desert_sand_soil_wet.png",
"farming_desert_sand_soil_wet_side.png"},
groups = {crumbly = 3, falling_node = 1, sand = 1, desert = 1,
not_in_creative_inventory = 1, soil = 3, wet = 1, field = 1},
sounds = default.node_sound_sand_defaults(),
soil = {
base = "default:desert_sand",
@ -182,49 +191,56 @@ minetest.register_abm({
interval = 15,
chance = 4,
action = function(pos, node)
local n_def = minetest.registered_nodes[node.name] or nil
local wet = n_def.soil.wet or nil
local base = n_def.soil.base or nil
local dry = n_def.soil.dry or nil
if not n_def or not n_def.soil or not wet or not base or not dry then
return
end
pos.y = pos.y + 1
local nn = minetest.get_node_or_nil(pos)
if not nn or not nn.name then
if not nn then
return
end
local nn_def = minetest.registered_nodes[nn.name] or nil
local nn_def = minetest.registered_nodes[nn.name]
pos.y = pos.y - 1
if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then
minetest.set_node(pos, {name = base})
local soil = minetest.registered_nodes[node.name].soil
assert(soil and soil.wet and soil.base and soil.dry,
"Field node " .. node.name .. " lacks of either 'wet', 'base' " ..
"or 'dry' properties.")
if nn_def and nn_def.walkable and
minetest.get_item_group(nn.name, "plant") == 0 then
node.name = soil.base
minetest.set_node(pos, node)
return
end
-- check if there is water nearby
local wet_lvl = minetest.get_item_group(node.name, "wet")
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 wet_lvl == 0 then
minetest.set_node(pos, {name = wet})
end
else
-- only turn back if there are no unloaded blocks (and therefore
-- possible water sources) nearby
if not minetest.find_node_near(pos, 3, {"ignore"}) then
-- turn it back into base if it is already dry
if wet_lvl == 0 then
-- only turn it back if there is no plant/seed on top of it
if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then
minetest.set_node(pos, {name = base})
end
-- if its wet turn it back into dry soil
elseif wet_lvl == 1 then
minetest.set_node(pos, {name = dry})
end
local wet_lvl = minetest.get_item_group(node.name, "wet")
-- Make the node wet if water is near it
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 wet_lvl == 0 then
node.name = soil.wet
minetest.set_node(pos, node)
end
return
end
-- Only dry out if there are no unloaded blocks (and therefore
-- possible water sources) nearby
if minetest.find_node_near(pos, 3, {"ignore"}) then
return
end
-- Turn it back into base if it is already dry and no plant/seed
-- is on top of it
if wet_lvl == 0 then
if minetest.get_item_group(nn.name, "plant") == 0 and
minetest.get_item_group(nn.name, "seed") == 0 then
node.name = soil.base
minetest.set_node(pos, node)
end
-- If it is wet turn it back into dry soil
elseif wet_lvl == 1 then
node.name = soil.dry
minetest.set_node(pos, node)
end
end,
})
@ -233,13 +249,15 @@ minetest.register_abm({
-- Make default:grass_* occasionally drop wheat seed
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"}},
minetest.override_item("default:grass_" .. i, {
drop = {
max_items = 1,
items = {
{items = {"farming:seed_wheat"}, rarity = 5},
{items = {"default:grass_1"}},
}
}
}})
})
end
@ -250,13 +268,15 @@ end
-- This source is kept for now to avoid disruption but should probably be
-- removed in future as players get used to the new source.
minetest.override_item("default:junglegrass", {drop = {
max_items = 1,
items = {
{items = {"farming:seed_cotton"}, rarity = 8},
{items = {"default:junglegrass"}},
minetest.override_item("default:junglegrass", {
drop = {
max_items = 1,
items = {
{items = {"farming:seed_cotton"}, rarity = 8},
{items = {"default:junglegrass"}},
}
}
}})
})
-- Wild cotton as a source of cotton seed