Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Chest = {name = "", itemList = {}, wrap = nil, maxslots = 0}
- function Chest:new(o, name)
- o = o or {}
- setmetatable(o, self)
- self.__index = self
- self.name = name or ""
- return o
- end
- function Chest:init()
- self.itemList = {}
- for slot, item in pairs(self.wrap.list()) do
- --print(("%s:%d in slot %d"):format(item.name, item.count, slot))
- if self.itemList[item.name] == nil then
- self.itemList[item.name] = { slot = { slot }, itemCount = item.count }
- else
- table.insert(self.itemList[item.name]["slot"], slot)
- self.itemList[item.name].itemCount = self.itemList[item.name].itemCount + item.count
- end
- end
- self.maxslots = self.wrap.size()
- end
- function Chest:connect()
- self.wrap = peripheral.wrap(self.name)
- end
- function Chest:print()
- for k, v in self:sortedPairs(self.itemList) do
- textutils.pagedPrint(("%s : %d"):format(k, v.itemCount))
- end
- end
- function Chest:printItem(name)
- textutils.pagedPrint(("Item %s => %s"):format(name, textutils.serialise(self.itemList[name])))
- end
- function Chest:findFreeSlot()
- slot = 0
- for i, k in ipairs(self.wrap.list()) do
- slot = i
- end
- if (slot + 1) < self.maxslots then
- slot = slot + 1
- else
- slot = -1
- end
- return slot
- end
- function Chest:moveFromSlotToOtherSlot(name, slot1, slot2)
- return self.wrap.pushItems(name, slot1, 64, slot2)
- end
- function Chest:moveFromSlotToSlot(slot1, slot2)
- name = self.wrap.getItemDetail(slot1).name
- print(("Moving %s from %d to %d"):format(name, slot1, slot2))
- key = self:findKeyFromValueItem(name, slot1)
- if key ~= nil then
- self.itemList[name].slot[key] = slot2
- end
- return self:moveFromSlotToOtherSlot(self.name, slot1, slot2)
- end
- function Chest:sortedPairs(tab)
- local keys = {}
- for k in pairs(tab) do
- keys[#keys + 1] = k
- end
- table.sort(keys, function(a, b) return tab[a].itemCount > tab[b].itemCount end)
- local j = 0
- return
- function()
- j = j + 1
- local k = keys[j]
- if k ~= nil then
- return k, tab[k]
- end
- end
- end
- function Chest:findKeyFromValueItem(itemName, value)
- for k,v in pairs(self.itemList[itemName].slot) do
- if v==value then return k end
- end
- return nil
- end
- function Chest:sort()
- slotN = 1
- stop = false
- for itemName, item in self:sortedPairs(self.itemList) do
- increased = false
- if stop or (slotN > self.maxslots) then
- break
- end
- for _, itemSlot in pairs(item.slot) do
- increased = false
- freeSlot = self:findFreeSlot()
- if freeSlot == -1 then
- print("Can't sort without at least one free slot!")
- stop = true
- break
- end
- if (self.wrap.getItemDetail(slotN) ~= nil) and (itemSlot ~= slotN) then
- self:moveFromSlotToSlot(slotN, freeSlot)
- end
- self:moveFromSlotToSlot(itemSlot, slotN)
- if (self.wrap.getItemDetail(itemSlot) ~= nil) and (itemSlot ~= (slotN)) then
- print(("Adding padding %d"):format(itemSlot))
- table.insert(item.slot, itemSlot)
- end
- if self.wrap.getItemDetail(slotN).count >= self.wrap.getItemDetail(slotN).maxCount then
- slotN = slotN + 1
- increased = true
- print("Increasing slotN")
- end
- end
- if increased == false then
- slotN = slotN + 1
- end
- self:init()
- end
- end
- chest = Chest:new{name = "expandedstorage:chest_1"}
- chest:connect()
- chest:init()
- --chest:print()
- chest:sort()
- --chest:printItem("minecraft:redstone")
- print(("First free slot found: %d"):format(chest:findFreeSlot()))
- --print(chest:moveFromSlotToSlot(1, 2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement