Advertisement
alsacchi

test.lua

Jan 31st, 2022
709
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.96 KB | None | 0 0
  1. Chest = {name = "", itemList = {}, wrap = nil, maxslots = 0}
  2.  
  3. function Chest:new(o, name)
  4.    o = o or {}
  5.    setmetatable(o, self)
  6.    self.__index = self
  7.    self.name = name or ""
  8.    return o
  9. end
  10.  
  11. function Chest:init()
  12.     self.itemList = {}
  13.     for slot, item in pairs(self.wrap.list()) do
  14.         --print(("%s:%d in slot %d"):format(item.name, item.count, slot))
  15.         if self.itemList[item.name] == nil then
  16.             self.itemList[item.name] = { slot = { slot }, itemCount = item.count }
  17.         else
  18.             table.insert(self.itemList[item.name]["slot"], slot)
  19.             self.itemList[item.name].itemCount = self.itemList[item.name].itemCount + item.count
  20.          end
  21.     end
  22.     self.maxslots = self.wrap.size()
  23. end
  24.  
  25. function Chest:connect()
  26.     self.wrap = peripheral.wrap(self.name)
  27. end
  28.  
  29. function Chest:print()
  30.     for k, v in self:sortedPairs(self.itemList) do
  31.         textutils.pagedPrint(("%s : %d"):format(k, v.itemCount))
  32.     end
  33. end
  34.  
  35. function Chest:printItem(name)
  36.     textutils.pagedPrint(("Item %s => %s"):format(name, textutils.serialise(self.itemList[name])))
  37. end
  38.  
  39. function Chest:findFreeSlot()
  40.     slot = 0
  41.     for i, k in ipairs(self.wrap.list()) do
  42.         slot = i
  43.     end
  44.     if (slot + 1) < self.maxslots then
  45.         slot = slot + 1
  46.     else
  47.         slot = -1
  48.     end
  49.     return slot
  50. end
  51.  
  52. function Chest:moveFromSlotToOtherSlot(name, slot1, slot2)
  53.     return self.wrap.pushItems(name, slot1, 64, slot2)
  54. end
  55.  
  56. function Chest:moveFromSlotToSlot(slot1, slot2)
  57.     name = self.wrap.getItemDetail(slot1).name
  58.     print(("Moving %s from %d to %d"):format(name, slot1, slot2))
  59.     key = self:findKeyFromValueItem(name, slot1)
  60.     if key ~= nil then
  61.         self.itemList[name].slot[key] = slot2
  62.     end
  63.     return self:moveFromSlotToOtherSlot(self.name, slot1, slot2)
  64. end
  65.  
  66. function Chest:sortedPairs(tab)
  67.     local keys = {}
  68.     for k in pairs(tab) do
  69.         keys[#keys + 1] = k
  70.     end
  71.     table.sort(keys, function(a, b) return tab[a].itemCount > tab[b].itemCount end)
  72.     local j = 0
  73.     return
  74.         function()
  75.             j = j + 1
  76.             local k = keys[j]
  77.             if k ~= nil then
  78.                 return k, tab[k]
  79.         end
  80.     end
  81. end
  82.  
  83. function Chest:findKeyFromValueItem(itemName, value)
  84.     for k,v in pairs(self.itemList[itemName].slot) do
  85.         if v==value then return k end
  86.       end
  87.       return nil
  88. end
  89.  
  90. function Chest:sort()
  91.     slotN = 1
  92.     stop = false
  93.     for itemName, item in self:sortedPairs(self.itemList) do
  94.         increased = false
  95.         if stop or (slotN > self.maxslots) then
  96.             break
  97.         end
  98.         for _, itemSlot in pairs(item.slot) do
  99.             increased = false
  100.             freeSlot = self:findFreeSlot()
  101.             if freeSlot == -1 then
  102.                 print("Can't sort without at least one free slot!")
  103.                 stop = true
  104.                 break
  105.             end
  106.             if (self.wrap.getItemDetail(slotN) ~= nil) and (itemSlot ~= slotN) then
  107.                 self:moveFromSlotToSlot(slotN, freeSlot)
  108.             end
  109.            
  110.             self:moveFromSlotToSlot(itemSlot, slotN)
  111.             if (self.wrap.getItemDetail(itemSlot) ~= nil) and (itemSlot ~= (slotN)) then
  112.                 print(("Adding padding %d"):format(itemSlot))
  113.                 table.insert(item.slot, itemSlot)
  114.             end
  115.             if self.wrap.getItemDetail(slotN).count >= self.wrap.getItemDetail(slotN).maxCount then
  116.                 slotN = slotN + 1
  117.                 increased = true
  118.                 print("Increasing slotN")
  119.             end
  120.  
  121.         end
  122.         if increased == false then
  123.             slotN = slotN + 1
  124.         end
  125.         self:init()
  126.     end
  127. end
  128.  
  129. chest = Chest:new{name = "expandedstorage:chest_1"}
  130.  
  131. chest:connect()
  132. chest:init()
  133. --chest:print()
  134. chest:sort()
  135. --chest:printItem("minecraft:redstone")
  136. print(("First free slot found: %d"):format(chest:findFreeSlot()))
  137.  
  138. --print(chest:moveFromSlotToSlot(1, 2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement