pepejik

Untitled

Oct 31st, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.63 KB | None | 0 0
  1. local component = require("component")
  2. local GUI = require("GUI")
  3. local event = require("event")
  4. local me = component.me_controller
  5.  
  6. -- Основное приложение GUI
  7. local mainContainer = GUI.application()
  8. local screenWidth, screenHeight = mainContainer.width, mainContainer.height
  9.  
  10. -- Параметры крафта
  11. local maxSubcrafts = 9
  12. local maxBatchSize = 64 -- Максимальное количество предметов на один подкрафт
  13. local selectedItem = nil -- Выбранный предмет для крафта
  14.  
  15. -- Хранилище статуса подкрафтов
  16. local subcraftStatus = {}
  17.  
  18. -- Функция для получения списка всех доступных крафтовых предметов, содержащих "panel" в названии
  19. local function fetchCraftables()
  20. local items = me.getCraftables()
  21. local itemListData = {}
  22.  
  23. for _, item in ipairs(items) do
  24. local itemName = item.getItemStack().label:lower() -- Приводим к нижнему регистру для поиска
  25. if itemName:find("panel") then -- Проверяем, содержит ли имя слово "panel"
  26. table.insert(itemListData, {
  27. name = item.getItemStack().label,
  28. fullName = item.getItemStack().name,
  29. amount = item.getItemStack().size,
  30. })
  31. end
  32. end
  33.  
  34. return itemListData
  35. end
  36.  
  37. -- Функция для инициации подкрафтов и отслеживания их статуса
  38. local function initiateSubcrafts(itemName, amount)
  39. local craftable = me.getCraftables({name = itemName})[1]
  40. if not craftable then
  41. GUI.alert("Не найден шаблон для крафта " .. itemName)
  42. return false
  43. end
  44.  
  45. -- Разбиваем крафт на подкрафты (до 9 компонентов)
  46. local subcraftsNeeded = math.min(math.ceil(amount / maxBatchSize), maxSubcrafts)
  47. subcraftStatus = {} -- Сбрасываем статус подкрафтов
  48.  
  49. for i = 1, subcraftsNeeded do
  50. local batchAmount = (i == subcraftsNeeded) and (amount % maxBatchSize) or maxBatchSize
  51. local craftRequest = craftable.request(batchAmount)
  52. if not craftRequest then
  53. GUI.alert("Ошибка при запуске подкрафта для " .. itemName)
  54. return false
  55. end
  56. table.insert(subcraftStatus, craftRequest) -- Сохраняем статус подкрафта
  57. GUI.alert("Запущен подкрафт " .. batchAmount .. " x " .. itemName)
  58. end
  59.  
  60. return true
  61. end
  62.  
  63. -- Функция для проверки статуса подкрафтов
  64. local function checkSubcraftsComplete()
  65. for _, request in ipairs(subcraftStatus) do
  66. if not request:isDone() then
  67. if request:isCanceled() then
  68. GUI.alert("Подкрафт отменен!")
  69. return false
  70. end
  71. return false -- Есть незавершенные подкрафты
  72. end
  73. end
  74. return true -- Все подкрафты завершены
  75. end
  76.  
  77. -- Функция для создания основного крафта после завершения подкрафтов
  78. local function craftFinalItem(itemName, amount)
  79. local craftable = me.getCraftables({name = itemName})[1]
  80. if craftable then
  81. local craftRequest = craftable.request(amount)
  82. if craftRequest then
  83. GUI.alert("Запущен крафт основного предмета " .. amount .. " x " .. itemName)
  84. else
  85. GUI.alert("Ошибка при запуске крафта основного предмета " .. itemName)
  86. end
  87. else
  88. GUI.alert("Не найден шаблон для основного крафта " .. itemName)
  89. end
  90. end
  91.  
  92. -- Функция для обработки крафтового запроса пользователя
  93. local function handleCraftRequest(amount)
  94. if selectedItem then
  95. GUI.alert("Проверка подкрафтов для: " .. selectedItem.name)
  96. -- Запускаем подкрафты для компонентов
  97. if initiateSubcrafts(selectedItem.fullName, amount) then
  98. -- Запускаем таймер для проверки завершения подкрафтов
  99. event.timer(1, function()
  100. if checkSubcraftsComplete() then
  101. GUI.alert("Все подкрафты завершены. Запуск основного крафта...")
  102. craftFinalItem(selectedItem.fullName, amount)
  103. else
  104. return true -- Продолжаем проверку, если подкрафты не завершены
  105. end
  106. end, math.huge) -- Таймер с бесконечным количеством повторов
  107. end
  108. else
  109. GUI.alert("Выберите предмет для крафта.")
  110. end
  111. end
  112.  
  113. -- Функция для создания окна с выбором предмета
  114. local function createItemSelectionWindow()
  115. -- Загружаем доступные для крафта предметы с названием "panel"
  116. local items = fetchCraftables()
  117.  
  118. -- Создаем окно выбора предмета
  119. local window = mainContainer:addChild(GUI.window(1, 1, screenWidth, screenHeight))
  120. window:addChild(GUI.panel(1, 1, window.width, window.height, 0x2D2D2D))
  121.  
  122. -- Заголовок окна
  123. window:addChild(GUI.label(1, 2, window.width, 1, 0xFFFFFF, "Выберите предмет для крафта"))
  124. :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
  125.  
  126. -- Список предметов
  127. local itemList = window:addChild(GUI.list(2, 5, window.width - 4, window.height - 10, 3, 0, 0x3C3C3C, 0xFFFFFF, 0x555555, 0xFFFFFF, 0xAAAAAA, 0xFFFFFF))
  128.  
  129. -- Добавляем предметы в список
  130. for _, item in ipairs(items) do
  131. local itemText = item.name .. " (в наличии: " .. item.amount .. ")"
  132. itemList:addItem(itemText).onTouch = function()
  133. selectedItem = item -- Устанавливаем выбранный предмет
  134. GUI.alert("Вы выбрали: " .. item.name)
  135. window:remove()
  136. createOrderWindow() -- Открываем окно заказа
  137. end
  138. end
  139.  
  140. mainContainer:draw(true)
  141. end
  142.  
  143. -- Функция для создания окна заказа
  144. local function createOrderWindow()
  145. -- Создаем основное окно
  146. local window = mainContainer:addChild(GUI.window(1, 1, screenWidth, screenHeight))
  147. window:addChild(GUI.panel(1, 1, window.width, window.height, 0x2D2D2D))
  148.  
  149. -- Заголовок окна
  150. window:addChild(GUI.label(1, 2, window.width, 1, 0xFFFFFF, "ME Терминал для крафта"))
  151. :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
  152.  
  153. -- Поле для отображения выбранного предмета
  154. local selectedItemLabel = window:addChild(GUI.label(2, 5, window.width - 4, 1, 0xFFFFFF, "Предмет: " .. (selectedItem and selectedItem.name or "не выбран")))
  155. selectedItemLabel:setAlignment(GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP)
  156.  
  157. -- Поле ввода количества
  158. local amountInput = window:addChild(GUI.input(2, 8, window.width - 4, 3, 0xFFFFFF, 0x2D2D2D, 0x2D2D2D, 0xCCCCCC, 0x2D2D2D, "1", "Количество"))
  159.  
  160. -- Кнопка "Заказать"
  161. window:addChild(GUI.button(10, 12, 20, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Заказать")).onTouch = function()
  162. local amount = tonumber(amountInput.text)
  163.  
  164. if selectedItem and amount and amount > 0 then
  165. handleCraftRequest(amount)
  166. else
  167. GUI.alert("Введите корректное количество и выберите предмет.")
  168. end
  169. end
  170.  
  171. mainContainer:draw(true)
  172. end
  173.  
  174. -- Автоматически открываем окно выбора предмета при запуске
  175. createItemSelectionWindow()
  176.  
  177. -- Кнопка для закрытия приложения
  178. mainContainer:addChild(GUI.button(screenWidth - 15, 2, 10, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Закрыть")).onTouch = function()
  179. mainContainer:stop()
  180. end
  181.  
  182. -- Запуск интерфейса
  183. mainContainer:draw(true)
  184. mainContainer:start()
Advertisement
Add Comment
Please, Sign In to add comment