v0.06 nodes remove bugfix, punch_cart command added, cart sensor added

master
Joachim Stolberg 2019-04-15 22:21:17 +02:00
parent 499dfc4053
commit 369cc1c35a
15 changed files with 179 additions and 90 deletions

View File

@ -108,3 +108,4 @@ optional: farming redo
- 2019-04-08 v0.03 * 'plant_sapling', 'place_below', 'dig_below' added, many bugs fixed
- 2019-04-11 v0.04 * support for 'node_io' added, chest added, further commands added
- 2019-04-14 v0.05 * timer added, user signs added, bug fixes
- 2019-04-15 v0.06 * nodes remove bugfix, punch_cart command added, cart sensor added

View File

@ -134,9 +134,9 @@ local function on_receive_fields(pos, formname, fields, player)
if fields.update then
meta:set_string("formspec", formspec(pos, mem))
elseif fields.start == I("On") then
elseif fields.start then
start_robot(pos)
elseif fields.stop == I("Off") then
elseif fields.stop then
signs_bot.stop_robot(pos, mem)
end
end

View File

@ -159,3 +159,25 @@ signs_bot.register_botcommand("drop_items", {
end,
})
signs_bot.register_botcommand("punch_cart", {
mod = "item",
params = "",
description = I("Punch a rail cart to start it"),
cmnd = function(base_pos, mem)
local pos = lib.dest_pos(mem.robot_pos, mem.robot_param2, {0})
for _, object in pairs(minetest.get_objects_inside_radius(pos, 2)) do
if object:get_entity_name() == "carts:cart" then
local owner = M(base_pos):get_string("owner")
local player = minetest.get_player_by_name(owner)
if player then
object:punch(player, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 1},
}, nil)
end
end
end
return lib.DONE
end,
})

View File

@ -22,78 +22,113 @@ 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 function node_and_pos(pos)
return get_node_lvm(pos), pos
end
-- Positions to check:
-- 3
-- 5 6
-- [R]1
-- 4 2
-- 5
function signs_bot.move_robot(pos, param2)
local pos1 = lib.next_pos(pos, param2)
local pos2 = {x=pos1.x, y=pos1.y-1, z=pos1.z}
local pos3 = {x=pos1.x, y=pos1.y+1, z=pos1.z}
local pos4 = {x=pos.x, y=pos.y-1, z=pos.z}
local pos5 = {x=pos.x, y=pos.y-2, z=pos.z}
local new_pos = nil
-- 3 2
-- 4
function signs_bot.move_robot(mem)
local param2 = mem.robot_param2
local pos = mem.robot_pos
local node1, pos1 = node_and_pos(lib.next_pos(pos, param2))
local node2, pos2 = node_and_pos({x=pos1.x, y=pos1.y-1, z=pos1.z})
local node3, pos3 = node_and_pos({x=pos.x, y=pos.y-1, z=pos.z})
if lib.check_pos(pos1, pos2, param2) then -- one step forward
new_pos = pos1
elseif lib.check_pos(pos3, pos1, param2) then -- one step up
local node = lib.get_node_lvm(pos4)
if node.name == "signs_bot:robot_leg" then
return nil
--
-- One step forward (pos1)
--
if lib.check_pos(pos1, node1, node2, param2) or
lib.check_pos(pos1, node1, node3, param2) then
if node3.name == "signs_bot:robot_foot" then
minetest.swap_node(pos3, mem.stored_node or {name = "air"})
minetest.remove_node(pos)
elseif node3.name == "signs_bot:robot_leg" then
local node4, pos4 = node_and_pos({x=pos.x, y=pos.y-2, z=pos.z})
if node4.name == "signs_bot:robot_foot" then
minetest.swap_node(pos4, mem.stored_node or {name = "air"})
end
minetest.remove_node(pos)
else
minetest.swap_node(pos, mem.stored_node or {name = "air"})
end
new_pos = {x=pos.x, y=pos.y+1, z=pos.z}
minetest.swap_node(pos, {name="signs_bot:robot_foot"})
minetest.set_node(new_pos, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = new_pos})
return new_pos
elseif lib.check_pos(pos1, pos4, param2) then -- one step forward
new_pos = pos1
elseif lib.check_pos(pos4, pos5, param2) then -- one step down
new_pos = pos4
else
return nil -- blocked
mem.stored_node = node1
minetest.set_node(pos1, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = pos1})
return pos1
end
local node4 = lib.get_node_lvm(pos4)
if node4.name == "signs_bot:robot_foot" or node4.name == "signs_bot:robot_leg" then
minetest.remove_node(pos4)
local node5 = lib.get_node_lvm(pos5)
if node5.name == "signs_bot:robot_foot" then
minetest.remove_node(pos5)
--
-- One step up (pos5)
--
local node6, pos6 = node_and_pos({x=pos1.x, y=pos1.y+1, z=pos1.z})
if lib.check_pos(pos6, node6, node1, param2) then
local node5, pos5 = node_and_pos({x=pos.x, y=pos.y+1, z=pos.z})
if node5.name == "air" then
if node3.name == "signs_bot:robot_leg" then
return nil
elseif node3.name == "signs_bot:robot_foot" then
minetest.swap_node(pos3, {name="signs_bot:robot_leg"})
else
minetest.swap_node(pos, {name="signs_bot:robot_foot"})
end
minetest.set_node(pos5, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = pos5})
return pos5
end
end
minetest.remove_node(pos)
minetest.set_node(new_pos, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = new_pos})
return new_pos
--
-- One step down I (pos3)
--
local node4, pos4 = node_and_pos({x=pos.x, y=pos.y-2, z=pos.z})
if lib.check_pos(pos3, node3, node4, param2) then --
minetest.remove_node(pos)
minetest.set_node(pos3, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = pos3})
mem.stored_node = node3
return pos3
end
--
-- One step down II (pos3)
--
if node3.name == "signs_bot:robot_foot" or node3.name == "signs_bot:robot_leg" then
minetest.remove_node(pos)
minetest.set_node(pos3, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = pos3})
return pos3
end
end
local function backward_robot(pos, param2)
local pos1 = lib.next_pos(pos, (param2 + 2) % 4)
local pos2 = {x=pos1.x, y=pos1.y-1, z=pos1.z}
local pos4 = {x=pos.x, y=pos.y-1, z=pos.z}
local pos5 = {x=pos.x, y=pos.y-2, z=pos.z}
local function backward_robot(mem)
local param2 = mem.robot_param2
local pos = mem.robot_pos
local node1, pos1 = node_and_pos(lib.next_pos(pos, (param2 + 2) % 4))
local node2, pos2 = node_and_pos({x=pos1.x, y=pos1.y-1, z=pos1.z})
local node3, pos3 = node_and_pos({x=pos.x, y=pos.y-1, z=pos.z})
local node4, pos4 = node_and_pos({x=pos.x, y=pos.y-2, z=pos.z})
local new_pos = nil
if lib.check_pos(pos1, pos2, param2) then -- one step forward
new_pos = pos1
else
return nil -- blocked
end
local node4 = lib.get_node_lvm(pos4)
if node4.name == "signs_bot:robot_foot" or node4.name == "signs_bot:robot_leg" then
minetest.remove_node(pos4)
local node5 = lib.get_node_lvm(pos5)
if node5.name == "signs_bot:robot_foot" then
minetest.remove_node(pos5)
if lib.check_pos(pos1, node1, node2, param2) then
if node3.name == "signs_bot:robot_foot" or node3.name == "signs_bot:robot_leg" then
minetest.remove_node(pos3)
if node4.name == "signs_bot:robot_foot" then
minetest.remove_node(pos4)
end
end
minetest.swap_node(pos, mem.stored_node or {name = "air"})
minetest.set_node(pos1, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = pos1})
mem.stored_node = node1
return pos1
end
minetest.remove_node(pos)
minetest.set_node(new_pos, {name="signs_bot:robot", param2=param2})
minetest.sound_play('signs_bot_step', {pos = new_pos})
return new_pos
end
signs_bot.register_botcommand("backward", {
@ -101,7 +136,7 @@ signs_bot.register_botcommand("backward", {
params = "",
description = I("Move the robot one step back"),
cmnd = function(base_pos, mem)
local new_pos = backward_robot(mem.robot_pos, mem.robot_param2)
local new_pos = backward_robot(mem)
if new_pos then -- not blocked?
mem.robot_pos = new_pos
end
@ -157,13 +192,12 @@ signs_bot.register_botcommand("turn_around", {
-- [R]
-- 2
local function robot_up(pos, param2)
local pos1 = {x=pos.x, y=pos.y+1, z=pos.z}
local pos2 = {x=pos.x, y=pos.y-1, z=pos.z}
if lib.check_pos(pos1, pos2, param2) then
local node = lib.get_node_lvm(pos2)
if node.name == "signs_bot:robot_leg" then
local node1, pos1 = node_and_pos({x=pos.x, y=pos.y+1, z=pos.z})
local node2, pos2 = node_and_pos({x=pos.x, y=pos.y-1, z=pos.z})
if lib.check_pos(pos1, node1, node2, param2) then
if node2.name == "signs_bot:robot_leg" then
return nil
elseif node.name == "signs_bot:robot_foot" then
elseif node2.name == "signs_bot:robot_foot" then
minetest.swap_node(pos, {name="signs_bot:robot_leg"})
else
minetest.swap_node(pos, {name="signs_bot:robot_foot"})
@ -194,12 +228,11 @@ signs_bot.register_botcommand("move_up", {
-- 2
-- 3
local function robot_down(pos, param2)
local pos1 = {x=pos.x, y=pos.y-1, z=pos.z}
local pos2 = {x=pos.x, y=pos.y-2, z=pos.z}
local pos3 = {x=pos.x, y=pos.y-3, z=pos.z}
local node1 = lib.get_node_lvm(pos1)
if lib.check_pos(pos1, pos2, param2)
or (node1.name == "air" and lib.check_pos(pos2, pos3, param2))
local node1, pos1 = node_and_pos({x=pos.x, y=pos.y-1, z=pos.z})
local node2, pos2 = node_and_pos({x=pos.x, y=pos.y-2, z=pos.z})
local node3, pos3 = node_and_pos({x=pos.x, y=pos.y-3, z=pos.z})
if lib.check_pos(pos1, node1, node2, param2)
or (node1.name == "air" and lib.check_pos(pos2, node2, node3, param2))
or (node1.name == "signs_bot:robot_leg" or node1.name == "signs_bot:robot_foot") then
minetest.remove_node(pos)
minetest.set_node(pos1, {name="signs_bot:robot", param2=param2})

View File

@ -46,7 +46,7 @@ end
function signs_bot.get_commands()
local tbl = {}
for _,mod in ipairs(SortedMods) do
tbl[#tbl+1] = mod..I(" commands:")
tbl[#tbl+1] = mod.." "..I("commands:")
for _,cmnd in ipairs(SortedKeys[mod]) do
local item = tCommands[cmnd]
tbl[#tbl+1] = " "..item.name.." "..item.params
@ -186,7 +186,7 @@ end
local function cond_move(base_pos, mem)
local any_sensor, sign_pos = scan_surrounding(mem)
if not sign_pos then
local new_pos = signs_bot.move_robot(mem.robot_pos, mem.robot_param2)
local new_pos = signs_bot.move_robot(mem)
if new_pos then -- not blocked?
mem.robot_pos = new_pos
if any_sensor then
@ -203,7 +203,7 @@ end
local function uncond_move(base_pos, mem)
local any_sensor = scan_surrounding(mem)
local new_pos = signs_bot.move_robot(mem.robot_pos, mem.robot_param2)
local new_pos = signs_bot.move_robot(mem)
if new_pos then -- not blocked?
mem.robot_pos = new_pos
if any_sensor then

View File

@ -39,6 +39,7 @@ dofile(MP.."/nodes.lua")
dofile(MP.."/bot_sensor.lua")
dofile(MP.."/node_sensor.lua")
dofile(MP.."/crop_sensor.lua")
dofile(MP.."/cart_sensor.lua")
dofile(MP.."/chest.lua")
dofile(MP.."/timer.lua")

View File

@ -64,7 +64,7 @@ function signs_bot.lib.get_node_lvm(pos)
local data = vm:get_data()
local param2_data = vm:get_param2_data()
local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
local idx = area:index(pos.x, pos.y, pos.z)
local idx = area:indexp(pos)
node = {
name = minetest.get_name_from_content_id(data[idx]),
param2 = param2_data[idx]
@ -85,10 +85,8 @@ local function poke_objects(pos, param2, objects)
end
end
-- check if posA == air-like and posB == solid and no player around
function signs_bot.lib.check_pos(posA, posB, param2)
local nodeA = get_node_lvm(posA)
local nodeB = get_node_lvm(posB)
-- check if nodeA on posA == air-like and nodeB == solid and no player around
function signs_bot.lib.check_pos(posA, nodeA, nodeB, param2)
if not minetest.registered_nodes[nodeA.name].walkable and
minetest.registered_nodes[nodeB.name].walkable then
local objects = minetest.get_objects_inside_radius(posA, 0.7)

Binary file not shown.

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-14 19:34+0200\n"
"PO-Revision-Date: 2019-04-14 19:36+0200\n"
"POT-Creation-Date: 2019-04-15 20:53+0200\n"
"PO-Revision-Date: 2019-04-15 20:56+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -155,6 +155,10 @@ msgstr ""
"<slot> ist die Position im\n"
"eigenen Inventar (1--8)."
#: cmd_item.lua
msgid "Punch a rail cart to start it"
msgstr "Schlage den Wagen um ihn zu starten"
#: cmd_move.lua
msgid "Move the robot one step back"
msgstr ""
@ -445,7 +449,7 @@ msgstr ""
"eigenen Inventar (1--6)."
#: commands.lua
msgid " commands:"
msgid "commands:"
msgstr "Kommandos:"
#: commands.lua

View File

@ -7,16 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-14 18:25+0200\n"
"PO-Revision-Date: 2019-04-14 19:31+0200\n"
"POT-Creation-Date: 2019-04-14 19:34+0200\n"
"PO-Revision-Date: 2019-04-14 19:36+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.6\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: de\n"
#: basis.lua
msgid "Off"
@ -74,6 +74,14 @@ msgstr "Zeichen:"
msgid "Bot Control Unit"
msgstr "Roboter Steuerungseinheit"
#: chest.lua
msgid "Bot Chest: Sends signal to "
msgstr "Roboter Kiste: Sende Signal zu "
#: chest.lua
msgid "Signs Bot Chest"
msgstr "Signs Bot Kiste"
#: cmd_farming.lua
msgid ""
"Sow farming seeds\n"
@ -579,3 +587,19 @@ msgstr "Zeichen \"Stopp\""
#: tool.lua
msgid "Sensor Connection Tool"
msgstr "Sensor Verbindungswerkzeug"
#: timer.lua
msgid "Bot Timer"
msgstr "Roboter Timer"
#: timer.lua
msgid "Connected with"
msgstr "Verbunden mit"
#: timer.lua
msgid "Cycle time [min]:"
msgstr "Zykluszeit [min]:"
#: timer.lua
msgid "Start"
msgstr "Start"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-14 19:34+0200\n"
"POT-Creation-Date: 2019-04-15 20:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -131,6 +131,10 @@ msgid ""
"<slot> is the inventory slot (1..8)"
msgstr ""
#: cmd_item.lua
msgid "Punch a rail cart to start it"
msgstr ""
#: cmd_move.lua
msgid "Move the robot one step back"
msgstr ""
@ -344,7 +348,7 @@ msgid ""
msgstr ""
#: commands.lua
msgid " commands:"
msgid "commands:"
msgstr ""
#: commands.lua

View File

@ -21,7 +21,9 @@ local lib = signs_bot.lib
-- Called when robot is started
function signs_bot.place_robot(pos1, pos2, param2)
if lib.check_pos(pos1, pos2, param2) then
local node1 = lib.get_node_lvm(pos1)
local node2 = lib.get_node_lvm(pos2)
if lib.check_pos(pos1, node1, node2, param2) then
minetest.set_node(pos1, {name = "signs_bot:robot", param2 = param2})
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B