pepejik

Untitled

Oct 31st, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.96 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.  
  14. -- Хранилище статуса подкрафтов
  15. local subcraftStatus = {}
  16.  
  17. -- Функция для инициации подкрафтов и отслеживания их статуса
  18. local function initiateSubcrafts(itemName, amount)
  19. local craftable = me.getCraftables({label = itemName})[1]
  20. if not craftable then
  21. GUI.alert("Не найден шаблон для крафта " .. itemName)
  22. return false
  23. end
  24.  
  25. -- Разбиваем крафт на подкрафты (до 9 компонентов)
  26. local subcraftsNeeded = math.min(math.ceil(amount / maxBatchSize), maxSubcrafts)
  27. subcraftStatus = {} -- Сбрасываем статус подкрафтов
  28.  
  29. for i = 1, subcraftsNeeded do
  30. local batchAmount = (i == subcraftsNeeded) and (amount % maxBatchSize) or maxBatchSize
  31. local craftRequest = craftable.request(batchAmount)
  32. if not craftRequest then
  33. GUI.alert("Ошибка при запуске подкрафта для " .. itemName)
  34. return false
  35. end
  36. table.insert(subcraftStatus, craftRequest) -- Сохраняем статус подкрафта
  37. GUI.alert("Запущен подкрафт " .. batchAmount .. " x " .. itemName)
  38. end
  39.  
  40. return true
  41. end
  42.  
  43. -- Функция для проверки статуса подкрафтов
  44. local function checkSubcraftsComplete()
  45. for _, request in ipairs(subcraftStatus) do
  46. if not request:isDone() then
  47. if request:isCanceled() then
  48. GUI.alert("Подкрафт отменен!")
  49. return false
  50. end
  51. return false -- Есть незавершенные подкрафты
  52. end
  53. end
  54. return true -- Все подкрафты завершены
  55. end
  56.  
  57. -- Функция для создания основного крафта после завершения подкрафтов
  58. local function craftFinalItem(itemName, amount)
  59. local craftable = me.getCraftables({label = itemName})[1]
  60. if craftable then
  61. local craftRequest = craftable.request(amount)
  62. if craftRequest then
  63. GUI.alert("Запущен крафт основного предмета " .. amount .. " x " .. itemName)
  64. else
  65. GUI.alert("Ошибка при запуске крафта основного предмета " .. itemName)
  66. end
  67. else
  68. GUI.alert("Не найден шаблон для основного крафта " .. itemName)
  69. end
  70. end
  71.  
  72. -- Функция для обработки крафтового запроса пользователя
  73. local function handleCraftRequest(itemName, amount)
  74. GUI.alert("Проверка подкрафтов для: " .. itemName)
  75.  
  76. -- Запускаем подкрафты для компонентов
  77. if initiateSubcrafts(itemName, amount) then
  78. -- Запускаем таймер для проверки завершения подкрафтов
  79. event.timer(1, function()
  80. if checkSubcraftsComplete() then
  81. GUI.alert("Все подкрафты завершены. Запуск основного крафта...")
  82. craftFinalItem(itemName, amount)
  83. else
  84. return true -- Продолжаем проверку, если подкрафты не завершены
  85. end
  86. end, math.huge) -- Таймер с бесконечным количеством повторов
  87. end
  88. end
  89.  
  90. -- Функция для создания окна заказа
  91. local function createOrderWindow()
  92. -- Создаем основное окно
  93. local window = mainContainer:addChild(GUI.window(1, 1, screenWidth, screenHeight))
  94. window:addChild(GUI.panel(1, 1, window.width, window.height, 0x2D2D2D))
  95.  
  96. -- Заголовок окна
  97. window:addChild(GUI.label(1, 2, window.width, 1, 0xFFFFFF, "ME Терминал для крафта"))
  98. :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
  99.  
  100. -- Поле ввода названия предмета
  101. local itemNameInput = window:addChild(GUI.input(2, 5, window.width - 4, 3, 0xFFFFFF, 0x2D2D2D, 0x2D2D2D, 0xCCCCCC, 0x2D2D2D, "", "Название предмета"))
  102.  
  103. -- Поле ввода количества
  104. local amountInput = window:addChild(GUI.input(2, 9, window.width - 4, 3, 0xFFFFFF, 0x2D2D2D, 0x2D2D2D, 0xCCCCCC, 0x2D2D2D, "1", "Количество"))
  105.  
  106. -- Кнопка "Заказать"
  107. window:addChild(GUI.button(10, 13, 20, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Заказать")).onTouch = function()
  108. local itemName = itemNameInput.text
  109. local amount = tonumber(amountInput.text)
  110.  
  111. if itemName ~= "" and amount and amount > 0 then
  112. handleCraftRequest(itemName, amount)
  113. else
  114. GUI.alert("Введите корректные название и количество.")
  115. end
  116. end
  117.  
  118. mainContainer:draw(true)
  119. end
  120.  
  121. -- Автоматически открываем окно заказа при запуске
  122. createOrderWindow()
  123.  
  124. -- Кнопка для закрытия приложения
  125. mainContainer:addChild(GUI.button(screenWidth - 15, 2, 10, 3, 0xAAAAAA, 0x444444, 0x666666, 0xFFFFFF, "Закрыть")).onTouch = function()
  126. mainContainer:stop()
  127. end
  128.  
  129. -- Запуск интерфейса
  130. mainContainer:draw(true)
  131. mainContainer:start()
Advertisement
Add Comment
Please, Sign In to add comment