local lib = potted_farming local S = lib.S local max_uses = lib.watering_can_max_uses local watering_can_item = lib.modname .. ":watering_can" local pot_def = { groups = {flammable = 2, crumbly = 2, cracky = 3, attached_node = 1, not_in_creative_inventory = 1}, tiles = { "pot_with_soil_top.png", "pot_with_soil_bottom.png", "pot_with_soil_side.png", "pot_with_soil_side.png", "pot_with_soil_side.png", "pot_with_soil_side.png" }, -- tiles drawtype = "nodebox", paramtype = "light", node_box = { type = "fixed", fixed = { {-0.1875, -0.5, -0.1875, 0.1875, -0.1875, 0.1875}, -- base_center {-0.25, -0.375, -0.125, -0.1875, -0.1875, 0.125}, -- base1 {-0.125, -0.375, 0.1875, 0.125, -0.1875, 0.25}, -- base2 {0.1875, -0.375, -0.125, 0.25, -0.1875, 0.125}, -- base3 {-0.125, -0.375, -0.25, 0.125, -0.1875, -0.1875}, -- base4 {-0.5, -0.5, 0, 0.5, 0.5, 0}, -- plant1X {0, -0.5, -0.5, 0, 0.5, 0.5}, -- plant2Z } -- fixed }, -- node_box selection_box = { type = "fixed", fixed = { {-0.25, -0.5, -0.25, 0.25, -0.1875, 0.25}, -- selection } }, -- selection_box collision_box = { type = "fixed", fixed = { {-0.25, -0.5, -0.25, 0.25, -0.1875, 0.25}, -- selection } }, -- collsion_box on_rotate = function(pos, node) return false end, } --[[ ************************************************** ** ** ** is_acceptable_source ** ** ** ************************************************** need modname:itemname --]] function lib.is_acceptable_source (itemname) local name = itemname:split(":")[2] local plant = name:split("_")[1] if plant == nil then plant = "" end local s = lib.plant_settings -- with these variables i can check if the potted plant had been actually registered local pot = lib.modname .. ":pot_with_".. plant .."_1" local chkpot = minetest.registered_nodes[pot] -- if plant is present in table AND the item in hand is the stem of that plant if lib.plant_list[plant] and string.find(name , "_stem") and s[plant].definable and chkpot then return true, "plant", plant end for k,v in pairs(lib.mushroom_list) do pot = lib.modname .. ":pot_with_".. k .."_1" chkpot = minetest.registered_nodes[pot] if v[1] == itemname and chkpot then if s[k] ~= nil and s[k].definable then return true, "mushroom", k end end end for k,v in pairs(lib.fruit_tree_list) do pot = lib.modname .. ":pot_with_".. k .."_sapling" chkpot = minetest.registered_nodes[pot] if v[1] == itemname and chkpot then if s[k] ~= nil and s[k].definable then return true, "fruit_tree", k end end end return false, "no", nil end -- lib.is_acceptable_source --[[ ************************************************** ** ** ** check_light ** ** ** ************************************************** --]] function lib.check_light(pos, min_light, max_light) local checkpos = pos if minetest.get_node(checkpos).name == "ignore" then return false end local pot_light = minetest.get_node_light(checkpos) --minetest.chat_send_all("pot light".. pot_light) --"if you need to get the light value ontop of target node you need to get the light value of position above the target." --this is a potted plant, can stay inside a house, not on soil, therefore there is no need to check the light from the node above. local min = min_light local max = max_light if min < 1 then min = 1 end if max > 14 then max = 14 end if min > max then local t = max max = min min = t end if min <= pot_light and pot_light <= max then return true end return false end -- function lib.check_light --[[ ************************************************** ** ** ** register_plant_abm ** ** growing_potted_plant ** ** ** ************************************************** --]] function lib.register_plant_abm(nodename, next_step_nodename, delay, percentage) -- if the register_plant_abm function is called, then surely the plant is defined and registerable -- mod_name:pot_with_PLANT_N local plant_name = nodename:split(":")[2]:split("_")[3] -- as per naming convention, [3] is the given plant_name local potted_plant = lib.plant_settings[plant_name] minetest.register_abm({ label = "growing_potted_".. plant_name .."_abm", nodenames = {nodename}, --neighbors = {"default:air"}, --can be omitted interval = delay, chance = percentage, action = function(pos, node, active_object_count, active_object_count_wider) local nodepos = pos if(lib.check_light(nodepos, potted_plant.min_light, potted_plant.max_light ) ) then minetest.swap_node(nodepos, {name = next_step_nodename}) end -- if(lib.check end, -- action = }) -- register_plant_abm end -- lib.register_plant_abm --[[ ************************************************** ** ** ** add_watering_can_wear ** ** ** ************************************************** --]] function lib.add_watering_can_wear(itemstack) if itemstack:get_name() == watering_can_item then itemstack:add_wear(65535 / (max_uses)) local wear = itemstack:get_wear() if wear >= 65535 then itemstack:replace(lib.modname .. ":empty_watering_can") end -- if wear end -- if itemstack is watering can return itemstack end -- add_watering_can_wear --[[ ************************************************** ** ** ** get_leaf_item_name ** ** ** ************************************************** --]] function lib.get_leaf_item_name(plant_name) local item_name = lib.modname .. ":" .. plant_name local p = lib.plant_settings.support[plant_name] -- p = possible_support_for_existing_item if p ~= nil and p.can_grow then -- the plant is present in the support AND can swap is set to true local existing_item = p.itemname local mod_name = existing_item:split(":")[1] -- the itemname could be written incorrectly taken from the settings if minetest.registered_items[existing_item] and minetest.get_modpath(mod_name) then item_name = existing_item end -- if mod is installed, and itemname exists end -- if value is set to true return item_name end -- get_leaf_item_name --[[ ************************************************** ** ** ** register_plant ** ** ** ************************************************** plant_name = "basil" or "rosemary" etc --]] function lib.register_plant(plant_name) local plant_desc = plant_name:gsub("_", " "):gsub("(%a)(%a+)", function(a, b) return string.upper(a) .. string.lower(b) end) local leaf_item = lib.get_leaf_item_name(plant_name) if leaf_item:split(":")[1] == lib.modname then -- HERB/LEAVES DEFINITION -- local craftitem_def = { description = S(plant_desc), inventory_image = lib.modname .. "_".. plant_name ..".png", groups = {}, } craftitem_def.groups["food_".. plant_name] = 1 minetest.register_craftitem(lib.modname .. ":" .. plant_name, table.copy(craftitem_def) ) end -- if leaf item do not exists already (due to other mods) -- STEM DEFINITION -- minetest.register_craftitem(lib.modname .. ":" .. plant_name .."_stem", { description = S(plant_desc) .. " " .. S("Stem"), inventory_image = lib.modname .. "_".. plant_name .."_stem.png", groups = {stem = 1, flammable = 2,}, --the planting mechanism is in the pot on_rightclick }) -- register_craftitem( local plant_def = table.copy(pot_def) plant_def.description = S("Pot with ") .. S(plant_desc) -- POTTED plant_name STAGE 1 : just planted, gives stem back in case of accidental planting ----------------------- plant_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_1.png" plant_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_1.png" plant_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_1.png" plant_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_1.png" plant_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {lib.modname .. ":" .. plant_name .."_stem"} }, }, } -- plant_def.drop minetest.register_node(lib.modname .. ":pot_with_".. plant_name .."_1", table.copy(plant_def) ) lib.register_plant_abm(lib.modname .. ":pot_with_".. plant_name .."_1", lib.modname .. ":pot_with_".. plant_name .."_2", 30, 10) -- POTTED PLANT STAGE 2 : growing, gives nothing yet -------------------------------------------------------------- plant_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_2.png" plant_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_2.png" plant_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_2.png" plant_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_2.png" plant_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, }, } -- plant_def.drop minetest.register_node(lib.modname .. ":pot_with_".. plant_name .."_2", table.copy(plant_def) ) lib.register_plant_abm(lib.modname .. ":pot_with_".. plant_name .."_2", "potted_farming:pot_with_".. plant_name .."_3", 40, 15) -- POTTED PLANT STAGE 3 : fully grown, chance of giving stem, gives most leaves ----------------------------------- plant_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_3.png" plant_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_3.png" plant_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_" ..plant_name .."_3.png" plant_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_3.png" plant_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {leaf_item .." 2"}, rarity = 1}, {items = {leaf_item }, rarity = 2}, {items = {leaf_item }, rarity = 5}, {items = {lib.modname .. ":" .. plant_name .."_stem" }, rarity = 5}, }, -- items } -- plant_def.drop plant_def.on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:is_player() then local itemname = itemstack:get_name() if itemname ~= watering_can_item then local nodepos = pos local q = math.random(2, 4) -- number of leaves taken local stem = math.random(1, 5) -- chance of getting a stem local leftover local item = ItemStack(leaf_item .." ".. q) local inv = player:get_inventory() if inv:room_for_item("main", item) then leftover = inv:add_item("main", item) if not leftover:is_empty() then minetest.add_item(player:get_pos(), leftover) end else minetest.add_item(player:get_pos(), item) end local stem_item = lib.modname .. ":"..plant_name .."_stem" if stem == 1 then if inv:room_for_item("main", stem_item) then leftover = inv:add_item("main", stem_item) if not leftover:is_empty() then minetest.add_item(player:get_pos(), leftover) end else minetest.add_item(player:get_pos(), stem_item) end -- if inv.room end -- if stem local n = math.random(1, 3) minetest.sound_play("foliage-0".. n, {pos=nodepos, gain=1.2}) minetest.swap_node(nodepos, {name = lib.modname .. ":pot_with_".. plant_name .."_2"}) end -- itemstack empty end-- player is a player return itemstack end -- plant_def.on_rightclick minetest.register_node(lib.modname.. ":pot_with_".. plant_name .."_3", table.copy(plant_def) ) lib.register_plant_abm( lib.modname .. ":pot_with_".. plant_name .."_3", lib.modname .. ":pot_with_".. plant_name .."_4", 40, 30) -- POTTED PLANT STAGE 4 : needs water, no stem, few leaves -------------------------------------------------------- plant_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_4.png" plant_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_4.png" plant_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_4.png" plant_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. plant_name .."_4.png" plant_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {leaf_item .." 2"}}, {items = {leaf_item }, rarity = 3}, }, -- items } -- plant_def.drop plant_def.on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:is_player() then local itemname = itemstack:get_name() if itemstack:is_empty() == false and itemname == watering_can_item then local nodepos = pos itemstack = lib.add_watering_can_wear(itemstack) local n = math.random(3, 4) minetest.sound_play("water-splash-0".. n, {pos=nodepos, gain=1.2}) minetest.swap_node(nodepos, {name = lib.modname .. ":pot_with_".. plant_name .."_3"}) end -- itemstack is watering_can end -- player is a player return itemstack end -- plant_def.on_rightclick minetest.register_node(lib.modname .. ":pot_with_" .. plant_name .."_4", table.copy(plant_def) ) end -- register_plant --[[ ************************************************** ** ** ** register_wild_variant ** ** ** ************************************************** --]] function lib.register_wild_variant(plant_name, nodes, s, min, max) local leaf_item = lib.get_leaf_item_name(plant_name) minetest.register_node(lib.modname .. ":wild_".. plant_name , { description = S("Wild ").. S(plant_name), paramtype = "light", paramtype2 = "facedir", walkable = false, drawtype = "plantlike", tiles = {lib.modname .. "_wild_".. plant_name ..".png"}, inventory_image = lib.modname .. "_wild_".. plant_name ..".png", wield_image = lib.modname .. "_wild_".. plant_name ..".png", groups = { snappy = 3, dig_immediate = 1, flammable = 2, plant = 1, flora = 1, attached_node = 1, not_in_creative_inventory = 1 }, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = { {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, }, }, -- selection_box drop = { items = { {items = {leaf_item .." 2"}, rarity = 1}, {items = {leaf_item}, rarity = 2}, {items = {lib.modname .. ":" .. plant_name .."_stem"}, rarity = 1}, } -- items }, -- drop }) -- register_node minetest.register_decoration({ deco_type = "simple", place_on = nodes, sidelen = 16, noise_params = { offset = 0, scale = s, spread = {x = 70, y = 70, z = 70}, seed = 2570, octaves = 3, persist = 0.6 }, -- noise_params y_min = min, y_max = max, decoration = lib.modname .. ":wild_".. plant_name, }) -- register_decoration end -- function lib.register_wild_variant --[[ ************************************************** ** ** ** register_mushroom ** ** ** ************************************************** mushroom_name = "brown" or "chanterelle" etc --]] function lib.register_mushroom(mushroom_name, full_mushroom_name) -- the check if the mushroom item exists is done when calling the function, not inside local mushroom_desc = mushroom_name:gsub("_", " "):gsub("(%a)(%a+)", function(a, b) return string.upper(a) .. string.lower(b) end) local mushroom_def = table.copy(pot_def) mushroom_def.description = S("Pot with ") .. S(mushroom_desc) --POTTED MUSHROOM STAGE 1 : just planted, gives back one mushroom mushroom_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_1.png" mushroom_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_1.png" mushroom_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_1.png" mushroom_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_1.png" mushroom_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {full_mushroom_name} }, }, } -- mushroom_def.drop minetest.register_node(lib.modname .. ":pot_with_".. mushroom_name .."_1", table.copy(mushroom_def) ) lib.register_plant_abm(lib.modname .. ":pot_with_".. mushroom_name .."_1", lib.modname .. ":pot_with_".. mushroom_name .."_2", 30, 15) --POTTED MUSHROOM STAGE 2 : growing, if you click you will get one mushroom, and goes back to 1 mushroom_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_2.png" mushroom_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_2.png" mushroom_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_" ..mushroom_name .."_2.png" mushroom_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_2.png" mushroom_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {full_mushroom_name } }, {items = {full_mushroom_name }, rarity = 2}, }, -- items } -- mushroom_def.drop mushroom_def.on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:is_player() then local itemname = itemstack:get_name() if itemname ~= watering_can_item then local nodepos = pos local q = math.random(1, 2) local mush_item = full_mushroom_name .." ".. q local leftover local inv = player:get_inventory() if inv:room_for_item("main", mush_item) then leftover = inv:add_item("main", mush_item) if not leftover:is_empty() then minetest.add_item(player:get_pos(), leftover) end else minetest.add_item(player:get_pos(), mush_item) end local n = math.random(1, 3) minetest.sound_play("foliage-0".. n, {pos=nodepos, gain=1.2}) minetest.swap_node(nodepos, {name = lib.modname .. ":pot_with_".. mushroom_name .."_1"}) end -- itemstack empty end-- player is a player return itemstack end -- mushroom_def.on_rightclick minetest.register_node(lib.modname.. ":pot_with_".. mushroom_name .."_2", table.copy(mushroom_def) ) lib.register_plant_abm(lib.modname .. ":pot_with_".. mushroom_name .."_2", lib.modname .. ":pot_with_".. mushroom_name .."_3", 30, 20) --POTTED MUSHROOM STAGE 3 : fully grown, click to get 2-4 mushrooms, goes back to 2, FINAL STAGE mushroom_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_3.png" mushroom_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_3.png" mushroom_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_" ..mushroom_name .."_3.png" mushroom_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_3.png" mushroom_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {full_mushroom_name .." 2"}, rarity = 1}, {items = {full_mushroom_name }, rarity = 2}, {items = {full_mushroom_name }, rarity = 4}, }, -- items } -- mushroom_def.drop mushroom_def.on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:is_player() then local itemname = itemstack:get_name() if itemname ~= watering_can_item then local nodepos = pos local q = math.random(2, 4) -- number of mushrooms taken local mush_item = full_mushroom_name .." ".. q local leftover local inv = player:get_inventory() if inv:room_for_item("main", mush_item) then leftover = inv:add_item("main", mush_item) if not leftover:is_empty() then minetest.add_item(player:get_pos(), leftover) end else minetest.add_item(nodepos, mush_item) end local n = math.random(1, 3) minetest.sound_play("foliage-0".. n, {pos=nodepos, gain=1.2}) minetest.swap_node(nodepos, {name = lib.modname .. ":pot_with_".. mushroom_name .."_1"}) end -- itemstack empty end-- player is a player return itemstack end -- mushroom_def.on_rightclick minetest.register_node(lib.modname.. ":pot_with_".. mushroom_name .."_3", table.copy(mushroom_def) ) --POTTED MUSHROOM STAGE 4 : too much sun exposure, dryed up, ALL STAGES can get to this one if the lightlevel is too high mushroom_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_4.png" mushroom_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_4.png" mushroom_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_" ..mushroom_name .."_4.png" mushroom_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. mushroom_name .."_4.png" mushroom_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {full_mushroom_name .." 2"}, rarity = 1}, {items = {full_mushroom_name }, rarity = 2}, }, -- items } -- mushroom_def.drop mushroom_def.on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:is_player() then local itemname = itemstack:get_name() if itemname ~= watering_can_item then local nodepos = pos local q = math.random(1, 3) -- number of mushrooms taken local mush_item = full_mushroom_name .." ".. q local leftover local inv = player:get_inventory() if inv:room_for_item("main", mush_item) then leftover = inv:add_item("main", mush_item) if not leftover:is_empty() then minetest.add_item(player:get_pos(), leftover) end else minetest.add_item(nodepos, mush_item) end local n = math.random(1, 3) minetest.sound_play("foliage-0".. n, {pos=nodepos, gain=1.2}) minetest.swap_node(nodepos, {name = lib.modname .. ":pot_with_soil"}) end -- itemstack empty end-- player is a player return itemstack end -- mushroom_def.on_rightclick minetest.register_node(lib.modname.. ":pot_with_".. mushroom_name .."_4", table.copy(mushroom_def) ) -- DRYING UP ABM minetest.register_abm({ label = "drying_potted_mushroom_abm", nodenames = { lib.modname.. ":pot_with_".. mushroom_name .."_1", lib.modname.. ":pot_with_".. mushroom_name .."_2", lib.modname.. ":pot_with_".. mushroom_name .."_3", }, --neighbors = {"default:air"}, interval = 30, chance = 40, action = function(pos, node, active_object_count, active_object_count_wider) local potted_plant = lib.plant_settings[mushroom_name] local nodepos = pos local can_grow = lib.check_light(nodepos, potted_plant.min_light, potted_plant.max_light) if can_grow == false then minetest.swap_node(nodepos, {name = lib.modname.. ":pot_with_".. mushroom_name .."_4"}) end -- if(lib.check end, -- action = }) -- register_abm end -- function lib.register_mushroom --[[ ************************************************** ** ** ** check_free_space_above ** ** ** ************************************************** --]] function lib.check_free_space_above(pot_pos) local above_pos = vector.add(pot_pos, vector.new(0, 1, 0)) local above_node = minetest.get_node(above_pos) if above_node.name == "air" then return true end return false end -- function lib.check_free_space_above --[[ ************************************************** ** ** ** register_sapling_abm ** ** ** ************************************************** --]] function lib.register_sapling_abm(nodename, shrub_nodename, leaves_nodename, fruit , delay, percentage) local potted_plant = lib.plant_settings[fruit] minetest.register_abm({ label = "growing_potted_".. fruit .."_sapling_abm", nodenames = {nodename}, --neighbors = {"default:air"}, --can be omitted interval = delay, chance = percentage, action = function(pos, node, active_object_count, active_object_count_wider) local nodepos = pos local above_nodepos = vector.add(nodepos, vector.new(0, 1, 0)) local enough_light = lib.check_light(above_nodepos, potted_plant.min_light, potted_plant.max_light) if lib.check_free_space_above(nodepos) and enough_light then minetest.swap_node(nodepos, {name = shrub_nodename}) minetest.swap_node(above_nodepos, {name = leaves_nodename}) end -- if(lib.check end, -- action = }) end -- function lib.register_sapling_abm --[[ ************************************************** ** ** ** register_leaves_abm ** ** ** ************************************************** --]] function lib.register_leaves_abm(nodename, fruit_leaves_nodename, thirsty_leaves_nodename, fruit, delay, percentage) local potted_plant = lib.plant_settings[fruit] minetest.register_abm({ label = "growing_potted_".. fruit .."_leaves_abm", nodenames = {nodename}, --neighbors = {"default:air"}, --can be omitted interval = delay, chance = percentage, action = function(pos, node, active_object_count, active_object_count_wider) local nodepos = pos local leaves_nodename = thirsty_leaves_nodename local enough_light = lib.check_light(nodepos, potted_plant.min_light, potted_plant.max_light ) local meta = minetest.get_meta(nodepos) local pot_light = meta:get_int("lightlevel") --minetest.chat_send_all("leaves abm ".. fruit .. " enough_light ".. tostring(enough_light) .." light at pos ".. pot_light) if enough_light then local growth = math.random(1, 3) if growth == 1 then leaves_nodename = fruit_leaves_nodename end end -- if(lib.check minetest.swap_node(nodepos, {name = leaves_nodename, param2 = 2} ) end, -- action = }) end -- function lib.register_leaves_abm --[[ ************************************************** ** ** ** register_fruit_tree ** ** ** ************************************************** sapling_name = "ethereal:lemon_tree_sapling", full_fruit_name = "ethereal:lemon" --]] function lib.register_fruit_tree (k, sapling_name, full_fruit_name, original_leaves_png, shrub_to_use) -- from sapling a litte potted tree local fruit_mod_name = full_fruit_name:split(":")[1] local fruit_name = k local leaves_png = original_leaves_png if leaves_png == nil then leaves_png = "default_leaves.png" end if k == "banana" then leaves_png = "(".. leaves_png .. "^".. lib.modname .."_banana_leaf_mask.png^[makealpha:255,0,255)" end local shrub_def = table.copy(pot_def) shrub_def.description = S("Pot with ") .. S(fruit_name) -- STAGE 1 pot with sapling : grows into pot with shrub after quite a while, will not grow unless there is space above shrub_def.tiles[3] = "pot_with_soil_side.png^" .. lib.modname .. "_".. fruit_name .."_sapling.png" shrub_def.tiles[4] = "pot_with_soil_side.png^" .. lib.modname .. "_".. fruit_name .."_sapling.png" shrub_def.tiles[5] = "pot_with_soil_side.png^" .. lib.modname .. "_" ..fruit_name .."_sapling.png" shrub_def.tiles[6] = "pot_with_soil_side.png^" .. lib.modname .. "_".. fruit_name .."_sapling.png" shrub_def.drop = { items = { {items = {lib.modname .. ":pot_with_soil"} }, {items = {sapling_name} }, }, -- items } -- shrub_def.drop minetest.register_node(lib.modname.. ":pot_with_".. fruit_name .."_sapling", table.copy(shrub_def) ) lib.register_sapling_abm(lib.modname.. ":pot_with_".. fruit_name .."_sapling", shrub_to_use, lib.modname.. ":".. fruit_name .."_leaves_1", fruit_name, 40, 30) -- STAGE 2 pot with shrub : does not grow but is the base for the leaf node above -- MOVED to nodes.lua , registering one and only one shrub, im keeping the register_sapling_abm as it is -- because i could have plants with a different shrub, like banana -- ABOVE shrub, leaves : if the leaves are destroyed, the pot below is destroyed too, and viceversa local fruit_desc = fruit_name:gsub("(%a)(%a+)", function(a, b) return string.upper(a) .. string.lower(b) end) local leaves_def = { description = S(fruit_desc) .. " " .. S("(Leaves)") .. " 1", drawtype = "plantlike", -- allfaces_optional visual_scale = 1.3, walkable = false, paramtype = "light", paramtype2 = "meshoptions", place_param2 = 2, tiles = { leaves_png }, sunlight_propagates = true, groups = {snappy = 3, attached_node = 1, leaves = 1, flammable = 2, not_in_creative_inventory = 1 }, drop = { items = { {items = {sapling_name}, rarity = 5}, } }, sounds = default.node_sound_leaves_defaults(), } -- leaves_def -- STAGE 1 : lemon leaves 1 : grows into leaves with lemon, OR leaves that needs water minetest.register_node(lib.modname.. ":".. fruit_name .."_leaves_1", table.copy(leaves_def) ) -- special abm, with some randomness to determine wheather leaves should go to fruit leaves or thristy leaves lib.register_leaves_abm(lib.modname.. ":".. fruit_name .."_leaves_1", lib.modname.. ":".. fruit_name .."_leaves_2", lib.modname.. ":".. fruit_name .."_leaves_3", fruit_name, 40, 15) -- STAGE 2 : lemon leaves 2 : gives 2-3 lemons, does not grow more, goes back to leaves 1 when harvested leaves_def.description = S(fruit_desc) .. " " .. S("(Leaves)") .. " 2" leaves_def.tiles = {lib.modname .."_".. fruit_name .."_on_leaves.png^".. leaves_png } leaves_def.drop = { items = { {items = {full_fruit_name .." 2"}}, } } leaves_def.on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:is_player() then local itemname = itemstack:get_name() local nodepos = pos local q = math.random(2, 3) -- number of fruit taken local leftover local item = ItemStack(full_fruit_name .." ".. q) local inv = player:get_inventory() if inv:room_for_item("main", item) then leftover = inv:add_item("main", item) if not leftover:is_empty() then minetest.add_item(player:get_pos(), leftover) end else minetest.add_item(player:get_pos(), item) end local n = math.random(1, 3) minetest.sound_play("foliage-0".. n, {pos=nodepos, gain=1.2}) minetest.swap_node(nodepos, {name = lib.modname.. ":".. fruit_name .."_leaves_1", param2 = 2}) end-- player is a player return itemstack end -- leaves_def.on_rightclick minetest.register_node(lib.modname.. ":".. fruit_name .."_leaves_2", table.copy(leaves_def) ) -- lemon leaves 3 : needs water, does not grow, goes back to leaves 1 when the POT is watered leaves_def.description = S(fruit_desc) .. " " .. S("(Leaves)") .. " 3" leaves_def.tiles = { leaves_png .. "^[colorize:yellow:35" } leaves_def.drop = {} minetest.register_node(lib.modname.. ":".. fruit_name .."_leaves_3", table.copy(leaves_def) ) end -- function lib.register_fruit_tree