diff --git a/mods/farming/api.lua b/mods/farming/api.lua index f1767d1..e6d57f8 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -44,7 +44,10 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) pos = pt.under, gain = 0.5, }) - itemstack:add_wear(65535/(uses-1)) + + if not minetest.setting_getbool("creative_mode") then + itemstack:add_wear(65535/(uses-1)) + end return itemstack end @@ -135,25 +138,27 @@ end farming.register_plant = function(name, def) local mname = name:split(":")[1] local pname = name:split(":")[2] + -- Check def table - if def.description == nil then + if not def.description then def.description = "Seed" end - if def.inventory_image == nil then + if not def.inventory_image then def.inventory_image = "unknown_item.png" end - if def.steps == nil then + if not def.steps then return nil end - if def.minlight == nil then + if not def.minlight then def.minlight = 1 end - if def.maxlight == nil then + if not def.maxlight then def.maxlight = 14 end if not def.fertility then def.fertility = {} end + -- Register seed local g = {seed = 1, snappy = 3, attached_node = 1} for k, v in pairs(def.fertility) do @@ -179,40 +184,13 @@ farming.register_plant = function(name, def) return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname) end }) - -- Seed -> plant - minetest.register_abm({ - nodenames = {"group:seed"}, - neighbors = {"group:soil"}, - interval = 90, - chance = 2, - action = function(pos, node) - local seedferts = minetest.registered_nodes[node.name].fertility - local soilferts = {} - -- Collect fertilities of soil - for k, v in pairs(minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name].groups) do - if k == "grassland" or k == "desert" then - soilferts[k] = k - end - end - -- Cannot grow if no fertility match found - local fertmatch = false - for k, v in pairs(seedferts) do - if soilferts[v] ~= nil then - fertmatch = true - break - end - end - - if fertmatch == true and minetest.get_item_group(minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name, "wet") ~= 0 then - minetest.set_node(pos, {name = node.name:gsub("seed_", "") .. "_1"}) - end - end - }) + -- Register harvest minetest.register_craftitem(":" .. mname .. ":" .. pname, { description = pname:gsub("^%l", string.upper), inventory_image = mname .. "_" .. pname .. ".png", }) + -- Register growing steps for i=1,def.steps do local drop = { @@ -242,18 +220,38 @@ farming.register_plant = function(name, def) sounds = default.node_sound_leaves_defaults(), }) end + -- Growing ABM minetest.register_abm({ - nodenames = {"group:" .. pname}, + nodenames = {"group:" .. pname, "group:seed"}, neighbors = {"group:soil"}, interval = 90, chance = 2, action = function(pos, node) + local plant_height = minetest.get_item_group(node.name, pname) + -- return if already full grown - if minetest.get_item_group(node.name, pname) == def.steps then + if plant_height == def.steps then return end - + + local node_def = minetest.registered_items[node.name] or nil + + -- grow seed + if minetest.get_item_group(node.name, "seed") and node_def.fertility then + local can_grow = false + local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + for _, v in pairs(node_def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 then + can_grow = true + end + end + if can_grow then + minetest.set_node(pos, {name = node.name:gsub("seed_", "") .. "_1"}) + end + return + end + -- check if on wet soil pos.y = pos.y - 1 local n = minetest.get_node(pos) @@ -261,20 +259,19 @@ farming.register_plant = function(name, def) return end pos.y = pos.y + 1 - + -- check light - if not minetest.get_node_light(pos) then + local ll = minetest.get_node_light(pos) + + if not ll or ll < def.minlight or ll > def.maxlight then return end - if minetest.get_node_light(pos) < def.minlight or minetest.get_node_light(pos) > def.maxlight then - return - end - + -- grow - local height = minetest.get_item_group(node.name, pname) + 1 - minetest.set_node(pos, {name = mname .. ":" .. pname .. "_" .. height}) + minetest.set_node(pos, {name = mname .. ":" .. pname .. "_" .. plant_height + 1}) end }) + -- Return local r = { seed = mname .. ":seed_" .. pname, diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index d8c1d2d..ba7aed4 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -21,7 +21,7 @@ minetest.register_node("farming: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}, + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, sounds = default.node_sound_dirt_defaults(), soil = { base = "default:dirt", @@ -35,7 +35,7 @@ minetest.register_node("farming:soil_wet", { 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}, + 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", @@ -57,7 +57,7 @@ minetest.register_node("farming:desert_sand_soil", { drop = "default: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}, + 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", @@ -71,7 +71,7 @@ minetest.register_node("farming:desert_sand_soil_wet", { 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}, + groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1}, sounds = default.node_sound_sand_defaults(), soil = { base = "default:desert_sand", @@ -81,39 +81,48 @@ minetest.register_node("farming:desert_sand_soil_wet", { }) minetest.register_abm({ - nodenames = {"group:soil", "group:wet"}, - interval = 5, - chance = 10, + nodenames = {"group:field"}, + interval = 15, + chance = 4, 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 + 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 + return + end + local nn_def = minetest.registered_nodes[nn.name] or nil + pos.y = pos.y - 1 - 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}) + if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then + minetest.set_node(pos, {name = base}) + return end -- check if there is water nearby if minetest.find_node_near(pos, 3, {"group:water"}) then + local wet_lvl = minetest.get_item_group(node.name, "wet") -- 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}) + if wet_lvl == 0 then + minetest.set_node(pos, {name = wet}) end else -- turn it back into base if it is already dry - if minetest.get_item_group(node.name, "wet") == 0 then + 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, "plant") == 0 and minetest.get_item_group(nn, "seed") == 0 then - minetest.set_node(pos, {name = node.soil.base}) + 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 minetest.get_item_group(node.name, "wet") == 1 then - minetest.set_node(pos, {name = node.soil.dry}) + elseif wet_lvl == 1 then + minetest.set_node(pos, {name = dry}) end end end,