package in.twizmwaz.cardinal.module.modules.kit.kitTypes; import in.twizmwaz.cardinal.module.modules.kit.Kit; import in.twizmwaz.cardinal.util.Items; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import java.util.ArrayList; import java.util.List; public class ItemKit implements Kit { private List<KitItem> items; public ItemKit(List<KitItem> items) { this.items = items; } public static List<KitItem> cloneItems(List<KitItem> items) { List<KitItem> clone = new ArrayList<>(items.size()); for(KitItem item : items) clone.add(item.getCopy()); return clone; } @Override public void unload() { HandlerList.unregisterAll(this); } @Override public void apply(Player player, Boolean force) { PlayerInventory inventory = player.getInventory(); List<KitItem> items = cloneItems(this.items); // Remove kit items that the player already has for(ItemStack item : inventory.getContents()) { if (item == null) continue; ItemStack itemClone = item.clone(); for(KitItem item2 : items) { if(Items.itemsEqual(item2.getItem(), item) && !(item2.getItem().getDurability() < item.getDurability())) { int remove = itemClone.getAmount(); if (item2.getItem().getAmount() < remove) remove = item2.getItem().getAmount(); itemClone.setAmount(itemClone.getAmount() - remove); item2.getItem().setAmount(item2.getItem().getAmount() - remove); } } } for (KitItem item : items) { ItemStack kitItem = item.getItem(); if (!item.hasSlot()) { inventory.addItem(kitItem); continue; } if (force) { setPlayerItem(player, item.getSlot(), kitItem); } else { // Repair tools if (kitItem.getAmount() > 0 && kitItem.getType().getMaxDurability() > 0) { for (ItemStack item2 : inventory.getContents()) { if (item2 == null) continue; if (Items.itemsEqual(kitItem, item2) && kitItem.getDurability() < item2.getDurability()) { item2.setDurability(kitItem.getDurability()); kitItem.setAmount(0); break; } } } // Stack items if (kitItem.getAmount() > 0) { for (ItemStack item2 : inventory.getContents()) { if (item2 == null || kitItem.getAmount() == 0) continue; if (Items.itemsEqual(kitItem, item2) && item2.getAmount() < item2.getMaxStackSize()) { int max = Math.min(item2.getMaxStackSize() - item2.getAmount(), kitItem.getAmount()); item2.setAmount(item2.getAmount() + max); kitItem.setAmount(kitItem.getAmount() - max); } } } // Put item in slot or give item if (kitItem.getAmount() > 0) { if (inventory.getItem(item.getSlot()) == null) { setPlayerItem(player, item.getSlot(), kitItem); } else { inventory.addItem(kitItem); } } } } } // This uses the NMS method that /replacitem uses, allows for the use of // slot.weapon.offhand, and such public static void setPlayerItem(Player player, int slot, ItemStack item) { ((CraftPlayer)player).getHandle().c(slot, CraftItemStack.asNMSCopy(item)); } }