Ewgeniy

send

Feb 10th, 2023 (edited)
683
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.78 KB | None | 0 0
  1. local component = require("component")
  2. local event = require("event")
  3. local port = 512
  4. local keyWord = "ECSGrief"
  5. local modem
  6.  
  7. if component.isAvailable("modem") then
  8.     modem = component.modem
  9. else
  10.     error("Требуется беспроводной модем!")
  11. end
  12.  
  13. modem.open(port)
  14.  
  15. -------------------------------------------------------------------------------------
  16.  
  17. local dirKeys = {
  18.     [2] = "forward",
  19.     [3] = "up",
  20.     [4] = "down",
  21. }
  22.  
  23. local dirNames = {
  24.     forward = "вперёд",
  25.     up      = "вверх",
  26.     down    = "вниз",
  27. }
  28.  
  29. local commands = {
  30.     [17] = { msg = "forward",     text = "Двигаться вперёд" },
  31.     [31] = { msg = "back",        text = "Двигаться назад" },
  32.     [30] = { msg = "turnLeft",    text = "Повернуться налево" },
  33.     [32] = { msg = "turnRight",   text = "Повернуться направо" },
  34.     [57] = { msg = "up",          text = "Двигаться вверх" },
  35.     [42] = { msg = "down",        text = "Двигаться вниз" },
  36.     [19] = { msg = "redstone",    text = "Переключить редстоун" },
  37.     [14] = { msg = "exit",        text = "Завершить программу на роботе" },
  38.     [59] = { msg = "selfDestroy", text = "!!! УНИЧТОЖИТЬ ДАННЫЕ РОБОТА !!!" },
  39. }
  40.  
  41. local function chooseDirAndSend(action, label)
  42.     print("[" .. label .. "] Выберите направление:")
  43.     print("  1 = вперёд    2 = вверх    3 = вниз    ESC = отмена")
  44.     while true do
  45.         local ev = { event.pull("key_down") }
  46.         local kc = ev[4]
  47.         if dirKeys[kc] then
  48.             local dir = dirKeys[kc]
  49.             local msg = action .. ":" .. dir
  50.             print("→ " .. label .. " " .. dirNames[dir])
  51.             modem.broadcast(port, keyWord, msg)
  52.             return
  53.         elseif kc == 1 then
  54.             print("Отмена.")
  55.             return
  56.         end
  57.     end
  58. end
  59.  
  60. -- Ожидаем список блоков от робота и спрашиваем выбор
  61. local function waitForInventoryAndChoose(dir)
  62.     print("Запрос инвентаря роботу...")
  63.     while true do
  64.         local ev = { event.pull(5) }  -- таймаут 5 секунд
  65.         if ev[1] == nil then
  66.             print("!! Робот не ответил (таймаут).")
  67.             return
  68.         elseif ev[1] == "modem_message" and ev[4] == port and ev[6] == keyWord then
  69.             local incoming = tostring(ev[7])
  70.  
  71.             -- Робот прислал "INVEMPTY" — инвентарь пуст
  72.             if incoming == "INVEMPTY" then
  73.                 print("!! В инвентаре робота нет предметов.")
  74.                 return
  75.  
  76.             -- Робот прислал "INVONE:слот" — только один блок, он сам поставит
  77.             elseif incoming:sub(1, 7) == "INVONE:" then
  78.                 local info = incoming:sub(8)
  79.                 print("→ Один блок: " .. info .. " — ставлю автоматически.")
  80.                 return
  81.  
  82.             -- Робот прислал список: "INVLIST:1=Камень(5)|2=Земля(3)|..."
  83.             elseif incoming:sub(1, 8) == "INVLIST:" then
  84.                 local listStr = incoming:sub(9)
  85.                 local items = {}
  86.                 for entry in listStr:gmatch("[^|]+") do
  87.                     local idx, name, count = entry:match("^(%d+)=(.+)%((%d+)%)$")
  88.                     if idx then
  89.                         table.insert(items, { idx = tonumber(idx), name = name, count = tonumber(count) })
  90.                     end
  91.                 end
  92.  
  93.                 print("В инвентаре несколько предметов. Выберите номер для установки:")
  94.                 for i, item in ipairs(items) do
  95.                     print("  " .. i .. ") [слот " .. item.idx .. "] " .. item.name .. " x" .. item.count)
  96.                 end
  97.                 print("  ESC = отмена")
  98.  
  99.                 while true do
  100.                     local ev2 = { event.pull("key_down") }
  101.                     local kc2 = ev2[4]
  102.                     if kc2 == 1 then
  103.                         print("Отмена.")
  104.                         modem.broadcast(port, keyWord, "placeCancel")
  105.                         return
  106.                     end
  107.                     -- Цифры 1-9 (коды клавиш 2-10)
  108.                     local num = kc2 - 1
  109.                     if num >= 1 and num <= #items then
  110.                         local chosen = items[num]
  111.                         print("→ Выбран: " .. chosen.name .. " [слот " .. chosen.idx .. "]")
  112.                         modem.broadcast(port, keyWord, "placeChosen:" .. chosen.idx .. ":" .. dir)
  113.                         return
  114.                     end
  115.                 end
  116.  
  117.             -- Обычные сообщения INFO/ERROR показываем и продолжаем ждать
  118.             elseif incoming:sub(1, 6) == "ERROR:" then
  119.                 print("")
  120.                 print("!! ОШИБКА НА РОБОТЕ: " .. incoming:sub(8))
  121.                 print("")
  122.                 return
  123.             elseif incoming:sub(1, 5) == "INFO:" then
  124.                 print("[~] " .. incoming:sub(7))
  125.                 return
  126.             end
  127.         end
  128.     end
  129. end
  130.  
  131. local function send()
  132.     while true do
  133.         local ev = { event.pull() }
  134.         if ev[1] == "key_down" then
  135.             local kc = ev[4]
  136.             if kc == 18 then                      -- E: use
  137.                 chooseDirAndSend("use", "Использовать предмет (ПКМ)")
  138.             elseif kc == 16 then                  -- Q: swing
  139.                 chooseDirAndSend("swing", "Удар инструментом (ЛКМ)")
  140.             elseif kc == 33 then                  -- F: place
  141.                 print("[Поставить блок] Выберите направление:")
  142.                 print("  1 = вперёд    2 = вверх    3 = вниз    ESC = отмена")
  143.                 local waiting = true
  144.                 while waiting do
  145.                     local ev2 = { event.pull("key_down") }
  146.                     local kc2 = ev2[4]
  147.                     if dirKeys[kc2] then
  148.                         local dir = dirKeys[kc2]
  149.                         print("→ Направление: " .. dirNames[dir])
  150.                         modem.broadcast(port, keyWord, "placeQuery:" .. dir)
  151.                         waitForInventoryAndChoose(dir)
  152.                         waiting = false
  153.                     elseif kc2 == 1 then
  154.                         print("Отмена.")
  155.                         waiting = false
  156.                     end
  157.                 end
  158.             elseif kc == 44 then                  -- Z: suck
  159.                 chooseDirAndSend("suck", "Подобрать предмет")
  160.             elseif kc == 46 then                  -- C: craft
  161.                 print("→ Крафтить из слотов 1-9 инвентаря робота")
  162.                 modem.broadcast(port, keyWord, "craft")
  163.             elseif commands[kc] then
  164.                 print("→ " .. commands[kc].text)
  165.                 modem.broadcast(port, keyWord, commands[kc].msg)
  166.                 if commands[kc].msg == "exit" then
  167.                     return
  168.                 end
  169.             end
  170.         elseif ev[1] == "modem_message" and ev[4] == port and ev[6] == keyWord then
  171.             local incoming = tostring(ev[7])
  172.             if incoming:sub(1, 6) == "ERROR:" then
  173.                 print("")
  174.                 print("!! ОШИБКА НА РОБОТЕ: " .. incoming:sub(8))
  175.                 print("")
  176.             elseif incoming:sub(1, 5) == "INFO:" then
  177.                 print("[~] " .. incoming:sub(7))
  178.             elseif incoming == "pong" then
  179.                 print("[PING] Робот жив и отвечает.")
  180.             end
  181.         end
  182.     end
  183. end
  184.  
  185. local function main()
  186.     print(" ")
  187.     print("ECSGrief Sender v1.5")
  188.     print(" ")
  189.     print("WASD/SPACE/SHIFT — движение")
  190.     print("E  — использовать предмет (ПКМ)")
  191.     print("Q  — удар инструментом  (ЛКМ)")
  192.     print("F  — поставить блок из инвентаря")
  193.     print("Z  — подобрать предмет")
  194.     print("C  — скрафтить (ингредиенты в слотах 1-9 робота)")
  195.     print("После E/Q/F/Z: 1=вперёд  2=вверх  3=вниз  ESC=отмена")
  196.     print("R  — переключить редстоун")
  197.     print("BACKSPACE — выход | F1 — уничтожить данные робота")
  198.     print(" ")
  199.     send()
  200.     print(" ")
  201.     print("Программа завершена.")
  202. end
  203.  
  204. main()
Advertisement
Add Comment
Please, Sign In to add comment