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,16 @@ 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 int spaceIndex = kitItem .indexOf (" " );
199+ if (spaceIndex != -1 ) {
200+ final String slotStr = kitItem .substring ("slot:" .length (), spaceIndex );
201+ itemSlot = NumberUtil .isInt (slotStr ) ? Integer .parseInt (slotStr ) : -1 ;
202+ kitItem = kitItem .substring (spaceIndex + 1 );
203+ }
204+ }
205+
194206 final ItemStack stack ;
195207 final SerializationProvider serializationProvider = ess .provider (SerializationProvider .class );
196208
@@ -218,22 +230,35 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
218230 stack = metaStack .getItemStack ();
219231 }
220232
221- itemList .add (stack );
233+ if (itemSlot == -1 || itemsWithSlot .containsKey (itemSlot )) {
234+ itemList .add (stack );
235+ } else {
236+ itemsWithSlot .put (itemSlot , stack );
237+ }
222238 }
223239
224240 final int maxStackSize = user .isAuthorized ("essentials.oversizedstacks" ) ? ess .getSettings ().getOversizedStackSize () : 0 ;
225241 final boolean isDropItemsIfFull = ess .getSettings ().isDropItemsIfFull ();
226242
227- final KitPreExpandItemsEvent itemsEvent = new KitPreExpandItemsEvent ( user , kitName , itemList );
228- Bukkit . getPluginManager (). callEvent ( itemsEvent );
243+ final List < ItemStack > totalItems = new ArrayList <>( itemList );
244+ totalItems . addAll ( itemsWithSlot . values () );
229245
230- final ItemStack [] itemArray = itemList .toArray (new ItemStack [0 ]);
231-
232- if (!isDropItemsIfFull && !Inventories .hasSpace (user .getBase (), maxStackSize , autoEquip , itemArray )) {
246+ final KitPreExpandItemsEvent itemsEvent = new KitPreExpandItemsEvent (user , kitName , totalItems );
247+ Bukkit .getPluginManager ().callEvent (itemsEvent );
248+ final ItemStack [] totalItemsArray = totalItems .toArray (new ItemStack [0 ]);
249+ if (!isDropItemsIfFull && !Inventories .hasSpace (user .getBase (), maxStackSize , autoEquip , totalItemsArray )) {
233250 user .sendTl ("kitInvFullNoDrop" );
234251 return false ;
235252 }
236253
254+ for (Map .Entry <Integer , ItemStack > itemWithSlot : itemsWithSlot .entrySet ()) {
255+ final ItemStack leftover = Inventories .addItem (user .getBase (), maxStackSize , itemWithSlot .getValue (), itemWithSlot .getKey ());
256+ if (leftover != null ) {
257+ itemList .add (leftover );
258+ }
259+ }
260+
261+ final ItemStack [] itemArray = itemList .toArray (new ItemStack [0 ]);
237262 final Map <Integer , ItemStack > leftover = Inventories .addItem (user .getBase (), maxStackSize , autoEquip , itemArray );
238263 if (!isDropItemsIfFull && !leftover .isEmpty ()) {
239264 // 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