package be.isach.ultracosmetics.cosmetics.type; 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.Category; import be.isach.ultracosmetics.cosmetics.Cosmetic; import be.isach.ultracosmetics.player.UltraPlayer; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import be.isach.ultracosmetics.util.ServerVersion; import org.bukkit.ChatColor; /** * A cosmetic type. * * @author iSach * @since 07-05-2016 */ public abstract class CosmeticType<T extends Cosmetic> { private String configName; private String permission; private String descriptionAsString; private Class<? extends T> clazz; private Category category; public CosmeticType(Category category, String configName, String permission, String description, Class clazz) { this.configName = configName; this.permission = permission; this.descriptionAsString = description; this.clazz = clazz; this.category = category; if (SettingsManager.getConfig().get(getCategory().getConfigPath() + "." + configName + ".Description") == null) { setDescriptionAsString(description); SettingsManager.getConfig().set(getCategory().getConfigPath() + "." + configName + ".Description", getDescriptionColored(), "Description of this cosmetic."); } else setDescriptionAsString(fromList(SettingsManager.getConfig().getStringList(category.getConfigPath() + "." + configName + ".Description"))); } public T equip(UltraPlayer player, UltraCosmetics ultraCosmetics) { T cosmetic = null; try { cosmetic = getClazz().getDeclaredConstructor(UltraPlayer.class, UltraCosmetics.class).newInstance(player == null ? null : player, ultraCosmetics); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } cosmetic.equip(); return cosmetic; } public boolean isEnabled() { if(this == GadgetType.ETHEREALPEARL && UltraCosmeticsData.get().getServerVersion() == ServerVersion.v1_11_R1) { return false; } return SettingsManager.getConfig().getBoolean(category.getConfigPath() + "." + configName + ".Enabled"); } public String getName() { return MessageManager.getMessage(category.getConfigPath() + "." + configName + ".name"); } public String getConfigName() { return configName; } public String getPermission() { return permission; } public String getDescriptionAsString() { return descriptionAsString; } public Class<? extends T> getClazz() { return clazz; } public Category getCategory() { return category; } public void setDescriptionAsString(String descriptionAsString) { this.descriptionAsString = descriptionAsString; } /** * Transforms the description from a String to a list. * Without colors. * * @return The description as a list. */ public List<String> getDescription() { List<String> desc = new ArrayList<>(); for (String string : getDescriptionAsString().split("\n")) desc.add(ChatColor.translateAlternateColorCodes('&', string)); return desc; } /** * Transforms the description from a String to a list. * With colors. * * @return The description as a list. */ public List<String> getDescriptionColored() { return Arrays.asList(getDescriptionAsString().split("\n")); } /** * Check if the SuitType should show a description. * * @return {@code true} if it should show a description, otherwise {@code false}. */ public boolean showsDescription() { return SettingsManager.getConfig().getBoolean(category.getConfigPath() + "." + getConfigName() + ".Show-Description"); } /** * Check if the SuitType can be found in Treasure Chests. * * @return {@code true} if it can be found in treasure chests, otherwise {@code false}. */ public boolean canBeFound() { return SettingsManager.getConfig().getBoolean(category.getConfigPath() + "." + getConfigName() + ".Can-Be-Found-In-Treasure-Chests"); } /** * Get the description as a String from list. * * @param description The Description as a list. * @return The description as a String. */ private String fromList(List<String> description) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < description.size(); i++) stringBuilder.append(description.get(i)).append(i < description.size() - 1 ? "\n" : ""); return stringBuilder.toString(); } /** * Override toString method to show Cosmetic name. * @return */ @Override public String toString() { return getConfigName().toUpperCase(); } }