Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ------------------------------------------------------
- -- Внимание! Код не смотреть | --
- -- Во избежания повреждения чего бы то ни было . --
- ------------------------------------------------------
- local FILE = "/usr/share/db"
- local PORT = 666
- local ROBOT = "62907d63-2067-4973-9742-2554daa93c88"
- local DIR = "north"
- local TECH_SLOTS = 3
- local DEBUG = false
- ---===---
- local com = require("component")
- local modem = com.modem
- local event = require("event")
- local me = com.me_interface
- local term = require("term")
- local gpu = com.gpu
- local unicode = require("unicode")
- local comp = require("computer")
- local w, h = gpu.getResolution()
- modem.open(PORT)
- local all = me.getAvailableItems()
- local stacks = {}
- local function updateList()
- stacks = {}
- for i = 1, #all, 1 do
- local fingerprint = all[i].fingerprint
- if fingerprint.dmg ~= 0 then
- stacks[fingerprint.id .. "@" .. fingerprint.dmg] = all[i]
- else
- stacks[fingerprint.id] = all[i]
- end
- end
- end
- loadfile(FILE, _ENV, _ENV)()
- updateList()
- local checkAvail -- Forward declaration
- local function centerY(text, line)
- local textDiv = math.floor(unicode.len(text) / 2)
- local widthDiv = math.floor(w / 2)
- gpu.set(widthDiv - textDiv - 1, line, text)
- end
- local function pushItem(item, slot)
- local itemPrint = item.fingerprint
- print("[INFO] [Pusher] Exporting " .. itemPrint.id .. "@" .. itemPrint.dmg .. " into robot (Slot: " .. slot .. ")")
- rSlot = slot + TECH_SLOTS
- rSlot = rSlot + math.floor((slot - 1) / 3)
- me.exportItem(itemPrint, DIR, 1, rSlot)
- end
- local function getItem(itemName)
- return recipes[itemName]
- end
- checkAvail = function(itemName, item)
- if DEBUG then print(itemName, item) end
- local itemStack
- if item == nil then
- itemStack = getItem(itemName)
- else
- itemStack = item
- end
- updateList()
- local itemFP = itemStack.fingerprint
- local data = false
- for i = 1, #all, 1 do
- if all[i].fingerprint.id == itemFP.id and all[i].fingerprint.dmg == itemFP.dmg then
- data = {true, all[i], i}
- break
- end
- end
- if data == false then
- return false
- end
- return table.unpack(data)
- end
- local tree = {}
- local function smartInsert(item, order, qty, noCraft, combine)
- if DEBUG then print("SI", item, order, qty, noCraft, combine) end
- local new = true
- if combine then
- for i = 1, #tree, 1 do
- if tree[i].item.fingerprint.id == item.fingerprint.id and tree[i].item.fingerprint.dmg == item.fingerprint.dmg then
- tree[i].order = math.max(order, tree[i].order)
- tree[i].qty = tree[i].qty + qty
- new = false
- break
- end
- end
- end
- if new then
- if noCraft then
- table.insert(tree, {["item"] = item, ["order"] = order, ["qty"] = qty, ["noCraft"] = true})
- else
- table.insert(tree, {["item"] = item, ["order"] = order, ["qty"] = qty, ["noCraft"] = false})
- end
- end
- end
- local function buildTree(itemName, order, qty, itemStack, toCraft, combine)
- if DEBUG then print(itemName, order, qty, itemStack, toCraft, combine) end
- local item = {}
- if itemName ~= nil then
- item = getItem(itemName)
- elseif itemStack ~= nil then
- item = itemStack
- end
- if type(item.recipe) == "table" then
- for i = 1, 9, 1 do
- if item.recipe[i] ~= "" then
- if not checkAvail(item.recipe[i]) then
- buildTree(item.recipe[i], order + 1, math.ceil(qty / item.qty), nil, false, true)
- else
- smartInsert(getItem(item.recipe[i]), order + 1, math.ceil(qty / item.qty), true, true)
- end
- end
- end
- else
- if not checkAvail(itemName) then
- io.stderr:write("Отсутствует компонент крафта: " .. item.fingerprint.id .. "@" .. item.fingerprint.dmg .. "!")
- os.exit()
- end
- end
- if toCraft == nil then toCraft = false end
- if combine == nil then combine = true end
- if DEBUG then print("TC", toCraft, combine) end
- smartInsert(item, order, qty, toCraft, combine)
- end
- local stack = {}
- local function checkTree()
- for i = 1, #tree, 1 do
- local stack = tree[i]
- if DEBUG then print("ID", stack.item.fingerprint.id, stack.item.fingerprint.dmg) end
- local avail, info, _ = checkAvail(nil, stack.item)
- if DEBUG then print("AQ", avail, stack.qty, type(stack.qty)) end
- if stack.noCraft then
- if avail then
- if DEBUG then print("CS", info.size) end
- if stack.qty > info.size then
- if stack.item.recipe then
- buildTree(nil, stack.order + 1, stack.qty - info.size, stack.item, false, false)
- else
- io.stderr:write("[ERR] Недостаточно ресурсов: " .. stack.item.fingerprint.id .. "@" .. stack.item.fingerprint.dmg .. " (" .. info.size .. "/" .. stack.qty .. ")!")
- os.exit()
- end
- end
- else
- if stack.item.recipe then
- print("M", stack.qty)
- buildTree(nil, stack.order + 1, stack.qty, stack.item, false, false)
- else
- io.stderr:write("[ERR] Отсутствие ресурсов: " .. stack.item.fingerprint.id .. "@" .. stack.item.fingerprint.dmg .. " (" .. stack.qty .. ")!")
- os.exit()
- end
- end
- end
- end
- end
- local function craft()
- local stats = {}
- stats.crafted = 0
- stats.timeStart = comp.uptime()
- stats.timeStop = 0
- stats.treeLen = #tree
- local orderTree = {}
- for i = 1, #tree, 1 do
- local order = tree[i].order + 1
- if not orderTree[order] then
- orderTree[order] = {}
- end
- table.insert(orderTree[order], {["item"] = tree[i].item, ["qty"] = tree[i].qty, ["noCraft"] = tree[i].noCraft})
- end
- stats.maxOrder = #orderTree
- for i = #orderTree, 1, -1 do
- print("[INFO] [Craft] Обработка очереди " .. i)
- for j = 1, #orderTree[i], 1 do
- print("[INFO] [Craft] Обработка задачи " .. j)
- if orderTree[i][j].item.recipe then
- if not orderTree[i][j].noCraft then
- print("[INFO] [Craft] ID предмета в задаче: " .. orderTree[i][j].item.fingerprint.id .. "@" .. orderTree[i][j].item.fingerprint.dmg)
- for l = 1, math.ceil(orderTree[i][j].qty / orderTree[i][j].item.qty), 1 do
- print("[INFO] [Craft] Крафт #" .. l)
- for k = 1, 9, 1 do
- if orderTree[i][j].item.recipe[k] ~= "" then
- pushItem(getItem(orderTree[i][j].item.recipe[k]), k)
- end
- end
- modem.send(ROBOT, PORT, "craft")
- stats.crafted = stats.crafted + 1
- os.sleep(0.5)
- end
- end
- end
- end
- end
- stats.timeStop = comp.uptime()
- return stats
- end
- modem.send(ROBOT, PORT, "clear")
- local listH = h - 1
- local function getNumber(min, max)
- repeat
- gpu.fill(1, h, w, 1, " ")
- term.setCursor(1, h)
- io.write("Предмет для крафта (0 для выхода): ")
- input = term.read(nil, false)
- if tonumber(input) == 0 then
- term.clear()
- term.setCursor(1, 1)
- os.exit()
- end
- until tonumber(input) ~= nil and tonumber(input) <= max and tonumber(input) >= min
- return tonumber(input)
- end
- local names = {}
- for name, _ in pairs(recipes) do
- table.insert(names, name)
- end
- local pages = {}
- local onPage = listH * 2
- if #names > onPage then
- onPage = onPage - 1
- end
- local j = 1
- local page = {}
- while true do
- page = {}
- for i = 1, onPage, 1 do
- if names[j + i] then
- table.insert(page, {j + i - 1, names[j + i - 1]})
- else
- break
- end
- end
- table.insert(pages, page)
- if not names[j + onPage + 1] then break end
- j = j + onPage
- end
- local lines = {}
- local function list(page)
- term.clear()
- for i = 1, #pages[page], 1 do
- local item = pages[page][i]
- local nonCraftable = (recipes[item[2]].recipe and "[*] " or "")
- if i > listH then
- gpu.set(w / 2, i - listH, "[" .. item[1] .. "] " .. nonCraftable .. item[2])
- else
- gpu.set(1, i, "[" .. item[1] .. "] " .. nonCraftable .. item[2])
- end
- end
- end
- local function drawNext(id)
- gpu.set(w / 2, listH, "[" .. id .. "] Next ->")
- end
- local page = 0
- local input = ""
- local nextId = 0
- local returnToBack = false
- repeat
- page = page + 1
- if page > #pages then
- page = 1
- end
- list(page)
- if onPage ~= listH * 2 then
- nextId = pages[page][#pages[page]][1] + 1
- drawNext(nextId)
- input = getNumber(pages[page][1][1], pages[page][#pages[page]][1] + 1)
- else
- input = getNumber(pages[1][1][1], pages[1][#pages[1]][1])
- end
- until input ~= nextId
- gpu.setBackground(0xFFFFFF)
- gpu.setForeground(0x000000)
- local request, id, lineH, offset = "", 0, 0, 1
- for i = 1, #pages[page], 1 do
- if pages[page][i][1] == tonumber(input) then
- request = pages[page][i][2]
- id = i
- end
- end
- if id > listH then
- lineH = id - listH
- offset = w / 2
- else
- lineH = id
- end
- gpu.fill(offset, lineH, w / 2 - 2, 1, " ")
- gpu.set(offset, lineH, "[" .. input .. "] " .. request)
- gpu.setForeground(0xFFFFFF)
- gpu.setBackground(0x000000)
- local qty = 0
- repeat
- term.clearLine(h)
- term.setCursor(1, h)
- io.write("Выберите количество (0 для выхода): ")
- qty = term.read()
- until tonumber(qty) ~= nil
- if tonumber(qty) < 1 then
- term.clear()
- term.setCursor(1, 1)
- os.exit()
- end
- qty = tonumber(qty)
- term.clear()
- term.setCursor(1, 2)
- gpu.set(1, 1, string.rep("-", w))
- centerY("ПЛАН КРАФТА", 1)
- buildTree(request, 0, qty)
- for i =1, #tree, 1 do
- if tree[i].noCraft then
- noCraft = "[X]"
- else
- noCraft = ""
- end
- print("[" .. i .. "] " .. tree[i].item.fingerprint.id .. "@" .. tree[i].item.fingerprint.dmg .. " x " .. tree[i].qty .. " " .. noCraft .. " (порядок: " .. tree[i].order .. ")")
- end
- gpu.set(1, h, "Нажмите [Enter] для проверки дерева и старта крафта...")
- local keyData = {event.pull("key_down")}
- if keyData[1] == nil or keyData[3] ~= 13 then
- term.clear()
- term.setCursor(1, 1)
- os.exit()
- end
- term.clear()
- term.setCursor(1, 2)
- gpu.set(1, 1, string.rep("-", w))
- centerY("ПЛАН КРАФТА (ПЕРЕПРОВЕРКА)", 1)
- checkTree()
- for i = 1, #tree, 1 do
- if tree[i].noCraft then
- noCraft = "[X]"
- else
- noCraft = ""
- end
- print("[" .. i .. "] " .. tree[i].item.fingerprint.id .. "@" .. tree[i].item.fingerprint.dmg .. " x " .. tree[i].qty .. " " .. noCraft .. " (порядок: " .. tree[i].order .. ")")
- end
- gpu.set(1, h, "Нажмите [Enter] для продолжения...")
- keyData = {event.pull("key_down")}
- if keyData[1] == nil or keyData[3] ~= 13 then
- term.clear()
- term.setCursor(1, 1)
- os.exit()
- end
- term.clear()
- term.setCursor(1, 2)
- gpu.set(1, 1, string.rep("-", w))
- centerY("ЛОГ КРАФТА", 1)
- print("[ATTN] Пожалуйста, не изменяйте содержимое МЭ-сети до завершения процесса крафта!")
- local stats = craft()
- print("")
- print("[INFO] [Stats] Статистика:")
- print("[INFO] [Stats] Всего крафтов: " .. stats.crafted)
- print("[INFO] [Stats] Время крафта: " .. stats.timeStop - stats.timeStart .. "s")
- print("[INFO] [Stats] Очередей всего: " .. stats.maxOrder)
- print("[INFO] [Stats] Длина дерева: " .. stats.treeLen .. "\n")
- gpu.set(1, h - 1, string.rep("-", w))
- centerY("КРАФТ ЗАВЕРШЁН", h - 1)
- term.setCursor(1, h)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement