Advertisement
lauserloss

management

Jan 2nd, 2023 (edited)
1,059
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.76 KB | None | 0 0
  1. local setAPI = require('./apis/setAPI')
  2. local tableAPI = require('./apis/tableAPI')
  3. local settings = require('inventoryManagementSettings')
  4. local completion = require('cc.completion')
  5.  
  6. local Management = {}
  7.  
  8. function Management:new()
  9.     setmetatable(self, Management)
  10.  
  11.     self.peripherals = nil
  12.     self.input = nil
  13.     self.output = nil
  14.     self.items = nil
  15.  
  16.     return self
  17. end
  18.  
  19. -- Create inventory set
  20. function Management:getPeripherals()
  21.     local peripheralNames = peripheral.getNames('inventory')
  22.  
  23.     self.peripherals = Set.new(peripheralNames)
  24.  
  25.     for k, _ in pairs(self.peripherals) do
  26.         if not peripheral.hasType(k, 'inventory') then
  27.             self.peripherals[k] = nil
  28.         end
  29.     end
  30.  
  31.     -- remove local inventories
  32.     local directions = { 'bottom', 'top', 'left', 'right', 'front', 'back' }
  33.  
  34.     for _, v in ipairs(directions) do
  35.         self.peripherals[v] = nil
  36.     end
  37.  
  38.     -- get input chest
  39.     self.peripherals[settings.input.name] = nil
  40.     self.input = peripheral.wrap(settings.input.name)
  41.  
  42.     -- get output chest
  43.     self.peripherals[settings.output.name] = nil
  44.     self.output = peripheral.wrap(settings.output.name)
  45. end
  46.  
  47. function Management:getInventories()
  48.     local inventories
  49.  
  50.     inventories = tableAPI.deepcopy(self.peripherals)
  51.  
  52.     for k, v in pairs(inventories) do
  53.         local tempPeripheral = peripheral.wrap(k)
  54.         inventories[k] = { chest = tempPeripheral, size = tempPeripheral.size() }
  55.     end
  56.  
  57.     return inventories
  58. end
  59.  
  60. -- add to item list {name = item_name, inv_name = inventory_name, peripheral = peripheral, slot = slot, count = count, nbt = nbt}
  61. function Management:addItem(item)
  62.     if self.items[item.name] == nil then
  63.         self.items[item.name] = {}
  64.     end
  65.  
  66.     if self.items[item.name]['inventories'] == nil then
  67.         self.items[item.name]['inventories'] = {}
  68.     end
  69.  
  70.     if self.items[item.name]['inventories'][item.inv_name] == nil then
  71.         self.items[item.name]['inventories'][item.inv_name] = { peripheral = item.peripheral,
  72.             inventory = {} }
  73.     end
  74.  
  75.     self.items[item.name]['inventories'][item.inv_name]['inventory'][item.slot] = { count = item.count,
  76.         nbt = item.nbt }
  77. end
  78.  
  79. -- create item list
  80. function Management:getItems()
  81.     local inventories
  82.  
  83.     inventories = tableAPI.deepcopy(self.peripherals)
  84.  
  85.     for k, v in pairs(inventories) do
  86.         local tempPeripheral = peripheral.wrap(k)
  87.         local tempInventory = tempPeripheral.list()
  88.         inventories[k] = { chest = tempPeripheral, size = tempPeripheral.size(), inventory = {} }
  89.         for slot, item in pairs(tempInventory) do
  90.             inventories[k]['inventory'][slot] = {}
  91.             inventories[k]['inventory'][slot].name = tempInventory[slot].name
  92.             inventories[k]['inventory'][slot].count = tempInventory[slot].count
  93.             inventories[k]['inventory'][slot].nbt = tempInventory[slot].nbt
  94.         end
  95.     end
  96.  
  97.     self.items = {}
  98.  
  99.     for k_chest, v_perinv in pairs(inventories) do
  100.         for k_slot, v_itemdetail in pairs(v_perinv.inventory) do
  101.             self:addItem({ name = v_itemdetail.name,
  102.                 inv_name = k_chest,
  103.                 peripheral = v_perinv.chest,
  104.                 slot = k_slot,
  105.                 count = v_itemdetail.count,
  106.                 nbt = v_itemdetail.nbt })
  107.         end
  108.     end
  109. end
  110.  
  111. function Management:sort()
  112.     local lastItem = nil
  113.     local lastInventory = nil
  114.     local lastSlot = nil
  115.     local lastSlotInfo = nil
  116.     local lastSlotFree = nil
  117.     local lastSlotFull = false
  118.     local empty = false
  119.     for k_item, v_invs in pairs(self.items) do
  120.         for k_inv, v_inv_info in pairs(v_invs.inventories) do
  121.             for k_slot, v_slot_info in pairs(v_inv_info.inventory) do
  122.                 local itemDetail = v_inv_info.peripheral.getItemDetail(k_slot)
  123.                 local freeAmount = itemDetail.maxCount - itemDetail.count
  124.                 local pushedAmount = 0
  125.                 if freeAmount > 0 then
  126.                     if lastItem == k_item then
  127.                         if lastSlotInfo.nbt == v_slot_info.nbt then
  128.                             if lastSlotFree > itemDetail.count then
  129.                                 pushedAmount = itemDetail.count
  130.                                 empty = true
  131.                             elseif lastSlotFree == itemDetail.count then
  132.                                 pushedAmount = itemDetail.count
  133.                                 empty = true
  134.                                 lastSlotFull = true
  135.                             else
  136.                                 pushedAmount = lastSlotFree
  137.                                 lastSlotFull = true
  138.                             end
  139.                             v_inv_info.peripheral.pushItems(lastInventory, k_slot, pushedAmount, lastSlot)
  140.                             self.items[k_item]['inventories'][lastInventory]['inventory'][lastSlot]['count'] =
  141.                             self.items[k_item]['inventories'][lastInventory]['inventory'][lastSlot]['count'] +
  142.                                 pushedAmount
  143.  
  144.                             if not empty then
  145.                                 self.items[k_item]['inventories'][k_inv]['inventory'][k_slot]['count'] =
  146.                                 self.items[k_item]['inventories'][k_inv]['inventory'][k_slot]['count'] - pushedAmount
  147.                             else
  148.                                 self.items[k_item]['inventories'][k_inv]['inventory'][k_slot] = nil
  149.                                 local chest_empty = true
  150.                                 for k, v in pairs(self.items[k_item]['inventories'][k_inv]['inventory']) do
  151.                                     chest_empty = false
  152.                                     break
  153.                                 end
  154.                                 if chest_empty then
  155.                                     self.items[k_item]['inventories'][k_inv] = nil
  156.                                 end
  157.                             end
  158.                         end
  159.                     end
  160.  
  161.                     if not empty then
  162.                         lastSlotFree = freeAmount + pushedAmount
  163.                         lastSlotInfo = v_slot_info
  164.                         lastSlot = k_slot
  165.                         lastInventory = k_inv
  166.                         lastItem = k_item
  167.                     elseif lastSlotFull then
  168.                         lastSlotFree = nil
  169.                         lastSlotInfo = nil
  170.                         lastSlot = nil
  171.                         lastInventory = nil
  172.                         lastItem = nil
  173.                     else
  174.                         lastSlotFree = lastSlotFree - pushedAmount
  175.                     end
  176.                     empty = false
  177.                     lastSlotFull = false
  178.                 else
  179.                 end
  180.             end
  181.         end
  182.     end
  183. end
  184.  
  185. -- create item list
  186. function Management:count()
  187.     local count = 0
  188.     for k_item, v_invs in pairs(self.items) do
  189.         count = 0
  190.         for k_inv, v_inv_info in pairs(v_invs.inventories) do
  191.             for k_slot, v_slot_info in pairs(v_inv_info.inventory) do
  192.                 itemDetail = v_inv_info.peripheral.getItemDetail(k_slot)
  193.                 count = count + itemDetail.count
  194.             end
  195.         end
  196.         self.items[k_item]['count'] = count
  197.     end
  198. end
  199.  
  200. -- find empty slot
  201. function Management:getEmptySlot()
  202.     local found = nil
  203.     for k_inv, v_inv_info in pairs(self:getInventories()) do
  204.         local lastSlot = 0
  205.         for k_slot in ipairs(v_inv_info.chest.list()) do
  206.             if k_slot - lastSlot ~= 1 then
  207.                 break
  208.             else
  209.                 lastSlot = k_slot
  210.             end
  211.         end
  212.  
  213.         if lastSlot < v_inv_info.size then
  214.             found = { name = k_inv, peripheral = v_inv_info.chest, slot = lastSlot + 1 }
  215.             break
  216.         end
  217.     end
  218.     return found
  219. end
  220.  
  221. function Management:insert(item)
  222.     local empty = false
  223.  
  224.     local remaining = item.count
  225.  
  226.     if self.items[item.name] ~= nil then
  227.         for k_inv, v_inv_info in pairs(self.items[item.name].inventories) do
  228.             for k_slot, v_slot_info in pairs(v_inv_info.inventory) do
  229.                 local itemDetail = v_inv_info.peripheral.getItemDetail(k_slot)
  230.                 local freeAmount = itemDetail.maxCount - itemDetail.count
  231.                 local pushedAmount = 0
  232.  
  233.                 if freeAmount > 0 then
  234.                     if item.nbt == v_slot_info.nbt then
  235.                         if freeAmount > item.count then
  236.                             pushedAmount = item.count
  237.                             empty = true
  238.                         elseif freeAmount == item.count then
  239.                             pushedAmount = item.count
  240.                             empty = true
  241.                         else
  242.                             pushedAmount = freeAmount
  243.                         end
  244.                         item.peripheral.pushItems(k_inv, item.slot, pushedAmount, k_slot)
  245.                         remaining = remaining - pushedAmount
  246.  
  247.                         self.items[item.name]['inventories'][k_inv]['inventory'][k_slot]['count'] =
  248.                         self.items[item.name]['inventories'][k_inv]['inventory'][k_slot]['count'] +
  249.                             pushedAmount
  250.                     end
  251.                 end
  252.             end
  253.         end
  254.     end
  255.  
  256.     if remaining > 0 then
  257.         local emptySlot = self:getEmptySlot()
  258.         if emptySlot ~= nil then
  259.             item.peripheral.pushItems(emptySlot.name, item.slot, item.count, emptySlot.slot)
  260.             self:addItem({ name = item.name,
  261.                 inv_name = emptySlot.name,
  262.                 peripheral = emptySlot.peripheral,
  263.                 slot = emptySlot.slot,
  264.                 count = item.count,
  265.                 nbt = item.nbt })
  266.         else
  267.             print('Inventory full')
  268.         end
  269.     end
  270. end
  271.  
  272. -- import items
  273. function Management:import()
  274.     local empty = true
  275.     local inputItems = self.input.list()
  276.     for k, v in pairs(inputItems) do
  277.         empty = false
  278.         break
  279.     end
  280.     if empty then
  281.         return false
  282.     else
  283.         for k, v in pairs(inputItems) do
  284.             local item = v
  285.             item['slot'] = k
  286.             item['peripheral'] = self.input
  287.             self:insert(item)
  288.         end
  289.         self:getEmptySlot()
  290.         return true
  291.     end
  292. end
  293.  
  294. function Management:getItemList()
  295.     local list = ''
  296.     for k, v in pairs(self.items) do
  297.         list = list ..  string.format('%5dx %s \r\n', v.count, k)
  298.     end
  299.     return list
  300. end
  301.  
  302. function Management:readItem()
  303.     local items = {}
  304.     for k in pairs(self.items) do
  305.         table.insert(items, k)
  306.     end
  307.     return read(nil, nil, function(text) return completion.choice(text, items) end)
  308. end
  309.  
  310. return Management
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement