@@ -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