2626import java .util .GregorianCalendar ;
2727import java .util .List ;
2828import java .util .Map ;
29+ import java .util .HashMap ;
2930import java .util .logging .Level ;
3031
3132import static com .earth2me .essentials .I18n .tlLiteral ;
@@ -174,10 +175,11 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
174175 final boolean allowUnsafe = ess .getSettings ().allowUnsafeEnchantments ();
175176 final boolean autoEquip = ess .getSettings ().isKitAutoEquip ();
176177 final List <ItemStack > itemList = new ArrayList <>();
178+ final Map <Integer , ItemStack > itemsWithSlot = new HashMap <>();
177179 final List <String > commandQueue = new ArrayList <>();
178180 final List <String > moneyQueue = new ArrayList <>();
179181 final String currencySymbol = ess .getSettings ().getCurrencySymbol ().isEmpty () ? "$" : ess .getSettings ().getCurrencySymbol ();
180- for (final String kitItem : output .getLines ()) {
182+ for (String kitItem : output .getLines ()) {
181183 if (kitItem .startsWith ("$" ) || kitItem .startsWith (currencySymbol )) {
182184 moneyQueue .add (NumberUtil .sanitizeCurrencyString (kitItem , ess ));
183185 continue ;
@@ -191,6 +193,13 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
191193 continue ;
192194 }
193195
196+ int itemSlot = -1 ;
197+ if (kitItem .startsWith ("slot:" )) {
198+ final String slotStr = kitItem .substring ("slot:" .length (), kitItem .indexOf (" " ));
199+ itemSlot = NumberUtil .isInt (slotStr ) ? Integer .parseInt (slotStr ) : -1 ;
200+ kitItem = kitItem .substring (kitItem .indexOf (" " ) + 1 );
201+ }
202+
194203 final ItemStack stack ;
195204 final SerializationProvider serializationProvider = ess .provider (SerializationProvider .class );
196205
@@ -218,7 +227,11 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
218227 stack = metaStack .getItemStack ();
219228 }
220229
221- itemList .add (stack );
230+ if (itemSlot == -1 || itemsWithSlot .containsKey (itemSlot )) {
231+ itemList .add (stack );
232+ } else {
233+ itemsWithSlot .put (itemSlot , stack );
234+ }
222235 }
223236
224237 final int maxStackSize = user .isAuthorized ("essentials.oversizedstacks" ) ? ess .getSettings ().getOversizedStackSize () : 0 ;
@@ -227,13 +240,22 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
227240 final KitPreExpandItemsEvent itemsEvent = new KitPreExpandItemsEvent (user , kitName , itemList );
228241 Bukkit .getPluginManager ().callEvent (itemsEvent );
229242
230- final ItemStack [] itemArray = itemList .toArray (new ItemStack [0 ]);
231-
232- if (!isDropItemsIfFull && !Inventories .hasSpace (user .getBase (), maxStackSize , autoEquip , itemArray )) {
243+ final List <ItemStack > totalItems = new ArrayList <>(itemList );
244+ totalItems .addAll (itemsWithSlot .values ());
245+ final ItemStack [] totalItemsArray = totalItems .toArray (new ItemStack [0 ]);
246+ if (!isDropItemsIfFull && !Inventories .hasSpace (user .getBase (), maxStackSize , autoEquip , totalItemsArray )) {
233247 user .sendTl ("kitInvFullNoDrop" );
234248 return false ;
235249 }
236250
251+ for (Map .Entry <Integer , ItemStack > itemWithSlot : itemsWithSlot .entrySet ()) {
252+ final ItemStack leftover = Inventories .addItem (user .getBase (), maxStackSize , itemWithSlot .getValue (), itemWithSlot .getKey ());
253+ if (leftover != null ) {
254+ itemList .add (leftover );
255+ }
256+ }
257+
258+ final ItemStack [] itemArray = itemList .toArray (new ItemStack [0 ]);
237259 final Map <Integer , ItemStack > leftover = Inventories .addItem (user .getBase (), maxStackSize , autoEquip , itemArray );
238260 if (!isDropItemsIfFull && !leftover .isEmpty ()) {
239261 // Inventories#hasSpace should prevent this state from EVER being reached; If it does, something has gone terribly wrong, and we should just give up and hope people report it :(
0 commit comments