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 selectedItem = nil -- Выбранный предмет для крафта
- -- Хранилище статуса подкрафтов
- local subcraftStatus = {}
- -- Функция для получения списка всех доступных крафтовых предметов, содержащих "panel" в названии
- local function fetchCraftables()
- local items = me.getCraftables()
- local itemListData = {}
- for _, item in ipairs(items) do
- local itemName = item.getItemStack().label:lower() -- Приводим к нижнему регистру для поиска
- if itemName:find("panel") then -- Проверяем, содержит ли имя слово "panel"
- table.insert(itemListData, {
- name = item.getItemStack().label,
- fullName = item.getItemStack().name,
- amount = item.getItemStack().size,
- })
- end
- end
- return itemListData
- end
- -- Функция для инициации подкрафтов и отслеживания их статуса
- local function initiateSubcrafts(itemName, amount)
- local craftable = me.getCraftables({name = 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({name = 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(amount)
- if selectedItem then
- GUI.alert("Проверка подкрафтов для: " .. selectedItem.name)
- -- Запускаем подкрафты для компонентов
- if initiateSubcrafts(selectedItem.fullName, amount) then
- -- Запускаем таймер для проверки завершения подкрафтов
- event.timer(1, function()
- if checkSubcraftsComplete() then
- GUI.alert("Все подкрафты завершены. Запуск основного крафта...")
- craftFinalItem(selectedItem.fullName, amount)
- else
- return true -- Продолжаем проверку, если подкрафты не завершены
- end
- end, math.huge) -- Таймер с бесконечным количеством повторов
- end
- else
- GUI.alert("Выберите предмет для крафта.")
- end
- end
- -- Функция для создания окна с выбором предмета
- local function createItemSelectionWindow()
- -- Загружаем доступные для крафта предметы с названием "panel"
- local items = fetchCraftables()
- -- Создаем окно выбора предмета
- 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, "Выберите предмет для крафта"))
- :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
- -- Список предметов
- local itemList = window:addChild(GUI.list(2, 5, window.width - 4, window.height - 10, 3, 0, 0x3C3C3C, 0xFFFFFF, 0x555555, 0xFFFFFF, 0xAAAAAA, 0xFFFFFF))
- -- Добавляем предметы в список
- for _, item in ipairs(items) do
- local itemText = item.name .. " (в наличии: " .. item.amount .. ")"
- itemList:addItem(itemText).onTouch = function()
- selectedItem = item -- Устанавливаем выбранный предмет
- GUI.alert("Вы выбрали: " .. item.name)
- window:remove()
- createOrderWindow() -- Открываем окно заказа
- end
- end
- mainContainer:draw(true)
- 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 selectedItemLabel = window:addChild(GUI.label(2, 5, window.width - 4, 1, 0xFFFFFF, "Предмет: " .. (selectedItem and selectedItem.name or "не выбран")))
- selectedItemLabel:setAlignment(GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP)
- -- Поле ввода количества
- local amountInput = window:addChild(GUI.input(2, 8, window.width - 4, 3, 0xFFFFFF, 0x2D2D2D, 0x2D2D2D, 0xCCCCCC, 0x2D2D2D, "1", "Количество"))
- -- Кнопка "Заказать"
- window:addChild(GUI.button(10, 12, 20, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Заказать")).onTouch = function()
- local amount = tonumber(amountInput.text)
- if selectedItem and amount and amount > 0 then
- handleCraftRequest(amount)
- else
- GUI.alert("Введите корректное количество и выберите предмет.")
- end
- end
- mainContainer:draw(true)
- end
- -- Автоматически открываем окно выбора предмета при запуске
- createItemSelectionWindow()
- -- Кнопка для закрытия приложения
- 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