@@ -95,122 +95,77 @@ else if( tileEntity instanceof IInventory )
95
95
96
96
// Methods for placing into inventories:
97
97
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
-
105
98
@ Nonnull
106
99
public static ItemStack storeItems ( @ Nonnull ItemStack itemstack , IItemHandler inventory , int begin )
107
100
{
108
- int [] slots = makeSlotList ( 0 , inventory .getSlots (), begin );
109
- return storeItems ( itemstack , inventory , slots );
101
+ return storeItems ( itemstack , inventory , 0 , inventory .getSlots (), begin );
110
102
}
111
103
112
104
@ Nonnull
113
105
public static ItemStack storeItems ( @ Nonnull ItemStack itemstack , IItemHandler inventory )
114
106
{
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 );
117
108
}
118
109
119
- // Methods for taking out of inventories
120
-
121
110
@ 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 )
123
112
{
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 ;
126
124
}
127
125
126
+ // Methods for taking out of inventories
127
+
128
128
@ Nonnull
129
129
public static ItemStack takeItems ( int count , IItemHandler inventory , int begin )
130
130
{
131
- int [] slots = makeSlotList ( 0 , inventory .getSlots (), begin );
132
- return takeItems ( count , inventory , slots );
131
+ return takeItems ( count , inventory , 0 , inventory .getSlots (), begin );
133
132
}
134
133
135
134
@ Nonnull
136
135
public static ItemStack takeItems ( int count , IItemHandler inventory )
137
136
{
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 );
179
138
}
180
139
181
140
@ 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 )
183
142
{
184
- if ( slots == null )
185
- {
186
- return ItemStack .EMPTY ;
187
- }
188
-
189
143
// Combine multiple stacks from inventory into one if necessary
190
144
ItemStack partialStack = ItemStack .EMPTY ;
191
- int countRemaining = count ;
192
- for ( int slot : slots )
145
+ for ( int i = 0 ; i < range ; i ++ )
193
146
{
194
- if ( countRemaining <= 0 ) break ;
147
+ int slot = start + ((i + (begin - start )) % range );
148
+
149
+ if ( count <= 0 ) break ;
195
150
196
151
ItemStack stack = inventory .getStackInSlot ( slot );
197
- if ( !stack .isEmpty () )
152
+ if ( !stack .isEmpty () && ( partialStack . isEmpty () || areItemsStackable ( stack , partialStack )) )
198
153
{
199
- if ( partialStack .isEmpty () || areItemsStackable ( stack , partialStack ) )
154
+ ItemStack extracted = inventory .extractItem ( slot , count , false );
155
+ if ( !extracted .isEmpty () )
200
156
{
201
- ItemStack extracted = inventory .extractItem ( slot , countRemaining , false );
202
- if ( !extracted .isEmpty () )
157
+ if ( partialStack .isEmpty () )
203
158
{
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 () );
213
162
}
163
+ else
164
+ {
165
+ partialStack .grow ( extracted .getCount () );
166
+ }
167
+
168
+ count -= extracted .getCount ();
214
169
}
215
170
}
216
171
}
0 commit comments