Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local event = require("event")
- local term = require("term")
- local gpu = component.gpu
- local me = component.me_controller
- -- Цвета для интерфейса в серых тонах
- local colorBackground = 0x1E1E1E -- Темно-серый фон
- local colorText = 0xCCCCCC -- Светло-серый текст
- local colorHighlight = 0x3A3A3A -- Средне-серый для выделения
- local colorHighlightText = 0xFFFFFF -- Белый текст для выделения
- local colorBorder = 0x2B2B2B -- Черный цвет для границы
- local colorTitle = 0xFFFF00 -- Желтый для заголовков
- -- Параметры экрана
- local screenWidth, screenHeight = gpu.getResolution()
- local complexityThreshold = 1000000 -- Порог сложности крафта в байтах (1 миллион)
- -- Шаг прокрутки и количество видимых элементов
- local scrollStep = 1
- local visibleItemsCount = screenHeight - 6 -- Ограничиваем количество видимых строк
- -- Переменные для поиска и фильтрации
- local searchQuery = ""
- local filteredItemList = {}
- -- Устанавливаем цвет фона
- gpu.setBackground(colorBackground)
- term.clear()
- -- Функция для рисования границы вокруг интерфейса
- local function drawBorder()
- gpu.setBackground(colorBorder)
- gpu.fill(1, 1, screenWidth, 1, " ") -- Верхняя граница
- gpu.fill(1, screenHeight, screenWidth, 1, " ") -- Нижняя граница
- gpu.fill(1, 1, 1, screenHeight, " ") -- Левая граница
- gpu.fill(screenWidth, 1, 1, screenHeight, " ") -- Правая граница
- end
- -- Функция для получения списка предметов из МЭ-сети, фильтрации по сложности и сортировки по количеству
- local function getItems()
- local items = me.getCraftables()
- local itemList = {}
- for _, item in ipairs(items) do
- -- Проверка сложности крафта
- local complexity = item.getRequiredMemory and item.getRequiredMemory() or 0
- if complexity > complexityThreshold then
- table.insert(itemList, {
- name = item.getItemStack().label,
- amount = item.getItemStack().size,
- fullName = item.getItemStack().name,
- complexity = complexity
- })
- end
- end
- -- Сортировка по количеству, а затем по сложности (в порядке убывания)
- table.sort(itemList, function(a, b)
- return a.amount > b.amount or (a.amount == b.amount and a.complexity > b.complexity)
- end)
- return itemList
- end
- -- Функция для фильтрации предметов по поисковому запросу
- local function filterItems(itemList, query)
- if query == "" then
- return itemList
- end
- local filtered = {}
- for _, item in ipairs(itemList) do
- if item.name:lower():find(query:lower()) then
- table.insert(filtered, item)
- end
- end
- return filtered
- end
- -- Функция для отображения интерфейса выбора предмета
- local function displayMenu(itemList, selectedIndex, offset)
- term.clear()
- drawBorder()
- -- Заголовок и поле поиска
- gpu.setForeground(colorTitle)
- gpu.setBackground(colorBackground)
- gpu.set(3, 2, "Предметы с высокой сложностью крафта")
- gpu.set(screenWidth - 20, 2, "Поиск: " .. searchQuery)
- -- Отображение только видимых предметов
- for i = 1, visibleItemsCount do
- local itemIndex = i + offset
- if itemIndex > #itemList then break end
- local item = itemList[itemIndex]
- local itemDisplay = item.name .. " (В наличии: " .. item.amount .. ", Сложность: " .. item.complexity .. ")"
- if itemIndex == selectedIndex then
- gpu.setBackground(colorHighlight)
- gpu.setForeground(colorHighlightText)
- gpu.set(3, i + 2, "> " .. itemDisplay)
- else
- gpu.setBackground(colorBackground)
- gpu.setForeground(colorText)
- gpu.set(3, i + 2, " " .. itemDisplay)
- end
- end
- -- Подсказки
- gpu.setForeground(colorText)
- gpu.setBackground(colorBackground)
- gpu.set(3, screenHeight - 1, "Используйте +/- для изменения количества. Enter для выбора. Q для выхода.")
- end
- -- Остальные функции остаются без изменений...
- local function displayAmountSelection(item, itemList)
- displayTop10CraftComponents(item.fullName) -- Отображаем топ-10 компонентов перед выбором количества
- term.clear()
- drawBorder()
- local amount = 1
- while true do
- gpu.setForeground(colorTitle)
- gpu.setBackground(colorBackground)
- gpu.set(3, 2, "Выберите количество для крафта: " .. item.name)
- -- Отображение выбранного количества
- gpu.setForeground(colorHighlightText)
- gpu.setBackground(colorHighlight)
- gpu.fill(3, 4, screenWidth - 6, 1, " ")
- gpu.set(3, 4, "Количество: " .. amount)
- gpu.setForeground(colorText)
- gpu.setBackground(colorBackground)
- gpu.set(3, screenHeight - 2, "Используйте +/- для изменения. Enter для крафта. Esc для отмены.")
- -- Обработка событий
- local _, _, _, key_code = event.pull("key_down")
- if key_code == 13 then -- '+'
- amount = amount + 1
- elseif key_code == 12 and amount > 1 then -- '-'
- amount = amount - 1
- elseif key_code == 28 then -- Enter
- return amount
- elseif key_code == 1 then -- Esc
- return nil
- end
- end
- end
- -- Основная функция для запуска GUI приложения
- local function runApp()
- local itemList = getItems()
- filteredItemList = filterItems(itemList, searchQuery)
- local selectedIndex = 1
- local offset = 0 -- Смещение для прокрутки списка
- displayMenu(filteredItemList, selectedIndex, offset)
- while true do
- local _, _, _, key_code = event.pull("key_down")
- if key_code == 200 then -- Стрелка вверх
- if selectedIndex > 1 then
- selectedIndex = selectedIndex - 1
- if selectedIndex < offset + 1 then
- offset = offset - scrollStep
- end
- end
- elseif key_code == 208 then -- Стрелка вниз
- if selectedIndex < #filteredItemList then
- selectedIndex = selectedIndex + 1
- if selectedIndex > offset + visibleItemsCount then
- offset = offset + scrollStep
- end
- end
- elseif key_code == 13 then -- '+' для поиска
- term.clear()
- term.setCursor(screenWidth - 20, 2)
- searchQuery = term.read() or ""
- filteredItemList = filterItems(itemList, searchQuery)
- selectedIndex = 1
- offset = 0
- displayMenu(filteredItemList, selectedIndex, offset)
- elseif key_code == 28 then -- Enter для выбора предмета
- local selectedItem = filteredItemList[selectedIndex]
- local amount = displayAmountSelection(selectedItem, itemList)
- if amount then
- requestCraft(selectedItem.fullName, amount)
- end
- itemList = getItems() -- Обновляем список после крафта
- filteredItemList = filterItems(itemList, searchQuery)
- selectedIndex = 1
- offset = 0
- elseif key_code == 16 then -- Q для выхода
- term.clear()
- print("Выход из программы.")
- break
- end
- displayMenu(filteredItemList, selectedIndex, offset)
- end
- end
- -- Запуск приложения
- runApp()
Advertisement
Add Comment
Please, Sign In to add comment