Advertisement
Doob

[OpenComputers] smart_tube (glasses)

Dec 3rd, 2015
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.60 KB | None | 0 0
  1. local component = require('component')
  2. local transposer = component.transposer
  3. local buffer = 3
  4. local tItems = {}
  5.  
  6. local function refresh() -- обновление информации о всех предметах во всех хранилищах
  7.   tItems = {}
  8.   for side = 0, 5 do
  9.     if side ~= buffer and transposer.getInventorySize(side) then
  10.       for slot = 1, transposer.getInventorySize(side) do
  11.         local item = transposer.getStackInSlot(side, slot)
  12.         if item ~= nil then
  13.           if not tItems[item.label] then
  14.             tItems[item.label] = {}
  15.           end
  16.           if not tItems[item.label][side] then
  17.             tItems[item.label][side] = {}
  18.           end
  19.           if not tItems[item.label][6] then
  20.             tItems[item.label][6] = 0
  21.           end
  22.           tItems[item.label][6] = tItems[item.label][6] + item.size
  23.           if item.size == nil then
  24.             tItems[item.label][side][slot] = 0
  25.           else
  26.             tItems[item.label][side][slot] = item.size
  27.           end
  28.         end
  29.       end
  30.     end
  31.   end
  32. end
  33.  
  34. local function counter(item) -- счетчик предметов определенного типа
  35.   local count = 0
  36.   for side = 0, 5 do
  37.     if side ~= buffer and transposer.getInventorySize(side) then
  38.       if tItems[item] ~= nil then
  39.         if tItems[item][side] ~= nil then
  40.           for slot = 1, #tItems[item][side] do
  41.             count = count + tItems[item][side][slot]
  42.           end
  43.         end
  44.       end
  45.     end
  46.   end
  47.   tItems[item][6] = count
  48.   return count
  49. end
  50.  
  51. local function fromBuffer() -- перемещение всех предметов из буфера в хранилища
  52.   for side = 0, 5 do
  53.     if side ~= buffer and transposer.getInventorySize(side) then
  54.       for i = 1, transposer.getInventorySize(buffer) do
  55.         transposer.transferItem(buffer, side)
  56.       end
  57.     end
  58.   end
  59. end
  60.  
  61. local function toBuffer(item, amount) -- перемещение заданного предмета из хранилищ в буфер
  62.   if tItems[item][6] >= amount then
  63.     for side = 0, 5 do
  64.       if side ~= buffer and transposer.getInventorySize(side) then
  65.         if tItems[item] ~= nil then
  66.           if tItems[item][side] ~= nil then
  67.             for slot = 1, #tItems[item][side] do
  68.               if tItems[item][side][slot] ~= nil then
  69.                 if tItems[item][side][slot] >= amount then
  70.                   transposer.transferItem(side, buffer, amount, slot)
  71.                   tItems[item][side][slot] = tItems[item][side][slot] - amount
  72.                   tItems[item][6] = tItems[item][6] - amount
  73.                   return true
  74.                 elseif tItems[item][side][slot] <= amount then
  75.                   transposer.transferItem(side, buffer, tItems[item][side][slot], slot)
  76.                   tItems[item][6] = tItems[item][6] - tItems[item][side][slot]
  77.                   amount = amount - tItems[item][side][slot]
  78.                 end
  79.                 if amount == 0 then
  80.                   return true
  81.                 end
  82.               end
  83.             end
  84.           end
  85.         end
  86.       end
  87.     end
  88.   else
  89.     return false
  90.   end
  91. end
  92.  
  93. local bridge = component.openperipheral_bridge
  94. local unicode = require('unicode')
  95. local event = require('event')
  96. local tList = {}
  97.  
  98. local page = 0
  99.  
  100. local tHelp = {
  101.   {20, 50, '$$< или $$>'},
  102.   {20, 60, '$$G [номер] [количество]'},
  103.   {20, 70, '$$R'},
  104.   {20, 80, '$$B'},
  105.   {200, 50, 'листать список предметов'},
  106.   {200, 60, 'получить предмет'},
  107.   {200, 70, 'обновить информацию о предметах'},
  108.   {200, 80, 'загрузить предметы из буфера'}
  109. }
  110.  
  111. local tbl = {}
  112. local k = 120
  113. for j = 1, 10 do
  114.   tbl[j] = {13, k}
  115.   tbl[j+10] = {218, k}
  116.   k = k + 15
  117. end
  118.  
  119. local function ref(svx)
  120.   if svx then
  121.     refresh()
  122.   end
  123.   tList = {}
  124.   for i, j in pairs(tItems) do
  125.     table.insert(tList, i)
  126.   end
  127. end
  128.  
  129. local function writeH()
  130.   bridge.addBox(10, 30, 400, 80, 0x000000).setOpacity(70)
  131.   bridge.addText(13, 35, 'Введите команду в чате', 0x008888)
  132.   for i = 1, #tHelp do
  133.     bridge.addText(tHelp[i][1], tHelp[i][2], tHelp[i][3], 0xCCCCCC)
  134.   end
  135. end
  136.  
  137. local function writeI()
  138.   local color = 0x000000
  139.   for b = 116, 251, 15 do
  140.     if color == 0x000000 then
  141.       color = 0x444444
  142.     else
  143.       color = 0x000000
  144.     end
  145.     bridge.addBox(10, b, 196, 15, color).setOpacity(70)
  146.     bridge.addBox(214, b, 196, 15, color).setOpacity(70)
  147.   end
  148.  
  149.   for i = 1+page, #tbl+page do
  150.     if tList[i] ~= nil then
  151.       bridge.addText(tbl[i][1], tbl[i][2], i .. '', 0xFFFF00)
  152.       bridge.addText(tbl[i][1]+23, tbl[i][2], tItems[tList[i]][6] .. '', 0x00FF00)
  153.       bridge.addText(tbl[i][1]+52, tbl[i][2], unicode.sub(tList[i], 1, 23), 0x00FFFF)
  154.     end
  155.   end
  156. end
  157.  
  158. local function main()
  159.   while 1 do
  160.     bridge.clear()
  161.     writeH()
  162.     writeI()
  163.     bridge.sync()
  164.     local e = {event.pull('glasses_chat_command')}
  165.     local cmd = string.upper(string.sub(e[5], 1, 1))
  166.     if cmd == '>' then
  167.       if tList[page+20] ~= nil then
  168.         page = page + 20
  169.       end
  170.     elseif cmd == '<' then
  171.       if tList[page-20] ~= nil then
  172.         page = page - 20
  173.       end
  174.     elseif cmd == 'G' then
  175.       local number, amount = string.match(string.sub(e[5], 2, #e[5]), '([0-9]+) ([0-9]+)')
  176.       toBuffer(tList[tonumber(number)+page], tonumber(amount))
  177.       ref()
  178.     elseif cmd == 'B' then
  179.       fromBuffer()
  180.       ref(true)
  181.     elseif cmd == 'R' then
  182.       ref(true)
  183.     end
  184.   end
  185. end
  186.  
  187. ref(true)
  188. print('готов к работе')
  189.  
  190. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement