Advertisement
efrim

Mining controller 3.0.1 [computercraft, warpdrive]

Oct 21st, 2013
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.64 KB | None | 0 0
  1. NETWORK_SIDE = "bottom" -- Сторона, к которой подключен модем
  2. DATA_FILE = "miners.dat" -- Файл для сохранения данных
  3. TEMP_FILE = "miners.temp" -- Временное хранилище
  4. REFRESH_RATE = 5        -- Seconds
  5.  
  6. BACKGROUND_COLOR = 1    -- White
  7. TEXT_COLOR = 32768      -- Black
  8.  
  9. nTotal = 0
  10. mLayerOffset = 30
  11.  
  12. nLowEnergy = 0
  13. nMining = 0
  14. nQuarry = 0
  15. nStopped = 0
  16. maxLayer = 0
  17. minLayer = 256
  18.  
  19. scrX, scrY = term.getSize()
  20.  
  21. modem = peripheral.wrap(NETWORK_SIDE)
  22.  
  23. peripherals = modem.getNamesRemote()
  24. miner = {}
  25.  
  26. --------------------------------------------------
  27.  
  28.     -- Массив данных о майнерах:
  29.     -- 1 - 'state'
  30.     -- 2 - 'energy'
  31.     -- 3 - 'currentLayer'
  32.     -- 4 - 'mined'
  33.     -- 5 - 'total'
  34.  
  35. minersStats = {}
  36. for i = 1, 81 do
  37.     minersStats[i] = {}
  38.  
  39.     for j = 1, 7 do
  40.         minersStats[i][j] = 0 -- Fill the values here
  41.     end
  42. end
  43.  
  44. --------------------------------------------------
  45. -- Инициализация
  46. --------------------------------------------------
  47.  
  48. function FindMiners ()
  49.     for i = 1, #peripherals do
  50.         if modem.getTypeRemote(peripherals[i]) == "mininglaser" then
  51.             nTotal = nTotal + 1
  52.             miner[nTotal] = peripherals[i]
  53.         end
  54.     end
  55. end
  56.  
  57. --------------------------------------------------
  58. -- Сбор статистики
  59. --------------------------------------------------
  60.  
  61. function UpdateMiner (minerN)
  62.     local state, energy, currentLayer, mined, total = modem.callRemote(miner[minerN], "getMinerState")
  63.  
  64.     minersStats[minerN][1] = state
  65.     minersStats[minerN][2] = energy
  66.     minersStats[minerN][3] = currentLayer
  67.     minersStats[minerN][4] = mined
  68.     minersStats[minerN][5] = total
  69.  
  70.     return 0
  71. end
  72.  
  73. function UpdateAllMiners() -- Обновление статусов всех майнеров
  74.     for i = 1, nTotal do
  75.         UpdateMiner(i)
  76.     end
  77.  
  78.     return 0
  79. end
  80.  
  81. function RecalculateStatistics ()
  82.     nOnline = 0
  83.     nLowEnergy = 0
  84.     nMining = 0
  85.     nQuarry = 0
  86.     nStopped = 0
  87.     maxLayer = 0
  88.     minLayer = 256
  89.  
  90.     for i = 1, nTotal do
  91.         -- nLowEnergyTemp
  92.         if minersStats[i][2] <= 20000 then
  93.             nLowEnergy = nLowEnergy + 1
  94.         end
  95.         -- nMiningTemp, nQuarryTemp, nStoppedTemp
  96.         if minersStats[i][1] == "not mining" then
  97.             nStopped = nStopped + 1
  98.         elseif minersStats[i][1] == "mining" then
  99.             nMining = nMining + 1
  100.         elseif minersStats[i][1] == "mining (quarry mode)" then
  101.             nQuarry = nQuarry + 1
  102.         end
  103.         -- maxLayerTemp
  104.         maxLayer = math.max(maxLayer, minersStats[i][3])
  105.         minLayer = math.min(minLayer, minersStats[i][3])
  106.     end
  107.  
  108.     return 0
  109. end
  110.  
  111. --------------------------------------------------
  112. -- Интерфейс
  113. --------------------------------------------------
  114.  
  115. function CommandAllMiners(command)
  116.     for i = 1, nTotal do
  117.         modem.callRemote(miner[i], "setStartLayerOffset", mLayerOffset)
  118.         modem.callRemote(miner[i], command)
  119.     end
  120. end
  121.  
  122. function DrawBackground ()
  123.     term.setBackgroundColor(BACKGROUND_COLOR)
  124.     term.setTextColor(TEXT_COLOR)
  125.     term.setCursorBlink(false)
  126.     term.clear()
  127.     term.setCursorPos(1, 1)
  128.  
  129.     term.write("\t\t< Mining lasers >")
  130. end
  131.  
  132. function WriteStats ()
  133.     term.setCursorPos(1, 3)
  134.     term.write("Online:\t\t" .. nTotal)
  135.     term.setCursorPos(1, 4)
  136.     term.write("Mining, quarry:\t\t" .. nMining .. ":" .. nQuarry)
  137.     term.setCursorPos(1, 5)
  138.     term.write("Max/min level:\t\t" .. maxLayer .. "/" .. minLayer)
  139.     term.setCursorPos(1, 6)
  140.     term.write("Low energy:\t\t" .. nLowEnergy)
  141. end
  142.  
  143. function WriteButtonsExplanation ()
  144.     term.setCursorPos(1, scrY-3)
  145.     term.write("M - mine, Q - quarry, S - stop")
  146.     term.setCursorPos(1, scrY-2)
  147.     term.write("O - set offset, X - shutdown, R - refresh")
  148. end
  149.  
  150. function ReceiveOffset ()
  151.     sleep(1/20)
  152.     term.setCursorPos(1, 3)
  153.     term.write("Enter offset:")
  154.     term.setCursorPos(1, 4)
  155.     term.write("> ")
  156.  
  157.     term.setCursorBlink(true)
  158.     local input = read()
  159.     term.setCursorBlink(false)
  160.  
  161.     mLayerOffset = tonumber(input)
  162.  
  163.     return mLayerOffset
  164. end
  165.  
  166. function Shutdown()
  167.     term.setBackgroundColor(32768)
  168.     term.setTextColor(1)
  169.     term.setCursorPos(1, 1)
  170.     term.clear()
  171.     print("Bye!..")
  172.     sleep(1)
  173.     os.shutdown()
  174. end
  175.  
  176. --------------------------------------------------
  177. -- Сохранение и загрузка
  178. --------------------------------------------------
  179.  
  180. function SaveToFile()
  181.     local file = fs.open(TEMP_FILE, "w")
  182.     file.writeLine(mLayerOffset .. "")
  183.     file.close()
  184.  
  185.     fs.delete(DATA_FILE)
  186.     fs.move(TEMP_FILE, DATA_FILE)
  187.  
  188.     return 0
  189. end
  190.  
  191. function LoadFromFile()
  192.     local file = fs.open(DATA_FILE, "r")
  193.     mLayerOffset = tonumber(file.readLine())
  194.     file.close()
  195.  
  196.     return 0
  197. end
  198.  
  199. --------------------------------------------------
  200. -- Главный луп
  201. --------------------------------------------------
  202.  
  203. function main ()
  204.     FindMiners()
  205.  
  206.     if fs.exists(DATA_FILE) then
  207.         LoadFromFile()
  208.     end
  209.  
  210.     while true do
  211.         UpdateAllMiners()
  212.         RecalculateStatistics()
  213.  
  214.         DrawBackground()
  215.         WriteStats()
  216.         WriteButtonsExplanation ()
  217.  
  218.         local timeout = os.startTimer(REFRESH_RATE)
  219.         while true do
  220.  
  221.             event = {os.pullEvent()}
  222.  
  223.             if event[1] == "key" then
  224.                 if event[2] == 50 then              -- M - mining
  225.                     CommandAllMiners("startMining")
  226.                 elseif event[2] == 16 then          -- Q - quarry
  227.                     CommandAllMiners("startQuarry")
  228.                 elseif event[2] == 31 then          -- S - stop
  229.                     CommandAllMiners("stop")
  230.                 elseif event[2] == 24 then          -- O - offset
  231.                     DrawBackground()
  232.                     ReceiveOffset()
  233.                     SaveToFile()
  234.                     break
  235.                 elseif event[2] == 19 then          -- R - refresh
  236.                     break
  237.                 elseif event[2] == 45 then          -- X - shutdown
  238.                     Shutdown()
  239.                 end
  240.                 local timeout2 = os.startTimer(REFRESH_RATE)
  241.  
  242.             elseif event[1] == "timer" and event[2] == timeout then
  243.                 break
  244.             end
  245.         end
  246.     end
  247. end
  248.  
  249. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement