Many improvements and bugfixes

master
Joachim Stolberg 2021-01-30 15:08:35 +01:00
parent c8657e8697
commit 501046565c
17 changed files with 50 additions and 59 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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")

View File

@ -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
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)