diff --git a/Essentials/src/com/earth2me/essentials/Kit.java b/Essentials/src/com/earth2me/essentials/Kit.java index 4d5a71493..22e8e1f38 100644 --- a/Essentials/src/com/earth2me/essentials/Kit.java +++ b/Essentials/src/com/earth2me/essentials/Kit.java @@ -141,17 +141,18 @@ public class Kit { } } - public void expandItems(final User user) throws Exception { - expandItems(user, getItems(user)); + public boolean expandItems(final User user) throws Exception { + return expandItems(user, getItems(user)); } - public void expandItems(final User user, final List items) throws Exception { + public boolean expandItems(final User user, final List items) throws Exception { try { IText input = new SimpleTextInput(items); IText output = new KeywordReplacer(input, user.getSource(), ess, true, true); boolean spew = false; final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments(); + List itemList = new ArrayList<>(); for (String kitItem : output.getLines()) { if (kitItem.startsWith(ess.getSettings().getCurrencySymbol())) { BigDecimal value = new BigDecimal(kitItem.substring(ess.getSettings().getCurrencySymbol().length()).trim()); @@ -181,13 +182,19 @@ public class Kit { // We pass a null sender here because kits should not do perm checks metaStack.parseStringMeta(null, allowUnsafe, parts, 2, ess); } - - final Map overfilled; - final boolean allowOversizedStacks = user.isAuthorized("essentials.oversizedstacks"); + + itemList.add(metaStack.getItemStack()); + } + + + final Map overfilled; + final boolean allowOversizedStacks = user.isAuthorized("essentials.oversizedstacks"); + final boolean isDropItemsIfFull = ess.getSettings().isDropItemsIfFull(); + if (isDropItemsIfFull) { if (allowOversizedStacks) { - overfilled = InventoryWorkaround.addOversizedItems(user.getBase().getInventory(), ess.getSettings().getOversizedStackSize(), metaStack.getItemStack()); + overfilled = InventoryWorkaround.addOversizedItems(user.getBase().getInventory(), ess.getSettings().getOversizedStackSize(), itemList.toArray(new ItemStack[itemList.size()])); } else { - overfilled = InventoryWorkaround.addItems(user.getBase().getInventory(), metaStack.getItemStack()); + overfilled = InventoryWorkaround.addItems(user.getBase().getInventory(), itemList.toArray(new ItemStack[itemList.size()])); } for (ItemStack itemStack : overfilled.values()) { int spillAmount = itemStack.getAmount(); @@ -200,6 +207,16 @@ public class Kit { } spew = true; } + } else { + if (allowOversizedStacks) { + overfilled = InventoryWorkaround.addAllOversizedItems(user.getBase().getInventory(), ess.getSettings().getOversizedStackSize(), itemList.toArray(new ItemStack[itemList.size()])); + } else { + overfilled = InventoryWorkaround.addAllItems(user.getBase().getInventory(), itemList.toArray(new ItemStack[itemList.size()])); + } + if (overfilled != null) { + user.sendMessage(tl("kitInvFullNoDrop")); + return false; + } } user.getBase().updateInventory(); if (spew) { @@ -210,5 +227,6 @@ public class Kit { ess.getLogger().log(Level.WARNING, e.getMessage()); throw new Exception(tl("kitError2"), e); } + return true; } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java index 5779deff7..0b8f83e89 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java @@ -81,8 +81,9 @@ public class Commandkit extends EssentialsCommand { kit.checkDelay(userFrom); kit.checkAffordable(userFrom); + if (!kit.expandItems(userTo)) + continue; kit.setTime(userFrom); - kit.expandItems(userTo); kit.chargeUser(userTo); if (!userFrom.equals(userTo)) { diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java b/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java index a70ba20bc..fc99fc4c6 100644 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java @@ -80,6 +80,25 @@ public final class InventoryWorkaround { } return addItems(fakeInventory, items); } + + public static Map addAllOversizedItems(final Inventory inventory, final int oversizedStacks, final ItemStack... items) { + ItemStack[] contents = inventory.getContents(); + + final Inventory fakeInventory; + if (isCombinedInventory(inventory)) { + fakeInventory = makeTruncatedPlayerInventory((PlayerInventory) inventory); + } else { + fakeInventory = Bukkit.getServer().createInventory(null, inventory.getType()); + fakeInventory.setContents(contents); + } + Map overflow = addOversizedItems(fakeInventory, oversizedStacks, items); + if (overflow.isEmpty()) { + addOversizedItems(inventory, oversizedStacks, items); + return null; + } + return overflow; + } + // Returns what it couldn't store public static Map addItems(final Inventory inventory, final ItemStack... items) { diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index c25610306..d005ca991 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -252,6 +252,7 @@ kitError=\u00a74There are no valid kits. kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to \u00a7c{1}\u00a76. kitInvFull=\u00a74Your inventory was full, placing kit on the floor. +kitInvFullNoDrop=\u00a74There is not enough room in your inventory for that kit. kitItem=\u00a76- \u00a7f{0} kitNotFound=\u00a74That kit does not exist. kitOnce=\u00a74You can''t use that kit again.