Advertisement
Guest User

1

a guest
Oct 21st, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.56 KB | None | 0 0
  1. local component = require("component")
  2. local computer = require("computer")
  3. local event = require("event")
  4. local term = require("term")
  5. local shell = require("shell")
  6. local fs = require("filesystem")
  7. local unicode = require("unicode")
  8. local serial = require("serialization")
  9. local data = component.database
  10. local gpu = component.gpu
  11. local transposer = component.transposer
  12.  
  13. require("durexdb")
  14. local dataBase = DurexDatabase:new()
  15.  
  16. local storages = {}
  17. local selectors = {}
  18. local items = {}
  19. local addressToSelector = {}
  20. gpu.setResolution(80,30)
  21.  
  22. local page = 0
  23. local sizeOfPage = 26
  24. local items_on_the_screen = {}
  25.  
  26. function loadSelectors()
  27.   file = io.open(shell.getWorkingDirectory() .. "/selectors.lua", "r")
  28.   local tempSelectors = serial.unserialize(file:read(999999))
  29.   file:close()
  30.   file = io.open(shell.getWorkingDirectory() .. "/addressToSelector.lua", "r")
  31.   local addresses = serial.unserialize(file:read(999999))
  32.   file:close()
  33.  
  34.   for i=1,#tempSelectors do
  35.     selectors[i] = component.proxy(tempSelectors[i])
  36.   end
  37.  
  38.   for k,v in pairs(addresses) do
  39.     addressToSelector[k] = component.proxy(v)
  40.   end
  41. end
  42.  
  43. function saveSelectors()
  44.   local addresses = {}
  45.   for k,v in pairs( addressToSelector) do
  46.     addresses[k] = v.address
  47.   end
  48.   local tempSelectors = {}
  49.   for i=1,#selectors do
  50.     tempSelectors[i] = selectors[i].address
  51.   end
  52.   file = io.open(shell.getWorkingDirectory() .. "/selectors.lua", "w")
  53.   file:write(serial.serialize(tempSelectors))
  54.   file:close()
  55.   file = io.open(shell.getWorkingDirectory() .. "/addressToSelector.lua", "w")
  56.   file:write(serial.serialize(addresses))
  57.   file:close()
  58. end
  59.  
  60. function showItems()
  61.   for i=1,#selectors do
  62.     selectors[i].setSlots({})
  63.   end
  64.   local selectorNumber = 1
  65.   local indexSelector = 1
  66.   for i=1,#items_on_the_screen do
  67.     local item = {}
  68.     item.id,item.dmg = parseToIdAndDamage(items_on_the_screen[i][3])
  69.     selectors[selectorNumber].setSlot(indexSelector,item)
  70.     indexSelector = indexSelector + 1
  71.     if (indexSelector == 10 )then
  72.       indexSelector = 1
  73.       selectorNumber = selectorNumber + 1
  74.     end
  75.   end
  76. end
  77.  
  78. function customizeSelectors()
  79.   local x = 1
  80.   local tempStorages = component.list('openperipheral_selector')
  81.   local tempSelectors = {}
  82.   for k,v in pairs(tempStorages) do
  83.     component.setPrimary(v,k)
  84.     while(component.isAvailable('openperipheral_selector') == false)  do
  85.       os.sleep(0.05)
  86.     end
  87.     tempSelectors[x] = component.openperipheral_selector
  88.     x=x+1
  89.   end
  90.  
  91.   for i=1,#tempSelectors do
  92.     print('selector #'..i)
  93.     local _,_,a = event.pull('slot_click')
  94.     local realA = ''
  95.     for j=1,#tempSelectors do
  96.       if (tempSelectors[j].getSlot(1)) then
  97.         selectors[i] = tempSelectors[j]
  98.         addressToSelector[a] = tempSelectors[j]
  99.         break
  100.       end
  101.     end
  102.   end
  103. end
  104.  
  105.  
  106. function ItemToString(name,dmg)
  107.     local item = {}
  108.     item.name = name
  109.     item.dmg = dmg
  110.     return serial.serialize(item)
  111.   end
  112.  
  113. function getClickedItems(slot,address)
  114.   local item = addressToSelector[address].getSlot(slot)
  115.   local count = 0
  116.   local tempName = ItemToString(item.id,item.dmg)
  117.   local id = item.id
  118.   local damage = item.dmg
  119.   for k,v in pairs(items_on_the_screen) do
  120.     if (k == tempName) then
  121.       count = v[2]
  122.     end
  123.   end
  124.   if (count == 0) then return end
  125.  
  126.   gpu.setBackground(0xbbbbbb)
  127.   gpu.fill(28,10,24,8,' ')
  128.   gpu.setBackground(0x111111)
  129.   gpu.fill(30,11,20,6,' ')
  130.   gpu.setForeground(0xffffff)
  131.   gpu.set(35,11,"Max count")
  132.   gpu.set(37,12,tostring(count))
  133.   gpu.set(34,14,"Input count")
  134.   gpu.setBackground(0x666666)
  135.   gpu.setForeground(0xffffff)
  136.   gpu.fill(37,15,5,1,' ')
  137.   local str = ''
  138.   while true do
  139.     local _,_,asci = event.pull('key_down')
  140.     if (asci == 13) then
  141.       if (str == '' or tonumber(str) == 0) then
  142.         drawItems()
  143.         break
  144.       else
  145.         getItem(id,damage,tonumber(str))
  146.         drawItems()
  147.         break
  148.       end
  149.     elseif (asci == 8 ) then
  150.       gpu.fill(37,15,5,1,' ')
  151.       str = unicode.sub(str,1,unicode.len(str)-1)
  152.       gpu.set(37,15,str)
  153.     elseif (asci>=48 and asci<=57) then
  154.       str = str .. unicode.char(asci)
  155.       gpu.set(37,15,str)
  156.     end
  157.   end
  158. end
  159.  
  160. function parseToIdAndDamage(name)
  161.   local id_with_damage = name
  162.   local words = {}
  163.   local id = ''
  164.   for w in (id_with_damage .. ":"):gmatch("([^:]*):") do
  165.     table.insert(words, w)
  166.   end
  167.   for i=1,#words-1 do
  168.     id = id .. words[i]
  169.     if (i<#words-1) then
  170.       id = id..':'
  171.     end
  172.   end
  173.   local damage = tonumber(words[#words])
  174.   return id,damage
  175. end
  176. loadSelectors()
  177.  
  178. function drawItems()
  179.   items_on_the_screen = getAllItemsFromDataBase()
  180.   gpu.setBackground(0x111111)
  181.   gpu.fill(23,3,56,27,' ')
  182.   local i = 1
  183.   local sleep = page * 26
  184.   for k,v in pairs(items_on_the_screen) do
  185.     if sleep > 0 then
  186.       sleep = sleep - 1
  187.     else
  188.       if (i == 27) then
  189.         break
  190.       end
  191.       v[3] = i
  192.       if i%2 == 1 then
  193.         gpu.setBackground(0x333333)
  194.       else
  195.         gpu.setBackground(0x555555)
  196.       end
  197.       gpu.setForeground(0xffffff)
  198.       gpu.fill(25,i+2,52,1,' ')
  199.       gpu.set(25,i+2,v[1])
  200.       gpu.set(60,i+2,tostring(v[2]))
  201.       gpu.setForeground(0x00ff00)
  202.       gpu.set(74,i+2,'Get')
  203.       gpu.setForeground(0xff0000)
  204.       gpu.set(73,i+2,'N')
  205.       i = i + 1
  206.     end
  207.   end
  208. end
  209.  
  210. function drawInterface()
  211.   setData()
  212.   gpu.setBackground(0xbbbbbb)
  213.   term.clear()
  214.   gpu.setBackground(0x111111)
  215.   gpu.fill(3,2,19,16,' ')
  216.   gpu.fill(23,2,56,28,' ')
  217.   gpu.setForeground(0xffffff)
  218.   gpu.fill(3,27,9,3,' ')
  219.   gpu.set(5,28,'<----')
  220.   gpu.fill(13,27,9,3,' ')
  221.   gpu.set(15,28,'---->')
  222.   gpu.setForeground(0xff0000)
  223.   gpu.set(25,2,'Name')
  224.   gpu.set(60,2,'Count')
  225.   gpu.set(72,2,'Query')
  226.   gpu.setForeground(0xffffff)
  227.   gpu.fill(3,23,19,3,' ')
  228.   gpu.set(7,24,'Clear chest')
  229.   gpu.fill(3,19,19,3,' ')
  230.   gpu.set(7,20,'Show Items')
  231.   drawItems()
  232. end
  233.  
  234.  
  235.  
  236. function setData()
  237.   dataBase:setData(items)
  238. end
  239.  
  240. function getAllItemsFromDataBase()
  241.   return dataBase:getAllItems()
  242. end
  243.  
  244. function saveItems()
  245.   file = io.open(shell.getWorkingDirectory() .. "/Chest.lua", "w")
  246.   file:write(serial.serialize(items))
  247.   file:close()
  248. end
  249.  
  250. function loadItems()
  251.   file = io.open(shell.getWorkingDirectory() .. "/Chest.lua", "r")
  252.   items = serial.unserialize(file:read(999999))
  253.   file:close()
  254. end
  255.  
  256. function loadItemNames()
  257.   dataBase:loadItemsNames()
  258. end
  259.  
  260. function customizeStorage()
  261.   local x = 1
  262.   local tempStorages = component.list('transposer')
  263.   local isTransposer = true
  264.   while (isTransposer) do
  265.     for k,v in pairs(tempStorages) do
  266.       isTransposer = false
  267.       component.setPrimary(v,k)
  268.       while(component.isAvailable('transposer') == false) do
  269.         os.sleep(0.05)
  270.       end
  271.       if (component.transposer.getStackInSlot(1,1)) then
  272.         component.transposer.transferItem(1,0,64,1,1)
  273.         storages[x] = component.transposer
  274.         isTransposer = true
  275.         x=x+1
  276.         break
  277.       end
  278.     end
  279.   end
  280. end
  281.  
  282. customizeStorage()
  283. loadItemNames()
  284. function getAllItems()
  285.   for i=1,#storages do
  286.     items[i] = {}
  287.     for j=1,3 do
  288.       items[i][j] = {}
  289.       getItemsOfStorage(i,j)
  290.     end
  291.   end
  292. end
  293. function getItemsOfStorage(x,y)
  294.   for i=1,storages[x].getInventorySize(y+1) do
  295.     local tempItem = storages[x].getStackInSlot(y+1,i)
  296.     if (tempItem) then
  297.       items[x][y][i]=tempItem
  298.     else
  299.       items[x][y][i]= {}
  300.       items[x][y][i].damage =0
  301.       items[x][y][i].name = "0"
  302.       items[x][y][i].size = "0"
  303.     end
  304.   end
  305. end
  306.  
  307. function getItemFromSlot(storageX,side,index,count)
  308.   storages[storageX].transferItem(side,1,count,index)
  309.   if (side ~= 0) then
  310.     local temp_item = storages[storageX].getStackInSlot(side,index)
  311.     if (temp_item) then
  312.       items[storageX][side-1][index].size = temp_item.size
  313.     end
  314.   end
  315.   if (storageX>1) then
  316.     getItemFromSlot(storageX-1,0,1,count)
  317.   end
  318. end
  319.  
  320. function setNameToItem(id,name)
  321.   dataBase:setNameForItem(id,name)
  322. end
  323.  
  324. function getItem(id,damage,count)
  325.   local slots = dataBase:getItems(id,damage,count)
  326.   if not slots then
  327.     return
  328.   end
  329.   for i=1,#slots do
  330.     getItemFromSlot(slots[i][1],slots[i][2],slots[i][3],slots[i][4])
  331.   end
  332.   saveItems()
  333.   setData()
  334. end
  335.  
  336. function transferItemBack(slot,chest_x,side,index,count,level)
  337.   if (level < chest_x) then
  338.     storages[level].transferItem(1,0,count,slot,1)
  339.     transferItemBack(1,chest_x,side,index,count,level+1)
  340.   else
  341.     storages[level].transferItem(1,side,count,slot,index)
  342.     local tempItem = storages[chest_x].getStackInSlot(side,index)
  343.     items[chest_x][side-1][index].size = tempItem.size
  344.     items[chest_x][side-1][index].damage = tempItem.damage
  345.     items[chest_x][side-1][index].name = tempItem.name
  346.     items[chest_x][side-1][index].name = tempItem.name
  347.     items[chest_x][side-1][index].name = tempItem.name
  348.     saveItems()
  349.   end
  350. end
  351.  
  352. function pushItems()
  353.   local availableSlots = dataBase:getAvailableSlot()
  354.   local caret = 1
  355.   for i=1,storages[1].getInventorySize(1) do
  356.     local tempItem = storages[1].getStackInSlot(1,i)
  357.     if (tempItem) then
  358.       if (tempItem.size < tempItem.maxSize) then
  359.         storages[1].store(1,i,data.address,1)
  360.         local slots = dataBase:getNotFullSlot(tempItem.name,tempItem.damage,tempItem.maxSize)
  361.         local flag = true
  362.         for j=1,#slots do
  363.           if (storages[slots[j][1]].compareStackToDatabase(slots[j][2],slots[j][3],data.address,1,true)) then
  364.             local count = tempItem.maxSize - storages[slots[j][1]].getStackInSlot(slots[j][2],slots[j][3]).size
  365.             transferItemBack(i,slots[j][1],slots[j][2],slots[j][3],count,1)
  366.             tempItem.size = tempItem.size - count
  367.             if (tempItem.size <=0) then
  368.               flag = false
  369.               break
  370.             end
  371.           end
  372.         end
  373.         if flag then
  374.           slot = availableSlots[caret]
  375.           caret = caret + 1
  376.           transferItemBack(i,slot[1],slot[2],slot[3],64,1)
  377.         end
  378.       else
  379.         slot = availableSlots[caret]
  380.         caret = caret + 1
  381.         transferItemBack(i,slot[1],slot[2],slot[3],64,1)
  382.       end
  383.     end
  384.   end
  385.   saveItems()
  386.   setData()
  387. end
  388. loadItems()
  389.  
  390. drawInterface()
  391. function isClicked(x1,y1,x2,y2,x,y)
  392.   return (x>=x1 and y>=y1 and x<=x2 and y<=y2)
  393. end
  394. while true do
  395.   local e,c,x,y,_,p = event.pull(3)
  396.   if e == 'touch' then
  397.     if (isClicked(3,27,11,29,x,y)) then
  398.       page = page - 1
  399.       drawItems()
  400.     elseif (isClicked(13,27,21,29,x,y)) then
  401.       page = page + 1
  402.       drawItems()
  403.     elseif (isClicked(3,23,21,25,x,y)) then
  404.       pushItems()
  405.       drawItems()
  406.     elseif (isClicked(74,3,76,2+sizeOfPage,x,y)) then
  407.       for k,v in pairs(items_on_the_screen) do
  408.         if (v[3] == y-2) then
  409.           local tempItemWithStats = serial.unserialize(k)
  410.           local id = tempItemWithStats.name
  411.           local damage = tonumber(tempItemWithStats.dmg)
  412.           gpu.setBackground(0xbbbbbb)
  413.           gpu.fill(28,10,24,8,' ')
  414.           gpu.setBackground(0x111111)
  415.           gpu.fill(30,11,20,6,' ')
  416.           gpu.setForeground(0xffffff)
  417.           gpu.set(35,11,"Max count")
  418.           gpu.set(37,12,tostring(v[2]))
  419.           gpu.set(34,14,"Input count")
  420.           gpu.setBackground(0x666666)
  421.           gpu.setForeground(0xffffff)
  422.           gpu.fill(37,15,5,1,' ')
  423.           local str = ''
  424.           while true do
  425.             local _,_,asci = event.pull('key_down')
  426.             if (asci == 13) then
  427.               if (str == '' or tonumber(str) == 0) then
  428.                 drawItems()
  429.                 break
  430.               else
  431.                 getItem(id,damage,tonumber(str))
  432.                 drawItems()
  433.                 break
  434.               end
  435.             elseif (asci == 8 ) then
  436.               gpu.fill(37,15,5,1,' ')
  437.               str = unicode.sub(str,1,unicode.len(str)-1)
  438.               gpu.set(37,15,str)
  439.             elseif (asci>=48 and asci<=57) then
  440.               str = str .. unicode.char(asci)
  441.               gpu.set(37,15,str)
  442.             end
  443.           end
  444.           break
  445.         end
  446.       end
  447.     elseif (isClicked(73,3,73,2+sizeOfPage,x,y)) then
  448.       local id_with_damage = items_on_the_screen[y-2][3]
  449.       if (y-2)%2 == 1 then
  450.         gpu.setBackground(0x333333)
  451.       else
  452.         gpu.setBackground(0x555555)
  453.       end
  454.       gpu.fill(25,y,32,1,' ')
  455.       local str = ''
  456.       while true do
  457.         local _,_,asci = event.pull('key_down')
  458.         if (asci == 13) then
  459.           if (str == '') then
  460.             drawItems()
  461.             break
  462.           else
  463.             setNameToItem(id_with_damage,str)
  464.             drawItems()
  465.             break
  466.           end
  467.         elseif (asci == 8 ) then
  468.           gpu.fill(25,y,32,1,' ')
  469.           str = unicode.sub(str,1,unicode.len(str)-1)
  470.           gpu.set(25,y,str)
  471.         elseif (asci ~= 0 ) then
  472.           str = str .. unicode.char(asci)
  473.           gpu.set(25,y,str)
  474.         end
  475.       end
  476.     elseif (isClicked(3,19,21,21,x,y)) then
  477.       showItems()
  478.     end
  479.   elseif (e=='slot_click') then
  480.     getClickedItems(c,x)
  481.   end
  482. end
  483. saveItems()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement