Skip to content

Commit afdfcb2

Browse files
committed
Merge pull request dan200#582 from SquidDev-CC/ComputerCraft/hotfix/extract-overflow
Fix InventoryUtil ignoring the stack limit when extracting items
2 parents 8ae65d1 + 776a786 commit afdfcb2

File tree

1 file changed

+36
-81
lines changed

1 file changed

+36
-81
lines changed

src/main/java/dan200/computercraft/shared/util/InventoryUtil.java

Lines changed: 36 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -95,122 +95,77 @@ else if( tileEntity instanceof IInventory )
9595

9696
// Methods for placing into inventories:
9797

98-
@Nonnull
99-
public static ItemStack storeItems( @Nonnull ItemStack itemstack, IItemHandler inventory, int start, int range, int begin )
100-
{
101-
int[] slots = makeSlotList( start, range, begin );
102-
return storeItems( itemstack, inventory, slots );
103-
}
104-
10598
@Nonnull
10699
public static ItemStack storeItems( @Nonnull ItemStack itemstack, IItemHandler inventory, int begin )
107100
{
108-
int[] slots = makeSlotList( 0, inventory.getSlots(), begin );
109-
return storeItems( itemstack, inventory, slots );
101+
return storeItems( itemstack, inventory, 0, inventory.getSlots(), begin );
110102
}
111103

112104
@Nonnull
113105
public static ItemStack storeItems( @Nonnull ItemStack itemstack, IItemHandler inventory )
114106
{
115-
int[] slots = makeSlotList( 0, inventory.getSlots(), 0 ); // TODO: optimise this out?
116-
return storeItems( itemstack, inventory, slots );
107+
return storeItems( itemstack, inventory, 0, inventory.getSlots(), 0 );
117108
}
118109

119-
// Methods for taking out of inventories
120-
121110
@Nonnull
122-
public static ItemStack takeItems( int count, IItemHandler inventory, int start, int range, int begin )
111+
public static ItemStack storeItems( @Nonnull ItemStack stack, IItemHandler inventory, int start, int range, int begin )
123112
{
124-
int[] slots = makeSlotList( start, range, begin );
125-
return takeItems( count, inventory, slots );
113+
if( stack.isEmpty() ) return ItemStack.EMPTY;
114+
115+
// Inspect the slots in order and try to find empty or stackable slots
116+
ItemStack remainder = stack.copy();
117+
for( int i = 0; i < range; i++ )
118+
{
119+
int slot = start + ((i + (begin - start)) % range);
120+
if( remainder.isEmpty() ) break;
121+
remainder = inventory.insertItem( slot, remainder, false );
122+
}
123+
return areItemsEqual( stack, remainder ) ? stack : remainder;
126124
}
127125

126+
// Methods for taking out of inventories
127+
128128
@Nonnull
129129
public static ItemStack takeItems( int count, IItemHandler inventory, int begin )
130130
{
131-
int[] slots = makeSlotList( 0, inventory.getSlots(), begin );
132-
return takeItems( count, inventory, slots );
131+
return takeItems( count, inventory, 0, inventory.getSlots(), begin );
133132
}
134133

135134
@Nonnull
136135
public static ItemStack takeItems( int count, IItemHandler inventory )
137136
{
138-
int[] slots = makeSlotList( 0, inventory.getSlots(), 0 );
139-
return takeItems( count, inventory, slots );
140-
}
141-
142-
// Private methods
143-
144-
private static int[] makeSlotList( int start, int range, int begin )
145-
{
146-
if( start < 0 || range == 0 )
147-
{
148-
return null;
149-
}
150-
151-
int[] slots = new int[ range ];
152-
for( int n = 0; n < slots.length; ++n )
153-
{
154-
slots[ n ] = start + ((n + (begin - start)) % range);
155-
}
156-
return slots;
157-
}
158-
159-
@Nonnull
160-
private static ItemStack storeItems( @Nonnull ItemStack stack, IItemHandler inventory, int[] slots )
161-
{
162-
if( slots == null || slots.length == 0 )
163-
{
164-
return stack;
165-
}
166-
if( stack.isEmpty() )
167-
{
168-
return ItemStack.EMPTY;
169-
}
170-
171-
// Inspect the slots in order and try to find empty or stackable slots
172-
ItemStack remainder = stack.copy();
173-
for( int slot : slots )
174-
{
175-
if( remainder.isEmpty() ) break;
176-
remainder = inventory.insertItem( slot, remainder, false );
177-
}
178-
return areItemsEqual( stack, remainder ) ? stack : remainder;
137+
return takeItems( count, inventory, 0, inventory.getSlots(), 0 );
179138
}
180139

181140
@Nonnull
182-
private static ItemStack takeItems( int count, IItemHandler inventory, int[] slots )
141+
public static ItemStack takeItems( int count, IItemHandler inventory, int start, int range, int begin )
183142
{
184-
if( slots == null )
185-
{
186-
return ItemStack.EMPTY;
187-
}
188-
189143
// Combine multiple stacks from inventory into one if necessary
190144
ItemStack partialStack = ItemStack.EMPTY;
191-
int countRemaining = count;
192-
for( int slot : slots )
145+
for( int i = 0; i < range; i++ )
193146
{
194-
if( countRemaining <= 0 ) break;
147+
int slot = start + ((i + (begin - start)) % range);
148+
149+
if( count <= 0 ) break;
195150

196151
ItemStack stack = inventory.getStackInSlot( slot );
197-
if( !stack.isEmpty() )
152+
if( !stack.isEmpty() && (partialStack.isEmpty() || areItemsStackable( stack, partialStack )) )
198153
{
199-
if( partialStack.isEmpty() || areItemsStackable( stack, partialStack ) )
154+
ItemStack extracted = inventory.extractItem( slot, count, false );
155+
if( !extracted.isEmpty() )
200156
{
201-
ItemStack extracted = inventory.extractItem( slot, countRemaining, false );
202-
if( !extracted.isEmpty() )
157+
if( partialStack.isEmpty() )
203158
{
204-
countRemaining -= extracted.getCount();
205-
if( partialStack.isEmpty() )
206-
{
207-
partialStack = extracted;
208-
}
209-
else
210-
{
211-
partialStack.grow( extracted.getCount() );
212-
}
159+
// If we've extracted for this first time, then limit the count to the maximum stack size.
160+
partialStack = extracted;
161+
count = Math.min( count, extracted.getMaxStackSize() );
213162
}
163+
else
164+
{
165+
partialStack.grow( extracted.getCount() );
166+
}
167+
168+
count -= extracted.getCount();
214169
}
215170
}
216171
}

0 commit comments

Comments
 (0)