From bb73fb57df8db183a2e4d4a1e6eaff88f81466b6 Mon Sep 17 00:00:00 2001 From: Jules Date: Mon, 10 Apr 2023 17:30:50 +0200 Subject: [PATCH] Fixed skills not updating when using /mmocore reload --- .../java/net/Indyuce/mmocore/MMOCore.java | 5 +- .../mmocore/api/player/PlayerData.java | 48 +++++++++++-------- .../api/player/profess/PlayerClass.java | 3 ++ .../mmocore/api/player/stats/PlayerStats.java | 2 +- .../net/Indyuce/mmocore/skill/ClassSkill.java | 9 ---- .../mmocore/skill/binding/BoundSkillInfo.java | 48 +++++++++++-------- .../main/resources/default/gui/skill-list.yml | 5 +- 7 files changed, 62 insertions(+), 58 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java index 6425ea0a..9feb5e1c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -45,9 +45,6 @@ import net.Indyuce.mmocore.script.mechanic.ManaMechanic; import net.Indyuce.mmocore.script.mechanic.StaminaMechanic; import net.Indyuce.mmocore.script.mechanic.StelliumMechanic; import net.Indyuce.mmocore.skill.cast.SkillCastingMode; -import net.Indyuce.mmocore.skill.list.Ambers; -import net.Indyuce.mmocore.skill.list.Neptune_Gift; -import net.Indyuce.mmocore.skill.list.Sneaky_Picky; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -359,7 +356,7 @@ public class MMOCore extends JavaPlugin { actionBarManager.reload(getConfig().getConfigurationSection("action-bar")); if (clearBefore) - PlayerData.getAll().forEach(PlayerData::update); + PlayerData.getAll().forEach(PlayerData::reload); } public static void log(String message) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index fc56e50d..fa4d4e64 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -161,10 +161,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc *

* It's OK if bound skills disappear because of a configuration issue * on the user's end. After all this method is only called when using - * /reload and /reload is considered a bad practice. If any error - * happens then just don't update the player's skill. + * /mmocore reload */ - public void update() { + public void reload() { try { profess = profess == null ? null : MMOCore.plugin.classManager.get(profess.getId()); @@ -173,13 +172,20 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc MMOCore.log(Level.SEVERE, "[Userdata] Could not find class " + getProfess().getId() + " while refreshing player data."); } - Iterator ite = boundSkills.keySet().iterator(); - while (ite.hasNext()) try { - int slot = ite.next(); - BoundSkillInfo boundSkillInfo = new BoundSkillInfo(boundSkills.get(slot)); - boundSkills.put(slot, boundSkillInfo); - } catch (Exception ignored) { - } + final Iterator ite = boundSkills.keySet().iterator(); + while (ite.hasNext()) + try { + final int slot = ite.next(); + + + Bukkit.broadcastMessage("OLD " + boundSkills.get(slot).getClassSkill().getSkill().getModifierInfo("cooldown")); + + boundSkills.put(slot, new BoundSkillInfo(boundSkills.get(slot))); + + Bukkit.broadcastMessage("NEW " + boundSkills.get(slot).getClassSkill().getSkill().getModifierInfo("cooldown")); + } catch (Exception exception) { + exception.printStackTrace(); + } for (SkillTree skillTree : getProfess().getSkillTrees()) for (SkillTreeNode node : skillTree.getNodes()) @@ -528,6 +534,13 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return sum; } + @Deprecated + public List getUnlockedSkills() { + return getProfess().getSkills().stream() + .filter((classSkill) -> hasUnlocked(classSkill)) + .collect(Collectors.toList()); + } + @Override public int getAttributePoints() { return attributePoints; @@ -1161,22 +1174,19 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc */ public void bindSkill(int slot, ClassSkill skill) { Validate.notNull(skill, "Skill cannot be null"); - //Unbinds the previous skill (Important for passive skills. + + // Unbinds the previous skill (Important for passive skills. String skillId = skill.getSkill().getHandler().getId(); if (boundSkills.containsKey(slot)) boundSkills.get(slot).unbind(); + if (slot >= 0) { - //We apply the skill buffs associated with the slot to the skill. + + // We apply the skill buffs associated with the slot to the skill. for (SkillModifierTrigger skillBuffTrigger : profess.getSkillSlot(slot).getSkillBuffTriggers()) if (skillBuffTrigger.getTargetSkills().contains(skillId)) skillBuffTrigger.apply(this, skill.getSkill().getHandler()); - if (skill.getSkill().getTrigger().isPassive()) { - PassiveSkill passiveSkill = skill.toPassive(this); - passiveSkill.register(mmoData); - boundSkills.put(slot, new BoundSkillInfo(skill, this, passiveSkill.getUniqueId())); - } else { - boundSkills.put(slot, new BoundSkillInfo(skill, this)); - } + boundSkills.put(slot, new BoundSkillInfo(skill, this)); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java index b76f3241..8aa3ba2b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java @@ -422,10 +422,12 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return false; } + @Deprecated public boolean hasSkill(RegisteredSkill skill) { return hasSkill(skill.getHandler().getId()); } + @Deprecated public boolean hasSkill(String id) { return skills.containsKey(id); } @@ -456,6 +458,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return skills.get(id); } + @Deprecated public Collection getSkills() { return skills.values(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/stats/PlayerStats.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/stats/PlayerStats.java index fcb283b8..ed6a2e92 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/stats/PlayerStats.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/stats/PlayerStats.java @@ -71,7 +71,7 @@ public class PlayerStats { * MythicLib. Must be ran everytime the player levels up or changes class. *

* This is also called when reloading the plugin to make class setup easier, - * see {@link PlayerData#update()} for more info + * see {@link PlayerData#reload()} for more info */ public synchronized void updateStats() { for (String stat : MMOCore.plugin.statManager.getRegistered()) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java index af08b6cd..35c23223 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java @@ -108,15 +108,6 @@ public class ClassSkill implements CooldownObject, Unlockable { return Objects.requireNonNull(modifiers.get(modifier), "Could not find modifier '" + modifier + "'").calculate(level); } - /** - * Gives the delay to launch the skill - * - * @return - */ - public int getDelay(PlayerData data) { - return modifiers.containsKey("delay") ? (int) modifiers.get("delay").calculate(data.getSkillLevel(getSkill())) : 0; - } - public List calculateLore(PlayerData data) { return calculateLore(data, data.getSkillLevel(skill)); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/BoundSkillInfo.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/BoundSkillInfo.java index 9bdecb15..727f6ad9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/BoundSkillInfo.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/BoundSkillInfo.java @@ -3,7 +3,9 @@ package net.Indyuce.mmocore.skill.binding; import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.skill.ClassSkill; +import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Objects; import java.util.UUID; @@ -12,17 +14,21 @@ public class BoundSkillInfo { private final PlayerData playerData; private final ClassSkill classSkill; - private UUID passiveSkillId; + /** + * Private skills must be registered inside of MythicLib when bound. + * When set to null, the skill is NOT registered. + */ + @Nullable + private PassiveSkill registered; public BoundSkillInfo(ClassSkill classSkill, PlayerData playerData) { this.classSkill = classSkill; this.playerData = playerData; - } - public BoundSkillInfo(ClassSkill classSkill, PlayerData playerData, UUID passiveSkillId) { - this.classSkill = classSkill; - this.playerData = playerData; - this.passiveSkillId = passiveSkillId; + if (classSkill.getSkill().getTrigger().isPassive()) { + registered = classSkill.toPassive(playerData); + registered.register(playerData.getMMOPlayerData()); + } } /** @@ -31,10 +37,12 @@ public class BoundSkillInfo { public BoundSkillInfo(BoundSkillInfo info) { this.playerData = info.getPlayerData(); this.classSkill = Objects.requireNonNull(playerData.getProfess().getSkill(info.getClassSkill().getSkill())); - info.unbind(); - PassiveSkill passiveSkill = classSkill.toPassive(playerData); - passiveSkill.register(playerData.getMMOPlayerData()); - this.passiveSkillId = passiveSkill.getUniqueId(); + + if (classSkill.getSkill().getTrigger().isPassive()) { + info.unbind(); + registered = classSkill.toPassive(playerData); + registered.register(playerData.getMMOPlayerData()); + } } @NotNull @@ -47,25 +55,23 @@ public class BoundSkillInfo { return playerData; } - @NotNull - public UUID getPassiveSkillId() { - return passiveSkillId; + public boolean isPassive() { + return registered != null; } /** - * This is used to refresh the PassiveSkill playerModifier so it is always associated to the + * This is used to refresh the PassiveSkill playerModifier + * so it is always associated to the right skill level. */ public void refresh() { - if (classSkill.getSkill().getTrigger().isPassive()) { - playerData.getMMOPlayerData().getPassiveSkillMap().removeModifier(passiveSkillId); - PassiveSkill passiveSkill = classSkill.toPassive(playerData); - passiveSkill.register(playerData.getMMOPlayerData()); - this.passiveSkillId = passiveSkill.getUniqueId(); + if (isPassive()) { + registered.unregister(playerData.getMMOPlayerData()); + registered = classSkill.toPassive(playerData); + registered.register(playerData.getMMOPlayerData()); } } public void unbind() { - if (classSkill.getSkill().getTrigger().isPassive()) - playerData.getMMOPlayerData().getPassiveSkillMap().removeModifier(passiveSkillId); + if (isPassive()) registered.unregister(playerData.getMMOPlayerData()); } } diff --git a/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml b/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml index 444624e9..7f60ca0a 100644 --- a/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml +++ b/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml @@ -49,10 +49,7 @@ items: slot: slots: [ 8,17,26,35,44,53 ] function: slot - item: BOOK - - # Material used when the slot is empty - empty-item: GRAY_DYE + item: GRAY_DYE name: '&aSkill Slot {slot}' no-skill: '&cNone'