Many improvements and bugfixes
parent
c8657e8697
commit
501046565c
13
README.md
13
README.md
|
@ -3,9 +3,9 @@ Signs Bot [signs_bot]
|
|||
|
||||
**A robot controlled by signs.**
|
||||
|
||||
Browse on: ![GitHub](https://github.com/joe7575/signs_bot)
|
||||
Browse on: [GitHub](https://github.com/joe7575/signs_bot)
|
||||
|
||||
Download: ![GitHub](https://github.com/joe7575/signs_bot/archive/master.zip)
|
||||
Download: [GitHub](https://github.com/joe7575/signs_bot/archive/master.zip)
|
||||
|
||||
![Signs Bot](https://github.com/joe7575/signs_bot/blob/master/screenshot.png)
|
||||
|
||||
|
@ -105,7 +105,7 @@ For all Inventory commands applies: If the inventory stack specified by <slot> i
|
|||
repeat <num> -- start of a loop block, <num> is a number 1..999
|
||||
end -- end of a loop block
|
||||
call <label> -- call of a function (with return via the command 'return')
|
||||
|
||||
|
||||
Example with a function at the beginning:
|
||||
|
||||
jump main -- jump to the label 'main'
|
||||
|
@ -140,12 +140,12 @@ Or alternatively with the function at the end:
|
|||
return -- end of 'foo'. Jump back
|
||||
|
||||
### License
|
||||
Copyright (C) 2019-2020 Joachim Stolberg
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
Code: Licensed under the GNU GPL version 3 or later. See LICENSE.txt
|
||||
|
||||
|
||||
### Dependencies
|
||||
default, farming, basic_materials, tubelib2
|
||||
default, farming, basic_materials, tubelib2
|
||||
optional: farming redo, node_io, doc, techage, minecart
|
||||
|
||||
|
||||
|
@ -167,5 +167,6 @@ optional: farming redo, node_io, doc, techage, minecart
|
|||
- 2020-03-27 v1.01 * flower command and sign added
|
||||
- 2020-03-30 v1.02 * Program flow control commands added
|
||||
- 2020-06-21 v1.03 * Interpreter bugfixes, node and crop sensors changed
|
||||
- 2020-10-01 v1.04 * Many improvements and bugfixes (Thanks toThomas-S)
|
||||
- 2020-10-01 v1.04 * Many improvements and bugfixes (Thanks to Thomas-S)
|
||||
- 2021-01-30 v1.05 * Many improvements and bugfixes
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ minetest.register_node("signs_bot:bot_sensor_on", {
|
|||
end,
|
||||
|
||||
on_timer = function(pos)
|
||||
local node = lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
node.name = "signs_bot:bot_sensor"
|
||||
minetest.swap_node(pos, node)
|
||||
return false
|
||||
|
|
|
@ -30,7 +30,7 @@ local RegisteredInventories = {}
|
|||
-- From chest to robot
|
||||
function signs_bot.robot_take(base_pos, robot_pos, param2, want_count, slot)
|
||||
local target_pos = lib.next_pos(robot_pos, param2)
|
||||
local node = lib.get_node_lvm(target_pos)
|
||||
local node = tubelib2.get_node_lvm(target_pos)
|
||||
local def = RegisteredInventories[node.name]
|
||||
local owner = M(base_pos):get_string("owner")
|
||||
|
||||
|
@ -51,7 +51,7 @@ end
|
|||
-- From robot to chest
|
||||
function signs_bot.robot_put(base_pos, robot_pos, param2, num, slot)
|
||||
local target_pos = lib.next_pos(robot_pos, param2)
|
||||
local node = lib.get_node_lvm(target_pos)
|
||||
local node = tubelib2.get_node_lvm(target_pos)
|
||||
local def = RegisteredInventories[node.name]
|
||||
local owner = M(base_pos):get_string("owner")
|
||||
local taken = signs_bot.bot_inv_take_item(base_pos, slot, num)
|
||||
|
@ -71,7 +71,7 @@ end
|
|||
-- From robot to furnace
|
||||
function signs_bot.robot_put_fuel(base_pos, robot_pos, param2, num, slot)
|
||||
local target_pos = lib.next_pos(robot_pos, param2)
|
||||
local node = lib.get_node_lvm(target_pos)
|
||||
local node = tubelib2.get_node_lvm(target_pos)
|
||||
local def = RegisteredInventories[node.name]
|
||||
local owner = M(base_pos):get_string("owner")
|
||||
local taken = signs_bot.bot_inv_take_item(base_pos, slot, num)
|
||||
|
|
|
@ -22,7 +22,7 @@ local MP = minetest.get_modpath("signs_bot")
|
|||
local I,_ = dofile(MP.."/intllib.lua")
|
||||
|
||||
local lib = signs_bot.lib
|
||||
local get_node_lvm = lib.get_node_lvm
|
||||
local get_node_lvm = tubelib2.get_node_lvm
|
||||
|
||||
|
||||
local function node_and_pos(pos)
|
||||
|
|
|
@ -102,10 +102,10 @@ local function pattern_copy(base_pos, mem)
|
|||
mem.steps = mem.steps + 1
|
||||
|
||||
if lib.not_protected(base_pos, dst_pos) then
|
||||
local src_node = lib.get_node_lvm(src_pos)
|
||||
local src_node = tubelib2.get_node_lvm(src_pos)
|
||||
src_node.name = inv_get_item(base_pos, src_node.name)
|
||||
|
||||
local dst_node = lib.get_node_lvm(dst_pos)
|
||||
local dst_node = tubelib2.get_node_lvm(dst_pos)
|
||||
inv_put_item(base_pos, mem, dst_node.name)
|
||||
param2_conversion(src_node, mem.dir_offs)
|
||||
minetest.set_node(dst_pos, src_node)
|
||||
|
|
|
@ -138,7 +138,7 @@ local function place_item_below(base_pos, robot_pos, param2, slot)
|
|||
if not lib.not_protected(base_pos, pos1) then
|
||||
return signs_bot.ERROR, I("Error: Position protected")
|
||||
end
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
if node.name == "signs_bot:robot_foot" then
|
||||
local taken = bot_inv_take_item(base_pos, slot, 1)
|
||||
if taken then
|
||||
|
@ -204,7 +204,7 @@ signs_bot.register_botcommand("place_above", {
|
|||
local function dig_item(base_pos, robot_pos, param2, slot, route, level)
|
||||
local pos1 = lib.dest_pos(robot_pos, param2, route)
|
||||
pos1.y = pos1.y + (level or 0)
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
local dug_name = lib.is_simple_node(node)
|
||||
if not lib.not_protected(base_pos, pos1) then
|
||||
return signs_bot.ERROR, I("Error: Position protected")
|
||||
|
@ -287,7 +287,7 @@ signs_bot.register_botcommand("dig_right", {
|
|||
|
||||
local function dig_item_below(base_pos, robot_pos, param2, slot)
|
||||
local pos1 = {x=robot_pos.x,y=robot_pos.y-1,z=robot_pos.z}
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
local dug_name = lib.is_simple_node(node)
|
||||
if not lib.not_protected(base_pos, pos1) then
|
||||
return signs_bot.ERROR, I("Error: Position protected")
|
||||
|
@ -321,7 +321,7 @@ signs_bot.register_botcommand("dig_below", {
|
|||
|
||||
local function dig_item_above(base_pos, robot_pos, param2, slot)
|
||||
local pos1 = {x=robot_pos.x,y=robot_pos.y+1,z=robot_pos.z}
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
local dug_name = lib.is_simple_node(node)
|
||||
if not lib.not_protected(base_pos, pos1) then
|
||||
return signs_bot.ERROR, I("Error: Position protected")
|
||||
|
@ -356,7 +356,7 @@ signs_bot.register_botcommand("dig_above", {
|
|||
local function rotate_item(base_pos, robot_pos, param2, route, level, steps)
|
||||
local pos1 = lib.dest_pos(robot_pos, param2, route)
|
||||
pos1.y = pos1.y + level
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
if not lib.not_protected(base_pos, pos1) then
|
||||
return signs_bot.ERROR, I("Error: Position protected")
|
||||
end
|
||||
|
|
|
@ -280,7 +280,7 @@ local function dig_sign(base_pos, robot_pos, param2, slot)
|
|||
return signs_bot.ERROR, I("Error: No sign available")
|
||||
end
|
||||
if lib.not_protected(base_pos, pos1) then
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
local sign = ItemStack(node.name)
|
||||
local meta = sign:get_meta()
|
||||
meta:set_string("description", name)
|
||||
|
@ -320,7 +320,7 @@ local function trash_sign(base_pos, robot_pos, param2, slot)
|
|||
return signs_bot.ERROR, I("Error: No sign available")
|
||||
end
|
||||
if lib.not_protected(base_pos, pos1) then
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
local sign = ItemStack("signs_bot:sign_cmnd")
|
||||
minetest.remove_node(pos1)
|
||||
signs_bot.bot_inv_put_item(base_pos, slot, sign)
|
||||
|
|
|
@ -109,7 +109,7 @@ local function check_sign(pos, mem)
|
|||
return false
|
||||
end
|
||||
|
||||
local node = lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
-- correct sign direction?
|
||||
if mem.robot_param2 == node.param2 then
|
||||
return true
|
||||
|
@ -143,7 +143,7 @@ end
|
|||
|
||||
local function activate_sensor(pos, param2)
|
||||
local pos1 = lib.next_pos(pos, param2)
|
||||
local node = lib.get_node_lvm(pos1)
|
||||
local node = tubelib2.get_node_lvm(pos1)
|
||||
if node.name == "signs_bot:bot_sensor" then
|
||||
node.name = "signs_bot:bot_sensor_on"
|
||||
minetest.swap_node(pos1, node)
|
||||
|
|
|
@ -99,7 +99,7 @@ minetest.register_node("signs_bot:sensor_extender_on", {
|
|||
end,
|
||||
|
||||
on_timer = function(pos)
|
||||
local node = lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
node.name = "signs_bot:sensor_extender"
|
||||
minetest.swap_node(pos, node)
|
||||
return false
|
||||
|
|
11
init.lua
11
init.lua
|
@ -15,11 +15,14 @@
|
|||
signs_bot = {}
|
||||
|
||||
-- Version for compatibility checks, see readme.md/history
|
||||
signs_bot.version = 1.03
|
||||
signs_bot.version = 1.05
|
||||
|
||||
if minetest.global_exists("techage") and techage.version < 0.06 then
|
||||
minetest.log("error", "[signs_bot] Signs Bot requires techage version 0.06 or newer!")
|
||||
return
|
||||
if minetest.global_exists("techage") and techage.version < 0.25 then
|
||||
error("[signs_bot] Signs Bot requires techage version 0.25 or newer!")
|
||||
end
|
||||
|
||||
if tubelib2.version < 1.9 then
|
||||
error("[signs_bot] Signs Bot requires tubelib2 version 1.9 or newer!")
|
||||
end
|
||||
|
||||
signs_bot.S = minetest.get_translator("signs_bot")
|
||||
|
|
|
@ -183,7 +183,7 @@ register_command("call", 1,
|
|||
return api.DONE
|
||||
end,
|
||||
function(addr)
|
||||
return tSymbolTbl[addr..":"]
|
||||
return addr and tSymbolTbl[addr..":"]
|
||||
end
|
||||
)
|
||||
|
||||
|
@ -204,7 +204,7 @@ register_command("jump", 1,
|
|||
return api.DONE
|
||||
end,
|
||||
function(addr)
|
||||
return tSymbolTbl[addr..":"]
|
||||
return addr and tSymbolTbl[addr..":"]
|
||||
end
|
||||
)
|
||||
|
||||
|
|
21
lib.lua
21
lib.lua
|
@ -53,27 +53,9 @@ function signs_bot.lib.dest_pos(pos, param2, route)
|
|||
return pos, p2
|
||||
end
|
||||
|
||||
function signs_bot.lib.get_node_lvm(pos)
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
if node then
|
||||
return node
|
||||
end
|
||||
local vm = minetest.get_voxel_manip()
|
||||
local MinEdge, MaxEdge = vm:read_from_map(pos, pos)
|
||||
local data = vm:get_data()
|
||||
local param2_data = vm:get_param2_data()
|
||||
local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
|
||||
local idx = area:indexp(pos)
|
||||
node = {
|
||||
name = minetest.get_name_from_content_id(data[idx]),
|
||||
param2 = param2_data[idx]
|
||||
}
|
||||
return node
|
||||
end
|
||||
|
||||
local next_pos = signs_bot.lib.next_pos
|
||||
local dest_pos = signs_bot.lib.dest_pos
|
||||
local get_node_lvm = signs_bot.lib.get_node_lvm
|
||||
local get_node_lvm = tubelib2.get_node_lvm
|
||||
|
||||
local function poke_objects(pos, param2, objects)
|
||||
minetest.sound_play('signs_bot_go_away', {pos = pos})
|
||||
|
@ -124,6 +106,7 @@ end
|
|||
|
||||
-- Has to be checked before a node is dug
|
||||
function signs_bot.lib.is_simple_node(node)
|
||||
if node.name == "signs_bot:box" then return false end
|
||||
-- don't remove nodes with some intelligence or undiggable nodes
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if not NotSoSimpleNodes[node.name] then
|
||||
|
|
|
@ -23,7 +23,7 @@ local I,_ = dofile(MP.."/intllib.lua")
|
|||
|
||||
local lib = signs_bot.lib
|
||||
|
||||
local CYCLE_TIME = 4
|
||||
local CYCLE_TIME = 2
|
||||
|
||||
local function update_infotext(pos, dest_pos, cmnd)
|
||||
M(pos):set_string("infotext", I("Node Sensor: Connected with ")..S(dest_pos).." / "..cmnd)
|
||||
|
@ -74,12 +74,16 @@ local function any_node_changed(pos)
|
|||
|
||||
if mem.num ~= num then
|
||||
if mem.mode == 1 and num < mem.num then
|
||||
mem.num = num
|
||||
return true
|
||||
elseif mem.mode == 2 and num > mem.num then
|
||||
mem.num = num
|
||||
return true
|
||||
elseif mem.mode == 3 then
|
||||
mem.num = num
|
||||
return true
|
||||
end
|
||||
mem.num = num
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
|
10
robot.lua
10
robot.lua
|
@ -21,8 +21,8 @@ local lib = signs_bot.lib
|
|||
|
||||
-- Called when robot is started
|
||||
function signs_bot.place_robot(pos1, pos2, param2)
|
||||
local node1 = lib.get_node_lvm(pos1)
|
||||
local node2 = lib.get_node_lvm(pos2)
|
||||
local node1 = tubelib2.get_node_lvm(pos1)
|
||||
local node2 = tubelib2.get_node_lvm(pos2)
|
||||
if lib.check_pos(pos1, node1, node2, param2) then
|
||||
minetest.set_node(pos1, {name = "signs_bot:robot", param2 = param2})
|
||||
end
|
||||
|
@ -31,11 +31,11 @@ end
|
|||
-- Called when robot is removed
|
||||
function signs_bot.remove_robot(mem)
|
||||
local pos = mem.robot_pos
|
||||
local node = lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
if node.name == "signs_bot:robot" then
|
||||
minetest.remove_node(pos)
|
||||
local pos1 = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||
node = lib.get_node_lvm(pos1)
|
||||
node = tubelib2.get_node_lvm(pos1)
|
||||
if node.name == "signs_bot:robot_foot" or node.name == "signs_bot:robot_leg" then
|
||||
if node.name == "signs_bot:robot_foot" then
|
||||
minetest.swap_node(pos1, mem.stored_node or {name = "air"})
|
||||
|
@ -43,7 +43,7 @@ function signs_bot.remove_robot(mem)
|
|||
minetest.remove_node(pos1)
|
||||
end
|
||||
pos1 = {x=pos.x, y=pos.y-2, z=pos.z}
|
||||
node = lib.get_node_lvm(pos1)
|
||||
node = tubelib2.get_node_lvm(pos1)
|
||||
if node.name == "signs_bot:robot_foot" then
|
||||
minetest.swap_node(pos1, mem.stored_node or {name = "air"})
|
||||
end
|
||||
|
|
|
@ -21,7 +21,7 @@ local lib = signs_bot.lib
|
|||
|
||||
-- Used by the pairing tool
|
||||
function signs_bot.get_node_type(pos)
|
||||
local node = lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
local is_sensor = minetest.get_item_group(node.name, "sign_bot_sensor") == 1
|
||||
if ndef then
|
||||
|
@ -38,7 +38,7 @@ end
|
|||
-- Used by the pairing tool
|
||||
function signs_bot.get_signal(actuator_pos)
|
||||
if actuator_pos then
|
||||
local node = lib.get_node_lvm(actuator_pos)
|
||||
local node = tubelib2.get_node_lvm(actuator_pos)
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.signs_bot_get_signal then
|
||||
return ndef.signs_bot_get_signal(actuator_pos, node)
|
||||
|
@ -65,7 +65,7 @@ function signs_bot.send_signal(sensor_pos)
|
|||
local signal = meta:get_string("signal_data")
|
||||
if dest_pos ~= "" and signal ~= "" then
|
||||
local pos = P(dest_pos)
|
||||
local node = lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.signs_bot_on_signal then
|
||||
ndef.signs_bot_on_signal(pos, node, signal)
|
||||
|
|
|
@ -57,7 +57,7 @@ if minetest.get_modpath("techage") then
|
|||
description = S("Ignite the techage charcoal lighter"),
|
||||
cmnd = function(base_pos, mem)
|
||||
local pos = signs_bot.lib.dest_pos(mem.robot_pos, mem.robot_param2, {0})
|
||||
local node = signs_bot.lib.get_node_lvm(pos)
|
||||
local node = tubelib2.get_node_lvm(pos)
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].on_ignite then
|
||||
minetest.registered_nodes[node.name].on_ignite(pos)
|
||||
|
|
2
tool.lua
2
tool.lua
|
@ -53,7 +53,7 @@ local function pairing(actuator_pos, sensor_pos)
|
|||
local signal = signs_bot.get_signal(actuator_pos)
|
||||
if signal then
|
||||
signs_bot.store_signal(sensor_pos, actuator_pos, signal)
|
||||
local node = lib.get_node_lvm(sensor_pos)
|
||||
local node = tubelib2.get_node_lvm(sensor_pos)
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.update_infotext then
|
||||
ndef.update_infotext(sensor_pos, actuator_pos, signal)
|
||||
|
|
Loading…
Reference in New Issue