pepejik

Untitled

Oct 30th, 2024
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.56 KB | None | 0 0
  1. local component = require("component")
  2. local event = require("event")
  3. local term = require("term")
  4. local gpu = component.gpu
  5. local me = component.me_controller
  6.  
  7. -- Цвета для интерфейса в серых тонах
  8. local colorBackground = 0x1E1E1E -- Темно-серый фон
  9. local colorText = 0xCCCCCC -- Светло-серый текст
  10. local colorHighlight = 0x3A3A3A -- Средне-серый для выделения
  11. local colorHighlightText = 0xFFFFFF -- Белый текст для выделения
  12. local colorBorder = 0x2B2B2B -- Черный цвет для границы
  13. local colorTitle = 0xFFFF00 -- Желтый для заголовков
  14.  
  15. -- Параметры экрана
  16. local screenWidth, screenHeight = gpu.getResolution()
  17. local complexityThreshold = 1000000 -- Порог сложности крафта в байтах (1 миллион)
  18.  
  19. -- Шаг прокрутки и количество видимых элементов
  20. local scrollStep = 1
  21. local visibleItemsCount = screenHeight - 6 -- Ограничиваем количество видимых строк
  22.  
  23. -- Переменные для поиска и фильтрации
  24. local searchQuery = ""
  25. local filteredItemList = {}
  26.  
  27. -- Устанавливаем цвет фона
  28. gpu.setBackground(colorBackground)
  29. term.clear()
  30.  
  31. -- Функция для рисования границы вокруг интерфейса
  32. local function drawBorder()
  33. gpu.setBackground(colorBorder)
  34. gpu.fill(1, 1, screenWidth, 1, " ") -- Верхняя граница
  35. gpu.fill(1, screenHeight, screenWidth, 1, " ") -- Нижняя граница
  36. gpu.fill(1, 1, 1, screenHeight, " ") -- Левая граница
  37. gpu.fill(screenWidth, 1, 1, screenHeight, " ") -- Правая граница
  38. end
  39.  
  40. -- Функция для получения списка предметов из МЭ-сети, фильтрации по сложности и сортировки по количеству
  41. local function getItems()
  42. local items = me.getCraftables()
  43. local itemList = {}
  44.  
  45. for _, item in ipairs(items) do
  46. -- Проверка сложности крафта
  47. local complexity = item.getRequiredMemory and item.getRequiredMemory() or 0
  48. if complexity > complexityThreshold then
  49. table.insert(itemList, {
  50. name = item.getItemStack().label,
  51. amount = item.getItemStack().size,
  52. fullName = item.getItemStack().name,
  53. complexity = complexity
  54. })
  55. end
  56. end
  57.  
  58. -- Сортировка по количеству, а затем по сложности (в порядке убывания)
  59. table.sort(itemList, function(a, b)
  60. return a.amount > b.amount or (a.amount == b.amount and a.complexity > b.complexity)
  61. end)
  62.  
  63. return itemList
  64. end
  65.  
  66. -- Функция для фильтрации предметов по поисковому запросу
  67. local function filterItems(itemList, query)
  68. if query == "" then
  69. return itemList
  70. end
  71. local filtered = {}
  72. for _, item in ipairs(itemList) do
  73. if item.name:lower():find(query:lower()) then
  74. table.insert(filtered, item)
  75. end
  76. end
  77. return filtered
  78. end
  79.  
  80.  
  81. -- Функция для отображения интерфейса выбора предмета
  82. local function displayMenu(itemList, selectedIndex, offset)
  83. term.clear()
  84. drawBorder()
  85.  
  86. -- Заголовок и поле поиска
  87. gpu.setForeground(colorTitle)
  88. gpu.setBackground(colorBackground)
  89. gpu.set(3, 2, "Предметы с высокой сложностью крафта")
  90. gpu.set(screenWidth - 20, 2, "Поиск: " .. searchQuery)
  91.  
  92. -- Отображение только видимых предметов
  93. for i = 1, visibleItemsCount do
  94. local itemIndex = i + offset
  95. if itemIndex > #itemList then break end
  96.  
  97. local item = itemList[itemIndex]
  98. local itemDisplay = item.name .. " (В наличии: " .. item.amount .. ", Сложность: " .. item.complexity .. ")"
  99.  
  100. if itemIndex == selectedIndex then
  101. gpu.setBackground(colorHighlight)
  102. gpu.setForeground(colorHighlightText)
  103. gpu.set(3, i + 2, "> " .. itemDisplay)
  104. else
  105. gpu.setBackground(colorBackground)
  106. gpu.setForeground(colorText)
  107. gpu.set(3, i + 2, " " .. itemDisplay)
  108. end
  109. end
  110.  
  111. -- Подсказки
  112. gpu.setForeground(colorText)
  113. gpu.setBackground(colorBackground)
  114. gpu.set(3, screenHeight - 1, "Используйте +/- для изменения количества. Enter для выбора. Q для выхода.")
  115. end
  116.  
  117. -- Остальные функции остаются без изменений...
  118. local function displayAmountSelection(item, itemList)
  119. displayTop10CraftComponents(item.fullName) -- Отображаем топ-10 компонентов перед выбором количества
  120. term.clear()
  121. drawBorder()
  122. local amount = 1
  123.  
  124. while true do
  125. gpu.setForeground(colorTitle)
  126. gpu.setBackground(colorBackground)
  127. gpu.set(3, 2, "Выберите количество для крафта: " .. item.name)
  128.  
  129. -- Отображение выбранного количества
  130. gpu.setForeground(colorHighlightText)
  131. gpu.setBackground(colorHighlight)
  132. gpu.fill(3, 4, screenWidth - 6, 1, " ")
  133. gpu.set(3, 4, "Количество: " .. amount)
  134.  
  135. gpu.setForeground(colorText)
  136. gpu.setBackground(colorBackground)
  137. gpu.set(3, screenHeight - 2, "Используйте +/- для изменения. Enter для крафта. Esc для отмены.")
  138.  
  139. -- Обработка событий
  140. local _, _, _, key_code = event.pull("key_down")
  141. if key_code == 13 then -- '+'
  142. amount = amount + 1
  143. elseif key_code == 12 and amount > 1 then -- '-'
  144. amount = amount - 1
  145. elseif key_code == 28 then -- Enter
  146. return amount
  147. elseif key_code == 1 then -- Esc
  148. return nil
  149. end
  150. end
  151. end
  152. -- Основная функция для запуска GUI приложения
  153. local function runApp()
  154. local itemList = getItems()
  155. filteredItemList = filterItems(itemList, searchQuery)
  156. local selectedIndex = 1
  157. local offset = 0 -- Смещение для прокрутки списка
  158. displayMenu(filteredItemList, selectedIndex, offset)
  159.  
  160. while true do
  161. local _, _, _, key_code = event.pull("key_down")
  162.  
  163. if key_code == 200 then -- Стрелка вверх
  164. if selectedIndex > 1 then
  165. selectedIndex = selectedIndex - 1
  166. if selectedIndex < offset + 1 then
  167. offset = offset - scrollStep
  168. end
  169. end
  170. elseif key_code == 208 then -- Стрелка вниз
  171. if selectedIndex < #filteredItemList then
  172. selectedIndex = selectedIndex + 1
  173. if selectedIndex > offset + visibleItemsCount then
  174. offset = offset + scrollStep
  175. end
  176. end
  177. elseif key_code == 13 then -- '+' для поиска
  178. term.clear()
  179. term.setCursor(screenWidth - 20, 2)
  180. searchQuery = term.read() or ""
  181. filteredItemList = filterItems(itemList, searchQuery)
  182. selectedIndex = 1
  183. offset = 0
  184. displayMenu(filteredItemList, selectedIndex, offset)
  185. elseif key_code == 28 then -- Enter для выбора предмета
  186. local selectedItem = filteredItemList[selectedIndex]
  187. local amount = displayAmountSelection(selectedItem, itemList)
  188. if amount then
  189. requestCraft(selectedItem.fullName, amount)
  190. end
  191. itemList = getItems() -- Обновляем список после крафта
  192. filteredItemList = filterItems(itemList, searchQuery)
  193. selectedIndex = 1
  194. offset = 0
  195. elseif key_code == 16 then -- Q для выхода
  196. term.clear()
  197. print("Выход из программы.")
  198. break
  199. end
  200.  
  201. displayMenu(filteredItemList, selectedIndex, offset)
  202. end
  203. end
  204.  
  205. -- Запуск приложения
  206. runApp()
  207.  
Advertisement
Add Comment
Please, Sign In to add comment