--[[ Signs Bot ========= Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information Bot flower cutting command ]]-- -- Load support for I18n. local S = signs_bot.S local lib = signs_bot.lib local bot_inv_put_item = signs_bot.bot_inv_put_item local bot_inv_take_item = signs_bot.bot_inv_take_item local Flowers = {} -- Special drop handling is necessary because of waterlily. function signs_bot.register_flower(name) local drop = signs_bot.lib.is_simple_node({name = name}) if drop then Flowers[name] = drop end end signs_bot.register_flower("default:bush_stem") signs_bot.register_flower("default:acacia_bush_stem") signs_bot.register_flower("default:pine_bush_stem") minetest.after(1, function() for _,def in pairs(minetest.registered_decorations) do local name = def.decoration if name and type(name) == "string" then local mod = string.split(name, ":")[1] if mod == "flowers" or mod == "bakedclay" then -- Bakedclay also registers flowers as decoration. signs_bot.register_flower(name) end end end end) local function is_tree(node) if minetest.get_item_group(node.name, "tree") == 1 then return signs_bot.handle_drop_like_a_player(node) end if minetest.get_item_group(node.name, "leaves") == 1 then return signs_bot.handle_drop_like_a_player(node) end end local function harvesting(base_pos, mem) local pos = mem.pos_tbl and mem.pos_tbl[mem.steps] mem.steps = (mem.steps or 1) + 1 if pos and lib.not_protected(base_pos, pos) then local node = minetest.get_node_or_nil(pos) if node.name ~= "default:papyrus" then local drop = Flowers[node.name] or is_tree(node) if drop then minetest.remove_node(pos) local leftover = bot_inv_put_item(base_pos, 0, ItemStack(drop)) if leftover and leftover:get_count() > 0 then signs_bot.lib.drop_items(mem.robot_pos, leftover) end end else -- papyrus is a special plant that is collected upwards when cut local count = 0 while node.name == "default:papyrus" and lib.not_protected(base_pos, pos) do minetest.remove_node(pos) pos = { x = pos.x, y = pos.y + 1, z = pos.z } count = count + 1 node = minetest.get_node(pos) end if count > 0 then local leftover = bot_inv_put_item(base_pos, 0, ItemStack("default:papyrus " .. count)) if leftover and leftover:get_count() > 0 then signs_bot.lib.drop_items(mem.robot_pos, leftover) end end end end end signs_bot.register_botcommand("cutting", { mod = "farming", params = "", num_param = 0, description = S("Cutting flowers, papyrus,\nleaves and tree blocks\nin front of the robot\non a 3x3 field."), cmnd = function(base_pos, mem) if not mem.steps then mem.pos_tbl = signs_bot.lib.gen_position_table(mem.robot_pos, mem.robot_param2, 3, 3, 0) mem.steps = 1 end mem.pos_tbl = mem.pos_tbl or {} harvesting(base_pos, mem) if mem.steps > #mem.pos_tbl then mem.steps = nil return signs_bot.DONE end return signs_bot.BUSY end, }) local CMD = [[dig_sign 1 move cutting backward place_sign 1 turn_around]] signs_bot.register_sign({ name = "flowers", description = S('Sign "flowers"'), commands = CMD, image = "signs_bot_sign_flowers.png", }) minetest.register_craft({ output = "signs_bot:flowers 2", recipe = { {"group:wood", "default:stick", "group:wood"}, {"dye:black", "default:stick", "dye:yellow"}, {"dye:red", "", ""} } }) if minetest.get_modpath("doc") then doc.add_entry("signs_bot", "flowers", { name = S("Sign 'flowers'"), data = { item = "signs_bot:flowers", text = table.concat({ S("Used to cut flowers on a 3x3 field."), S("Place the sign in front of the field."), S("When finished, the bot turns."), }, "\n") }, }) end