forked from MTSR/techage_modpack
148 lines
3.7 KiB
Lua
148 lines
3.7 KiB
Lua
--[[
|
|
|
|
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
|