diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index eae67ebc..5ecf8c7f 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -247,7 +247,6 @@ public class MMOCore extends JavaPlugin { for (LootChest chest : new HashSet<>(lootChests.getActive())) if (chest.shouldExpire()) chest.unregister(false); - } }.runTaskTimer(this, 5 * 60 * 20, 5 * 60 * 20); diff --git a/src/main/java/net/Indyuce/mmocore/api/AltChar.java b/src/main/java/net/Indyuce/mmocore/api/AltChar.java index 51285be0..d61d93bd 100644 --- a/src/main/java/net/Indyuce/mmocore/api/AltChar.java +++ b/src/main/java/net/Indyuce/mmocore/api/AltChar.java @@ -6,6 +6,7 @@ public class AltChar { public static final String star = "✦"; public static final String rightArrow = "⇨"; public static final String fourEdgedClub = "✤"; + public static final String manaStar = "⭐"; public static final String club = "♣"; public static final String diamond = "◆"; diff --git a/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java b/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java index 5f3f4eee..862b2e05 100644 --- a/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java +++ b/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java @@ -34,6 +34,7 @@ public class PlayerActionBar extends BukkitRunnable { ChatColor.translateAlternateColorCodes('&', new String(format) .replace("{health}", digit.format(data.getPlayer().getHealth())) .replace("{max_health}", "" + StatType.MAX_HEALTH.format(data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())) + .replace("{mana_icon}", data.getProfess().getManaDisplay().getIcon()) .replace("{mana}", digit.format(data.getMana())) .replace("{max_mana}", "" + StatType.MAX_MANA.format(data.getStats().getStat(StatType.MAX_MANA))) .replace("{stamina}", digit.format(data.getStamina())) diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java index 589e863b..c63a9cc6 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java @@ -23,7 +23,6 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.AltChar; import net.Indyuce.mmocore.api.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.api.load.MMOLoadException; import net.Indyuce.mmocore.api.load.PostLoadObject; @@ -65,29 +64,26 @@ public class PlayerClass extends PostLoadObject { this.id = id.toUpperCase().replace("-", "_").replace(" ", "_"); name = ChatColor.translateAlternateColorCodes('&', config.getString("display.name")); - icon = MMOCoreUtils.readIcon(config.getString("display.item")); + icon = MMOCoreUtils.readIcon(config.getString("display.item", "BARRIER")); - if (config.contains("display.texture")) - if (icon.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { + if (config.contains("display.texture") && icon.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) + try { ItemMeta meta = icon.getItemMeta(); - try { - Field profileField = meta.getClass().getDeclaredField("profile"); - profileField.setAccessible(true); - GameProfile gp = new GameProfile(UUID.randomUUID(), null); - gp.getProperties().put("textures", new Property("textures", config.getString("display.texture"))); - profileField.set(meta, gp); - } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException exception) { - MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not apply playerhead texture: " + exception.getMessage()); - } + Field profileField = meta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + GameProfile gp = new GameProfile(UUID.randomUUID(), null); + gp.getProperties().put("textures", new Property("textures", config.getString("display.texture"))); + profileField.set(meta, gp); icon.setItemMeta(meta); - } else - MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not add player head texture. The item is not a playerhead!"); + } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException exception) { + throw new IllegalArgumentException("Could not apply playerhead texture: " + exception.getMessage()); + } for (String string : config.getStringList("display.lore")) description.add(ChatColor.GRAY + ChatColor.translateAlternateColorCodes('&', string)); for (String string : config.getStringList("display.attribute-lore")) attrDescription.add(ChatColor.GRAY + ChatColor.translateAlternateColorCodes('&', string)); - manaDisplay = new ManaDisplayOptions(config.getConfigurationSection("mana")); + manaDisplay = config.contains("mana") ? new ManaDisplayOptions(config.getConfigurationSection("mana")) : ManaDisplayOptions.DEFAULT; maxLevel = config.getInt("max-level"); displayOrder = config.getInt("display.order"); @@ -171,7 +167,7 @@ public class PlayerClass extends PostLoadObject { this.id = id; this.name = name; - manaDisplay = new ManaDisplayOptions(ChatColor.BLUE, "Mana", AltChar.listSquare.charAt(0)); + manaDisplay = ManaDisplayOptions.DEFAULT; maxLevel = 0; displayOrder = 0; expCurve = ExpCurve.DEFAULT; @@ -189,8 +185,13 @@ public class PlayerClass extends PostLoadObject { protected void whenPostLoaded(FileConfiguration config) { if (config.contains("subclasses")) for (String key : config.getConfigurationSection("subclasses").getKeys(false)) - subclasses.add(new Subclass(MMOCore.plugin.classManager.get(key.toUpperCase().replace("-", "_").replace(" ", "_")), - config.getInt("subclasses." + key))); + try { + subclasses.add(new Subclass(MMOCore.plugin.classManager.getOrThrow(key.toUpperCase().replace("-", "_").replace(" ", "_")), + config.getInt("subclasses." + key))); + } catch (IllegalArgumentException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, + "Could not load subclass '" + key + "' from class '" + getId() + "': " + exception.getMessage()); + } } public String getId() { diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java index a34667cb..63910255 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java @@ -4,46 +4,68 @@ import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; +import net.Indyuce.mmocore.api.AltChar; + public class ManaDisplayOptions { - private final ChatColor color; - private final String name; + private final ChatColor full, half, empty; + private final String name, icon; private final char barCharacter; + public static final ManaDisplayOptions DEFAULT = new ManaDisplayOptions(ChatColor.AQUA, ChatColor.BLUE, ChatColor.WHITE, "Mana", + AltChar.listSquare.charAt(0), ChatColor.BLUE + AltChar.manaStar); + public ManaDisplayOptions(ConfigurationSection config) { Validate.notNull(config, "Could not load mana display options"); name = config.getString("name"); Validate.notNull(name, "Could not load mana name"); - String format = config.getString("color").toUpperCase().replace("-", "_").replace(" ", "_"); - Validate.notNull(format, "Could not load mana color"); - color = ChatColor.valueOf(format); + Validate.notNull(config.getConfigurationSection("color"), "Could not find mana color config"); + full = ChatColor.valueOf(config.getString("color.full", "NO_INPUT").toUpperCase().replace("-", "_").replace(" ", "_")); + half = ChatColor.valueOf(config.getString("color.half", "NO_INPUT").toUpperCase().replace("-", "_").replace(" ", "_")); + empty = ChatColor.valueOf(config.getString("color.empty", "NO_INPUT").toUpperCase().replace("-", "_").replace(" ", "_")); - format = config.getString("char"); - Validate.notNull(format, "Could not load mana bar character"); + String format = config.getString("char", ""); Validate.notEmpty(format, "Could not load mana bar character"); barCharacter = format.charAt(0); + + icon = ChatColor.translateAlternateColorCodes('&', config.getString("icon", "")); + Validate.notEmpty(format, "Could not load mana action bar icon"); } - public ManaDisplayOptions(ChatColor color, String name, char barCharacter) { - Validate.notNull(color, "Color cannot be null"); + public ManaDisplayOptions(ChatColor full, ChatColor half, ChatColor empty, String name, char barCharacter, String icon) { + Validate.notNull(full, "Color cannot be null"); + Validate.notNull(half, "Color cannot be null"); + Validate.notNull(empty, "Color cannot be null"); Validate.notNull(name, "Name cannot be null"); Validate.notNull(barCharacter, "Bar character cannot be null"); - this.color = color; + this.full = full; + this.half = half; + this.empty = empty; this.name = name; this.barCharacter = barCharacter; + this.icon = icon; } - + public String getName() { return name; } + /* + * used to display mana on the action bar + */ + public String getIcon() { + return icon; + } + public String generateBar(double mana, double max) { String format = ""; double ratio = 20 * mana / max; + for (double j = 1; j < 20; j++) - format += "" + (ratio >= j ? color : ChatColor.WHITE) + barCharacter; + format += "" + (ratio >= j ? full : ratio >= j - .5 ? half : empty) + barCharacter; + return format; } } diff --git a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java index 2e323164..28c10bfb 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java +++ b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java @@ -5,7 +5,6 @@ import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -56,8 +55,6 @@ public class MMOCoreUtils { } public static ItemStack readIcon(String string) throws IllegalArgumentException { - Validate.notNull(string, "String cannot be null"); - String[] split = string.split("\\:"); Material material = Material.valueOf(split[0].toUpperCase().replace("-", "_").replace(" ", "_")); return split.length > 1 ? MMOLib.plugin.getVersion().getWrapper().textureItem(material, Integer.parseInt(split[1])) : new ItemStack(material); diff --git a/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java b/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java index 2edfd61a..13d3e184 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java +++ b/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java @@ -8,8 +8,8 @@ import org.bukkit.entity.Player; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.AltChar; -import net.Indyuce.mmocore.api.experience.Profession; import net.Indyuce.mmocore.api.experience.PlayerProfessions; +import net.Indyuce.mmocore.api.experience.Profession; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.api.quest.PlayerQuests; @@ -58,13 +58,13 @@ public class RPGPlaceholders PlayerProfessions professions = PlayerData.get(player).getCollectionSkills(); String name = identifier.substring(19).replace(" ", "-").replace("_", "-").toLowerCase(); Profession profession = MMOCore.plugin.professionManager.get(name); - double current = professions.getExperience(profession), - next = professions.getLevelUpExperience(profession); + double current = professions.getExperience(profession), next = professions.getLevelUpExperience(profession); return MMOCore.plugin.configManager.decimal.format(current / next * 100); } else if (identifier.startsWith("profession_")) - return "" + PlayerData.get(player).getCollectionSkills().getLevel(identifier.substring(11).replace(" ", "-").replace("_", "-").toLowerCase()); + return "" + PlayerData.get(player).getCollectionSkills() + .getLevel(identifier.substring(11).replace(" ", "-").replace("_", "-").toLowerCase()); else if (identifier.equals("max_health")) return StatType.MAX_HEALTH.format(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); @@ -73,7 +73,7 @@ public class RPGPlaceholders return "" + PlayerData.get(player).getExperience(); else if (identifier.equals("next_level")) - return "" +PlayerData.get(player).getLevelUpExperience(); + return "" + PlayerData.get(player).getLevelUpExperience(); else if (identifier.equals("class_points")) return "" + PlayerData.get(player).getClassPoints(); @@ -88,18 +88,15 @@ public class RPGPlaceholders return "" + PlayerData.get(player).getAttributeReallocationPoints(); else if (identifier.startsWith("attribute_")) - return String.valueOf(PlayerData.get(player).getAttributes().getAttribute(MMOCore.plugin.attributeManager.get(identifier.substring(10).toLowerCase().replace("_", "-")))); + return String.valueOf(PlayerData.get(player).getAttributes() + .getAttribute(MMOCore.plugin.attributeManager.get(identifier.substring(10).toLowerCase().replace("_", "-")))); else if (identifier.equals("mana")) return MMOCore.plugin.configManager.decimal.format(PlayerData.get(player).getMana()); else if (identifier.equals("mana_bar")) { - String format = ""; PlayerData data = PlayerData.get(player); - double ratio = 20 * data.getMana() / data.getStats().getStat(StatType.MAX_MANA); - for (double j = 1; j < 20; j++) - format += (ratio >= j ? MMOCore.plugin.configManager.manaFull : ratio >= j - .5 ? MMOCore.plugin.configManager.manaHalf : MMOCore.plugin.configManager.manaEmpty) + AltChar.listSquare; - return format; + return data.getProfess().getManaDisplay().generateBar(data.getMana(), data.getStats().getStat(StatType.MAX_MANA)); } else if (identifier.equals("stamina")) @@ -110,7 +107,9 @@ public class RPGPlaceholders PlayerData data = PlayerData.get(player); double ratio = 20 * data.getStamina() / data.getStats().getStat(StatType.MAX_STAMINA); for (double j = 1; j < 20; j++) - format += (ratio >= j ? MMOCore.plugin.configManager.staminaFull : ratio >= j - .5 ? MMOCore.plugin.configManager.staminaHalf : MMOCore.plugin.configManager.staminaEmpty) + AltChar.listSquare; + format += (ratio >= j ? MMOCore.plugin.configManager.staminaFull + : ratio >= j - .5 ? MMOCore.plugin.configManager.staminaHalf : MMOCore.plugin.configManager.staminaEmpty) + + AltChar.listSquare; return format; } diff --git a/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java b/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java index fb0e274e..31905a71 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; +import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.file.YamlConfiguration; @@ -60,7 +61,12 @@ public class ClassManager extends MMOManager { } public PlayerClass get(String id) { - return map.containsKey(id) ? map.get(id) : null; + return map.get(id); + } + + public PlayerClass getOrThrow(String id) { + Validate.isTrue(map.containsKey(id), "Could not find class with ID '" + id + "'"); + return map.get(id); } public Collection getAll() { diff --git a/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index 488c58ac..f71d1a71 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -26,7 +26,7 @@ public class ConfigManager { public boolean overrideVanillaExp, hotbarSwap; public double expPartyBuff, regenPartyBuff; public String partyChatPrefix; - public ChatColor manaFull, manaHalf, manaEmpty, staminaFull, staminaHalf, staminaEmpty; + public ChatColor staminaFull, staminaHalf, staminaEmpty; public int combatLogTimer, lootChestExpireTime; public final DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols(); @@ -102,9 +102,6 @@ public class ConfigManager { combatLogTimer = MMOCore.plugin.getConfig().getInt("combat-log.timer"); lootChestExpireTime = Math.max(MMOCore.plugin.getConfig().getInt("loot-chest-expire-time"), 1) * 1000; - manaFull = getColorOrDefault("mana-whole", ChatColor.BLUE); - manaHalf = getColorOrDefault("mana-half", ChatColor.AQUA); - manaEmpty = getColorOrDefault("mana-empty", ChatColor.WHITE); staminaFull = getColorOrDefault("stamina-whole", ChatColor.GREEN); staminaHalf = getColorOrDefault("stamina-half", ChatColor.DARK_GREEN); staminaEmpty = getColorOrDefault("stamina-empty", ChatColor.WHITE); @@ -163,7 +160,7 @@ public class ConfigManager { public class SimpleMessage { private final String message; - SimpleMessage(String message) { + public SimpleMessage(String message) { this.message = message; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5f5de156..b4852927 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -51,7 +51,7 @@ action-bar: ticks-to-update: 5 # How to display the data. - format: "&c❤ {health}/{max_health} &f| &9⭐ {mana}/{max_mana} &f| &7⛨ {armor}" + format: "&c❤ {health}/{max_health} &f| {mana_icon} {mana}/{max_mana} &f| &7⛨ {armor}" party: diff --git a/src/main/resources/default/classes/arcane-mage.yml b/src/main/resources/default/classes/arcane-mage.yml index 4b0bdd58..ec21005f 100644 --- a/src/main/resources/default/classes/arcane-mage.yml +++ b/src/main/resources/default/classes/arcane-mage.yml @@ -1,9 +1,5 @@ -options: - display: false -mana: - char: ■ - color: BLUE - name: 'Mana' + +# Display options display: name: 'Arcane Mage' lore: @@ -38,6 +34,11 @@ exp-curve: levels # Players cannot go further than Lvl 100 max-level: 100 +# This class must not display in /class +# becasue it is a subclass of mage +options: + display: false + triggers: level-up: - 'command{format="mmocore admin skill-points give %player% 1"}' diff --git a/src/main/resources/default/classes/human.yml b/src/main/resources/default/classes/human.yml index b975fd39..dc27e6d8 100644 --- a/src/main/resources/default/classes/human.yml +++ b/src/main/resources/default/classes/human.yml @@ -1,6 +1,13 @@ + +# Display options, it's not displayed anywhere so pointless. +# Just need the name for reference and PAPI placeholders. display: name: 'Human' +# This is the default class which players have when +# joining the server. They can level it up, but they +# cannot choose this class again after changing their +# class because it is not displayed in /class options: default: true display: false @@ -12,11 +19,6 @@ options: # Must match an existing exp curve filename from the 'expcurves' folder exp-curve: levels -mana: - char: ■ - color: BLUE - name: 'Mana' - # Experience sources for main class experience. main-exp-sources: - 'killmob{type=ZOMBIE;amount=1-3}' diff --git a/src/main/resources/default/classes/mage.yml b/src/main/resources/default/classes/mage.yml index 6e0f4631..bfcf97aa 100644 --- a/src/main/resources/default/classes/mage.yml +++ b/src/main/resources/default/classes/mage.yml @@ -36,9 +36,21 @@ triggers: level-up: - 'command{format="mmocore admin skill-points give %player% 1"}' +# This is the default mana display options, however it is not mandatory +# to have it in your class config file. Other classes do not have this +# section and therefore have the default mana display options. +# +# 'char' is the character used to generate the mana bar as a message +# 'color' are also the colors used to generate the mana bar +# 'icon' is the icon display on the player action bar +# 'name' is basically displayed everywhere mana: char: ■ - color: BLUE + icon: '&9⭐' + color: + full: AQUA + half: BLUE + empty: WHITE name: 'Mana' cast-particle: diff --git a/src/main/resources/default/classes/marksman.yml b/src/main/resources/default/classes/marksman.yml index 28e32a93..70faca7a 100644 --- a/src/main/resources/default/classes/marksman.yml +++ b/src/main/resources/default/classes/marksman.yml @@ -35,11 +35,8 @@ triggers: level-up: - 'command{format="mmocore admin skill-points give %player% 1"}' -mana: - char: ■ - color: BLUE - name: 'Mana' - +# Particles displayed around the player +# when he enters the casting mode. cast-particle: particle: CRIT diff --git a/src/main/resources/default/classes/paladin.yml b/src/main/resources/default/classes/paladin.yml index 84ccf402..16432808 100644 --- a/src/main/resources/default/classes/paladin.yml +++ b/src/main/resources/default/classes/paladin.yml @@ -33,11 +33,6 @@ exp-curve: levels # Players cannot go further than Lvl 100 max-level: 100 -mana: - char: ■ - color: BLUE - name: 'Mana' - triggers: level-up: - 'command{format="mmocore admin skill-points give %player% 1"}' diff --git a/src/main/resources/default/classes/rogue.yml b/src/main/resources/default/classes/rogue.yml index bc68552d..2e9705cb 100644 --- a/src/main/resources/default/classes/rogue.yml +++ b/src/main/resources/default/classes/rogue.yml @@ -42,11 +42,6 @@ options: cast-particle: particle: SPELL_WITCH -mana: - char: ■ - color: BLUE - name: 'Mana' - skills: DEEP_WOUND: level: 1 diff --git a/src/main/resources/default/classes/warrior.yml b/src/main/resources/default/classes/warrior.yml index b85e8bf9..d68eccec 100644 --- a/src/main/resources/default/classes/warrior.yml +++ b/src/main/resources/default/classes/warrior.yml @@ -39,9 +39,18 @@ max-level: 100 # Warrior has rage which he gains while casting spells # Rage increase its skill damage. Use # to get the player's rage (MythicMobs formulas) +# +# 'char' is the character used to generate the mana bar as a message +# 'color' are also the colors used to generate the mana bar +# 'icon' is the icon display on the player action bar +# 'name' is basically displayed everywhere mana: char: ♦ - color: RED + icon: '&4♦' + color: + full: DARK_RED + half: RED + empty: WHITE name: 'Rage' # Rage charges when dealing weapon and physical damage.