Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local event = require("event")
- local port = 512
- local keyWord = "ECSGrief"
- local modem
- if component.isAvailable("modem") then
- modem = component.modem
- else
- error("Требуется беспроводной модем!")
- end
- modem.open(port)
- -------------------------------------------------------------------------------------
- local dirKeys = {
- [2] = "forward",
- [3] = "up",
- [4] = "down",
- }
- local dirNames = {
- forward = "вперёд",
- up = "вверх",
- down = "вниз",
- }
- local commands = {
- [17] = { msg = "forward", text = "Двигаться вперёд" },
- [31] = { msg = "back", text = "Двигаться назад" },
- [30] = { msg = "turnLeft", text = "Повернуться налево" },
- [32] = { msg = "turnRight", text = "Повернуться направо" },
- [57] = { msg = "up", text = "Двигаться вверх" },
- [42] = { msg = "down", text = "Двигаться вниз" },
- [19] = { msg = "redstone", text = "Переключить редстоун" },
- [14] = { msg = "exit", text = "Завершить программу на роботе" },
- [59] = { msg = "selfDestroy", text = "!!! УНИЧТОЖИТЬ ДАННЫЕ РОБОТА !!!" },
- }
- local function chooseDirAndSend(action, label)
- print("[" .. label .. "] Выберите направление:")
- print(" 1 = вперёд 2 = вверх 3 = вниз ESC = отмена")
- while true do
- local ev = { event.pull("key_down") }
- local kc = ev[4]
- if dirKeys[kc] then
- local dir = dirKeys[kc]
- local msg = action .. ":" .. dir
- print("→ " .. label .. " " .. dirNames[dir])
- modem.broadcast(port, keyWord, msg)
- return
- elseif kc == 1 then
- print("Отмена.")
- return
- end
- end
- end
- -- Ожидаем список блоков от робота и спрашиваем выбор
- local function waitForInventoryAndChoose(dir)
- print("Запрос инвентаря роботу...")
- while true do
- local ev = { event.pull(5) } -- таймаут 5 секунд
- if ev[1] == nil then
- print("!! Робот не ответил (таймаут).")
- return
- elseif ev[1] == "modem_message" and ev[4] == port and ev[6] == keyWord then
- local incoming = tostring(ev[7])
- -- Робот прислал "INVEMPTY" — инвентарь пуст
- if incoming == "INVEMPTY" then
- print("!! В инвентаре робота нет предметов.")
- return
- -- Робот прислал "INVONE:слот" — только один блок, он сам поставит
- elseif incoming:sub(1, 7) == "INVONE:" then
- local info = incoming:sub(8)
- print("→ Один блок: " .. info .. " — ставлю автоматически.")
- return
- -- Робот прислал список: "INVLIST:1=Камень(5)|2=Земля(3)|..."
- elseif incoming:sub(1, 8) == "INVLIST:" then
- local listStr = incoming:sub(9)
- local items = {}
- for entry in listStr:gmatch("[^|]+") do
- local idx, name, count = entry:match("^(%d+)=(.+)%((%d+)%)$")
- if idx then
- table.insert(items, { idx = tonumber(idx), name = name, count = tonumber(count) })
- end
- end
- print("В инвентаре несколько предметов. Выберите номер для установки:")
- for i, item in ipairs(items) do
- print(" " .. i .. ") [слот " .. item.idx .. "] " .. item.name .. " x" .. item.count)
- end
- print(" ESC = отмена")
- while true do
- local ev2 = { event.pull("key_down") }
- local kc2 = ev2[4]
- if kc2 == 1 then
- print("Отмена.")
- modem.broadcast(port, keyWord, "placeCancel")
- return
- end
- -- Цифры 1-9 (коды клавиш 2-10)
- local num = kc2 - 1
- if num >= 1 and num <= #items then
- local chosen = items[num]
- print("→ Выбран: " .. chosen.name .. " [слот " .. chosen.idx .. "]")
- modem.broadcast(port, keyWord, "placeChosen:" .. chosen.idx .. ":" .. dir)
- return
- end
- end
- -- Обычные сообщения INFO/ERROR показываем и продолжаем ждать
- elseif incoming:sub(1, 6) == "ERROR:" then
- print("")
- print("!! ОШИБКА НА РОБОТЕ: " .. incoming:sub(8))
- print("")
- return
- elseif incoming:sub(1, 5) == "INFO:" then
- print("[~] " .. incoming:sub(7))
- return
- end
- end
- end
- end
- local function send()
- while true do
- local ev = { event.pull() }
- if ev[1] == "key_down" then
- local kc = ev[4]
- if kc == 18 then -- E: use
- chooseDirAndSend("use", "Использовать предмет (ПКМ)")
- elseif kc == 16 then -- Q: swing
- chooseDirAndSend("swing", "Удар инструментом (ЛКМ)")
- elseif kc == 33 then -- F: place
- print("[Поставить блок] Выберите направление:")
- print(" 1 = вперёд 2 = вверх 3 = вниз ESC = отмена")
- local waiting = true
- while waiting do
- local ev2 = { event.pull("key_down") }
- local kc2 = ev2[4]
- if dirKeys[kc2] then
- local dir = dirKeys[kc2]
- print("→ Направление: " .. dirNames[dir])
- modem.broadcast(port, keyWord, "placeQuery:" .. dir)
- waitForInventoryAndChoose(dir)
- waiting = false
- elseif kc2 == 1 then
- print("Отмена.")
- waiting = false
- end
- end
- elseif kc == 44 then -- Z: suck
- chooseDirAndSend("suck", "Подобрать предмет")
- elseif kc == 46 then -- C: craft
- print("→ Крафтить из слотов 1-9 инвентаря робота")
- modem.broadcast(port, keyWord, "craft")
- elseif commands[kc] then
- print("→ " .. commands[kc].text)
- modem.broadcast(port, keyWord, commands[kc].msg)
- if commands[kc].msg == "exit" then
- return
- end
- end
- elseif ev[1] == "modem_message" and ev[4] == port and ev[6] == keyWord then
- local incoming = tostring(ev[7])
- if incoming:sub(1, 6) == "ERROR:" then
- print("")
- print("!! ОШИБКА НА РОБОТЕ: " .. incoming:sub(8))
- print("")
- elseif incoming:sub(1, 5) == "INFO:" then
- print("[~] " .. incoming:sub(7))
- elseif incoming == "pong" then
- print("[PING] Робот жив и отвечает.")
- end
- end
- end
- end
- local function main()
- print(" ")
- print("ECSGrief Sender v1.5")
- print(" ")
- print("WASD/SPACE/SHIFT — движение")
- print("E — использовать предмет (ПКМ)")
- print("Q — удар инструментом (ЛКМ)")
- print("F — поставить блок из инвентаря")
- print("Z — подобрать предмет")
- print("C — скрафтить (ингредиенты в слотах 1-9 робота)")
- print("После E/Q/F/Z: 1=вперёд 2=вверх 3=вниз ESC=отмена")
- print("R — переключить редстоун")
- print("BACKSPACE — выход | F1 — уничтожить данные робота")
- print(" ")
- send()
- print(" ")
- print("Программа завершена.")
- end
- main()
Advertisement
Add Comment
Please, Sign In to add comment