package be.isach.ultracosmetics.cosmetics; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.UltraCosmeticsData; import be.isach.ultracosmetics.config.MessageManager; import be.isach.ultracosmetics.config.SettingsManager; import be.isach.ultracosmetics.cosmetics.type.*; import be.isach.ultracosmetics.menu.CosmeticMenu; import be.isach.ultracosmetics.util.ItemFactory; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.MaterialData; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * Cosmetic category enum. * * @author iSach * @since 06-20-2016 */ public enum Category { PETS("Pets", "Spawn", "Despawn", "Clear-Pet", "%petname%", "Spawn", "Despawn") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getPetsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return PetType.enabled(); } }, GADGETS("Gadgets", "Activate", "Deactivate", "Clear-Gadget", "%gadgetname%", "Equip", "Unequip") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getGadgetsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return GadgetType.enabled(); } }, EFFECTS("Particle-Effects", "Summon", "Unsummon", "Clear-Effect", "%effectname%", "Summon", "Unsummon") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getEffectsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return ParticleEffectType.enabled(); } }, MOUNTS("Mounts", "Spawn", "Despawn", "Clear-Mount", "%mountname%", "Spawn", "Despawn") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getMountsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return MountType.enabled(); } }, MORPHS("Morphs", "Morph", "Unmorph", "Clear-Morph", "%morphname%", "Morph", "Unmorph") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getMorphsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return MorphType.enabled(); } }, HATS("Hats", "Equip", "Unequip", "Clear-Hat", "%hatname%", "Equip", "Unequip") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getHatsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return HatType.enabled(); } }, SUITS("Suits", "Equip", "Unequip", "Clear-Suit", "%suitname%", "Equip", "Unequip") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getSuitsMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return EmoteType.enabled(); } }, EMOTES("Emotes", "Equip", "Unequip", "Clear-Emote", "%emotename%", "Equip", "Unequip") { @Override public CosmeticMenu getMenu(UltraCosmetics ultraCosmetics) { return ultraCosmetics.getMenus().getEmotesMenu(); } @Override public List<? extends CosmeticType> getEnabled() { return EmoteType.enabled(); } }; public static int enabledSize() { return enabled().size(); } public static List<Category> enabled() { return Arrays.stream(values()).filter(Category::isEnabled).collect(Collectors.toList()); } /** * The config path name. */ private String configPath; /** * The ItemStack in Main Menu. */ private ItemStack is; /** * Message on menu to activate a cosmetic of this category. */ private String activateMenu; /** * Message on menu to deactivate a cosmetic of this category. */ private String deactivateMenu; /** * Path of the clear message. */ private String clearConfigPath; private String chatPlaceholder; private String activateConfig; private String deactivateConfig; /** * Category of Cosmetic. * @param configPath The config path name. * @param activateMenu Message on menu to activate a cosmetic of this category. * @param deactivateMenu Message on menu to deactivate a cosmetic of this category. * @param clearConfigPath * @param chatPlaceholder * @param activateConfig * @param deactivateConfig */ Category(String configPath, String activateMenu, String deactivateMenu, String clearConfigPath, String chatPlaceholder, String activateConfig, String deactivateConfig) { this.configPath = configPath; this.activateMenu = activateMenu; this.deactivateMenu = deactivateMenu; this.clearConfigPath = clearConfigPath; this.chatPlaceholder = chatPlaceholder; this.activateConfig = activateConfig; this.deactivateConfig = deactivateConfig; if (SettingsManager.getConfig().contains("Categories." + configPath + ".Main-Menu-Item")) { this.is = initMaterialData((String) (SettingsManager.getConfig().get("Categories." + configPath + ".Main-Menu-Item"))).toItemStack(1); } else { this.is = ItemFactory.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA" + "6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTA1OWQ1OWViNGU1OWM" + "zMWVlY2Y5ZWNlMmY5Y2YzOTM0ZTQ1YzBlYzQ3NmZjODZiZmFlZjhlYTkxM2VhNzE" + "wIn19fQ==", ChatColor.DARK_GRAY + "" + ChatColor.ITALIC); } ItemMeta itemMeta = is.getItemMeta(); itemMeta.setDisplayName(MessageManager.getMessage("Menu." + configPath)); is.setItemMeta(itemMeta); } /** * Gets the ItemStack in Main Menu. * * @return The ItemStack in Main Menu. */ public ItemStack getItemStack() { return is; } /** * Checks if the category is enabled. * * @return {@code true} if enabled, otherwise {@code false}. */ public boolean isEnabled() { return !(this == MORPHS && !Bukkit.getPluginManager().isPluginEnabled("LibsDisguises")) && SettingsManager.getConfig().getBoolean("Categories-Enabled." + configPath); } /** * Checks if the category should have a back arrow in its menu. * * @return {@code true} if has arrow, otherwise {@code false} */ public boolean hasGoBackArrow() { return !(!UltraCosmeticsData.get().areTreasureChestsEnabled() && enabledSize() == 1) && (boolean) (SettingsManager.getConfig().get("Categories." + configPath + ".Go-Back-Arrow")); } /** * Creates Material data from a text. * {id}:{data} * * @param name The text as {id}:{data}. * @return The material data from the text. */ private MaterialData initMaterialData(String name) { return new MaterialData(Integer.parseInt(name.split(":")[0]), (name.split(":").length > 1 ? (byte) Integer.parseInt(name.split(":")[1]) : (byte) 0)); } /** * @return Config Path. */ public String getConfigPath() { return configPath; } public String getActivateMenu() { return MessageManager.getMessage("Menu." + activateMenu); } public String getClearConfigPath() { return clearConfigPath; } public String getDeactivateMenu() { return MessageManager.getMessage("Menu." + deactivateMenu); } public String getChatPlaceholder() { return chatPlaceholder; } public String getActivateConfig() { return activateConfig; } public String getDeactivateConfig() { return deactivateConfig; } public abstract CosmeticMenu getMenu(UltraCosmetics ultraCosmetics); public abstract List<? extends CosmeticType> getEnabled(); }