Advertisement
GekaYamix

Untitled

Mar 29th, 2025
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.92 KB | Source Code | 0 0
  1. -- Определение списка руд с их параметрами
  2. local items = { -- множитель, название руды, забираем руду, dmg, отдаём слиток, dmg, название слитка, ore_dictionary
  3.   {"3","Дракониевая руда","DraconicEvolution:draconiumOre","0","DraconicEvolution:draconiumDust","0","Дракониевая пыль","dustDraconium"},
  4.   {"2","Алмазная руда","minecraft:diamond_ore","0","minecraft:diamond","0","Алмаз","gemDiamond"},
  5.   {"2","Изумрудная руда","minecraft:emerald_ore","0","minecraft:emerald","0","Изумруд","gemEmerald"},
  6.   {"2","Золотая руда","minecraft:gold_ore","0","minecraft:gold_ingot","0","Золотой слиток","ingotGold"},
  7.   {"2","Железная руда","minecraft:iron_ore","0","minecraft:iron_ingot","0","Железный слиток","ingotIron"},
  8.   {"2","IC2 Медная руда","IC2:blockOreCopper","0","IC2:itemIngot","0","Медный слиток","ingotCopper"},
  9.   {"2","IC2 Оловянная руда","IC2:blockOreTin","0","IC2:itemIngot","1","Оловянный слиток","ingotTin"},
  10.   {"2","IC2 Свинцовая руда","IC2:blockOreLead","0","IC2:itemIngot","5","Свинцовый слиток","ingotLead"},
  11.   {"2","TE Медная руда","ThermalFoundation:Ore","0","ThermalFoundation:material","64","Медный слиток","ingotCopper"},
  12.   {"2","TE Оловянная руда","ThermalFoundation:Ore","1","ThermalFoundation:material","65","Оловянный слиток","ingotTin"},
  13.   {"2","TE Никелевая руда","ThermalFoundation:Ore","4","ThermalFoundation:material","68","Никелевый слиток","ingotNickel"},
  14.   {"2","TE Серебряная руда","ThermalFoundation:Ore","2","ThermalFoundation:material","66","Серебряный слиток","ingotSilver"},
  15.   {"2","TE Платиновая руда","ThermalFoundation:Ore","5","ThermalFoundation:material","69","Платиновый слиток","ingotPlatinum"},
  16.   {"2","Руда истинного кварца","appliedenergistics2:tile.OreQuartz","0","appliedenergistics2:item.ItemMultiMaterial","0","Истинный кварц","crystalCertusQuartz"},
  17.   {"3","Кварцевая руда","minecraft:quartz_ore","0","minecraft:quartz","0","Кварц","gemQuartz"},
  18.   {"8","Лазуритовая руда","minecraft:lapis_ore","0","minecraft:dye","4","Лазурит","dye"},
  19.   {"8","Красная руда","minecraft:redstone_ore","0","minecraft:redstone","0","Красная пыль","dustRedstone"},
  20.   {"2","Угольная руда","minecraft:coal_ore","0","minecraft:coal","0","Уголь","coal"}
  21. }
  22.  
  23. -- Подключение необходимых библиотек
  24. local unicode = require("unicode")
  25. local com = require("component")
  26. local event = require("event")
  27. local interface = com.isAvailable("me_interface") and com.me_interface or error("нет ме интерфейса")
  28. local db = com.isAvailable("database") and com.database or error("нет базы данных")
  29. local chest = com.isAvailable("chest") and com.chest or error("нет сундука")
  30. local size = chest.getInventorySize()
  31. local gpu = com.gpu
  32. local w, h = gpu.getResolution()
  33. local net_count,line_count = 0,0
  34. local last_update_time = os.time() -- Время последнего обновления
  35. local cached_network = nil -- Кэшированные данные о ресурсах
  36.  
  37. -- Функция для склонения слов в зависимости от числа
  38. local function declension(number)
  39.   local dec = ""
  40.   local rest = number % 10
  41.   local str = string.sub(number,string.len(number)-1)
  42.   if str == "11" or str == "12" or str == "13" or str == "14" then
  43.     dec = " слитков"
  44.   elseif rest == 1 then
  45.     dec = " слиток"
  46.   elseif rest == 2 or rest == 3 or rest == 4 then
  47.     dec = " слитка"
  48.   else
  49.     dec = " слитков"
  50.   end
  51.   return number..dec
  52. end
  53.  
  54. -- Функция для центрирования текста на экране
  55. local function center(coord,text,color)
  56.   gpu.setForeground(color)
  57.   local text_len = unicode.len(text)
  58.   local start_pos = math.floor((w - text_len) / 2)
  59.   gpu.set(start_pos, coord, text)
  60. end
  61.  
  62. -- Функция для вывода цветного текста на экран
  63. local function color_text(w,line,text,color)
  64.   gpu.setForeground(color)
  65.   gpu.set(w,line,text)
  66. end
  67.  
  68. -- Функция для вывода информации о доступных ресурсах
  69. local function print_items()
  70.   local line,size,fill = 3,0,true
  71.   local network = cached_network or interface.getItemsInNetwork()
  72.  
  73.   if #network ~= net_count then
  74.     if fill then
  75.       gpu.fill(1,3,w,h-4," ") -- Очистка экрана перед выводом информации, оставляя место для заголовка и кнопок
  76.       fill = not fill
  77.     end
  78.   end
  79.  
  80.   gpu.fill(1,1,w,1," ") -- Очистка первой строки
  81.   center(1, "Доступные ресурсы", 0x99CCFF) -- Заголовок
  82.   color_text(3, 2, string.rep("─", 76), 0x009999) -- Разделительная линия
  83.  
  84.   for ind = 1,#items do
  85.     for net = 1,#network do
  86.       if network[net].name == items[ind][5] then
  87.         if network[net].damage == tonumber(items[ind][6]) then
  88.           if network[net].size >= tonumber(items[ind][1]) then
  89.             if #network ~= net_count then
  90.               if fill then
  91.                 fill = not fill
  92.               end
  93.               color_text(5,line,items[ind][2],0xFF9900) -- Вывод названия руды
  94.               color_text(28,line,"1",0x3399FF) -- Вывод количества руды
  95.               color_text(30,line,"-->",0xFF0000) -- Вывод стрелки
  96.               color_text(34,line,"X "..items[ind][1],0x3399FF) -- Вывод множителя
  97.               color_text(42,line,items[ind][7],0xFF9900) -- Вывод названия слитка
  98.               color_text(63,line,"доступно",FF9900) -- Вывод текста "доступно"
  99.               color_text(73,line,tostring(network[net].size),0x3399FF) -- Вывод количества доступных слитков
  100.               --color_text(3,line+1,string.rep("─",76),0xFFFFFF) -- Вывод разделительной линии
  101.               size = size + network[net].size -- Увеличение общего количества доступных слитков
  102.             else
  103.               size = size + network[net].size -- Увеличение общего количества доступных слитков
  104.               color_text(73,line,tostring(network[net].size.."   "),0x3399FF) -- Вывод количества доступных слитков с пробелами
  105.             end
  106.             line = line + 2 -- Переход на следующую строку
  107.           end
  108.         end
  109.       end
  110.     end
  111.   end
  112.   net_count = #network
  113.   if line == 3 or line ~= line_count then
  114.     net_count = 0
  115.   end
  116.   line_count = line
  117.   if size > 0 then
  118.     center(line_count+2,"Обмен ресурсов. Всего доступно "..declension(size),0x00CCFF) -- Вывод общего количества доступных слитков
  119.   else
  120.     center(h/2,"Обменник ресурсов пустой",0xFF0000) -- Вывод сообщения, если нет доступных ресурсов
  121.   end
  122. end
  123.  
  124. -- Функция для отправки предметов в сеть
  125. local function pushItem(name,count,label)
  126.   db.clear(1)
  127.   interface.store(name,db.address,1)
  128.   interface.setInterfaceConfiguration(1,db.address,1,64)
  129.   local drop = 0
  130.   while true do
  131.     if drop == count then
  132.       interface.setInterfaceConfiguration(1,db.address,1,0)
  133.       net_count = 0
  134.       break
  135.     else
  136.       local dropcount = interface.pushItem("UP",1,count-drop)
  137.       drop = drop + dropcount
  138.       if dropcount == 0 then
  139.         center(h/2,"освободите место в сундуке",0xFF0000) -- Вывод сообщения о необходимости освободить место в сундуке
  140.         center(h/2+2,"Ожидаю выдать "..label,0xFFFFFF) -- Вывод ожидания выдачи предмета
  141.         center(h/2+4,"всего "..count-drop,0xFFFFFF) -- Вывод общего количества предметов для выдачи
  142.         os.sleep(1)
  143.       end
  144.     end
  145.   end
  146. end
  147.  
  148. -- Функция для обмена руды на слитки
  149. local function exchange_ore_dict()
  150.   local ore_dict,item_count = "",false
  151.   local data = chest.getAllStacks(0)
  152.   for slot = 1,size do
  153.     if data[slot] then
  154.       for ind = 1,#items do
  155.         if data[slot].id == items[ind][3] then
  156.           if data[slot].dmg == tonumber(items[ind][4]) then
  157.             ore_dict = items[ind][8]
  158.             break
  159.           end
  160.         end
  161.       end
  162.       local network = cached_network or interface.getItemsInNetwork()
  163.       for ind2 = 1,#items do
  164.         if ore_dict == items[ind2][8] then
  165.           local ore = items[ind2][5]
  166.           local dmg = items[ind2][6]
  167.           local ore_name = items[ind2][2]
  168.           for net = 1,#network do
  169.             if network[net].name == ore then
  170.               if network[net].damage == tonumber(dmg) then
  171.                 if network[net].size >= tonumber(items[ind2][1]) then
  172.                   item_count = chest.pushItem("DOWN",slot,(network[net].size/items[ind2][1]))
  173.                   local drop_count = item_count*items[ind2][1]
  174.                   local ingot_name = items[ind2][7]
  175.                   center(1,"Меняю  "..item_count.."  "..ore_name.."  на  "..drop_count.."  "..ingot_name,0xFFFFFF) -- Вывод сообщения о обмене руды на слитки
  176.                   pushItem({name = ore,damage = tonumber(dmg)},drop_count,ingot_name)
  177.                   break
  178.                 end
  179.               end
  180.             end
  181.           end
  182.           if item_count then
  183.             item_count = false
  184.             ore_dict = ""
  185.             break
  186.           end
  187.         end
  188.       end
  189.     end
  190.   end
  191.   -- Обновление экрана после обмена
  192.   print_items()
  193. end
  194.  
  195. -- Функция для отображения кнопок
  196. local function draw_buttons()
  197.   local button_y = h - 2
  198.   gpu.setForeground(0x006633)
  199.   gpu.set(40, button_y, "⬤")
  200.   gpu.setForeground(0xFFFFFF)
  201.   gpu.set(42, button_y, " Edit")
  202.   gpu.setForeground(0x0066CC)
  203.   gpu.set(55, button_y, "⬤")
  204.   gpu.setForeground(0xFFFFFF)
  205.   gpu.set(57, button_y, " Reboot")
  206.   gpu.setForeground(0x990000)
  207.   gpu.set(70, button_y, "⬤")
  208.   gpu.setForeground(0xFFFFFF)
  209.   gpu.set(72, button_y, " Exit")
  210. end
  211.  
  212. -- Основной цикл программы
  213. gpu.fill(1,1,w,h," ")
  214. gpu.setResolution(80,h)
  215. draw_buttons()
  216. while true do
  217.   local current_time = os.time()
  218.   if current_time - last_update_time >= 5 then -- Обновление каждые 5 секунд
  219.     cached_network = interface.getItemsInNetwork() -- Кэширование данных о ресурсах
  220.     print_items() -- Вывод информации о доступных ресурсах
  221.     draw_buttons() -- Перерисовка кнопок после обновления
  222.     last_update_time = current_time
  223.   end
  224.   exchange_ore_dict() -- Обмен руды на слитки
  225.   os.sleep(0.5) -- Пауза на 0.5 секунды перед следующей итерацией
  226.  
  227.   -- Обработка событий нажатия клавиш
  228.   local _, _, key = event.pull(0.5, "key_down")
  229.   if key then
  230.     if key == 49 then -- Кнопка 1 (Редактировать код)
  231.       os.execute("edit start.lua")
  232.     elseif key == 50 then -- Кнопка 2 (Перезагрузить программу)
  233.       os.execute("reboot")
  234.     elseif key == 51 then -- Кнопка 3 (Закрыть программу)
  235.       os.exit()
  236.     end
  237.   end
  238. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement