imrskull

OreExchange1.lua

Oct 11th, 2025
11
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[
  2. The specified software is distributed under the CC0 license
  3. No Rights Reserved
  4. ]] --
  5.  
  6. local ore_dict = {
  7.     {
  8.         "Железная руда",
  9.         "Железный слиток",
  10.         take = {name = "minecraft:iron_ore", damage = 0},
  11.         give = {name = "minecraft:iron_ingot", damage = 0},
  12.         rate = {take = 9, give = 22}
  13.     },
  14.     {
  15.         "Кварцевая руда",
  16.         "Кварц",
  17.         take = {name = "minecraft:quartz_ore", damage = 0},
  18.         give = {name = "minecraft:quartz", damage = 0},
  19.         rate = {take = 1, give = 4}
  20.     },
  21.     {
  22.         "Золотая руда",
  23.         "Золотой слиток",
  24.         take = {name = "minecraft:gold_ore", damage = 0},
  25.         give = {name = "minecraft:gold_ingot", damage = 0},
  26.         rate = {take = 9, give = 22}
  27.     },
  28.     {
  29.         "Лазуритовая руда",
  30.         "Лазурит",
  31.         take = {name = "minecraft:lapis_ore", damage = 0},
  32.         give = {name = "minecraft:dye", damage = 4},
  33.         rate = {take = 1, give = 6}
  34.     },
  35.     {
  36.         "Красная руда",
  37.         "Красная пыль",
  38.         take = {name = "minecraft:redstone_ore", damage = 0},
  39.         give = {name = "minecraft:redstone", damage = 0},
  40.         rate = {take = 1, give = 5}
  41.     },
  42.     {
  43.         "Медная руда",
  44.         "Медный слиток",
  45.         take = {name = "IC2:blockOreCopper", damage = 0},
  46.         give = {name = "IC2:itemIngot", damage = 0},
  47.         rate = {take = 9, give = 22}
  48.     },
  49.     {
  50.         "Оловянная руда",
  51.         "Оловянный слиток",
  52.         take = {name = "IC2:blockOreTin", damage = 0},
  53.         give = {name = "IC2:itemIngot", damage = 1},
  54.         rate = {take = 9, give = 22}
  55.     },
  56.     {
  57.         "Дракониевая руда",
  58.         "Дракониевая пыль",
  59.         take = {name = "DraconicEvolution:draconiumOre", damage = 0},
  60.         give = {name = "DraconicEvolution:draconiumDust", damage = 0},
  61.         rate = {take = 1, give = 3}
  62.     },
  63.     {
  64.         "Угольная руда",
  65.         "Уголь",
  66.         take = {name = "minecraft:coal_ore", damage = 0},
  67.         give = {name = "minecraft:coal", damage = 0},
  68.         rate = {take = 1, give = 3}
  69.     },
  70.     {
  71.         "Руда истинного кварца",
  72.         "Кристалл истинного кварца",
  73.         take = {name = "appliedenergistics2:tile.OreQuartz", damage = 0},
  74.         give = {name = "appliedenergistics2:item.ItemMultiMaterial", damage = 0},
  75.         rate = {take = 1, give = 3}
  76.     },
  77.     {
  78.         "Заряж. руда ист. кварца",
  79.         "Заряж. крист. кварца",
  80.         take = {name = "appliedenergistics2:tile.OreQuartzCharged", damage = 0},
  81.         give = {name = "appliedenergistics2:item.ItemMultiMaterial", damage = 1},
  82.         rate = {take = 1, give = 3}
  83.     },
  84.     {
  85.         "Алмазная руда",
  86.         "Алмаз",
  87.         take = {name = "minecraft:diamond_ore", damage = 0},
  88.         give = {name = "minecraft:diamond", damage = 0},
  89.         rate = {take = 1, give = 3}
  90.     },
  91.     {
  92.         "Серебряная руда",
  93.         "Серебрянный слиток",
  94.         take = {name = "ThermalFoundation:Ore", damage = 2},
  95.         give = {name = "IC2:itemIngot", damage = 6},
  96.         rate = {take = 7, give = 22}
  97.     },
  98.     {
  99.         "Платиновая руда",
  100.         "Измельчённая платина",
  101.         take = {name = "ThermalFoundation:Ore", damage = 5},
  102.         give = {name = "ThermalFoundation:material", damage = 37},
  103.         rate = {take = 1, give = 2}
  104.     },
  105.     {
  106.         "Никелевая руда",
  107.         "Измельчённый никель",
  108.         take = {name = "ThermalFoundation:Ore", damage = 4},
  109.         give = {name = "ThermalFoundation:material", damage = 36},
  110.         rate = {take = 1, give = 2}
  111.     },
  112. }
  113.  
  114. local unicode = require("unicode")
  115. local computer = require("computer")
  116. local com = require("component")
  117. local event = require("event")
  118. local me = com.isAvailable("me_interface") and com.me_interface or error("нет ме интерфейса")
  119. local pim = com.isAvailable("pim") and com.pim or error("нет пима")
  120.  
  121. local gpu = com.gpu
  122. local w, h = 80, 50
  123. local defBG, defFG = gpu.getBackground(), gpu.getForeground()
  124. gpu.setResolution(w, h)
  125.  
  126. local function center(height, text, color)
  127.     gpu.setForeground(color)
  128.     gpu.set(math.floor(w / 2 - unicode.len(text) / 2), height, text)
  129. end
  130.  
  131. local function populateQty()
  132.     local totalOre = 0
  133.     for i, ore in pairs(ore_dict) do
  134.         local fingerprint = {id = ore.give.name, damage = ore.give.damage}
  135.         local item = me.getItemDetail(fingerprint).basic()
  136.         if item == nil then
  137.             return 0
  138.         else
  139.             ore.sizeOfStack = item.max_size
  140.             ore.qty = item.qty
  141.             totalOre = totalOre + item.qty
  142.         end
  143.     end
  144.     return totalOre
  145. end
  146.  
  147. local function displayOres()
  148.     local line = 2
  149.     for i, ore in pairs(ore_dict) do
  150.         local print_row = line + (i)
  151.  
  152.         gpu.setForeground(0x00ff00)
  153.         gpu.set(5, print_row, ore[1])
  154.         gpu.set(42, print_row, ore[2])
  155.  
  156.         gpu.setForeground(0xFF00FF)
  157.         gpu.set(28, print_row, tostring(ore.rate.take))
  158.         gpu.set(34, print_row, tostring(ore.rate.give))
  159.         gpu.set(73, print_row, tostring(ore.qty))
  160.  
  161.         gpu.setForeground(0xFFFF00)
  162.         gpu.set(30, print_row, "-->")
  163.         gpu.set(63, print_row, "Доступно:")
  164.         gpu.setForeground(0x202020)
  165.         gpu.set(2, print_row + 1, string.rep("═", w - 2))
  166.         line = line + 1
  167.     end
  168. end
  169.  
  170. local function updateOres()
  171.     local totalOre = populateQty()
  172.     gpu.fill(1, 1, w, h - 16, " ")
  173.     if totalOre == 0 then
  174.         gpu.fill(1, 1, w, h - 15, " ")
  175.         center(h - 15, "Нет соединения с МЭ", 0xff0000)
  176.     else
  177.         displayOres()
  178.     end
  179. end
  180.  
  181. local function giveItemFromMe(item, dmg, amount)
  182.     local fingerprint = {id = item, dmg = dmg}
  183.     local err, res = pcall(me.exportItem, fingerprint, "UP", amount)
  184.     if err == true then
  185.         return res.size
  186.     end
  187. end
  188.  
  189. local function giveIngot(toGive, ore)
  190.     local totalGive = 0
  191.     local givePreIteration = 0
  192.     while totalGive < toGive do
  193.         if toGive - totalGive > 64 then
  194.             givePreIteration = ore.sizeOfStack
  195.         else
  196.             givePreIteration = toGive - totalGive
  197.         end
  198.  
  199.         local gived = giveItemFromMe(ore.give.name, ore.give.damage, givePreIteration)
  200.  
  201.         totalGive = totalGive + gived
  202.         if gived == 0 then
  203.             gpu.fill(1, h - 15, w, 2, " ")
  204.             center(h - 15, "Oсвободите место в инвентаре", 0xff0000)
  205.             center(h - 14, "Ожидаю выдать " .. tostring(toGive - totalGive) .. " " .. ore[2], 0xFFFFFF)
  206.             os.sleep(1)
  207.         end
  208.         gpu.fill(1, h - 15, 2, h, " ")
  209.     end
  210. end
  211.  
  212. local function exchangeOre(slot, ore)
  213.     local curSlot = pim.getStackInSlot(slot)
  214.     if curSlot == nil then
  215.         center(h - 14, "Вы сошли с PIM, обмен прерван. (Не удалось прочесть слот)", 0xff0000)
  216.         os.sleep(0.5)
  217.         return
  218.     end
  219.     local userOreQty = curSlot.qty
  220.     local takeQty = userOreQty - (userOreQty % ore.rate.take)
  221.     local giveQty = userOreQty * ore.rate.give
  222.     if ore.qty < giveQty then
  223.         gpu.fill(1, h - 14, w, 1, " ")
  224.         center(h - 14, "Недостаточно слитков для обмена <" .. ore[1] .. ">", 0xff0000)
  225.         os.sleep(0.5)
  226.         return
  227.     end
  228.     -- Количетсво могло измениться..
  229.     local takedOre = pim.pushItem("DOWN", slot, takeQty)
  230.  
  231.     if takedOre == nil then
  232.         gpu.fill(1, h - 14, w, 1, " ")
  233.         center(h - 14, "Вы сошли с PIM, обмен прерван. (Не удалось извлечь руду)", 0xff0000)
  234.         os.sleep(0.5)
  235.     elseif takedOre == 0 then
  236.         gpu.fill(1, h - 14, w, 1, " ")
  237.         center(h - 14, "В выбраном слоте руды нет.. А была.. Хмм...", 0x505050)
  238.     else
  239.         local giveQty = (takedOre // ore.rate.take) * ore.rate.give
  240.         gpu.fill(1, h - 15, w, 2, " ")
  241.         center(h - 14, "Меняю  " .. takedOre .. "  " .. ore[1] .. "  на  " .. giveQty .. "  " .. ore[2], 0xffffff)
  242.         giveIngot(giveQty, ore)
  243.     end
  244. end
  245.  
  246. local function checkInventory()
  247.     local size = pim.getInventorySize()
  248.     local data = pim.getAllStacks(0)
  249.  
  250.     for slot = 1, size do
  251.         if data[slot] then
  252.             for i, ore in pairs(ore_dict) do
  253.                 if data[slot].id == ore.take.name and data[slot].dmg == ore.take.damage then
  254.                     exchangeOre(slot, ore)
  255.                 end
  256.             end
  257.         end
  258.     end
  259.  
  260.     updateOres()
  261.  
  262.     if pim.getInventoryName() ~= "pim" then
  263.         gpu.fill(1, h - 15, w, 2, " ")
  264.         center(h - 15, "Обмен окончен! Приходите ещё!", 0xffffff)
  265.  
  266.         checkInventory()
  267.     else
  268.         -- Может быть, мы не поймали событие когда юзер ушел
  269.         event.push("player_off")
  270.     end
  271. end
  272.  
  273. function handleEvent(eventID, ...)
  274.     local args = {...}
  275.     if eventID == "interrupted" then
  276.         gpu.setBackground(defBG)
  277.         gpu.setForeground(defFG)
  278.         gpu.fill(1, 1, w, h, " ")
  279.         os.exit()
  280.         return true
  281.     elseif eventID == "player_on" then
  282.         gpu.fill(1, h - 15, w, 1, " ")
  283.         center(h - 15, "Приветствую, " .. args[1] .. "! Начинаю обмен", 0xffffff)
  284.         updateOres()
  285.         checkInventory()
  286.     elseif eventID == "player_off" then
  287.         gpu.fill(1, h - 15, w, 1, " ")
  288.         center(h - 15, "Для обмена встаньте на PIM и не сходите до окончания обмена", 0xffffff)
  289.         updateOres()
  290.     end
  291. end
  292.  
  293. function drawStat()
  294.     gpu.setForeground(0x444444)
  295.     gpu.set(
  296.         2,
  297.         h - 1,
  298.         string.format(
  299.             "RAM: %.1fkB / %.1fkB",
  300.             (computer.totalMemory() - computer.freeMemory()) / 1024,
  301.             computer.totalMemory() / 1024
  302.         )
  303.     )
  304. end
  305.  
  306. local oreTimeFn = function()
  307.     updateOres()
  308.     -- Каджый 10 такт обновляем экран
  309.     for i = 1, 10 do
  310.         coroutine.yield()
  311.     end
  312. end
  313. local oreTimer = coroutine.create(oreTimeFn)
  314.  
  315. function draw_img(img, x, y, fore, back)
  316.     fore = fore or 0xffffff
  317.     back = back or 0x0
  318.     oldFG = gpu.getForeground()
  319.     gpu.setForeground(fore)
  320.     local i = 0
  321.     for line in img:gmatch("([^\n]*)\n?") do
  322.         gpu.set(x, y + i, line)
  323.         i = i + 1
  324.     end
  325.     gpu.setForeground(oldFG)
  326. end
  327. local img =
  328.     [[
  329.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  330.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡐⢆⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  331.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠠⡐⣄⢢⡐⢄⢢⡐⣄⠂⡄⠀⠀⢄⢢⢰⣀⢦⡐⣄⢢⡐⠄⣂⠆⠀⠀⢀⡐⢦⠹⠌⠀⢀⡰⢠⠀⠐⣠⠀⠀⠀⠀⠀⠀⠀⠀⠄⡐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  332.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢡⠂⡄⠀⠀⠀⠀⠌⡤⠃⠀⢳⡌⠃⠘⠈⠂⠑⠈⠑⠀⠀⡜⡢⠍⠂⠑⠈⠑⠈⠃⠀⠐⣌⠎⢀⡐⠦⣜⠂⠁⠀⠀⠀⡜⡡⠂⠘⠤⡁⠀⠀⠀⠀⠀⠀⠀⢂⠱⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  333.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢢⠑⡌⢢⠀⠤⣉⡜⣰⠁⠀⡣⢝⠀⠀⠀⠀⠀⠀⠀⠀⢀⠳⣹⢌⡱⢢⡱⢌⢲⢰⡀⠀⢎⠺⣤⣙⠳⣀⠀⠀⠀⠀⠠⣙⠦⠁⢨⣑⠂⠀⠀⠀⠀⠀⠀⠀⢌⠳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  334.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢢⡑⠈⠒⡭⠒⠌⠸⣡⠃⠀⣙⠮⡄⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠈⠁⠁⠉⣈⠞⡢⠄⠈⢎⡳⠂⠉⠳⢆⡆⣀⠀⠀⠐⡌⠦⠁⠠⣃⠎⠀⠀⠀⠀⠀⠀⠀⠌⢒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  335.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠒⡄⠁⠀⠀⠁⠀⠰⣡⠂⠀⠈⠸⣑⢋⢆⢳⡘⣔⠣⢆⢠⠱⣊⡕⣎⢖⡱⢎⠞⠁⠀⠈⣎⠱⠀⠀⠀⠈⠲⣡⠢⠄⠀⡜⡡⠂⠐⡥⢊⡴⢡⠎⡤⢁⠆⠀⠘⡀⠎⡐⢂⠰⠀⠆⡀⠀⠀⠀⠀⠀
  336.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⢌⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  337.     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  338.     ]]
  339.  
  340. function copyleft()
  341.     local text = {
  342.         {"Авторы: ", 0x444444, w - 35},
  343.         {"Неизвестны", 0x64fff2, w - 28}
  344.     }
  345.     local startPos = w - 32
  346.     for i, str in pairs(text) do
  347.         gpu.setForeground(str[2])
  348.         gpu.set(str[3], h - 1, str[1])
  349.     end
  350.  
  351.     gpu.setBackground(defBG)
  352.     gpu.setForeground(defFG)
  353. end
  354.  
  355. gpu.fill(1, 1, w, h, " ")
  356. center(h - 15, "Для обмена встаньте на PIM и не сходите до окончания обмена", 0xffffff)
  357. draw_img(img, 1, h - 13, 0x00a400)
  358. copyleft()
  359.  
  360. while true do
  361.     drawStat()
  362.  
  363.     handleEvent(event.pull(1))
  364.  
  365.     if coroutine.status(oreTimer) == "dead" then
  366.         oreTimer = coroutine.create(oreTimeFn)
  367.     else
  368.         coroutine.resume(oreTimer)
  369.     end
  370. end
  371.  
Add Comment
Please, Sign In to add comment