Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions Essentials/src/main/java/com/earth2me/essentials/Kit.java
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,11 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments();
final boolean autoEquip = ess.getSettings().isKitAutoEquip();
final List<ItemStack> itemList = new ArrayList<>();
final List<Integer> slotList = new ArrayList<>();
final List<String> commandQueue = new ArrayList<>();
final List<String> moneyQueue = new ArrayList<>();
final String currencySymbol = ess.getSettings().getCurrencySymbol().isEmpty() ? "$" : ess.getSettings().getCurrencySymbol();
for (final String kitItem : output.getLines()) {
for (String kitItem : output.getLines()) {
if (kitItem.startsWith("$") || kitItem.startsWith(currencySymbol)) {
moneyQueue.add(NumberUtil.sanitizeCurrencyString(kitItem, ess));
continue;
Expand All @@ -191,6 +192,15 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
continue;
}

if (kitItem.startsWith("slot:")) {
final String slotStr = kitItem.substring("slot:".length(), kitItem.indexOf(" "));
final int slot = NumberUtil.isInt(slotStr) ? Integer.parseInt(slotStr) : -1;
slotList.add(slot);
kitItem = kitItem.substring(kitItem.indexOf(" ") + 1);
} else {
slotList.add(-1);
}

final ItemStack stack;
final SerializationProvider serializationProvider = ess.provider(SerializationProvider.class);

Expand Down Expand Up @@ -234,7 +244,8 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
return false;
}

final Map<Integer, ItemStack> leftover = Inventories.addItem(user.getBase(), maxStackSize, autoEquip, itemArray);
final ItemStack[] unplacedItems = Inventories.addItem(user.getBase(), maxStackSize, itemList, slotList);
final Map<Integer, ItemStack> leftover = Inventories.addItem(user.getBase(), maxStackSize, autoEquip, unplacedItems);
if (!isDropItemsIfFull && !leftover.isEmpty()) {
// 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 :(
throw new IllegalStateException("Something has gone terribly wrong while adding items to the user's inventory. Please report this to the EssentialsX developers. Items left over: " + leftover + ". Original items: " + Arrays.toString(itemArray));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,14 @@ public void run(final Server server, final User user, final String commandLabel,
useSerializationProvider = false;
}

for (ItemStack is : items) {
for (int i = 0; i < items.length; i++) {
final ItemStack is = items[i];
if (is != null && is.getType() != null && is.getType() != Material.AIR) {
final String serialized;
if (useSerializationProvider) {
serialized = "@" + Base64Coder.encodeLines(serializationProvider.serializeItem(is));
serialized = "slot:" + i + " @" + Base64Coder.encodeLines(serializationProvider.serializeItem(is));
} else {
serialized = ess.getItemDb().serialize(is);
serialized = "slot:" + i + " " + ess.getItemDb().serialize(is);
}
list.add(serialized);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,46 @@ public static Map<Integer, ItemStack> addItem(final Player player, final int max
return addItem(player, maxStack, false, items);
}

public static ItemStack[] addItem(final Player player, final int maxStack, List<ItemStack> items, List<Integer> slots) {
final List<ItemStack> leftover = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
final ItemStack item = items.get(i);
final int itemMax = Math.max(maxStack, item.getMaxStackSize());
final int slot = slots.get(i);
if (slot == -1) {
leftover.add(item);
continue;
}

ItemStack existing = player.getInventory().getItem(slot);
final int existingAmount;
if (isEmpty(existing)) {
existing = item.clone();
existingAmount = 0;
} else {
existingAmount = existing.getAmount();
}

if (!item.isSimilar(existing)) {
leftover.add(item);
continue;
}

final int amount = item.getAmount();
if (amount + existingAmount <= itemMax) {
existing.setAmount(amount + existingAmount);
player.getInventory().setItem(slot, existing);
} else {
existing.setAmount(itemMax);
player.getInventory().setItem(slot, existing);
item.setAmount(amount + existingAmount - itemMax);
leftover.add(item);
}
}

return leftover.toArray(new ItemStack[0]);
}

public static Map<Integer, ItemStack> addItem(final Player player, final int maxStack, final boolean allowArmor, ItemStack... items) {
items = normalizeItems(cloneItems(items));
final Map<Integer, ItemStack> leftover = new HashMap<>();
Expand Down
Loading