package be.isach.ultracosmetics.cosmetics.suits; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.config.MessageManager; import be.isach.ultracosmetics.config.SettingsManager; import be.isach.ultracosmetics.cosmetics.Category; import be.isach.ultracosmetics.cosmetics.Cosmetic; import be.isach.ultracosmetics.cosmetics.Updatable; import be.isach.ultracosmetics.cosmetics.type.SuitType; import be.isach.ultracosmetics.player.UltraPlayer; import be.isach.ultracosmetics.util.ItemFactory; import be.isach.ultracosmetics.util.TextUtil; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.inventory.ItemStack; /** * Represents an instance of a suit summoned by a player. * * @author iSach * @since 12-20-2015 */ public abstract class Suit extends Cosmetic<SuitType> implements Updatable { /** * Armor Slot of the Suit. */ private ArmorSlot armorSlot; /** * ItemStack of the Suit. */ protected ItemStack itemStack; public Suit(UltraPlayer ultraPlayer, ArmorSlot armorSlot, SuitType suitType, UltraCosmetics ultraCosmetics) { super(ultraCosmetics, Category.SUITS, ultraPlayer, suitType); this.armorSlot = armorSlot; Bukkit.getPluginManager().registerEvents(this, ultraCosmetics); } @EventHandler public void onItemDrop(PlayerDropItemEvent event) { if(getOwner() == null || getPlayer() == null) { return; } ItemStack drop = event.getItemDrop().getItemStack(); if (event.getPlayer().equals(getPlayer()) && drop.hasItemMeta() && drop.getItemMeta().hasDisplayName() && drop.getItemMeta().getDisplayName().equals(itemStack.getItemMeta().getDisplayName())) { event.getItemDrop().remove(); if (SettingsManager.getConfig().getBoolean("Remove-Gadget-With-Drop")) { clear(); } } } @EventHandler public void onInventoryClick(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); ItemStack current = event.getCurrentItem(); if (event.getSlotType().equals(InventoryType.SlotType.ARMOR) && getPlayer() != null && player.equals(getPlayer()) && current != null && current.hasItemMeta() && current.getItemMeta().hasDisplayName() && itemStack != null && current.getItemMeta().getDisplayName().equals(itemStack.getItemMeta().getDisplayName())) { event.setCancelled(true); player.updateInventory(); } } public void equip(ArmorSlot slot) { if (!getOwner().getBukkitPlayer().hasPermission(getType().getPermission())) { getPlayer().sendMessage(MessageManager.getMessage("No-Permission")); return; } getUltraCosmetics().getServer().getPluginManager().registerEvents(this, getUltraCosmetics()); this.equipped = true; String mess = MessageManager.getMessage(getCategory().getConfigPath() + "." + getCategory().getActivateConfig()); mess = mess.replace(getCategory().getChatPlaceholder(), TextUtil.filterPlaceHolder(getTypeName(), getUltraCosmetics())); getPlayer().sendMessage(mess); this.armorSlot = slot; onEquip(); } @Override protected void onEquip() { if (getOwner().getCurrentHat() != null && armorSlot == ArmorSlot.HELMET) { getOwner().removeHat(); } getOwner().removeSuit(getArmorSlot()); switch (getArmorSlot()) { case HELMET: if (getOwner().getCurrentHat() != null) { getOwner().removeHat(); } if (getOwner().getCurrentEmote() != null) { getOwner().removeEmote(); } if (getPlayer().getInventory().getHelmet() != null) { ItemStack itemStack = getPlayer().getInventory().getHelmet(); drop(itemStack); getPlayer().getInventory().setHelmet(null); } getPlayer().getInventory().setHelmet(ItemFactory.create(getType().getHelmet(), (byte) 0, getType().getName(getArmorSlot()), "", MessageManager.getMessage("Suits.Suit-Part-Lore"))); itemStack = getPlayer().getInventory().getHelmet(); break; case CHESTPLATE: if (getPlayer().getInventory().getChestplate() != null) { ItemStack itemStack = getPlayer().getInventory().getChestplate(); drop(itemStack); getPlayer().getInventory().setChestplate(null); } getPlayer().getInventory().setChestplate(ItemFactory.create(getType().getChestplate(), (byte) 0, getType().getName(getArmorSlot()), "", MessageManager.getMessage("Suits.Suit-Part-Lore"))); itemStack = getPlayer().getInventory().getChestplate(); break; case LEGGINGS: if (getPlayer().getInventory().getLeggings() != null) { ItemStack itemStack = getPlayer().getInventory().getLeggings(); drop(itemStack); getPlayer().getInventory().setLeggings(null); } getPlayer().getInventory().setLeggings(ItemFactory.create(getType().getLeggings(), (byte) 0, getType().getName(getArmorSlot()), "", MessageManager.getMessage("Suits.Suit-Part-Lore"))); itemStack = getPlayer().getInventory().getLeggings(); break; case BOOTS: if (getPlayer().getInventory().getBoots() != null) { ItemStack itemStack = getPlayer().getInventory().getBoots(); drop(itemStack); getPlayer().getInventory().setBoots(null); } getPlayer().getInventory().setBoots(ItemFactory.create(getType().getBoots(), (byte) 0, getType().getName(getArmorSlot()), "", MessageManager.getMessage("Suits.Suit-Part-Lore"))); itemStack = getPlayer().getInventory().getBoots(); break; } getOwner().setSuit(armorSlot, this); runTaskTimerAsynchronously(getUltraCosmetics(), 0, 1); } @Override public void run() { if (getOwner() == null || getPlayer() == null) { cancel(); return; } onUpdate(); } /** * Clears the Suit. */ public void onClear() { switch (getArmorSlot()) { case HELMET: if (getOwner().getCurrentHat() != null) { getOwner().removeHat(); } if (getOwner().getCurrentEmote() != null) { getOwner().removeEmote(); } getPlayer().getInventory().setHelmet(null); break; case CHESTPLATE: getPlayer().getInventory().setChestplate(null); break; case LEGGINGS: getPlayer().getInventory().setLeggings(null); break; case BOOTS: getPlayer().getInventory().setBoots(null); break; } getOwner().setSuit(getArmorSlot(), null); HandlerList.unregisterAll(this); } /** * The Suit ItemStack. * * @return The Suit ItemStack. */ public ItemStack getItemStack() { return itemStack; } /** * Get Suit Armor Slot. * * @return Suit Armor Slot. */ public ArmorSlot getArmorSlot() { return armorSlot; } /** * Drops an Item. * * @param itemStack The item to drop. */ private void drop(ItemStack itemStack) { getPlayer().getWorld().dropItem(getPlayer().getLocation(), itemStack); } @Override protected String getTypeName() { return getType().getName(getArmorSlot()); } }