v0.06 nodes remove bugfix, punch_cart command added, cart sensor added
parent
499dfc4053
commit
369cc1c35a
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
22
cmd_item.lua
22
cmd_item.lua
|
@ -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,
|
||||
})
|
||||
|
||||
|
|
173
cmd_move.lua
173
cmd_move.lua
|
@ -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})
|
||||
|
|
|
@ -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
|
||||
|
|
1
init.lua
1
init.lua
|
@ -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")
|
||||
|
||||
|
|
8
lib.lua
8
lib.lua
|
@ -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)
|
||||
|
|
BIN
locale/de.mo
BIN
locale/de.mo
Binary file not shown.
10
locale/de.po
10
locale/de.po
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 |
Loading…
Reference in New Issue