Skip to content

Commit 776a786

Browse files
committed
Fix InventoryUtil ignoring the stack limit when extracting items
Using turtle.suck on an inventory filled with tools would fill the entire chest with said item, rather than extracting a single item. In order to avoid that, we clamp the extract limit to the max stack size when first extracting an item. This also inlines the makeSlotList logic, which means we can avoid creating an array for each inventory operation. This probably won't have any meaninful performance impact (even on large inventories), but is a nice optimisation to make.
1 parent 914df8b commit 776a786

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)