Advertisement
markov2019

Untitled

Jul 17th, 2021
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local offReac = 9902 --температура перегрева реактора до отключения
  2. local perDamage = 90 --процент износа конденсатора при котором он меняется
  3.  
  4. local com = require("component")
  5. local computer = require("computer")
  6. local event = require("event")
  7. local gpu = com.gpu
  8. local w,h = gpu.getResolution()
  9. local per,noFuel,lowEu,toReac,run = 0,0,0,1,true
  10. local sideReac,sideInv,sideRed,OutputEUt,StartEUt
  11. local slotReac = {}
  12.  
  13. if not com.isAvailable("transposer") then
  14.   print("нет транспозера")
  15.   os.exit()
  16. end
  17. local tr = com.transposer
  18.  
  19. if not com.isAvailable("redstone") then
  20.   print("нет контроллера красного камня")
  21.   os.exit()
  22. end
  23. local red = com.redstone
  24.  
  25. if not com.isAvailable("reactor_chamber") then
  26.   print("камера реактора не найдена")
  27.   os.exit()
  28. end
  29. local reactor = com.reactor_chamber
  30.  
  31. if reactor.producesEnergy() then
  32.   print("\n".."остановите реактор !")
  33.   for i = 0,5 do
  34.     if red.getOutput(i) > 0 then
  35.       red.setOutput(i, 0)
  36.     end
  37.   end
  38.   os.exit()
  39. end
  40.  
  41. if reactor.getHeat() > offReac then
  42.   print("\n".."перегрев реактора !")
  43.   os.exit()
  44. end
  45.  
  46. print("поиск реактора и сундука")
  47. for i = 0,5 do
  48.   local vr = tr.getInventorySize(i)
  49.   if vr ~= nil then
  50.     if vr == 58 then
  51.       print("реактор в стороне: "..i)
  52.       sideReac = i
  53.     else
  54.       sideInv = i
  55.       print("сундук в стороне: "..i)
  56.     end
  57.   end
  58. end
  59. if not sideReac then
  60.   print("\n".."камера реактора не найдена")
  61.   os.exit()
  62. end
  63. if not sideInv then
  64.   print("\n".."сундук не найден")
  65.   os.exit()
  66. end
  67. local slotsReac = tr.getInventorySize(sideReac)
  68. local slotsInv = tr.getInventorySize(sideInv)
  69.  
  70. local function getAllStacks(side)
  71.   local temp = {}
  72.   local tmp = false
  73.   for i = 1, tr.getInventorySize(side) do
  74.     tmp = tr.getStackInSlot(side, i)
  75.     if tmp ~= nil then
  76.       temp[i-1] = tmp
  77.     end
  78.   end
  79.   return temp
  80. end
  81.  
  82. print("сохранение конденсаторов")
  83. local data = getAllStacks(sideReac)
  84. for i = 0,slotsReac do
  85.   if data[i] and data[i].name then
  86.     if string.find(data[i].name,"ondensator") then
  87.       local per = math.ceil(100*data[i].damage/data[i].maxDamage)
  88.       print("слот: "..(i+1).."  износ: "..per.." %")
  89.       if per >= perDamage then
  90.         print("\n".."замените конденсатор в слоте: "..(i+1))
  91.         os.exit()
  92.       end
  93.       table.insert(slotReac, i+1)
  94.     end
  95.   end
  96. end
  97.  
  98. print("пробный запуск")
  99. for k,n in pairs({3,2,4,5,0,1}) do
  100.   red.setOutput(n, 15)
  101.   if reactor.producesEnergy() then
  102.     os.sleep(1)
  103.     StartEUt = math.ceil(reactor.getReactorEUOutput())
  104.     print("StartEUt = "..StartEUt)
  105.     sideRed = n
  106.     red.setOutput(n, 0)
  107.     print("редстоун в стороне: "..sideRed)
  108.     break
  109.   else
  110.     red.setOutput(n, 0)
  111.   end
  112.   if k == 6 then
  113.     print("\n".."реактор не запускается")
  114.     os.exit()
  115.   end
  116. end
  117.  
  118. print("настройка завершена".."\n".."старт...")
  119. --os.sleep(2)
  120.  
  121. local function gui()
  122.   gpu.setResolution(28,15)
  123.   gpu.setBackground(0x000000)
  124.   gpu.fill(1,1,28,15," ")
  125.   gpu.setForeground(0x669999)
  126.   gpu.set(1,1,"┌──────────────────────────┐")
  127.   gpu.set(1,2,"│  │  │  │  │  │  │  │  │  │")
  128.   gpu.set(1,3,"│──────────────────────────│")
  129.   gpu.set(1,4,"│  │  │  │  │  │  │  │  │  │")
  130.   gpu.set(1,5,"│──────────────────────────│")
  131.   gpu.set(1,6,"│  │  │  │  │  │  │  │  │  │")
  132.   gpu.set(1,7,"│──────────────────────────│")
  133.   gpu.set(1,8,"│  │  │  │  │  │  │  │  │  │")
  134.   gpu.set(1,9,"│──────────────────────────│")
  135.  gpu.set(1,10,"│  │  │  │  │  │  │  │  │  │")
  136.  gpu.set(1,11,"│──────────────────────────│")
  137.  gpu.set(1,12,"│  │  │  │  │  │  │  │  │  │")
  138.  gpu.set(1,13,"└──────────────────────────┘")
  139. end
  140.  
  141. local xy = {
  142. {"2","2"},{"5","2"},{"8","2"},{"11","2"},{"14","2"},{"17","2"},{"20","2"},{"23","2"},{"26","2"},
  143. {"2","4"},{"5","4"},{"8","4"},{"11","4"},{"14","4"},{"17","4"},{"20","4"},{"23","4"},{"26","4"},
  144. {"2","6"},{"5","6"},{"8","6"},{"11","6"},{"14","6"},{"17","6"},{"20","6"},{"23","6"},{"26","6"},
  145. {"2","8"},{"5","8"},{"8","8"},{"11","8"},{"14","8"},{"17","8"},{"20","8"},{"23","8"},{"26","8"},
  146. {"2","10"},{"5","10"},{"8","10"},{"11","10"},{"14","10"},{"17","10"},{"20","10"},{"23","10"},{"26","10"},
  147. {"2","12"},{"5","12"},{"8","12"},{"11","12"},{"14","12"},{"17","12"},{"20","12"},{"23","12"},{"26","12"},
  148. }
  149.  
  150. local function stop(wait)
  151.   local e = ({event.pull(wait,"key_down")})[4]
  152.   if e == 18 or e == 20 then
  153.     red.setOutput(sideRed, 0)
  154.     gpu.setResolution(w, h)
  155.     gpu.setBackground(0x000000)
  156.     gpu.setForeground(0xFFFFFF)
  157.     gpu.fill(1, 1, w, h, " ")
  158.     print("программа завершена")
  159.     os.sleep(1)
  160.     if reactor.producesEnergy() then
  161.       print("ВНИМАНИЕ реактор по прежнему активен !!!")
  162.     else
  163.       print("реактор остановлен")
  164.     end
  165.     run = false
  166.   end
  167. end
  168.  
  169. local function alert(message)
  170.   gpu.setForeground(0xFF9900)
  171.   gpu.set(1,14,"  для завершения нажмите E  ")
  172.   gpu.setForeground(0xFF0000)
  173.   gpu.set(1,15,message)
  174.   computer.beep(500, 1)
  175.   stop(3)
  176. end
  177.  
  178.  
  179. local function ReactorControl()
  180.   local data = getAllStacks(sideReac)
  181.     for i = 1,#slotReac do
  182.       data = tr.getStackInSlot(sideReac, slotReac[i])
  183.       if data.damage then
  184.         per = math.ceil(100*data.damage/data.maxDamage)
  185.         gpu.setForeground(0xFF9900)
  186.         gpu.set(tonumber(xy[slotReac[i]][1]),tonumber(xy[slotReac[i]][2]),tostring(per))
  187.       else
  188.         per = 0
  189.       end
  190.       if per == 100 then
  191.         red.setOutput(sideRed, 0)
  192.         alert(" снизте % замены конденсат. ")
  193.         while run do
  194.           computer.beep(500, 1)
  195.           stop(3)
  196.         end
  197.         os.exit()
  198.       end
  199.       if per >= perDamage or per == 0 then
  200.         gpu.setForeground(0xFF9900)
  201.         gpu.set(1,15,"    замена конденсаторов    ")
  202.         if red.getOutput(sideRed) > 0 then
  203.           red.setOutput(sideRed, 0)
  204.           os.sleep(0.5)
  205.         end
  206.         tr.transferItem(sideReac, sideInv, 1, slotReac[i])
  207.         gpu.setForeground(0xFF0000)
  208.         gpu.set(tonumber(xy[slotReac[i]][1]),tonumber(xy[slotReac[i]][2]),"██")
  209.         os.sleep(0.5)
  210.         local data1 = getAllStacks(sideInv)
  211.         for i1 = 0,slotsInv do
  212.           if data1[i1] and data1[i1].name then
  213.             local per = math.ceil(100*data1[i1].damage/data1[i1].maxDamage)
  214.             if string.find(data1[i1].name,"ondensator") and per < 90 then
  215.               toReac = tr.transferItem(sideInv, sideReac, 1, i1+1, slotReac[i])
  216.               gpu.setForeground(0x00FF00)
  217.               gpu.set(tonumber(xy[slotReac[i]][1]),tonumber(xy[slotReac[i]][2]),"██")
  218.               break
  219.             else
  220.               toReac = 0
  221.             end
  222.           end
  223.         end
  224.       end
  225.     end
  226.  
  227.   local function circuitCheck()
  228.     local data = getAllStacks(sideReac)
  229.     local sh = 0
  230.     for i = 1,#slotReac do
  231.       if data[slotReac[i]-1].damage then
  232.         sh = sh + 1
  233.       end
  234.     end
  235.     if sh == #slotReac then
  236.       return true
  237.     else
  238.       return false
  239.     end
  240.   end
  241.  
  242.   if reactor.getHeat() > offReac then
  243.     red.setOutput(sideRed, 0)
  244.     alert("     перегрев реактора !    ")
  245.   elseif not circuitCheck() then
  246.     alert(" нет целых конденсаторов !  ")
  247.   elseif toReac == 0 then
  248.     alert("    в сундуке нет места !   ")
  249.   elseif noFuel >= 5 then
  250.     alert("       нет топлива !        ")
  251.   else
  252.     red.setOutput(sideRed, 15)
  253.     if not reactor.producesEnergy() then
  254.       alert("  реактор не запускается !  ")
  255.     else
  256.       OutputEUt = math.ceil(reactor.getReactorEUOutput())
  257.       gpu.setForeground(0x00FF00)
  258.       gpu.set(1,14,"      eu/t =  "..OutputEUt.."            ")
  259.       gpu.set(1,15,"      реактор активен       ")
  260.     end
  261.   end
  262.   stop(0.1)
  263.  
  264.   if reactor.producesEnergy() and reactor.getReactorEUOutput() == 0 then
  265.     noFuel = noFuel + 1
  266.   else
  267.     noFuel = 0
  268.     if OutputEUt and OutputEUt < StartEUt then
  269.       lowEu = lowEu + 1
  270.     else
  271.       lowEu = 0
  272.     end
  273.   end
  274.   if noFuel == 3 or lowEu == 3 then
  275.     local data2 = getAllStacks(sideReac)
  276.     local data3 = getAllStacks(sideInv)
  277.     for i2 = 0,slotsReac do
  278.       if data2[i2] and data2[i2].name then
  279.         if string.find(data2[i2].name,"depleted") then
  280.           gpu.setForeground(0xFF9900)
  281.           gpu.set(1,15,"      замена стержней       ")
  282.           tr.transferItem(sideReac, sideInv, 1, i2+1)
  283.           for i3 = 0,slotsInv do
  284.             if data3[i3] and data3[i3].name then
  285.               if string.find(data3[i3].name,"MOX") or string.find(data3[i3].name,"Uran") then
  286.                 if not string.find(data3[i3].name,"depleted") then
  287.                   tr.transferItem(sideInv, sideReac, 1, i3+1, i2+1)
  288.                   break
  289.                 end
  290.               end
  291.             end
  292.           end
  293.         end
  294.       end
  295.     end
  296.     StartEUt = math.ceil(reactor.getReactorEUOutput())
  297.     lowEu = 0
  298.    
  299.   end
  300.   if OutputEUt and OutputEUt > StartEUt then
  301.     StartEUt = math.ceil(reactor.getReactorEUOutput())
  302.   end
  303. end
  304.  
  305. gui()
  306. gpu.setForeground(0xFF9900)
  307. gpu.set(1,14,"  для завершения нажмите E  ")
  308. os.sleep(1)
  309. while run do
  310.   local ok,err = pcall(ReactorControl)
  311.   if not ok then
  312.     red.setOutput(sideRed, 0)
  313.     gpu.setResolution(w, h)
  314.     gpu.setBackground(0x000000)
  315.     gpu.setForeground(0xFFFFFF)
  316.     os.execute("cls")
  317.     print("программа аварийно завершена")
  318.     if type(err) == "table" then
  319.       io.stderr:write(table.unpack(err))
  320.     else
  321.       io.stderr:write(err)
  322.     end
  323.     run = false
  324.   end
  325. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement