mirror of
https://github.com/luanti-org/minetest_game.git
synced 2025-05-21 06:43:17 -04:00
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
302 lines
8 KiB
Lua
302 lines
8 KiB
Lua
-- farming/nodes.lua
|
|
|
|
-- support for MT game translation.
|
|
local S = farming.get_translator
|
|
|
|
minetest.override_item("default:dirt", {
|
|
soil = {
|
|
base = "default:dirt",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
minetest.override_item("default:dirt_with_grass", {
|
|
soil = {
|
|
base = "default:dirt_with_grass",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
minetest.override_item("default:dirt_with_dry_grass", {
|
|
soil = {
|
|
base = "default:dirt_with_dry_grass",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
minetest.override_item("default:dirt_with_rainforest_litter", {
|
|
soil = {
|
|
base = "default:dirt_with_rainforest_litter",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
minetest.override_item("default:dirt_with_coniferous_litter", {
|
|
soil = {
|
|
base = "default:dirt_with_coniferous_litter",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
minetest.override_item("default:dry_dirt", {
|
|
soil = {
|
|
base = "default:dry_dirt",
|
|
dry = "farming:dry_soil",
|
|
wet = "farming:dry_soil_wet"
|
|
}
|
|
})
|
|
|
|
minetest.override_item("default:dry_dirt_with_dry_grass", {
|
|
soil = {
|
|
base = "default:dry_dirt_with_dry_grass",
|
|
dry = "farming:dry_soil",
|
|
wet = "farming:dry_soil_wet"
|
|
}
|
|
})
|
|
|
|
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},
|
|
sounds = default.node_sound_dirt_defaults(),
|
|
soil = {
|
|
base = "default:dirt",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
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"},
|
|
drop = "default:dirt",
|
|
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",
|
|
dry = "farming:soil",
|
|
wet = "farming:soil_wet"
|
|
}
|
|
})
|
|
|
|
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},
|
|
sounds = default.node_sound_dirt_defaults(),
|
|
soil = {
|
|
base = "default:dry_dirt",
|
|
dry = "farming:dry_soil",
|
|
wet = "farming:dry_soil_wet"
|
|
}
|
|
})
|
|
|
|
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"},
|
|
drop = "default:dry_dirt",
|
|
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",
|
|
dry = "farming:dry_soil",
|
|
wet = "farming:dry_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 = 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},
|
|
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 = 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, desert = 1,
|
|
not_in_creative_inventory = 1, soil = 3, wet = 1, field = 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:straw", {
|
|
description = S("Straw"),
|
|
tiles = {"farming_straw.png"},
|
|
is_ground_content = false,
|
|
groups = {snappy=3, flammable=4, fall_damage_add_percent=-30},
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
})
|
|
|
|
-- Registered before the stairs so the stairs get fuel recipes.
|
|
minetest.register_craft({
|
|
type = "fuel",
|
|
recipe = "farming:straw",
|
|
burntime = 3,
|
|
})
|
|
|
|
do
|
|
local recipe = "farming:straw"
|
|
local groups = {snappy = 3, flammable = 4}
|
|
local images = {"farming_straw.png"}
|
|
local sounds = default.node_sound_leaves_defaults()
|
|
|
|
stairs.register_stair("straw", recipe, groups, images, S("Straw Stair"),
|
|
sounds, true)
|
|
stairs.register_stair_inner("straw", recipe, groups, images, "",
|
|
sounds, true, S("Inner Straw Stair"))
|
|
stairs.register_stair_outer("straw", recipe, groups, images, "",
|
|
sounds, true, S("Outer Straw Stair"))
|
|
stairs.register_slab("straw", recipe, groups, images, S("Straw Slab"),
|
|
sounds, true)
|
|
end
|
|
|
|
minetest.register_abm({
|
|
label = "Farming soil",
|
|
nodenames = {"group:field"},
|
|
interval = 15,
|
|
chance = 4,
|
|
action = function(pos, node)
|
|
pos.y = pos.y + 1
|
|
local nn = minetest.get_node_or_nil(pos)
|
|
if not nn then
|
|
return
|
|
end
|
|
local nn_def = minetest.registered_nodes[nn.name]
|
|
pos.y = pos.y - 1
|
|
|
|
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
|
|
|
|
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,
|
|
})
|
|
|
|
|
|
-- 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"}},
|
|
}
|
|
}
|
|
})
|
|
end
|
|
|
|
|
|
-- Make default:junglegrass occasionally drop cotton seed.
|
|
|
|
-- This is the old source of cotton seeds that makes no sense. It is a leftover
|
|
-- from Mapgen V6 where junglegrass was the only plant available to be a source.
|
|
-- 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"}},
|
|
}
|
|
}
|
|
})
|
|
|
|
|
|
-- Wild cotton as a source of cotton seed
|
|
|
|
minetest.register_node("farming:cotton_wild", {
|
|
description = S("Wild Cotton"),
|
|
drawtype = "plantlike",
|
|
waving = 1,
|
|
tiles = {"farming_cotton_wild.png"},
|
|
inventory_image = "farming_cotton_wild.png",
|
|
wield_image = "farming_cotton_wild.png",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
buildable_to = true,
|
|
groups = {snappy = 3, attached_node = 1, flammable = 4},
|
|
drop = "farming:seed_cotton",
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16},
|
|
},
|
|
})
|