Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Определение списка руд с их параметрами
- local items = { -- множитель, название руды, забираем руду, dmg, отдаём слиток, dmg, название слитка, ore_dictionary
- {"3","Дракониевая руда","DraconicEvolution:draconiumOre","0","DraconicEvolution:draconiumDust","0","Дракониевая пыль","dustDraconium"},
- {"2","Алмазная руда","minecraft:diamond_ore","0","minecraft:diamond","0","Алмаз","gemDiamond"},
- {"2","Изумрудная руда","minecraft:emerald_ore","0","minecraft:emerald","0","Изумруд","gemEmerald"},
- {"2","Золотая руда","minecraft:gold_ore","0","minecraft:gold_ingot","0","Золотой слиток","ingotGold"},
- {"2","Железная руда","minecraft:iron_ore","0","minecraft:iron_ingot","0","Железный слиток","ingotIron"},
- {"2","IC2 Медная руда","IC2:blockOreCopper","0","IC2:itemIngot","0","Медный слиток","ingotCopper"},
- {"2","IC2 Оловянная руда","IC2:blockOreTin","0","IC2:itemIngot","1","Оловянный слиток","ingotTin"},
- {"2","IC2 Свинцовая руда","IC2:blockOreLead","0","IC2:itemIngot","5","Свинцовый слиток","ingotLead"},
- {"2","TE Медная руда","ThermalFoundation:Ore","0","ThermalFoundation:material","64","Медный слиток","ingotCopper"},
- {"2","TE Оловянная руда","ThermalFoundation:Ore","1","ThermalFoundation:material","65","Оловянный слиток","ingotTin"},
- {"2","TE Никелевая руда","ThermalFoundation:Ore","4","ThermalFoundation:material","68","Никелевый слиток","ingotNickel"},
- {"2","TE Серебряная руда","ThermalFoundation:Ore","2","ThermalFoundation:material","66","Серебряный слиток","ingotSilver"},
- {"2","TE Платиновая руда","ThermalFoundation:Ore","5","ThermalFoundation:material","69","Платиновый слиток","ingotPlatinum"},
- {"2","Руда истинного кварца","appliedenergistics2:tile.OreQuartz","0","appliedenergistics2:item.ItemMultiMaterial","0","Истинный кварц","crystalCertusQuartz"},
- {"3","Кварцевая руда","minecraft:quartz_ore","0","minecraft:quartz","0","Кварц","gemQuartz"},
- {"8","Лазуритовая руда","minecraft:lapis_ore","0","minecraft:dye","4","Лазурит","dye"},
- {"8","Красная руда","minecraft:redstone_ore","0","minecraft:redstone","0","Красная пыль","dustRedstone"},
- {"2","Угольная руда","minecraft:coal_ore","0","minecraft:coal","0","Уголь","coal"}
- }
- -- Подключение необходимых библиотек
- local unicode = require("unicode")
- local com = require("component")
- local event = require("event")
- local interface = com.isAvailable("me_interface") and com.me_interface or error("нет ме интерфейса")
- local db = com.isAvailable("database") and com.database or error("нет базы данных")
- local chest = com.isAvailable("chest") and com.chest or error("нет сундука")
- local size = chest.getInventorySize()
- local gpu = com.gpu
- local w, h = gpu.getResolution()
- local net_count,line_count = 0,0
- local last_update_time = os.time() -- Время последнего обновления
- local cached_network = nil -- Кэшированные данные о ресурсах
- -- Функция для склонения слов в зависимости от числа
- local function declension(number)
- local dec = ""
- local rest = number % 10
- local str = string.sub(number,string.len(number)-1)
- if str == "11" or str == "12" or str == "13" or str == "14" then
- dec = " слитков"
- elseif rest == 1 then
- dec = " слиток"
- elseif rest == 2 or rest == 3 or rest == 4 then
- dec = " слитка"
- else
- dec = " слитков"
- end
- return number..dec
- end
- -- Функция для центрирования текста на экране
- local function center(coord,text,color)
- gpu.setForeground(color)
- local text_len = unicode.len(text)
- local start_pos = math.floor((w - text_len) / 2)
- gpu.set(start_pos, coord, text)
- end
- -- Функция для вывода цветного текста на экран
- local function color_text(w,line,text,color)
- gpu.setForeground(color)
- gpu.set(w,line,text)
- end
- -- Функция для вывода информации о доступных ресурсах
- local function print_items()
- local line,size,fill = 3,0,true
- local network = cached_network or interface.getItemsInNetwork()
- if #network ~= net_count then
- if fill then
- gpu.fill(1,3,w,h-4," ") -- Очистка экрана перед выводом информации, оставляя место для заголовка и кнопок
- fill = not fill
- end
- end
- gpu.fill(1,1,w,1," ") -- Очистка первой строки
- center(1, "Доступные ресурсы", 0x99CCFF) -- Заголовок
- color_text(3, 2, string.rep("─", 76), 0x009999) -- Разделительная линия
- for ind = 1,#items do
- for net = 1,#network do
- if network[net].name == items[ind][5] then
- if network[net].damage == tonumber(items[ind][6]) then
- if network[net].size >= tonumber(items[ind][1]) then
- if #network ~= net_count then
- if fill then
- fill = not fill
- end
- color_text(5,line,items[ind][2],0xFF9900) -- Вывод названия руды
- color_text(28,line,"1",0x3399FF) -- Вывод количества руды
- color_text(30,line,"-->",0xFF0000) -- Вывод стрелки
- color_text(34,line,"X "..items[ind][1],0x3399FF) -- Вывод множителя
- color_text(42,line,items[ind][7],0xFF9900) -- Вывод названия слитка
- color_text(63,line,"доступно",FF9900) -- Вывод текста "доступно"
- color_text(73,line,tostring(network[net].size),0x3399FF) -- Вывод количества доступных слитков
- --color_text(3,line+1,string.rep("─",76),0xFFFFFF) -- Вывод разделительной линии
- size = size + network[net].size -- Увеличение общего количества доступных слитков
- else
- size = size + network[net].size -- Увеличение общего количества доступных слитков
- color_text(73,line,tostring(network[net].size.." "),0x3399FF) -- Вывод количества доступных слитков с пробелами
- end
- line = line + 2 -- Переход на следующую строку
- end
- end
- end
- end
- end
- net_count = #network
- if line == 3 or line ~= line_count then
- net_count = 0
- end
- line_count = line
- if size > 0 then
- center(line_count+2,"Обмен ресурсов. Всего доступно "..declension(size),0x00CCFF) -- Вывод общего количества доступных слитков
- else
- center(h/2,"Обменник ресурсов пустой",0xFF0000) -- Вывод сообщения, если нет доступных ресурсов
- end
- end
- -- Функция для отправки предметов в сеть
- local function pushItem(name,count,label)
- db.clear(1)
- interface.store(name,db.address,1)
- interface.setInterfaceConfiguration(1,db.address,1,64)
- local drop = 0
- while true do
- if drop == count then
- interface.setInterfaceConfiguration(1,db.address,1,0)
- net_count = 0
- break
- else
- local dropcount = interface.pushItem("UP",1,count-drop)
- drop = drop + dropcount
- if dropcount == 0 then
- center(h/2,"освободите место в сундуке",0xFF0000) -- Вывод сообщения о необходимости освободить место в сундуке
- center(h/2+2,"Ожидаю выдать "..label,0xFFFFFF) -- Вывод ожидания выдачи предмета
- center(h/2+4,"всего "..count-drop,0xFFFFFF) -- Вывод общего количества предметов для выдачи
- os.sleep(1)
- end
- end
- end
- end
- -- Функция для обмена руды на слитки
- local function exchange_ore_dict()
- local ore_dict,item_count = "",false
- local data = chest.getAllStacks(0)
- for slot = 1,size do
- if data[slot] then
- for ind = 1,#items do
- if data[slot].id == items[ind][3] then
- if data[slot].dmg == tonumber(items[ind][4]) then
- ore_dict = items[ind][8]
- break
- end
- end
- end
- local network = cached_network or interface.getItemsInNetwork()
- for ind2 = 1,#items do
- if ore_dict == items[ind2][8] then
- local ore = items[ind2][5]
- local dmg = items[ind2][6]
- local ore_name = items[ind2][2]
- for net = 1,#network do
- if network[net].name == ore then
- if network[net].damage == tonumber(dmg) then
- if network[net].size >= tonumber(items[ind2][1]) then
- item_count = chest.pushItem("DOWN",slot,(network[net].size/items[ind2][1]))
- local drop_count = item_count*items[ind2][1]
- local ingot_name = items[ind2][7]
- center(1,"Меняю "..item_count.." "..ore_name.." на "..drop_count.." "..ingot_name,0xFFFFFF) -- Вывод сообщения о обмене руды на слитки
- pushItem({name = ore,damage = tonumber(dmg)},drop_count,ingot_name)
- break
- end
- end
- end
- end
- if item_count then
- item_count = false
- ore_dict = ""
- break
- end
- end
- end
- end
- end
- -- Обновление экрана после обмена
- print_items()
- end
- -- Функция для отображения кнопок
- local function draw_buttons()
- local button_y = h - 2
- gpu.setForeground(0x006633)
- gpu.set(40, button_y, "⬤")
- gpu.setForeground(0xFFFFFF)
- gpu.set(42, button_y, " Edit")
- gpu.setForeground(0x0066CC)
- gpu.set(55, button_y, "⬤")
- gpu.setForeground(0xFFFFFF)
- gpu.set(57, button_y, " Reboot")
- gpu.setForeground(0x990000)
- gpu.set(70, button_y, "⬤")
- gpu.setForeground(0xFFFFFF)
- gpu.set(72, button_y, " Exit")
- end
- -- Основной цикл программы
- gpu.fill(1,1,w,h," ")
- gpu.setResolution(80,h)
- draw_buttons()
- while true do
- local current_time = os.time()
- if current_time - last_update_time >= 5 then -- Обновление каждые 5 секунд
- cached_network = interface.getItemsInNetwork() -- Кэширование данных о ресурсах
- print_items() -- Вывод информации о доступных ресурсах
- draw_buttons() -- Перерисовка кнопок после обновления
- last_update_time = current_time
- end
- exchange_ore_dict() -- Обмен руды на слитки
- os.sleep(0.5) -- Пауза на 0.5 секунды перед следующей итерацией
- -- Обработка событий нажатия клавиш
- local _, _, key = event.pull(0.5, "key_down")
- if key then
- if key == 49 then -- Кнопка 1 (Редактировать код)
- os.execute("edit start.lua")
- elseif key == 50 then -- Кнопка 2 (Перезагрузить программу)
- os.execute("reboot")
- elseif key == 51 then -- Кнопка 3 (Закрыть программу)
- os.exit()
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement