SHOW:
|
|
- or go back to the newest paste.
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 | - | local base = {} |
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 | - | if item ~= nil then |
44 | + | local count = counts[item.name] |
45 | - | local count = counts[item.name] |
45 | + | if count == nil then |
46 | - | if count == nil then |
46 | + | counts[item.name] = item.count |
47 | - | counts[item.name] = item.count |
47 | + | else |
48 | - | else |
48 | + | counts[item.name] = item.count + count |
49 | - | counts[item.name] = item.count + count |
49 | + | |
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 | - | for slot,cursor in pairs(_list()) do |
75 | + | |
76 | - | count = count + 1 |
76 | + | |
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 | - | --returns: |
110 | + | |
111 | - | -- Boolean - Entire stack moved and slot is now empty |
111 | + | moved = __wrapper.pushItems(to,item,count,toSlot) |
112 | - | -- Number - Number of items in stack moved |
112 | + | |
113 | if(count == nil) then | |
114 | return true | |
115 | else | |
116 | total = total + moved | |
117 | return count == total,total | |
118 | - | if(count == nil) then count = chest.count(item) end |
118 | + | |
119 | - | local moved = __wrapper.pushItems(to,item,count,toSlot) |
119 | + | |
120 | - | return count == moved,total |
120 | + | |
121 | local counted = base.count(item) | |
122 | if count == nil then count = counted end | |
123 | - | local counted = chest.count(item) |
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 | - | local found, slot, stack = chest.find(item) |
128 | + | |
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.items = extend( |
167 | + | |
168 | tlist | |
169 | ) | |
170 | ||
171 | function t_inventory.compact() | |
172 | local source = t_inventory.size() | |
173 | local dest = 1 | |
174 | - | function turtle.items.compact() |
174 | + | local count = t_inventory.count() |
175 | - | local source = turtle.items.size() |
175 | + | |
176 | for s=t_inventory.size(),2,-1 do | |
177 | - | local count = turtle.items.count() |
177 | + | |
178 | if turtle.getItemCount(s) > 0 then | |
179 | - | for s=turtle.items.size(),2,-1 do |
179 | + | |
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 | - | return turtle.items.count() ~= count |
196 | + | function t_inventory.selected() |
197 | return turtle.getItemDetail() | |
198 | end | |
199 | - | function turtle.items.selected() |
199 | + | |
200 | function t_inventory.depositAll(side) | |
201 | local dropCount = 0 | |
202 | ||
203 | - | function turtle.items.select(item) |
203 | + | local chest = inventory.getInventory(side) |
204 | - | local found,slot,count = turtle.items.find(item) |
204 | + | |
205 | - | if found then turtle.select(slot) end |
205 | + | |
206 | - | return found,slot,count |
206 | + | for n=1,INV_COUNT do |
207 | if inventory.getItemCount(n) > 0 then | |
208 | turtle.select(n) | |
209 | - | function turtle.items.depositAll(side) |
209 | + | |
210 | return false | |
211 | end | |
212 | - | local chest = inventory.wrap(side) |
212 | + | |
213 | end | |
214 | ||
215 | - | for n=1,turtle.items.size() do |
215 | + | |
216 | - | if turtle.items.count(n) > 0 then |
216 | + | |
217 | ||
218 | turtle.inventory = t_inventory |