toastonrye

inventory

Jul 30th, 2022
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --cc:Tweaked: Turtle Inventory Management
  2. --pastebin get 8JaJH3g2 inventory.lua
  3. --inv=require("inventory")
  4. --chest=inv.wrap("left")
  5. --chest.count()
  6. --require("inventory").wrap("left").find("minecraft:redstone")
  7.  
  8. local inventory = {}
  9.  
  10. function stacksEqual(a,b)
  11.     if a==nil or b==nil then return false end
  12.  
  13.     if type(a) == "string" then a = {name=a} end
  14.     if type(b) == "string" then b = {name=b} end
  15.    
  16.     if a.damage == nil then a["damage"] = 0 end
  17.     if b.damage == nil then b["damage"] = 0 end
  18.    
  19.     return a.damage == b.damage and a.name == b.name
  20. end
  21.  
  22. local function extend(_count, _size, _detail, _list)
  23.     base = {}
  24.  
  25.     function base.list()
  26.         return _list()
  27.     end
  28.    
  29.     function base.size()
  30.         return _size()
  31.     end
  32.    
  33.     function base.item(slot)
  34.         return _list()[slot]
  35.     end
  36.    
  37.     function base.itemDetail(slot)
  38.         return _detail(slot)
  39.     end
  40.    
  41.     function base.counts()
  42.         counts = {}
  43.         for slot,item in pairs(_list()) do
  44.             local count = counts[item.name]
  45.             if count == nil then
  46.                 counts[item.name] = item.count
  47.             else
  48.                 counts[item.name] = item.count + count
  49.             end
  50.         end
  51.         return counts
  52.     end
  53.    
  54.     --item == nil: # of slots which contain items
  55.     --item == number: count of items in slot
  56.     --item == string: total count of items
  57.     --item == {item}: total count of items
  58.     function base.find(item)
  59.         for slot,cursor in pairs(_list()) do
  60.             if stacksEqual(item, cursor) then return true, slot, cursor.count end
  61.         end
  62.         return false
  63.     end
  64.  
  65.     function base.isFull()
  66.         return base.count() == _size()
  67.     end
  68.    
  69.     function base.count(item)
  70.         local count = 0
  71.  
  72.         if item == nil then
  73.             return #_list()
  74.         elseif
  75.             type(item) == "number" then return _count(item)
  76.         else
  77.             for _,cursor in pairs(_list()) do
  78.                 if stacksEqual(cursor, item) then
  79.                     count = count + cursor.count
  80.                 end
  81.             end
  82.             return count
  83.         end
  84.     end
  85.    
  86.     return base
  87. end
  88.  
  89. function inventory.wrap(side)
  90.  
  91.     local __wrapper = peripheral.wrap(side)
  92.     if __wrapper == nil then return nil end
  93.  
  94.     local chest = extend(
  95.         function(slot) local items = __wrapper.list() if items[slot] == nil then return 0 else return items[slot].count end end,
  96.         function() return __wrapper.size() end,
  97.         function(slot) return __wrapper.getItemDetail(slot) end,
  98.         function() return __wrapper.list() end
  99.     )
  100.    
  101.     chest.name = side
  102.    
  103.     --Moves an item from this inventory to another.
  104.     --[item | slot] = item can be item name or slot
  105.     function chest.push(to, item, count, toSlot)
  106.         if type(to) ~= "string" then to = to.name end
  107.         local total = 0
  108.        
  109.         if type(item) == "number" then
  110.             --push to slot
  111.             moved = __wrapper.pushItems(to,item,count,toSlot)
  112.            
  113.             if(count == nil) then
  114.                 return true
  115.             else
  116.                 total = total + moved
  117.                 return count == total,total
  118.             end
  119.         end
  120.        
  121.         local counted =  base.count(item)
  122.         if count == nil then count = counted end
  123.        
  124.         repeat
  125.             local found, slot, stack = base.find(item)
  126.             if(not found) then return false, total end
  127.             if stack > count - total then stack = count - total end
  128.             total = total + __wrapper.pushItems(to,slot,stack,toSlot)
  129.         until count == total
  130.         return true, total
  131.     end
  132.    
  133.     function chest.pull(from,item,count,toSlot)
  134.         if type(from) == "string" then from = inventory.wrap(from) end
  135.         return from.push(chest,item,count,toSlot)
  136.     end
  137.    
  138.     --Turtle can't interact directly with chests in this way in CC:Tweaked. Modem required.
  139.     --https://github.com/cc-tweaked/CC-Tweaked/discussions/601
  140.     function chest.put(item, count, toSlot)
  141.         error("Not Supported")
  142.     end
  143.  
  144.     function chest.get(item, count)
  145.         error("Not implemented")
  146.     end
  147.    
  148.     return chest
  149. end
  150.  
  151. if turtle == nil then return inventory end
  152.  
  153. local function tlist()
  154.     list={}
  155.     for s=1,16 do
  156.         local count = turtle.getItemCount(s)
  157.         if count > 0 then
  158.             list[s] = turtle.getItemDetail(s, false)
  159.         end
  160.     end
  161.     return list
  162. end
  163.  
  164. local t_inventory = extend(
  165.     turtle.getItemCount,
  166.     function () return 16 end,
  167.     turtle.getItemDetail,
  168.     tlist
  169. )
  170.  
  171. function t_inventory.compact()
  172.     local source = t_inventory.size()
  173.     local dest = 1
  174.     local count = t_inventory.count()
  175.    
  176.     for s=t_inventory.size(),2,-1 do
  177.         local source = turtle.getItemDetail(s)
  178.         if turtle.getItemCount(s) > 0 then
  179.             for d=1,s-1 do
  180.                 if turtle.getItemSpace(d) > 0 then
  181.                     local dest = turtle.getItemDetail(d)
  182.                     if dest == nil or stacksEqual(source,dest) then
  183.                         turtle.select(s)
  184.                         if turtle.transferTo(d) then
  185.                             if turtle.getItemCount() == 0 then break end
  186.                         end
  187.                     end
  188.                 end
  189.             end
  190.         end
  191.     end
  192.    
  193.     return t_inventory.count() ~= count
  194. end
  195.  
  196. function t_inventory.selected()
  197.     return turtle.getItemDetail()
  198. end
  199.  
  200. function t_inventory.depositAll(side)
  201.     local dropCount = 0
  202.    
  203.     local chest = inventory.getInventory(side)
  204.     if chest == nil then return 0 end  
  205.    
  206.     for n=1,INV_COUNT do
  207.         if inventory.getItemCount(n) > 0 then
  208.             turtle.select(n)
  209.             if not turtle.drop() then
  210.                 return false
  211.             end
  212.         end
  213.     end
  214.    
  215.     return true
  216. end
  217.  
  218. turtle.inventory = t_inventory
Add Comment
Please, Sign In to add comment