Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local GUI = require("GUI")
- local event = require("event")
- local me = component.me_controller
- -- Основное приложение GUI
- local mainContainer = GUI.application()
- local screenWidth, screenHeight = mainContainer.width, mainContainer.height
- -- Параметры крафта
- local maxSubcrafts = 9
- local maxBatchSize = 64 -- Максимальное количество предметов на один подкрафт
- -- Хранилище статуса подкрафтов
- local subcraftStatus = {}
- -- Функция для инициации подкрафтов и отслеживания их статуса
- local function initiateSubcrafts(itemName, amount)
- local craftable = me.getCraftables({label = itemName})[1]
- if not craftable then
- GUI.alert("Не найден шаблон для крафта " .. itemName)
- return false
- end
- -- Разбиваем крафт на подкрафты (до 9 компонентов)
- local subcraftsNeeded = math.min(math.ceil(amount / maxBatchSize), maxSubcrafts)
- subcraftStatus = {} -- Сбрасываем статус подкрафтов
- for i = 1, subcraftsNeeded do
- local batchAmount = (i == subcraftsNeeded) and (amount % maxBatchSize) or maxBatchSize
- local craftRequest = craftable.request(batchAmount)
- if not craftRequest then
- GUI.alert("Ошибка при запуске подкрафта для " .. itemName)
- return false
- end
- table.insert(subcraftStatus, craftRequest) -- Сохраняем статус подкрафта
- GUI.alert("Запущен подкрафт " .. batchAmount .. " x " .. itemName)
- end
- return true
- end
- -- Функция для проверки статуса подкрафтов
- local function checkSubcraftsComplete()
- for _, request in ipairs(subcraftStatus) do
- if not request:isDone() then
- if request:isCanceled() then
- GUI.alert("Подкрафт отменен!")
- return false
- end
- return false -- Есть незавершенные подкрафты
- end
- end
- return true -- Все подкрафты завершены
- end
- -- Функция для создания основного крафта после завершения подкрафтов
- local function craftFinalItem(itemName, amount)
- local craftable = me.getCraftables({label = itemName})[1]
- if craftable then
- local craftRequest = craftable.request(amount)
- if craftRequest then
- GUI.alert("Запущен крафт основного предмета " .. amount .. " x " .. itemName)
- else
- GUI.alert("Ошибка при запуске крафта основного предмета " .. itemName)
- end
- else
- GUI.alert("Не найден шаблон для основного крафта " .. itemName)
- end
- end
- -- Функция для обработки крафтового запроса пользователя
- local function handleCraftRequest(itemName, amount)
- GUI.alert("Проверка подкрафтов для: " .. itemName)
- -- Запускаем подкрафты для компонентов
- if initiateSubcrafts(itemName, amount) then
- -- Запускаем таймер для проверки завершения подкрафтов
- event.timer(1, function()
- if checkSubcraftsComplete() then
- GUI.alert("Все подкрафты завершены. Запуск основного крафта...")
- craftFinalItem(itemName, amount)
- else
- return true -- Продолжаем проверку, если подкрафты не завершены
- end
- end, math.huge) -- Таймер с бесконечным количеством повторов
- end
- end
- -- Функция для создания окна заказа
- local function createOrderWindow()
- -- Создаем основное окно
- local window = mainContainer:addChild(GUI.window(1, 1, screenWidth, screenHeight))
- window:addChild(GUI.panel(1, 1, window.width, window.height, 0x2D2D2D))
- -- Заголовок окна
- window:addChild(GUI.label(1, 2, window.width, 1, 0xFFFFFF, "ME Терминал для крафта"))
- :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
- -- Поле ввода названия предмета
- local itemNameInput = window:addChild(GUI.input(2, 5, window.width - 4, 3, 0xFFFFFF, 0x2D2D2D, 0x2D2D2D, 0xCCCCCC, 0x2D2D2D, "", "Название предмета"))
- -- Поле ввода количества
- local amountInput = window:addChild(GUI.input(2, 9, window.width - 4, 3, 0xFFFFFF, 0x2D2D2D, 0x2D2D2D, 0xCCCCCC, 0x2D2D2D, "1", "Количество"))
- -- Кнопка "Заказать"
- window:addChild(GUI.button(10, 13, 20, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Заказать")).onTouch = function()
- local itemName = itemNameInput.text
- local amount = tonumber(amountInput.text)
- if itemName ~= "" and amount and amount > 0 then
- handleCraftRequest(itemName, amount)
- else
- GUI.alert("Введите корректные название и количество.")
- end
- end
- mainContainer:draw(true)
- end
- -- Автоматически открываем окно заказа при запуске
- createOrderWindow()
- -- Кнопка для закрытия приложения
- mainContainer:addChild(GUI.button(screenWidth - 15, 2, 10, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Закрыть")).onTouch = function()
- mainContainer:stop()
- end
- -- Запуск интерфейса
- mainContainer:draw(true)
- mainContainer:start()
Advertisement
Add Comment
Please, Sign In to add comment