Skip to content

Commit 88067f3

Browse files
committed
feat: kit items in specific slots
1 parent 9f57b3e commit 88067f3

File tree

3 files changed

+57
-5
lines changed

3 files changed

+57
-5
lines changed

Essentials/src/main/java/com/earth2me/essentials/Kit.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,11 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
174174
final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments();
175175
final boolean autoEquip = ess.getSettings().isKitAutoEquip();
176176
final List<ItemStack> itemList = new ArrayList<>();
177+
final List<Integer> slotList = new ArrayList<>();
177178
final List<String> commandQueue = new ArrayList<>();
178179
final List<String> moneyQueue = new ArrayList<>();
179180
final String currencySymbol = ess.getSettings().getCurrencySymbol().isEmpty() ? "$" : ess.getSettings().getCurrencySymbol();
180-
for (final String kitItem : output.getLines()) {
181+
for (String kitItem : output.getLines()) {
181182
if (kitItem.startsWith("$") || kitItem.startsWith(currencySymbol)) {
182183
moneyQueue.add(NumberUtil.sanitizeCurrencyString(kitItem, ess));
183184
continue;
@@ -191,6 +192,15 @@ public boolean expandItems(final User user, final List<String> items) throws Exc
191192
continue;
192193
}
193194

195+
if (kitItem.startsWith("slot:")) {
196+
final String slotStr = kitItem.substring("slot:".length(), kitItem.indexOf(" "));
197+
final int slot = NumberUtil.isInt(slotStr) ? Integer.parseInt(slotStr) : -1;
198+
slotList.add(slot);
199+
kitItem = kitItem.substring(kitItem.indexOf(" ") + 1);
200+
} else {
201+
slotList.add(-1);
202+
}
203+
194204
final ItemStack stack;
195205
final SerializationProvider serializationProvider = ess.provider(SerializationProvider.class);
196206

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

237-
final Map<Integer, ItemStack> leftover = Inventories.addItem(user.getBase(), maxStackSize, autoEquip, itemArray);
247+
final ItemStack[] unplacedItems = Inventories.addItem(user.getBase(), maxStackSize, itemList, slotList);
248+
final Map<Integer, ItemStack> leftover = Inventories.addItem(user.getBase(), maxStackSize, autoEquip, unplacedItems);
238249
if (!isDropItemsIfFull && !leftover.isEmpty()) {
239250
// 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 :(
240251
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));

Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ public void run(final Server server, final User user, final String commandLabel,
5151
useSerializationProvider = false;
5252
}
5353

54-
for (ItemStack is : items) {
54+
for (int i = 0; i < items.length; i++) {
55+
final ItemStack is = items[i];
5556
if (is != null && is.getType() != null && is.getType() != Material.AIR) {
5657
final String serialized;
5758
if (useSerializationProvider) {
58-
serialized = "@" + Base64Coder.encodeLines(serializationProvider.serializeItem(is));
59+
serialized = "slot:" + i + " @" + Base64Coder.encodeLines(serializationProvider.serializeItem(is));
5960
} else {
60-
serialized = ess.getItemDb().serialize(is);
61+
serialized = "slot:" + i + " " + ess.getItemDb().serialize(is);
6162
}
6263
list.add(serialized);
6364
}

Essentials/src/main/java/com/earth2me/essentials/craftbukkit/Inventories.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,46 @@ public static Map<Integer, ItemStack> addItem(final Player player, final int max
142142
return addItem(player, maxStack, false, items);
143143
}
144144

145+
public static ItemStack[] addItem(final Player player, final int maxStack, List<ItemStack> items, List<Integer> slots) {
146+
final List<ItemStack> leftover = new ArrayList<>();
147+
for (int i = 0; i < items.size(); i++) {
148+
final ItemStack item = items.get(i);
149+
final int itemMax = Math.max(maxStack, item.getMaxStackSize());
150+
final int slot = slots.get(i);
151+
if (slot == -1) {
152+
leftover.add(item);
153+
continue;
154+
}
155+
156+
ItemStack existing = player.getInventory().getItem(slot);
157+
final int existingAmount;
158+
if (isEmpty(existing)) {
159+
existing = item.clone();
160+
existingAmount = 0;
161+
} else {
162+
existingAmount = existing.getAmount();
163+
}
164+
165+
if (!item.isSimilar(existing)) {
166+
leftover.add(item);
167+
continue;
168+
}
169+
170+
final int amount = item.getAmount();
171+
if (amount + existingAmount <= itemMax) {
172+
existing.setAmount(amount + existingAmount);
173+
player.getInventory().setItem(slot, existing);
174+
} else {
175+
existing.setAmount(itemMax);
176+
player.getInventory().setItem(slot, existing);
177+
item.setAmount(amount + existingAmount - itemMax);
178+
leftover.add(item);
179+
}
180+
}
181+
182+
return leftover.toArray(new ItemStack[0]);
183+
}
184+
145185
public static Map<Integer, ItemStack> addItem(final Player player, final int maxStack, final boolean allowArmor, ItemStack... items) {
146186
items = normalizeItems(cloneItems(items));
147187
final Map<Integer, ItemStack> leftover = new HashMap<>();

0 commit comments

Comments
 (0)