From e338c0fd25cf0339db85fea2a6cbce3ba9b2fc3c Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 17:22:58 +0100 Subject: [PATCH 01/58] Fixed bug for ressources + class based ressource system --- .../mmocore/api/player/PlayerData.java | 8 ++++ .../player/profess/SavedClassInformation.java | 37 +++++++++++++++++- .../data/mysql/MySQLPlayerDataManager.java | 4 ++ .../data/yaml/YAMLPlayerDataManager.java | 4 ++ .../mmocore/player/ClassDataContainer.java | 8 ++++ .../mmocore/player/DefaultPlayerData.java | 39 +++++++++++++++++-- MMOCore-Dist/src/main/resources/config.yml | 5 +++ 7 files changed, 100 insertions(+), 5 deletions(-) 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 db412801..486955f5 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 @@ -948,14 +948,22 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc stellium = Math.max(0, Math.min(stellium + event.getAmount(), max)); } + @Override + public double getHealth() { + return getPlayer().getHealth(); + } + + @Override public double getMana() { return mana; } + @Override public double getStamina() { return stamina; } + @Override public double getStellium() { return stellium; } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index 76eafa7e..c8c39a40 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -10,6 +10,7 @@ import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.tree.SkillTree; +import org.bukkit.attribute.Attribute; import org.bukkit.configuration.ConfigurationSection; import java.util.*; @@ -17,7 +18,7 @@ import java.util.Map.Entry; public class SavedClassInformation { private final int level, skillPoints, attributePoints, attributeReallocationPoints, skillTreeReallocationPoints, skillReallocationPoints; - private final double experience; + private final double experience, health, mana, stellium, stamina; private final Map attributeLevels = new HashMap<>(); private final Map skillLevels = new HashMap<>(); private final Map skillTreePoints = new HashMap<>(); @@ -36,6 +37,10 @@ public class SavedClassInformation { attributeReallocationPoints = config.getInt("attribute-realloc-points"); skillReallocationPoints = config.getInt("skill-reallocation-points"); skillTreeReallocationPoints = config.getInt("skill-tree-reallocation-points"); + health = config.getInt("health", 20); + mana = config.getInt("mana", 0); + stamina = config.getInt("stamina", 0); + stellium = config.getInt("stellium", 0); if (config.contains("attribute")) config.getConfigurationSection("attribute").getKeys(false).forEach(key -> attributeLevels.put(key, config.getInt("attribute." + key))); if (config.contains("skill")) @@ -61,6 +66,10 @@ public class SavedClassInformation { attributeReallocationPoints = json.get("attribute-realloc-points").getAsInt(); skillReallocationPoints = json.get("skill-reallocation-points").getAsInt(); skillTreeReallocationPoints = json.get("skill-tree-reallocation-points").getAsInt(); + health = json.has("health") ? json.get("health").getAsDouble() : 20; + mana = json.has("mana") ? json.get("mana").getAsDouble() : 0; + stamina = json.has("stamina") ? json.get("stamina").getAsDouble() : 0; + stellium = json.has("stellium") ? json.get("stellium").getAsDouble() : 0; if (json.has("attribute")) for (Entry entry : json.getAsJsonObject("attribute").entrySet()) attributeLevels.put(entry.getKey(), entry.getValue().getAsInt()); @@ -88,7 +97,10 @@ public class SavedClassInformation { this.skillTreeReallocationPoints = data.getSkillTreeReallocationPoints(); this.skillReallocationPoints = data.getSkillReallocationPoints(); this.experience = data.getExperience(); - + this.health = data.getHealth(); + this.mana = data.getMana(); + this.stellium = data.getStellium(); + this.stamina = data.getStamina(); data.mapAttributeLevels().forEach((key, val) -> this.attributeLevels.put(key, val)); data.mapSkillLevels().forEach((key, val) -> skillLevels.put(key, val)); data.mapSkillTreePoints().forEach((key, val) -> skillTreePoints.put(key, val)); @@ -163,6 +175,22 @@ public class SavedClassInformation { return skillTreePoints.get(skillTreeId); } + public double getHealth() { + return health; + } + + public double getMana() { + return mana; + } + + public double getStellium() { + return stellium; + } + + public double getStamina() { + return stamina; + } + public Set getAttributeKeys() { return attributeLevels.keySet(); } @@ -265,6 +293,11 @@ public class SavedClassInformation { player.setClass(profess); player.unloadClassInfo(profess); + //This needs to be done at the end to make sure the MAX_HEALTH,MAX_MANA,MAX_STELLIUM... stats are loaded. + player.getPlayer().setHealth(Math.min(health,player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + player.setMana(mana); + player.setStellium(stellium); + player.setStamina(stamina); // Updates level on exp bar player.refreshVanillaExp(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 5f81e45c..f23dafb9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -89,6 +89,10 @@ public class MySQLPlayerDataManager extends PlayerDataManager { classinfo.addProperty("attribute-realloc-points", info.getAttributeReallocationPoints()); classinfo.addProperty("skill-reallocation-points", info.getSkillReallocationPoints()); classinfo.addProperty("skill-tree-reallocation-points", info.getSkillTreeReallocationPoints()); + classinfo.addProperty("health", info.getHealth()); + classinfo.addProperty("mana", info.getMana()); + classinfo.addProperty("stamina", info.getStamina()); + classinfo.addProperty("stellium", info.getStellium()); JsonObject skillinfo = new JsonObject(); for (String skill : info.getSkillKeys()) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index eabe5e83..1bff27f8 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -177,6 +177,10 @@ public class YAMLPlayerDataManager extends PlayerDataManager { config.set("class-info." + key + ".attribute-realloc-points", info.getAttributeReallocationPoints()); config.set("class-info." + key + ".skill-tree-reallocation-points", info.getSkillTreeReallocationPoints()); config.set("class-info." + key + ".skill-reallocation-points", info.getSkillReallocationPoints()); + config.set("class-info." + key + ".health", info.getHealth()); + config.set("class-info." + key + ".mana", info.getMana()); + config.set("class-info." + key + ".stamina", info.getStamina()); + config.set("class-info." + key + ".stellium", info.getStellium()); info.getSkillKeys().forEach(skill -> config.set("class-info." + key + ".skill." + skill, info.getSkillLevel(skill))); info.getAttributeKeys().forEach(attribute -> config.set("class-info." + key + ".attribute." + attribute, info.getAttributeLevel(attribute))); info.getNodeKeys().forEach(node -> config.set("class-info." + key + ".node-levels." + node, info.getNodeLevel(node))); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index 9ac8f2b1..90e8367d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -29,6 +29,14 @@ public interface ClassDataContainer { int getSkillTreeReallocationPoints(); + double getHealth(); + + double getMana(); + + double getStamina(); + + double getStellium(); + Map mapAttributeLevels(); Map mapSkillLevels(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index f6b16547..1a4dc244 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -4,6 +4,7 @@ import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; +import org.bukkit.attribute.Attribute; import org.bukkit.configuration.ConfigurationSection; import java.util.ArrayList; @@ -13,8 +14,8 @@ import java.util.Map; public class DefaultPlayerData implements ClassDataContainer { private final int level, classPoints, skillPoints, attributePoints, attrReallocPoints, skillReallocPoints, skillTreeReallocPoints; - - public static final DefaultPlayerData DEFAULT = new DefaultPlayerData(1, 0, 0, 0, 0, 0, 0); + private final double health, mana, stamina, stellium; + public static final DefaultPlayerData DEFAULT = new DefaultPlayerData(1, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0); public DefaultPlayerData(ConfigurationSection config) { level = config.getInt("level", 1); @@ -24,9 +25,13 @@ public class DefaultPlayerData implements ClassDataContainer { attrReallocPoints = config.getInt("attribute-realloc-points"); skillReallocPoints = config.getInt("skill-realloc-points", 0); skillTreeReallocPoints = config.getInt("skill-tree-realloc-points", 0); + health = config.getDouble("health"); + mana = config.getDouble("mana"); + stellium = config.getDouble("stellium"); + stamina = config.getDouble("stamina"); } - public DefaultPlayerData(int level, int classPoints, int skillPoints, int attributePoints, int attrReallocPoints, int skillReallocPoints, int skillTreeReallocPoints) { + public DefaultPlayerData(int level, int classPoints, int skillPoints, int attributePoints, int attrReallocPoints, int skillReallocPoints, int skillTreeReallocPoints, double health, double mana, double stamina, double stellium) { this.level = level; this.classPoints = classPoints; this.skillPoints = skillPoints; @@ -34,6 +39,10 @@ public class DefaultPlayerData implements ClassDataContainer { this.attrReallocPoints = attrReallocPoints; this.skillReallocPoints = skillReallocPoints; this.skillTreeReallocPoints = skillTreeReallocPoints; + this.health = health; + this.mana = mana; + this.stamina = stamina; + this.stellium = stellium; } public int getLevel() { @@ -74,6 +83,26 @@ public class DefaultPlayerData implements ClassDataContainer { return skillTreeReallocPoints; } + @Override + public double getHealth() { + return health; + } + + @Override + public double getMana() { + return mana; + } + + @Override + public double getStamina() { + return stamina; + } + + @Override + public double getStellium() { + return stellium; + } + @Override public Map mapSkillLevels() { return new HashMap<>(); @@ -117,5 +146,9 @@ public class DefaultPlayerData implements ClassDataContainer { player.setAttributeReallocationPoints(attrReallocPoints); player.setSkillTreeReallocationPoints(skillTreeReallocPoints); player.setSkillReallocationPoints(skillReallocPoints); + player.getPlayer().setHealth(Math.min(health,player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + player.setMana(mana); + player.setStamina(stamina); + player.setStellium(stellium); } } diff --git a/MMOCore-Dist/src/main/resources/config.yml b/MMOCore-Dist/src/main/resources/config.yml index 984f3cc2..d154f80b 100644 --- a/MMOCore-Dist/src/main/resources/config.yml +++ b/MMOCore-Dist/src/main/resources/config.yml @@ -30,6 +30,11 @@ default-playerdata: skill-realloc-points: 0 attribute-points: 0 attribute-realloc-points: 0 + health: 20 + mana: 0 + stellium: 0 + stamina: 0 + # The list of all conditions which must be met for the # BLOCK REGEN and BLOCK RESTRICTIONS to apply. Set to From 8b6e31651f77d6fa19a77ff9e0ad02e5bc02c274 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 17:49:55 +0100 Subject: [PATCH 02/58] Fixed bug for ressources + class based ressource system --- .../java/net/Indyuce/mmocore/player/ClassDataContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index 90e8367d..dca3620e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -14,7 +14,7 @@ import java.util.Map; * class. */ public interface ClassDataContainer { - +//Test int getLevel(); double getExperience(); From 25e3b478d5ef043626bced2879ba756e7cd7711c Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 17:50:41 +0100 Subject: [PATCH 03/58] test --- .../java/net/Indyuce/mmocore/player/ClassDataContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index dca3620e..90e8367d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -14,7 +14,7 @@ import java.util.Map; * class. */ public interface ClassDataContainer { -//Test + int getLevel(); double getExperience(); From 4dce534d74015bf1814d062da52db49f7691b761 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 18:57:07 +0100 Subject: [PATCH 04/58] Creation of skillSlot class --- .../player/profess/skillslot/SkillSlot.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java new file mode 100644 index 00000000..2febed8e --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java @@ -0,0 +1,24 @@ +package net.Indyuce.mmocore.api.player.profess.skillslot; + +import io.lumine.mythic.lib.api.math.BooleanExpressionParser; +import net.Indyuce.mmocore.skill.ClassSkill; +import org.bukkit.configuration.ConfigurationSection; + +public class SkillSlot { + private final int slot; + private final String expression; + + public SkillSlot(int slot, String expression) { + this.slot = slot; + this.expression = expression; + } + + public SkillSlot(ConfigurationSection section) { + this.slot = Integer.parseInt(section.getName()); + this.expression = section.getString("expression"); + } + + public boolean canBePlaced(ClassSkill classSkill) { + return new BooleanExpressionParser(expression).parse(classSkill.getSkill().getCategories()); + } +} From ef173a23360ef1928368eb109c139af7b5f503d6 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 18:58:17 +0100 Subject: [PATCH 05/58] Added categories to registeredSkills --- .../Indyuce/mmocore/skill/RegisteredSkill.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java index f8ec05a2..1504d090 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java @@ -11,11 +11,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; public class RegisteredSkill implements Unlockable { private final SkillHandler handler; @@ -23,7 +19,7 @@ public class RegisteredSkill implements Unlockable { private final Map defaultModifiers = new HashMap<>(); private final ItemStack icon; private final List lore; - + private final List categories; @NotNull private final TriggerType triggerType; @@ -33,7 +29,7 @@ public class RegisteredSkill implements Unlockable { name = Objects.requireNonNull(config.getString("name"), "Could not find skill name"); icon = MMOCoreUtils.readIcon(Objects.requireNonNull(config.getString("material"), "Could not find skill icon")); lore = Objects.requireNonNull(config.getStringList("lore"), "Could not find skill lore"); - + categories = config.getStringList("categories"); // Trigger type triggerType = getHandler().isTriggerable() ? (config.contains("passive-type") ? TriggerType.valueOf(UtilityMethods.enumName(config.getString("passive-type"))) : TriggerType.CAST) : TriggerType.API; @@ -54,6 +50,7 @@ public class RegisteredSkill implements Unlockable { this.icon = icon; this.lore = lore; this.triggerType = triggerType; + this.categories = new ArrayList<>(); } @Override @@ -73,6 +70,10 @@ public class RegisteredSkill implements Unlockable { return lore; } + public List getCategories() { + return categories; + } + public ItemStack getIcon() { return icon.clone(); } @@ -98,7 +99,7 @@ public class RegisteredSkill implements Unlockable { /** * @return Modifier formula. - * Not null as long as the modifier is well defined + * Not null as long as the modifier is well defined */ @NotNull public LinearValue getModifierInfo(String modifier) { From e9a7097a8d69a3dfac26ec29683569b490c42024 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 18:59:29 +0100 Subject: [PATCH 06/58] Removed the boundPassiveSkill method in DataContainer --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 4 ---- .../java/net/Indyuce/mmocore/player/ClassDataContainer.java | 2 -- .../java/net/Indyuce/mmocore/player/DefaultPlayerData.java | 6 ------ 3 files changed, 12 deletions(-) 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 486955f5..41a1c1c0 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 @@ -1201,10 +1201,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return boundSkills; } - public List getBoundPassiveSkills() { - return boundPassiveSkills; - } - @NotNull public CombatHandler getCombat() { return combat; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index 90e8367d..d8b8b74b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -45,8 +45,6 @@ public interface ClassDataContainer { List getBoundSkills(); - List getBoundPassiveSkills(); - Map getNodeLevels(); Map getNodeTimesClaimed(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index 1a4dc244..0be26654 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -1,6 +1,5 @@ package net.Indyuce.mmocore.player; -import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; @@ -133,11 +132,6 @@ public class DefaultPlayerData implements ClassDataContainer { return new ArrayList<>(); } - @Override - public List getBoundPassiveSkills() { - return new ArrayList<>(); - } - public void apply(PlayerData player) { player.setLevel(level); player.setClassPoints(classPoints); From 8e37898d33549cb6499e8c38b51b44634f26eb4b Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 19:00:38 +0100 Subject: [PATCH 07/58] Changed PlayerClass to make it compatible with SkillSlots --- .../api/player/profess/PlayerClass.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) 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 c3d8b283..42012926 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 @@ -21,6 +21,7 @@ import net.Indyuce.mmocore.api.player.profess.event.EventTrigger; import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.ResourceRegeneration; +import net.Indyuce.mmocore.api.player.profess.skillslot.SkillSlot; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.experience.EXPSource; @@ -67,8 +68,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { @Nullable private final CastingParticle castParticle; - private final int maxBoundActiveSkills, maxBoundPassiveSkills; - + private final List skillSlots= new ArrayList<>(); private final List skillTrees = new ArrayList<>(); private final List classScripts = new LinkedList(); private final Map stats = new HashMap<>(); @@ -103,7 +103,9 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { | SecurityException exception) { throw new IllegalArgumentException("Could not apply playerhead texture: " + exception.getMessage()); } - + for (String key : config.getConfigurationSection("skill-slots").getKeys(false)) { + skillSlots.add(new SkillSlot(config.getConfigurationSection("skill-slots." + key))); + } for (String string : config.getStringList("display.lore")) description.add(ChatColor.GRAY + MythicLib.plugin.parseColors(string)); for (String string : config.getStringList("display.attribute-lore")) @@ -118,8 +120,6 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { ? MMOCore.plugin.experience.getCurveOrThrow( config.get("exp-curve").toString().toLowerCase().replace("_", "-").replace(" ", "-")) : ExpCurve.DEFAULT; - maxBoundActiveSkills = config.getInt("max-bound-active-skills", MMOCore.plugin.configManager.maxBoundActiveSkills); - maxBoundPassiveSkills = config.getInt("max-bound-passive-skills", MMOCore.plugin.configManager.maxBoundPassiveSkills); ExperienceTable expTable = null; if (config.contains("exp-table")) try { @@ -252,8 +252,6 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { this.icon = new ItemStack(material); setOption(ClassOption.DISPLAY, false); setOption(ClassOption.DEFAULT, false); - maxBoundActiveSkills = 6; - maxBoundPassiveSkills = 3; for (PlayerResource resource : PlayerResource.values()) resourceHandlers.put(resource, new ResourceRegeneration(resource)); } @@ -309,13 +307,6 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return expCurve; } - public int getMaxBoundActiveSkills() { - return maxBoundActiveSkills; - } - - public int getMaxBoundPassiveSkills() { - return maxBoundPassiveSkills; - } @NotNull public ExperienceTable getExperienceTable() { From 8e6ac3755d168b5840d62e79766da618e28edb44 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 19:01:38 +0100 Subject: [PATCH 08/58] Removed references to PassiveBoundSlots in SavedClassInformation.java --- .../mmocore/api/player/profess/SavedClassInformation.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index c8c39a40..95238452 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -107,7 +107,6 @@ public class SavedClassInformation { data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node.getFullId(), level)); data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); - data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getTriggeredSkill().getHandler().getId())); data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId())); } @@ -236,9 +235,6 @@ public class SavedClassInformation { if (player.getProfess().hasExperienceTable()) player.getProfess().getExperienceTable().removePermStats(player, player.getProfess()); - while (player.hasPassiveSkillBound(0)) - player.unbindPassiveSkill(0); - while (player.hasSkillBound(0)) player.unbindSkill(0); player.clearNodeTimesClaimed(); From b7d3aa07ebce21777c01c674f9ec87a0d2fcd7d7 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 19:03:20 +0100 Subject: [PATCH 09/58] Removed all references to passiveBoundSkill in playerData --- .../mmocore/api/player/PlayerData.java | 69 ++++--------------- 1 file changed, 15 insertions(+), 54 deletions(-) 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 41a1c1c0..d7482c87 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 @@ -81,7 +81,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc */ @Nullable private PlayerClass profess; - private int level, classPoints, skillPoints, attributePoints, attributeReallocationPoints, skillTreeReallocationPoints, skillReallocationPoints; + private int level, classPoints, skillPoints, attributePoints, attributeReallocationPoints; + private int numberSlots, skillTreeReallocationPoints, skillReallocationPoints; private double experience; private double mana, stamina, stellium; private Guild guild; @@ -92,7 +93,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc private final Set waypoints = new HashSet<>(); private final Map skills = new HashMap<>(); private final List boundSkills = new ArrayList<>(); - private final List boundPassiveSkills = new ArrayList<>(); private final PlayerProfessions collectSkills = new PlayerProfessions(this); private final PlayerAttributes attributes = new PlayerAttributes(this); private final Map classSlots = new HashMap<>(); @@ -222,8 +222,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public void clearSkillTreePoints() { skillTreePoints.clear(); } + public void clearNodeTimesClaimed() { - Map copy= new HashMap<>(tableItemClaims); + Map copy = new HashMap<>(tableItemClaims); copy.forEach((str, val) -> { if (str.startsWith(SkillTreeNode.KEY_PREFIX)) tableItemClaims.remove(str); @@ -458,6 +459,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return skillPoints; } + public int getNumberSlots() { + return numberSlots; + } + + public void setNumberSlots(int numberSlots) { + this.numberSlots = numberSlots; + } + public void giveSkillReallocationPoints(int value) { skillReallocationPoints += value; } @@ -1047,16 +1056,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public void setSkillLevel(String skill, int level) { skills.put(skill, level); - //If it is a passive skill we rebind it to make sure to update the damages done by it. - for (int i = 0; i < boundPassiveSkills.size(); i++) { - - PassiveSkill passiveSkill = boundPassiveSkills.get(i); - if (passiveSkill.getTriggeredSkill().getHandler().getId().equals(skill)) { - passiveSkill.unregister(mmoData); - passiveSkill.register(mmoData); - } - - } } public void resetSkillLevel(String skill) { @@ -1135,41 +1134,10 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return slot >= boundSkills.size() ? null : boundSkills.get(slot); } - /** - * Registers a passive skill in the list. This method guarantees interface - * between ML passive skills and the MMOCore list. - * - * @param slot Slot to which you're binding the skill. - * Use -1 to force-register the skill - * @param skill Skill being bound - */ - public void bindPassiveSkill(int slot, @NotNull PassiveSkill skill) { - Validate.notNull(skill, "Skill cannot be null"); - final int maxBound = getProfess().getMaxBoundPassiveSkills(); - if (slot >= 0 && boundPassiveSkills.size() >= maxBound) { - final @NotNull PassiveSkill current = boundPassiveSkills.set(slot, skill); - if (current != null) - current.unregister(mmoData); - skill.register(mmoData); - return; - } - - boundPassiveSkills.add(skill); - skill.register(mmoData); - } - - public boolean hasPassiveSkillBound(int slot) { - return slot < boundPassiveSkills.size(); - } - - @Nullable - public PassiveSkill getBoundPassiveSkill(int slot) { - return slot >= boundPassiveSkills.size() ? null : boundPassiveSkills.get(slot); - } @Deprecated public void setBoundSkill(int slot, ClassSkill skill) { - bindActiveSkill(slot, skill); + bindSkill(slot, skill); } /** @@ -1179,23 +1147,16 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc * Use -1 to force-register the skill * @param skill Skill being bound */ - public void bindActiveSkill(int slot, ClassSkill skill) { + public void bindSkill(int slot, ClassSkill skill) { Validate.notNull(skill, "Skill cannot be null"); - if (slot >= 0 && boundSkills.size() >= getProfess().getMaxBoundActiveSkills()) + if (slot >= 0) boundSkills.set(slot, skill); - else - boundSkills.add(skill); } public void unbindSkill(int slot) { boundSkills.remove(slot); } - public void unbindPassiveSkill(int slot) { - PassiveSkill skill = boundPassiveSkills.get(slot); - skill.unregister(getMMOPlayerData()); - boundPassiveSkills.remove(slot); - } public List getBoundSkills() { return boundSkills; From 81f245a4ce0d1fa1c70ebf6a16046aee9b2b8229 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 9 Mar 2023 23:10:49 +0100 Subject: [PATCH 10/58] Removed passive skill from the skill list GUI --- .../mmocore/api/player/PlayerData.java | 11 ++- .../net/Indyuce/mmocore/gui/SkillList.java | 81 +------------------ 2 files changed, 8 insertions(+), 84 deletions(-) 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 d7482c87..acc08edc 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 @@ -5,7 +5,6 @@ import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.api.stat.StatInstance; import io.lumine.mythic.lib.api.stat.modifier.StatModifier; import io.lumine.mythic.lib.player.cooldown.CooldownMap; -import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -82,7 +81,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc @Nullable private PlayerClass profess; private int level, classPoints, skillPoints, attributePoints, attributeReallocationPoints; - private int numberSlots, skillTreeReallocationPoints, skillReallocationPoints; + private int skillSlotLimit, skillTreeReallocationPoints, skillReallocationPoints; private double experience; private double mana, stamina, stellium; private Guild guild; @@ -459,12 +458,12 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return skillPoints; } - public int getNumberSlots() { - return numberSlots; + public int getSkillSlotLimit() { + return skillSlotLimit; } - public void setNumberSlots(int numberSlots) { - this.numberSlots = numberSlots; + public void setSkillSlotLimit(int skillSlotLimit) { + this.skillSlotLimit = skillSlotLimit; } public void giveSkillReallocationPoints(int value) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 0c0ee123..1b5ef874 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -61,11 +61,11 @@ public class SkillList extends EditableInventory { }; } - if (function.equals("active-slot")) + if (function.equals("slot")) return new SlotItem(config) { @Override public ItemStack display(SkillViewerInventory inv, int n) { - if (n >= inv.getPlayerData().getProfess().getMaxBoundActiveSkills()) { + if (n >= inv.getPlayerData().getSkillSlotLimit()) { return new ItemStack(Material.AIR); } ItemStack item = super.display(inv, n); @@ -91,38 +91,6 @@ public class SkillList extends EditableInventory { } }; - if (function.equals("passive-slot")) - return new SlotItem(config) { - @Override - public ItemStack display(SkillViewerInventory inv, int n) { - if (n >= inv.getPlayerData().getProfess().getMaxBoundPassiveSkills()) { - return new ItemStack(Material.AIR); - } - ItemStack item = super.display(inv, n); - if (!inv.getPlayerData().hasPassiveSkillBound(n)) { - item.setType(super.emptyMaterial); - - if (MythicLib.plugin.getVersion().isStrictlyHigher(1, 13)) { - ItemMeta meta = item.getItemMeta(); - meta.setCustomModelData(super.emptyCMD); - item.setItemMeta(meta); - } - } - return item; - } - - - @Override - public Placeholders getPlaceholders(SkillViewerInventory inv, int n) { - Placeholders holders= super.getPlaceholders(inv, n); - String none = MythicLib.plugin.parseColors(config.getString("no-skill")); - RegisteredSkill skill = inv.getPlayerData().hasPassiveSkillBound(n) ? - MMOCore.plugin.skillManager.getSkill(inv.getPlayerData().getBoundPassiveSkill(n).getTriggeredSkill().getHandler().getId()) - : null; - holders.register("skill", skill == null ? none : skill.getName()); - return holders; - } - }; if (function.equals("previous")) return new SimplePlaceholderItem(config) { @@ -408,49 +376,6 @@ public class SkillList extends EditableInventory { return; } - /* - * binding or unbinding passive skills. - */ - - if (item.getFunction().equals("passive-slot")) { - int index = passiveSlotSlots.indexOf(context.getSlot()); - - // unbind if there is a current spell. - if (context.getClickType() == ClickType.RIGHT) { - if (!playerData.hasPassiveSkillBound(index)) { - MMOCore.plugin.configManager.getSimpleMessage("no-skill-bound").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); - return; - } - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2); - playerData.unbindPassiveSkill(index); - open(); - return; - } - - if (selected == null) - return; - - if (!selected.getSkill().getTrigger().isPassive()) { - MMOCore.plugin.configManager.getSimpleMessage("not-passive-skill").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); - return; - } - - - if (!playerData.hasSkillUnlocked(selected)) { - MMOCore.plugin.configManager.getSimpleMessage("not-unlocked-skill").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); - return; - } - - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2); - playerData.bindPassiveSkill(index, selected.toPassive(playerData)); - open(); - return; - } - - /* * binding or unbinding skills. */ @@ -487,7 +412,7 @@ public class SkillList extends EditableInventory { } player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2); - playerData.bindActiveSkill(index, selected); + playerData.bindSkill(index, selected); open(); return; } From 456ecb9da1834afb1a47aa1c0df7771bcbde8f1e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 16 Mar 2023 14:31:16 +0100 Subject: [PATCH 11/58] SkillSlot modifications --- .../player/profess/skillslot/SkillSlot.java | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java index 2febed8e..0759798e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java @@ -2,23 +2,62 @@ package net.Indyuce.mmocore.api.player.profess.skillslot; import io.lumine.mythic.lib.api.math.BooleanExpressionParser; import net.Indyuce.mmocore.skill.ClassSkill; +import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.ItemStack; + +import java.util.List; public class SkillSlot { - private final int slot; + private final int slot, modelData; private final String expression; + private final String name; + private final List lore; + private Material item; - public SkillSlot(int slot, String expression) { + public SkillSlot(int slot, int modelData, String expression, String name, List lore, Material item) { this.slot = slot; - this.expression = expression; + this.modelData = modelData; + this.expression = expression; + this.name = name; + this.lore = lore; + this.item = item; } public SkillSlot(ConfigurationSection section) { this.slot = Integer.parseInt(section.getName()); this.expression = section.getString("expression"); + this.name = section.getString("name"); + this.lore = section.getStringList("lore"); + if (section.contains("item")) + this.item = Material.valueOf(section.getString("item")); + this.modelData = section.getInt("model-data", 0); } - public boolean canBePlaced(ClassSkill classSkill) { + public int getSlot() { + return slot; + } + + public String getName() { + return name; + } + + public List getLore() { + return lore; + } + + public Material getItem() { + return item; + } + public boolean hasItem(){ + return item!=null; + } + + public int getModelData() { + return modelData; + } + + public boolean canPlaceSkill(ClassSkill classSkill) { return new BooleanExpressionParser(expression).parse(classSkill.getSkill().getCategories()); } } From 3b40b2ef3042d568e8a32053915200bb9d822d91 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 16 Mar 2023 14:31:51 +0100 Subject: [PATCH 12/58] Removed SkillSlotLimit in PlayerData. --- .../net/Indyuce/mmocore/api/player/PlayerData.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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 acc08edc..1a99c77c 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 @@ -81,7 +81,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc @Nullable private PlayerClass profess; private int level, classPoints, skillPoints, attributePoints, attributeReallocationPoints; - private int skillSlotLimit, skillTreeReallocationPoints, skillReallocationPoints; + private int skillTreeReallocationPoints, skillReallocationPoints; private double experience; private double mana, stamina, stellium; private Guild guild; @@ -458,14 +458,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return skillPoints; } - public int getSkillSlotLimit() { - return skillSlotLimit; - } - - public void setSkillSlotLimit(int skillSlotLimit) { - this.skillSlotLimit = skillSlotLimit; - } - public void giveSkillReallocationPoints(int value) { skillReallocationPoints += value; } From f5b312691f87b19c12a979ecb99761589a852030 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 16 Mar 2023 14:35:18 +0100 Subject: [PATCH 13/58] Modif for SkillSlots (skillSlot map in PlayerClass) --- .../mmocore/api/player/profess/PlayerClass.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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 42012926..02092c48 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 @@ -68,7 +68,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { @Nullable private final CastingParticle castParticle; - private final List skillSlots= new ArrayList<>(); + private final Map skillSlots= new HashMap<>(); private final List skillTrees = new ArrayList<>(); private final List classScripts = new LinkedList(); private final Map stats = new HashMap<>(); @@ -104,7 +104,8 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { throw new IllegalArgumentException("Could not apply playerhead texture: " + exception.getMessage()); } for (String key : config.getConfigurationSection("skill-slots").getKeys(false)) { - skillSlots.add(new SkillSlot(config.getConfigurationSection("skill-slots." + key))); + SkillSlot skillSlot=new SkillSlot(config.getConfigurationSection("skill-slots." + key)); + skillSlots.put(skillSlot.getSlot(),skillSlot); } for (String string : config.getStringList("display.lore")) description.add(ChatColor.GRAY + MythicLib.plugin.parseColors(string)); @@ -415,10 +416,18 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return skills.containsKey(id); } + public boolean hasSlot(int slot){ + return skillSlots.containsKey(slot); + } + public List getSkillTrees() { return skillTrees; } + public SkillSlot getSkillSlot(int slot){ + return skillSlots.get(slot); + } + public ClassSkill getSkill(RegisteredSkill skill) { return getSkill(skill.getHandler().getId()); } From 1718e04ba5c44cd1d933a6ce9a9937ebadae481e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 16 Mar 2023 14:36:07 +0100 Subject: [PATCH 14/58] Removed reference to passive/active skills. --- .../src/main/java/net/Indyuce/mmocore/gui/SkillList.java | 7 ------- MMOCore-Dist/src/main/resources/default/messages.yml | 2 -- 2 files changed, 9 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 1b5ef874..4b17b883 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -398,13 +398,6 @@ public class SkillList extends EditableInventory { if (selected == null) return; - if (selected.getSkill().getTrigger().isPassive()) { - MMOCore.plugin.configManager.getSimpleMessage("not-active-skill").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); - return; - } - - if (!playerData.hasSkillUnlocked(selected)) { MMOCore.plugin.configManager.getSimpleMessage("not-unlocked-skill").send(player); player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); diff --git a/MMOCore-Dist/src/main/resources/default/messages.yml b/MMOCore-Dist/src/main/resources/default/messages.yml index 84864417..078e44e3 100644 --- a/MMOCore-Dist/src/main/resources/default/messages.yml +++ b/MMOCore-Dist/src/main/resources/default/messages.yml @@ -199,8 +199,6 @@ not-enough-skill-points-shift: '&cYou need {shift_points} skill points.' upgrade-skill: '&eYour &6{skill} &eis now Level &6{level}&e!' not-unlocked-skill: '&cYou have not unlocked that skill yet.' no-skill-bound: '&cYou don''t have any skill bound to this slot.' -not-active-skill: '&cThis is not an active skill.' -not-passive-skill: '&cThis is not a passive skill.' skill-max-level-hit: '&cYou already hit the max level for that skill.' no-skill-placeholder: 'No Skill Bound' not-skill-reallocation-point: '&cYou do not have 1 skill reallocation point.' From 2ec66e92ef047e996d515d2abf16673b70746586 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 10:53:40 +0100 Subject: [PATCH 15/58] Skill Slots Update --- .../mmocore/api/player/PlayerData.java | 49 ++++++++++---- .../api/player/profess/PlayerClass.java | 2 +- .../profess/skillbinding/BoundSkillInfo.java | 67 +++++++++++++++++++ .../SkillSlot.java | 24 +++++-- .../net/Indyuce/mmocore/gui/SkillList.java | 53 ++++++++++----- .../src/main/resources/default/messages.yml | 1 + 6 files changed, 161 insertions(+), 35 deletions(-) create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/BoundSkillInfo.java rename MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/{skillslot => skillbinding}/SkillSlot.java (65%) 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 1a99c77c..bf5f062d 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 @@ -5,6 +5,7 @@ import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.api.stat.StatInstance; import io.lumine.mythic.lib.api.stat.modifier.StatModifier; import io.lumine.mythic.lib.player.cooldown.CooldownMap; +import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -17,6 +18,7 @@ import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; import net.Indyuce.mmocore.api.player.profess.Subclass; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; +import net.Indyuce.mmocore.api.player.profess.skillbinding.BoundSkillInfo; import net.Indyuce.mmocore.api.player.social.FriendRequest; import net.Indyuce.mmocore.api.player.stats.PlayerStats; import net.Indyuce.mmocore.api.quest.PlayerQuests; @@ -91,7 +93,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc private final List friends = new ArrayList<>(); private final Set waypoints = new HashSet<>(); private final Map skills = new HashMap<>(); - private final List boundSkills = new ArrayList<>(); + private final Map boundSkills = new HashMap<>(); private final PlayerProfessions collectSkills = new PlayerProfessions(this); private final PlayerAttributes attributes = new PlayerAttributes(this); private final Map classSlots = new HashMap<>(); @@ -164,13 +166,13 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc MMOCore.log(Level.SEVERE, "[Userdata] Could not find class " + getProfess().getId() + " while refreshing player data."); } - int j = 0; - while (j < boundSkills.size()) + Iterator ite=boundSkills.keySet().iterator(); + while (ite.hasNext()) try { - boundSkills.set(j, Objects.requireNonNull(getProfess().getSkill(boundSkills.get(j).getSkill()))); + int slot=ite.next(); + BoundSkillInfo boundSkillInfo=new BoundSkillInfo(boundSkills.get(slot)); + boundSkills.put(slot, boundSkillInfo); } catch (Exception ignored) { - } finally { - j++; } for (SkillTree skillTree : getProfess().getSkillTrees()) @@ -1047,10 +1049,23 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public void setSkillLevel(String skill, int level) { skills.put(skill, level); + refreshBoundedSkill(skill); } public void resetSkillLevel(String skill) { skills.remove(skill); + refreshBoundedSkill(skill); + } + + public void refreshBoundedSkill(String skill) { + boundSkills.values() + .stream() + .filter(skillInfo->skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)) + .forEach(BoundSkillInfo::refresh); + //TODO Remove test: + Bukkit.broadcastMessage("match"+boundSkills.values() + .stream() + .filter(skillInfo->skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)).toList().size()); } @Deprecated @@ -1108,8 +1123,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc this.profess = profess; // Clear old skills - for (Iterator iterator = boundSkills.iterator(); iterator.hasNext(); ) - if (!getProfess().hasSkill(iterator.next().getSkill())) + for (Iterator iterator = boundSkills.values().iterator(); iterator.hasNext(); ) + if (!getProfess().hasSkill(iterator.next().getClassSkill().getSkill())) iterator.remove(); // Update stats @@ -1122,7 +1137,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public ClassSkill getBoundSkill(int slot) { - return slot >= boundSkills.size() ? null : boundSkills.get(slot); + return slot >= boundSkills.size() ? null : boundSkills.get(slot).getClassSkill(); } @@ -1140,8 +1155,18 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc */ public void bindSkill(int slot, ClassSkill skill) { Validate.notNull(skill, "Skill cannot be null"); - if (slot >= 0) - boundSkills.set(slot, skill); + //Unbinds the previous skill (Important for passive skills. + if (boundSkills.containsKey(slot)) + boundSkills.get(slot).unbind(); + if (slot >= 0) { + 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)); + } + } } public void unbindSkill(int slot) { @@ -1150,7 +1175,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public List getBoundSkills() { - return boundSkills; + return boundSkills.values().stream().map(BoundSkillInfo::getClassSkill).collect(Collectors.toList()); } @NotNull 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 02092c48..0a3b1255 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 @@ -21,7 +21,7 @@ import net.Indyuce.mmocore.api.player.profess.event.EventTrigger; import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.ResourceRegeneration; -import net.Indyuce.mmocore.api.player.profess.skillslot.SkillSlot; +import net.Indyuce.mmocore.api.player.profess.skillbinding.SkillSlot; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.experience.EXPSource; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/BoundSkillInfo.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/BoundSkillInfo.java new file mode 100644 index 00000000..d2b948df --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/BoundSkillInfo.java @@ -0,0 +1,67 @@ +package net.Indyuce.mmocore.api.player.profess.skillbinding; + +import io.lumine.mythic.lib.player.skill.PassiveSkill; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.skill.ClassSkill; + +import java.util.Objects; +import java.util.UUID; + +public class BoundSkillInfo { + private final PlayerData playerData; + private final ClassSkill classSkill; + private UUID passiveSkillUUID; + + public BoundSkillInfo(ClassSkill classSkill, PlayerData playerData) { + this.classSkill = classSkill; + this.playerData = playerData; + } + + public BoundSkillInfo(ClassSkill classSkill, PlayerData playerData, UUID passiveSkillUUID) { + this.classSkill = classSkill; + this.playerData = playerData; + this.passiveSkillUUID = passiveSkillUUID; + } + + /** + * Used on update to refresh the classSkill & all references to old data. + */ + 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.passiveSkillUUID=passiveSkill.getUniqueId(); + } + + public ClassSkill getClassSkill() { + return classSkill; + } + + public PlayerData getPlayerData() { + return playerData; + } + + public UUID getPassiveSkillUUID() { + return passiveSkillUUID; + } + + /** + * This is used to refresh the PassiveSkill playerModifier so it is always associated to the + */ + public void refresh() { + if (classSkill.getSkill().getTrigger().isPassive()) { + playerData.getMMOPlayerData().getPassiveSkillMap().removeModifier(passiveSkillUUID); + PassiveSkill passiveSkill = classSkill.toPassive(playerData); + passiveSkill.register(playerData.getMMOPlayerData()); + this.passiveSkillUUID=passiveSkill.getUniqueId(); + } + } + + public void unbind() { + if (classSkill.getSkill().getTrigger().isPassive()) { + playerData.getMMOPlayerData().getPassiveSkillMap().removeModifier(passiveSkillUUID); + } + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java similarity index 65% rename from MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java rename to MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java index 0759798e..b3dc33c5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillslot/SkillSlot.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java @@ -1,11 +1,12 @@ -package net.Indyuce.mmocore.api.player.profess.skillslot; +package net.Indyuce.mmocore.api.player.profess.skillbinding; -import io.lumine.mythic.lib.api.math.BooleanExpressionParser; +import io.lumine.mythic.lib.MythicLib; +import net.Indyuce.mmocore.comp.mythicmobs.MythicHook; import net.Indyuce.mmocore.skill.ClassSkill; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.inventory.ItemStack; +import javax.script.ScriptException; import java.util.List; public class SkillSlot { @@ -49,8 +50,9 @@ public class SkillSlot { public Material getItem() { return item; } - public boolean hasItem(){ - return item!=null; + + public boolean hasItem() { + return item != null; } public int getModelData() { @@ -58,6 +60,16 @@ public class SkillSlot { } public boolean canPlaceSkill(ClassSkill classSkill) { - return new BooleanExpressionParser(expression).parse(classSkill.getSkill().getCategories()); + + String parsedExpression = expression; + for (String category : classSkill.getSkill().getCategories()) + parsedExpression = parsedExpression.replace("<" + category + ">", "true"); + parsedExpression = parsedExpression.replaceAll("<.*>", "false"); + try { + boolean res = (boolean) MythicLib.plugin.getScriptEngine().eval(parsedExpression); + return res; + } catch (ScriptException e) { + throw new RuntimeException(e); + } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 4b17b883..3061afb9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -5,6 +5,7 @@ import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.NBTItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.skillbinding.SkillSlot; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.gui.api.EditableInventory; import net.Indyuce.mmocore.gui.api.GeneratedInventory; @@ -28,8 +29,9 @@ import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; -public class SkillList extends EditableInventory { +public class SkillList extends EditableInventory { public SkillList() { super("skill-list"); } @@ -65,25 +67,39 @@ public class SkillList extends EditableInventory { return new SlotItem(config) { @Override public ItemStack display(SkillViewerInventory inv, int n) { - if (n >= inv.getPlayerData().getSkillSlotLimit()) { + if (!inv.getPlayerData().getProfess().hasSlot(n)) { return new ItemStack(Material.AIR); } + SkillSlot skillSlot = inv.getPlayerData().getProfess().getSkillSlot(n); ItemStack item = super.display(inv, n); if (!inv.getPlayerData().hasSkillBound(n)) { - item.setType(super.emptyMaterial); - + //If there is an item filled in the slot config it shows it, else shows the default item. + Material material = skillSlot.hasItem() ? skillSlot.getItem() : super.emptyMaterial; + int customModelData = skillSlot.hasItem() ? skillSlot.getModelData() : super.emptyCMD; + item.setType(material); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(MMOCore.plugin.placeholderParser.parse(inv.getPlayerData().getPlayer(),skillSlot.getName())); + List lore=skillSlot.getLore() + .stream() + .map(str->MMOCore.plugin.placeholderParser.parse(inv.getPlayerData().getPlayer(),str)) + .collect(Collectors.toList()); + meta.setLore(lore); if (MythicLib.plugin.getVersion().isStrictlyHigher(1, 13)) { - ItemMeta meta = item.getItemMeta(); - meta.setCustomModelData(super.emptyCMD); - item.setItemMeta(meta); + meta.setCustomModelData(customModelData); } + item.setItemMeta(meta); + } + return item; } + /** + * This should only be called when there is a skill bound. + */ @Override public Placeholders getPlaceholders(SkillViewerInventory inv, int n) { - Placeholders holders= super.getPlaceholders(inv, n); + Placeholders holders = super.getPlaceholders(inv, n); String none = MythicLib.plugin.parseColors(config.getString("no-skill")); RegisteredSkill skill = inv.getPlayerData().hasSkillBound(n) ? inv.getPlayerData().getBoundSkill(n).getSkill() : null; holders.register("skill", skill == null ? none : skill.getName()); @@ -297,8 +313,7 @@ public class SkillList extends EditableInventory { // Cached information private final List skills; private final List skillSlots; - private final List activeSlotSlots; - private final List passiveSlotSlots; + private final List slotSlots; //The skill the player Selected private ClassSkill selected; @@ -309,9 +324,8 @@ public class SkillList extends EditableInventory { skills = new ArrayList<>(playerData.getProfess().getSkills()); skillSlots = getEditable().getByFunction("skill").getSlots(); - Validate.notNull(getEditable().getByFunction("active-slot"), "Your skill GUI config file is out-of-date, please regenerate it."); - activeSlotSlots = getEditable().getByFunction("active-slot").getSlots(); - passiveSlotSlots = getEditable().getByFunction("passive-slot").getSlots(); + Validate.notNull(getEditable().getByFunction("slot"), "Your skill GUI config file is out-of-date, please regenerate it."); + slotSlots = getEditable().getByFunction("slot").getSlots(); selected = skills.get(page * skillSlots.size()); } @@ -379,9 +393,9 @@ public class SkillList extends EditableInventory { /* * binding or unbinding skills. */ - if (item.getFunction().equals("active-slot")) { - int index = activeSlotSlots.indexOf(context.getSlot()); - + if (item.getFunction().equals("slot")) { + int index = slotSlots.indexOf(context.getSlot()); + SkillSlot skillSlot=playerData.getProfess().getSkillSlot(index); // unbind if there is a current spell. if (context.getClickType() == ClickType.RIGHT) { if (!playerData.hasSkillBound(index)) { @@ -404,6 +418,13 @@ public class SkillList extends EditableInventory { return; } + if(!skillSlot.canPlaceSkill(selected)){ + MMOCore.plugin.configManager.getSimpleMessage("not-compatible-skill").send(player); + player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); + return; + } + + player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2); playerData.bindSkill(index, selected); open(); diff --git a/MMOCore-Dist/src/main/resources/default/messages.yml b/MMOCore-Dist/src/main/resources/default/messages.yml index 078e44e3..74292831 100644 --- a/MMOCore-Dist/src/main/resources/default/messages.yml +++ b/MMOCore-Dist/src/main/resources/default/messages.yml @@ -199,6 +199,7 @@ not-enough-skill-points-shift: '&cYou need {shift_points} skill points.' upgrade-skill: '&eYour &6{skill} &eis now Level &6{level}&e!' not-unlocked-skill: '&cYou have not unlocked that skill yet.' no-skill-bound: '&cYou don''t have any skill bound to this slot.' +not-compatible-skill: '&cThe selected skill is not compatible with this slot.' skill-max-level-hit: '&cYou already hit the max level for that skill.' no-skill-placeholder: 'No Skill Bound' not-skill-reallocation-point: '&cYou do not have 1 skill reallocation point.' From 7538b66673fa84713a5de6691a39cdfe8009419d Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 13:42:21 +0100 Subject: [PATCH 16/58] Modification to have the skillSlots seen has as a Map rather than a List --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 8 ++++++++ .../net/Indyuce/mmocore/player/ClassDataContainer.java | 2 +- .../net/Indyuce/mmocore/player/DefaultPlayerData.java | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) 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 bf5f062d..3d9f69f3 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 @@ -220,6 +220,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return new HashMap(skillTreePoints); } + @Override + public Map mapBoundSkills() { + Map result= new HashMap<>(); + for(int slot:boundSkills.keySet()) + result.put(slot,boundSkills.get(slot).getClassSkill()); + return result; + } + public void clearSkillTreePoints() { skillTreePoints.clear(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index d8b8b74b..eb9625b6 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -43,7 +43,7 @@ public interface ClassDataContainer { Map mapSkillTreePoints(); - List getBoundSkills(); + Map mapBoundSkills(); Map getNodeLevels(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index 0be26654..d7cfb92a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -128,8 +128,8 @@ public class DefaultPlayerData implements ClassDataContainer { } @Override - public List getBoundSkills() { - return new ArrayList<>(); + public Map mapBoundSkills() { + return new HashMap<>(); } public void apply(PlayerData player) { From 8fc5b5a51cd5bb020ba3ce889363720f8ceccc48 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 13:43:35 +0100 Subject: [PATCH 17/58] Map representation for BoundSkill in SavedClassInformation.java --- .../player/profess/SavedClassInformation.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index 95238452..e55d194c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -24,7 +24,7 @@ public class SavedClassInformation { private final Map skillTreePoints = new HashMap<>(); private final Map nodeLevels = new HashMap<>(); private final Map nodeTimesClaimed = new HashMap<>(); - private final List boundSkills = new ArrayList<>(); + private final Map boundSkills = new HashMap<>(); /** * Used by YAML storage @@ -42,17 +42,24 @@ public class SavedClassInformation { stamina = config.getInt("stamina", 0); stellium = config.getInt("stellium", 0); if (config.contains("attribute")) - config.getConfigurationSection("attribute").getKeys(false).forEach(key -> attributeLevels.put(key, config.getInt("attribute." + key))); + config.getConfigurationSection("attribute").getKeys(false) + .forEach(key -> attributeLevels.put(key, config.getInt("attribute." + key))); if (config.contains("skill")) - config.getConfigurationSection("skill").getKeys(false).forEach(key -> skillLevels.put(key, config.getInt("skill." + key))); + config.getConfigurationSection("skill").getKeys(false) + .forEach(key -> skillLevels.put(key, config.getInt("skill." + key))); if (config.contains("skill-tree-points")) - config.getConfigurationSection("skill-tree-points").getKeys(false).forEach(key -> skillTreePoints.put(key, config.getInt("skill-tree-points." + key))); + config.getConfigurationSection("skill-tree-points").getKeys(false) + .forEach(key -> skillTreePoints.put(key, config.getInt("skill-tree-points." + key))); if (config.contains("node-levels")) - config.getConfigurationSection("node-levels").getKeys(false).forEach(key -> nodeLevels.put(key, config.getInt("node-levels." + key))); + config.getConfigurationSection("node-levels").getKeys(false) + .forEach(key -> nodeLevels.put(key, config.getInt("node-levels." + key))); if (config.contains("node-times-claimed")) - config.getConfigurationSection("node-times-claimed").getKeys(false).forEach(key -> nodeTimesClaimed.put(key, config.getInt("node-times-claimed." + key))); - if (config.contains("bound-skills")) - config.getStringList("bound-skills").forEach(id -> boundSkills.add(id)); + config.getConfigurationSection("node-times-claimed").getKeys(false) + .forEach(key -> nodeTimesClaimed.put(key, config.getInt("node-times-claimed." + key))); + //Old system was using a StringList. If it saved with the old system the if condition won't be respected. + if (config.isConfigurationSection("bound-skills")) + config.getConfigurationSection("bound-skills").getKeys(false) + .forEach(key -> boundSkills.put(Integer.parseInt(key), config.getString("bound-skills." + key))); } /** @@ -85,8 +92,10 @@ public class SavedClassInformation { if (json.has("node-times-claimed")) for (Entry entry : json.getAsJsonObject("node-times-claimed").entrySet()) nodeTimesClaimed.put(entry.getKey(), entry.getValue().getAsInt()); - if (json.has("bound-skills")) - json.getAsJsonArray("bound-skills").forEach(id -> boundSkills.add(id.getAsString())); + //Old system was using a JsonArray. If it saved with the old system the if condition won't be respected. + if (json.has("bound-skills") && json.get("bound-skills").isJsonObject()) + for (Entry entry : json.getAsJsonObject("bound-skills").entrySet()) + boundSkills.put(Integer.parseInt(entry.getKey()), entry.getValue().getAsString()); } public SavedClassInformation(ClassDataContainer data) { @@ -107,7 +116,7 @@ public class SavedClassInformation { data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node.getFullId(), level)); data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); - data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId())); + data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill.getSkill().getHandler().getId())); } public int getLevel() { @@ -252,13 +261,9 @@ public class SavedClassInformation { player.setAttributeReallocationPoints(attributeReallocationPoints); player.setSkillTreeReallocationPoints(skillTreeReallocationPoints); player.setSkillReallocationPoints(skillReallocationPoints); - for (String id : boundSkills) { - ClassSkill skill = profess.getSkill(id); - if (skill.getSkill().getTrigger().isPassive()) - player.bindPassiveSkill(-1, skill.toPassive(player)); - else - player.getBoundSkills().add(skill); - } + for (int slot : boundSkills.keySet()) + player.bindSkill(slot, profess.getSkill(boundSkills.get(slot))); + skillLevels.forEach(player::setSkillLevel); attributeLevels.forEach((id, pts) -> player.getAttributes().setBaseAttribute(id, pts)); @@ -290,7 +295,7 @@ public class SavedClassInformation { player.unloadClassInfo(profess); //This needs to be done at the end to make sure the MAX_HEALTH,MAX_MANA,MAX_STELLIUM... stats are loaded. - player.getPlayer().setHealth(Math.min(health,player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + player.getPlayer().setHealth(Math.min(health, player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); player.setMana(mana); player.setStellium(stellium); player.setStamina(stamina); From 8fc13a70b932afb82a1b60e43d88af16696aa16e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 13:51:29 +0100 Subject: [PATCH 18/58] Adapted YamlDataStorage to the new formatting for boundSkills. --- .../data/yaml/YAMLPlayerDataManager.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index 1bff27f8..7567843b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -16,9 +16,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.logging.Level; import java.util.stream.Collectors; @@ -61,25 +59,27 @@ public class YAMLPlayerDataManager extends PlayerDataManager { config.getStringList("friends").forEach(str -> data.getFriends().add(UUID.fromString(str))); if (config.contains("skill")) config.getConfigurationSection("skill").getKeys(false).forEach(id -> data.setSkillLevel(id, config.getInt("skill." + id))); - if (config.contains("bound-skills")) - for (String id : config.getStringList("bound-skills")) - if (data.getProfess().hasSkill(id)) { - ClassSkill skill = data.getProfess().getSkill(id); - if (skill.getSkill().getTrigger().isPassive()) - data.bindPassiveSkill(-1, skill.toPassive(data)); - else - data.getBoundSkills().add(skill); + if (config.isConfigurationSection("bound-skills")) + for (String key : config.getConfigurationSection("bound-skills").getKeys(false)) { + ClassSkill skill = data.getProfess().getSkill(config.getString("bound-skills." + key)); + data.bindSkill(Integer.parseInt(key), skill); + } - } - - for (String key : MMOCore.plugin.skillTreeManager.getAll().stream().map(skillTree -> skillTree.getId()).toList()) { + for ( + String key : MMOCore.plugin.skillTreeManager.getAll(). + stream(). + map(skillTree -> skillTree.getId()). + toList()) { data.setSkillTreePoints(key, config.getInt("skill-tree-points." + key, 0)); } data.setSkillTreePoints("global", config.getInt("skill-tree-points.global", 0)); if (config.contains("times-claimed")) - for (String key : config.getConfigurationSection("times-claimed").getKeys(false)) { + for ( + String key : config.getConfigurationSection("times-claimed"). + + getKeys(false)) { ConfigurationSection section = config.getConfigurationSection("times-claimed." + key); if (section != null) for (String key1 : section.getKeys(false)) { @@ -92,7 +92,8 @@ public class YAMLPlayerDataManager extends PlayerDataManager { } } - for (SkillTreeNode node : MMOCore.plugin.skillTreeManager.getAllNodes()) { + for ( + SkillTreeNode node : MMOCore.plugin.skillTreeManager.getAllNodes()) { data.setNodeLevel(node, config.getInt("skill-tree-level." + node.getFullId(), 0)); } data.setupSkillTree(); @@ -114,9 +115,15 @@ public class YAMLPlayerDataManager extends PlayerDataManager { //These should be loaded after to make sure that the MAX_MANA, MAX_STAMINA & MAX_STELLIUM stats are already loaded. - data.setMana(config.contains("mana") ? config.getDouble("mana") : data.getStats().getStat("MAX_MANA")); - data.setStamina(config.contains("stamina") ? config.getDouble("stamina") : data.getStats().getStat("MAX_STAMINA")); - data.setStellium(config.contains("stellium") ? config.getDouble("stellium") : data.getStats().getStat("MAX_STELLIUM")); + data.setMana(config.contains("mana") ? config.getDouble("mana") : data.getStats(). + + getStat("MAX_MANA")); + data.setStamina(config.contains("stamina") ? config.getDouble("stamina") : data.getStats(). + + getStat("MAX_STAMINA")); + data.setStellium(config.contains("stellium") ? config.getDouble("stellium") : data.getStats(). + + getStat("MAX_STELLIUM")); data.setFullyLoaded(); } @@ -150,9 +157,8 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.mapSkillLevels().forEach((key1, value) -> config.set("skill." + key1, value)); data.getItemClaims().forEach((key, times) -> config.set("times-claimed." + key, times)); - List boundSkills = new ArrayList<>(); - data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId())); - data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getTriggeredSkill().getHandler().getId())); + Map boundSkills = new HashMap<>(); + data.mapBoundSkills().forEach((slot,classSkill)->config.set("bound-skills."+slot,classSkill.getSkill().getHandler().getId())); config.set("bound-skills", boundSkills); config.set("attribute", null); From 4244bdbe3c4175cdce32c4b412421b9b330e3a12 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:02:50 +0100 Subject: [PATCH 19/58] Allowed GenericTypes in addJsonObject method --- .../mmocore/manager/data/mysql/PlayerDataTableUpdater.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/PlayerDataTableUpdater.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/PlayerDataTableUpdater.java index 5e11bc8f..7f9652d1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/PlayerDataTableUpdater.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/PlayerDataTableUpdater.java @@ -95,10 +95,10 @@ public class PlayerDataTableUpdater { addData(key, json.toString()); } - public void addJSONObject(String key, Set> collection) { + public void addJSONObject(String key, Set> collection) { JsonObject json = new JsonObject(); - for (Map.Entry entry : collection) - json.addProperty(entry.getKey(), entry.getValue()); + for (Map.Entry entry : collection) + json.addProperty(entry.getKey().toString(), entry.getValue().toString()); addData(key, json.toString()); } } From c618b0267e829e05b0e9ec30d36ddb16181ed54c Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:03:48 +0100 Subject: [PATCH 20/58] Reformat for mapBoundSkills method. --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 6 +++--- .../java/net/Indyuce/mmocore/player/ClassDataContainer.java | 2 +- .../java/net/Indyuce/mmocore/player/DefaultPlayerData.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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 f4ffd6df..df27d52e 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 @@ -221,10 +221,10 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } @Override - public Map mapBoundSkills() { - Map result= new HashMap<>(); + public Map mapBoundSkills() { + Map result= new HashMap<>(); for(int slot:boundSkills.keySet()) - result.put(slot,boundSkills.get(slot).getClassSkill()); + result.put(slot,boundSkills.get(slot).getClassSkill().getSkill().getHandler().getId()); return result; } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index eb9625b6..f1198b19 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -43,7 +43,7 @@ public interface ClassDataContainer { Map mapSkillTreePoints(); - Map mapBoundSkills(); + Map mapBoundSkills(); Map getNodeLevels(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index d7cfb92a..48c54d08 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -128,7 +128,7 @@ public class DefaultPlayerData implements ClassDataContainer { } @Override - public Map mapBoundSkills() { + public Map mapBoundSkills() { return new HashMap<>(); } From 9e16e63bf59c7ee6f78177dcd28672719f0a5420 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:04:06 +0100 Subject: [PATCH 21/58] Reformat for mapBoundSkills method. --- .../mmocore/api/player/profess/SavedClassInformation.java | 2 +- .../mmocore/manager/data/yaml/YAMLPlayerDataManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index e55d194c..f80986f3 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -116,7 +116,7 @@ public class SavedClassInformation { data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node.getFullId(), level)); data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); - data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill.getSkill().getHandler().getId())); + data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill)); } public int getLevel() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index 7567843b..eb1fb394 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -158,7 +158,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.getItemClaims().forEach((key, times) -> config.set("times-claimed." + key, times)); Map boundSkills = new HashMap<>(); - data.mapBoundSkills().forEach((slot,classSkill)->config.set("bound-skills."+slot,classSkill.getSkill().getHandler().getId())); + data.mapBoundSkills().forEach((slot,skill)->config.set("bound-skills."+slot,skill)); config.set("bound-skills", boundSkills); config.set("attribute", null); From ca7ee79c738707a661298f14ebbc4d9993f29c8d Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:07:57 +0100 Subject: [PATCH 22/58] Saves Bound Skills in YamlPlayerDataManager --- .../mmocore/api/player/profess/SavedClassInformation.java | 4 ++++ .../mmocore/manager/data/yaml/YAMLPlayerDataManager.java | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index f80986f3..a1db0223 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -155,6 +155,10 @@ public class SavedClassInformation { registerSkillLevel(skill.getHandler().getId(), level); } + public Map getBoundSkills() { + return boundSkills; + } + public int getSkillTreeReallocationPoints() { return skillTreeReallocationPoints; } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index eb1fb394..f66ac9ab 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -157,9 +157,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.mapSkillLevels().forEach((key1, value) -> config.set("skill." + key1, value)); data.getItemClaims().forEach((key, times) -> config.set("times-claimed." + key, times)); - Map boundSkills = new HashMap<>(); data.mapBoundSkills().forEach((slot,skill)->config.set("bound-skills."+slot,skill)); - config.set("bound-skills", boundSkills); config.set("attribute", null); config.createSection("attribute"); @@ -191,6 +189,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { info.getAttributeKeys().forEach(attribute -> config.set("class-info." + key + ".attribute." + attribute, info.getAttributeLevel(attribute))); info.getNodeKeys().forEach(node -> config.set("class-info." + key + ".node-levels." + node, info.getNodeLevel(node))); info.getSkillTreePointsKeys().forEach(skillTreeId -> config.set("class-info." + key + ".skill-tree-points." + skillTreeId, info.getAttributeLevel(skillTreeId))); + info.getBoundSkills().forEach((slot,skill)->config.set("class-info." + key + ".bound-skills."+slot,skill)); } file.save(); From f7a6d92fc8b50fd13dd8f337d64ea7133782d088 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:12:33 +0100 Subject: [PATCH 23/58] Saves Bound Skills in MySQLPlayerDataManager --- .../manager/data/mysql/MySQLPlayerDataManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 561e61f1..9eb15b57 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -54,10 +54,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { updater.addData("guild", data.hasGuild() ? data.getGuild().getId() : null); updater.addJSONArray("waypoints", data.getWaypoints()); updater.addJSONArray("friends", data.getFriends().stream().map(UUID::toString).collect(Collectors.toList())); - List boundSkills = new ArrayList<>(); - data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId())); - data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getTriggeredSkill().getHandler().getId())); - updater.addJSONArray("bound_skills", boundSkills); + updater.addJSONObject("bound_skills",data.mapBoundSkills().entrySet()); updater.addJSONObject("skills", data.mapSkillLevels().entrySet()); updater.addJSONObject("times_claimed", data.getItemClaims().entrySet()); updater.addJSONObject("skill_tree_points", data.mapSkillTreePoints().entrySet()); @@ -111,6 +108,11 @@ public class MySQLPlayerDataManager extends PlayerDataManager { skillTreePointsInfo.addProperty(skillTreeId, info.getSkillTreePoints(skillTreeId)); classinfo.add("skill-tree-points", skillTreePointsInfo); + JsonObject boundSkillInfo = new JsonObject(); + for(int slot:info.getBoundSkills().keySet()) + boundSkillInfo.addProperty(slot+"",info.getBoundSkills().get(slot)); + classinfo.add("bound-skills", boundSkillInfo); + json.add(c, classinfo); } From 1205dd773b7cb411e986197be61af633caa5f5cc Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:14:37 +0100 Subject: [PATCH 24/58] ResetCommand fix for Bounded Skills. --- .../mmocore/command/rpg/admin/ResetCommandTreeNode.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java index 8f96947b..d4b46ffe 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java @@ -66,10 +66,8 @@ public class ResetCommandTreeNode extends CommandTreeNode { } data.resetTimesClaimed(); - while (data.hasSkillBound(0)) - data.unbindSkill(0); - while (data.hasPassiveSkillBound(0)) - data.unbindPassiveSkill(0); + for(int slot:data.mapBoundSkills().keySet()) + data.unbindSkill(slot); data.getQuestData().resetFinishedQuests(); data.getQuestData().start(null); CommandVerbose.verbose(sender, CommandVerbose.CommandType.RESET, From f17b9f2acef1b2a30e642042dbd73373246f1d86 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:16:34 +0100 Subject: [PATCH 25/58] MMOCoreDataSynchronizer fix for Bounded Skills. --- .../data/mysql/MMOCoreDataSynchronizer.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java index 84229919..6901bfa8 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java @@ -96,15 +96,11 @@ public class MMOCoreDataSynchronizer extends DataSynchronizer { for (Map.Entry entry : object.entrySet()) data.setSkillLevel(entry.getKey(), entry.getValue().getAsInt()); } - if (!isEmpty(result.getString("bound_skills"))) - for (String id : MMOCoreUtils.jsonArrayToList(result.getString("bound_skills"))) - if (data.getProfess().hasSkill(id)) { - ClassSkill skill = data.getProfess().getSkill(id); - if (skill.getSkill().getTrigger().isPassive()) - data.bindPassiveSkill(-1, skill.toPassive(data)); - else - data.getBoundSkills().add(skill); - } + if (!isEmpty(result.getString("bound_skills"))) { + JsonObject object = new Gson().fromJson(result.getString("skills"), JsonObject.class); + for (Map.Entry entry : object.entrySet()) + data.bindSkill(Integer.parseInt(entry.getKey()), data.getProfess().getSkill(entry.getValue().getAsString())); + } if (!isEmpty(result.getString("class_info"))) { JsonObject object = new Gson().fromJson(result.getString("class_info"), JsonObject.class); for (Map.Entry entry : object.entrySet()) { From cddda1b6eb67ef2b10a1f658f7e74c6dad006159 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:17:21 +0100 Subject: [PATCH 26/58] Version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec4f22e3..e4db384b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.Indyuce MMOCore pom - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT MMOCore-API From 7bf8a4ee24523deab2872a18268ad79f0461ca8a Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 14:21:55 +0100 Subject: [PATCH 27/58] Version --- MMOCore-API/pom.xml | 2 +- MMOCore-Dist/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MMOCore-API/pom.xml b/MMOCore-API/pom.xml index 1ac1239c..3c833823 100644 --- a/MMOCore-API/pom.xml +++ b/MMOCore-API/pom.xml @@ -5,7 +5,7 @@ MMOCore net.Indyuce - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT 4.0.0 diff --git a/MMOCore-Dist/pom.xml b/MMOCore-Dist/pom.xml index cf6bc6f3..809cafd3 100644 --- a/MMOCore-Dist/pom.xml +++ b/MMOCore-Dist/pom.xml @@ -5,7 +5,7 @@ MMOCore net.Indyuce - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT 4.0.0 From 374ac34f3cc2045a7c2673deb29ed60004ea5c9d Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 17:21:10 +0100 Subject: [PATCH 28/58] Bug Fix --- .../mmocore/api/player/profess/PlayerClass.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 0a3b1255..d905220a 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 @@ -35,6 +35,7 @@ import net.Indyuce.mmocore.skill.cast.ComboMap; import net.Indyuce.mmocore.experience.ExperienceObject; import net.Indyuce.mmocore.skilltree.tree.SkillTree; import net.md_5.bungee.api.ChatColor; +import org.apache.commons.lang.Validate; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; @@ -68,7 +69,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { @Nullable private final CastingParticle castParticle; - private final Map skillSlots= new HashMap<>(); + private final Map skillSlots = new HashMap<>(); private final List skillTrees = new ArrayList<>(); private final List classScripts = new LinkedList(); private final Map stats = new HashMap<>(); @@ -103,9 +104,10 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { | SecurityException exception) { throw new IllegalArgumentException("Could not apply playerhead texture: " + exception.getMessage()); } + Validate.isTrue(config.isConfigurationSection("skill-slots"), "You must define the skills-slots for class " + id); for (String key : config.getConfigurationSection("skill-slots").getKeys(false)) { - SkillSlot skillSlot=new SkillSlot(config.getConfigurationSection("skill-slots." + key)); - skillSlots.put(skillSlot.getSlot(),skillSlot); + SkillSlot skillSlot = new SkillSlot(config.getConfigurationSection("skill-slots." + key)); + skillSlots.put(skillSlot.getSlot(), skillSlot); } for (String string : config.getStringList("display.lore")) description.add(ChatColor.GRAY + MythicLib.plugin.parseColors(string)); @@ -416,7 +418,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return skills.containsKey(id); } - public boolean hasSlot(int slot){ + public boolean hasSlot(int slot) { return skillSlots.containsKey(slot); } @@ -424,7 +426,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return skillTrees; } - public SkillSlot getSkillSlot(int slot){ + public SkillSlot getSkillSlot(int slot) { return skillSlots.get(slot); } From d1a78ad83f2b2627b169c1c4d895e0c0ce0bd803 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:19:49 +0100 Subject: [PATCH 29/58] Coming back to old pom.xml version bc of a strange bug --- MMOCore-API/pom.xml | 2 +- MMOCore-Dist/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MMOCore-API/pom.xml b/MMOCore-API/pom.xml index 3c833823..1ac1239c 100644 --- a/MMOCore-API/pom.xml +++ b/MMOCore-API/pom.xml @@ -5,7 +5,7 @@ MMOCore net.Indyuce - 1.12.0-SNAPSHOT + 1.11.2-SNAPSHOT 4.0.0 diff --git a/MMOCore-Dist/pom.xml b/MMOCore-Dist/pom.xml index 809cafd3..cf6bc6f3 100644 --- a/MMOCore-Dist/pom.xml +++ b/MMOCore-Dist/pom.xml @@ -5,7 +5,7 @@ MMOCore net.Indyuce - 1.12.0-SNAPSHOT + 1.11.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index e4db384b..ec4f22e3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.Indyuce MMOCore pom - 1.12.0-SNAPSHOT + 1.11.2-SNAPSHOT MMOCore-API From 5db6ae79dc7c8876b0501edab413c0cfbff559c0 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:20:10 +0100 Subject: [PATCH 30/58] Modifications to support bound skills in default config --- .../resources/default/classes/arcane-mage.yml | 10 ++++++++++ .../main/resources/default/classes/human.yml | 10 ++++++++++ .../main/resources/default/classes/mage.yml | 11 +++++++++++ .../resources/default/classes/marksman.yml | 10 ++++++++++ .../resources/default/classes/paladin.yml | 9 +++++++++ .../main/resources/default/classes/rogue.yml | 9 +++++++++ .../resources/default/classes/warrior.yml | 10 ++++++++++ .../main/resources/default/gui/skill-list.yml | 19 +------------------ 8 files changed, 70 insertions(+), 18 deletions(-) diff --git a/MMOCore-Dist/src/main/resources/default/classes/arcane-mage.yml b/MMOCore-Dist/src/main/resources/default/classes/arcane-mage.yml index 176a04c5..24e1eb95 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/arcane-mage.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/arcane-mage.yml @@ -31,6 +31,16 @@ display: # Must match an existing exp curve filename from the 'expcurves' folder exp-curve: levels +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" + # The maximum level players can reach max-level: 100 diff --git a/MMOCore-Dist/src/main/resources/default/classes/human.yml b/MMOCore-Dist/src/main/resources/default/classes/human.yml index 9b8581bd..2e14caf2 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/human.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/human.yml @@ -20,6 +20,16 @@ options: # Must match an existing exp curve filename from the 'expcurves' folder exp-curve: levels +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" + #The number of skills a player can bound. max-bound-active-skills: 5 diff --git a/MMOCore-Dist/src/main/resources/default/classes/mage.yml b/MMOCore-Dist/src/main/resources/default/classes/mage.yml index ddf14d17..b14fb301 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/mage.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/mage.yml @@ -38,6 +38,15 @@ skill-trees: exp-table: class_exp_table +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" # 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. @@ -55,6 +64,8 @@ mana: empty: WHITE name: 'Mana' + + cast-particle: particle: SPELL_INSTANT diff --git a/MMOCore-Dist/src/main/resources/default/classes/marksman.yml b/MMOCore-Dist/src/main/resources/default/classes/marksman.yml index 0144f4de..0a522be4 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/marksman.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/marksman.yml @@ -33,6 +33,16 @@ max-level: 100 exp-table: class_exp_table +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" + skill-trees: - 'general' - 'rogue-marksman' diff --git a/MMOCore-Dist/src/main/resources/default/classes/paladin.yml b/MMOCore-Dist/src/main/resources/default/classes/paladin.yml index bcde0aba..698411db 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/paladin.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/paladin.yml @@ -30,6 +30,15 @@ display: # Must match an existing exp curve filename from the 'expcurves' folder exp-curve: levels +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" skill-trees: - 'general' diff --git a/MMOCore-Dist/src/main/resources/default/classes/rogue.yml b/MMOCore-Dist/src/main/resources/default/classes/rogue.yml index ee396628..a08e67e3 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/rogue.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/rogue.yml @@ -33,6 +33,15 @@ max-level: 100 exp-table: class_exp_table +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" skill-trees: - 'general' diff --git a/MMOCore-Dist/src/main/resources/default/classes/warrior.yml b/MMOCore-Dist/src/main/resources/default/classes/warrior.yml index e58db759..4dcc0250 100644 --- a/MMOCore-Dist/src/main/resources/default/classes/warrior.yml +++ b/MMOCore-Dist/src/main/resources/default/classes/warrior.yml @@ -61,6 +61,16 @@ mana: exp-table: class_exp_table +skill-slots: + 1: + name: "Skill Slot I" + 2: + name: "Skill Slot II" + 3: + name: "Skill Slot III" + 4: + name: "Skill Slot IV" + # Rage charges when dealing weapon and physical damage. triggers: weapon-damage: 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 ccb46c65..3042f98e 100644 --- a/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml +++ b/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml @@ -46,26 +46,9 @@ items: - '&eCosts 1 skill reallocation point.' - '&eâ—† Skill Reallocation Points: &6{points}' - - passive-skill-slot: - slots: [ 7,16,25,34,43,52 ] - function: passive-slot - item: BOOK - - # Material used when the slot is empty - empty-item: BLUE_DYE - - name: '&aPassive Skill Slot {slot}' - no-skill: '&cNone' - lore: - - '&7Current Passive Skill: &6{skill}' - - '' - - '&eâ–º Left click to bind {selected}.' - - '&eâ–º Right click to unbind.' - skill-slot: slots: [ 8,17,26,35,44,53 ] - function: active-slot + function: slot item: BOOK # Material used when the slot is empty From 1d1d28958fb887362a8f63bdb643a94f6ea65001 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:20:24 +0100 Subject: [PATCH 31/58] Bug Fixing --- .../net/Indyuce/mmocore/api/player/PlayerData.java | 5 +++-- .../api/player/profess/skillbinding/SkillSlot.java | 7 ++++--- .../main/java/net/Indyuce/mmocore/gui/SkillList.java | 12 +++++++----- 3 files changed, 14 insertions(+), 10 deletions(-) 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 df27d52e..886702f5 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 @@ -1140,11 +1140,12 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public boolean hasSkillBound(int slot) { - return slot < boundSkills.size(); + Bukkit.broadcastMessage("slot:"+slot+" "+boundSkills.containsKey(slot)); + return boundSkills.containsKey(slot); } public ClassSkill getBoundSkill(int slot) { - return slot >= boundSkills.size() ? null : boundSkills.get(slot).getClassSkill(); + return boundSkills.containsKey(slot) ? boundSkills.get(slot).getClassSkill():null; } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java index b3dc33c5..a1853363 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.api.player.profess.skillbinding; +import bsh.EvalError; import io.lumine.mythic.lib.MythicLib; import net.Indyuce.mmocore.comp.mythicmobs.MythicHook; import net.Indyuce.mmocore.skill.ClassSkill; @@ -27,7 +28,7 @@ public class SkillSlot { public SkillSlot(ConfigurationSection section) { this.slot = Integer.parseInt(section.getName()); - this.expression = section.getString("expression"); + this.expression = section.contains("expression") ? section.getString("expression") : "true"; this.name = section.getString("name"); this.lore = section.getStringList("lore"); if (section.contains("item")) @@ -66,9 +67,9 @@ public class SkillSlot { parsedExpression = parsedExpression.replace("<" + category + ">", "true"); parsedExpression = parsedExpression.replaceAll("<.*>", "false"); try { - boolean res = (boolean) MythicLib.plugin.getScriptEngine().eval(parsedExpression); + boolean res = (boolean) MythicLib.plugin.getInterpreter().eval(parsedExpression); return res; - } catch (ScriptException e) { + } catch (EvalError e) { throw new RuntimeException(e); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 3061afb9..b0b4b5be 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -17,6 +17,7 @@ import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.api.SoundEvent; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Sound; @@ -67,12 +68,12 @@ public class SkillList extends EditableInventory { return new SlotItem(config) { @Override public ItemStack display(SkillViewerInventory inv, int n) { - if (!inv.getPlayerData().getProfess().hasSlot(n)) { + if (!inv.getPlayerData().getProfess().hasSlot(n+1)) { return new ItemStack(Material.AIR); } - SkillSlot skillSlot = inv.getPlayerData().getProfess().getSkillSlot(n); + SkillSlot skillSlot = inv.getPlayerData().getProfess().getSkillSlot(n+1); ItemStack item = super.display(inv, n); - if (!inv.getPlayerData().hasSkillBound(n)) { + if (!inv.getPlayerData().hasSkillBound(n+1)) { //If there is an item filled in the slot config it shows it, else shows the default item. Material material = skillSlot.hasItem() ? skillSlot.getItem() : super.emptyMaterial; int customModelData = skillSlot.hasItem() ? skillSlot.getModelData() : super.emptyCMD; @@ -101,7 +102,7 @@ public class SkillList extends EditableInventory { public Placeholders getPlaceholders(SkillViewerInventory inv, int n) { Placeholders holders = super.getPlaceholders(inv, n); String none = MythicLib.plugin.parseColors(config.getString("no-skill")); - RegisteredSkill skill = inv.getPlayerData().hasSkillBound(n) ? inv.getPlayerData().getBoundSkill(n).getSkill() : null; + RegisteredSkill skill = inv.getPlayerData().hasSkillBound(n+1) ? inv.getPlayerData().getBoundSkill(n+1).getSkill() : null; holders.register("skill", skill == null ? none : skill.getName()); return holders; } @@ -394,7 +395,7 @@ public class SkillList extends EditableInventory { * binding or unbinding skills. */ if (item.getFunction().equals("slot")) { - int index = slotSlots.indexOf(context.getSlot()); + int index = slotSlots.indexOf(context.getSlot())+1; SkillSlot skillSlot=playerData.getProfess().getSkillSlot(index); // unbind if there is a current spell. if (context.getClickType() == ClickType.RIGHT) { @@ -427,6 +428,7 @@ public class SkillList extends EditableInventory { player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2); playerData.bindSkill(index, selected); + Bukkit.broadcastMessage("SKILL BOUND: "+index); open(); return; } From 10cfc48c9af2aedfb2fe57cad460bb7b2a0fd96c Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:21:47 +0100 Subject: [PATCH 32/58] Removed debug messages --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 7 +------ .../src/main/java/net/Indyuce/mmocore/gui/SkillList.java | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) 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 886702f5..e56b922d 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 @@ -1069,11 +1069,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc .stream() .filter(skillInfo->skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)) .forEach(BoundSkillInfo::refresh); - //TODO Remove test: - Bukkit.broadcastMessage("match"+boundSkills.values() - .stream() - .filter(skillInfo->skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)).toList().size()); - } + } @Deprecated public boolean hasSkillUnlocked(RegisteredSkill skill) { @@ -1140,7 +1136,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public boolean hasSkillBound(int slot) { - Bukkit.broadcastMessage("slot:"+slot+" "+boundSkills.containsKey(slot)); return boundSkills.containsKey(slot); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index b0b4b5be..99b6e1ba 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -428,7 +428,6 @@ public class SkillList extends EditableInventory { player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2); playerData.bindSkill(index, selected); - Bukkit.broadcastMessage("SKILL BOUND: "+index); open(); return; } From 5edc6ac9993a731287f3a28f7fbf3f7198840adc Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:42:28 +0100 Subject: [PATCH 33/58] Debug unbinding passive skill. --- .../main/java/net/Indyuce/mmocore/api/player/PlayerData.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 e56b922d..ae4879e8 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 @@ -1173,7 +1173,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public void unbindSkill(int slot) { - boundSkills.remove(slot); + BoundSkillInfo boundSkillInfo=boundSkills.remove(slot); + boundSkillInfo.unbind(); } From b05ced2660f3ea45bfb03e29acfecef25baaca7e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:42:43 +0100 Subject: [PATCH 34/58] Added passive & active categories by default --- .../main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java index 1504d090..628cf616 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java @@ -32,6 +32,10 @@ public class RegisteredSkill implements Unlockable { categories = config.getStringList("categories"); // Trigger type triggerType = getHandler().isTriggerable() ? (config.contains("passive-type") ? TriggerType.valueOf(UtilityMethods.enumName(config.getString("passive-type"))) : TriggerType.CAST) : TriggerType.API; + if(triggerType.isPassive()) + categories.add("passive"); + else + categories.add("active"); // Load default modifier formulas for (String mod : handler.getModifiers()) From 37bb71938185ec0bf5abcdd00c53e7de3864318e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 20:46:42 +0100 Subject: [PATCH 35/58] Buf Fix --- .../mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java index 6901bfa8..48ee1850 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java @@ -97,7 +97,7 @@ public class MMOCoreDataSynchronizer extends DataSynchronizer { data.setSkillLevel(entry.getKey(), entry.getValue().getAsInt()); } if (!isEmpty(result.getString("bound_skills"))) { - JsonObject object = new Gson().fromJson(result.getString("skills"), JsonObject.class); + JsonObject object = new Gson().fromJson(result.getString("bound_skills"), JsonObject.class); for (Map.Entry entry : object.entrySet()) data.bindSkill(Integer.parseInt(entry.getKey()), data.getProfess().getSkill(entry.getValue().getAsString())); } From aaa777267d6bb6c5478ec67ddb9c44dfc42ef164 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 16:49:17 +0100 Subject: [PATCH 36/58] Skill Unlocking Mechanic. --- .../mmocore/api/player/PlayerData.java | 34 +++++++++---------- .../net/Indyuce/mmocore/gui/SkillList.java | 5 ++- .../net/Indyuce/mmocore/skill/ClassSkill.java | 13 +++++-- 3 files changed, 31 insertions(+), 21 deletions(-) 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 ae4879e8..3910d815 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 @@ -166,11 +166,11 @@ 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(); + Iterator ite = boundSkills.keySet().iterator(); while (ite.hasNext()) try { - int slot=ite.next(); - BoundSkillInfo boundSkillInfo=new BoundSkillInfo(boundSkills.get(slot)); + int slot = ite.next(); + BoundSkillInfo boundSkillInfo = new BoundSkillInfo(boundSkills.get(slot)); boundSkills.put(slot, boundSkillInfo); } catch (Exception ignored) { } @@ -222,9 +222,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc @Override public Map mapBoundSkills() { - Map result= new HashMap<>(); - for(int slot:boundSkills.keySet()) - result.put(slot,boundSkills.get(slot).getClassSkill().getSkill().getHandler().getId()); + Map result = new HashMap<>(); + for (int slot : boundSkills.keySet()) + result.put(slot, boundSkills.get(slot).getClassSkill().getSkill().getHandler().getId()); return result; } @@ -534,20 +534,18 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc /** * @return If the item is unlocked by the player - * @deprecated Not used yet + * This is used for skills that can be locked & unlocked. */ - @Deprecated public boolean hasUnlocked(Unlockable unlockable) { return unlockedItems.contains(unlockable.getUnlockNamespacedKey()); } + /** - * Unlocks an item for the player + * Unlocks an item for the player. This is mainly used to unlock skills. * * @return If the item was already unlocked when calling this method - * @deprecated Not used yet */ - @Deprecated public boolean unlock(Unlockable unlockable) { return unlockedItems.add(unlockable.getUnlockNamespacedKey()); } @@ -769,9 +767,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc final double r = Math.sin((double) t / warpTime * Math.PI); for (double j = 0; j < Math.PI * 2; j += Math.PI / 4) getPlayer().getLocation().getWorld().spawnParticle(Particle.REDSTONE, getPlayer().getLocation().add( - Math.cos((double) 5 * t / warpTime + j) * r, - (double) 2 * t / warpTime, - Math.sin((double) 5 * t / warpTime + j) * r), + Math.cos((double) 5 * t / warpTime + j) * r, + (double) 2 * t / warpTime, + Math.sin((double) 5 * t / warpTime + j) * r), 1, new Particle.DustOptions(Color.PURPLE, 1.25f)); } }.runTaskTimer(MMOCore.plugin, 0, 1); @@ -1067,9 +1065,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public void refreshBoundedSkill(String skill) { boundSkills.values() .stream() - .filter(skillInfo->skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)) + .filter(skillInfo -> skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)) .forEach(BoundSkillInfo::refresh); - } + } @Deprecated public boolean hasSkillUnlocked(RegisteredSkill skill) { @@ -1140,7 +1138,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public ClassSkill getBoundSkill(int slot) { - return boundSkills.containsKey(slot) ? boundSkills.get(slot).getClassSkill():null; + return boundSkills.containsKey(slot) ? boundSkills.get(slot).getClassSkill() : null; } @@ -1173,7 +1171,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public void unbindSkill(int slot) { - BoundSkillInfo boundSkillInfo=boundSkills.remove(slot); + BoundSkillInfo boundSkillInfo = boundSkills.remove(slot); boundSkillInfo.unbind(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 99b6e1ba..1a1bc7ed 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -323,7 +323,10 @@ public class SkillList extends EditableInventory { public SkillViewerInventory(PlayerData playerData, EditableInventory editable) { super(playerData, editable); - skills = new ArrayList<>(playerData.getProfess().getSkills()); + skills = playerData.getProfess().getSkills() + .stream() + .filter((classSkill)->playerData.hasUnlocked(classSkill.getSkill())) + .collect(Collectors.toList()); skillSlots = getEditable().getByFunction("skill").getSlots(); Validate.notNull(getEditable().getByFunction("slot"), "Your skill GUI config file is out-of-date, please regenerate it."); slotSlots = getEditable().getByFunction("slot").getSlots(); 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 f301c62a..4a2cf373 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 @@ -17,6 +17,7 @@ import java.util.*; public class ClassSkill implements CooldownObject { private final RegisteredSkill skill; private final int unlockLevel, maxSkillLevel; + private final boolean unlockedByDefault; private final Map modifiers = new HashMap<>(); @Deprecated @@ -32,10 +33,14 @@ public class ClassSkill implements CooldownObject { * It is also used by the MMOCore API to force players to cast abilities. */ public ClassSkill(RegisteredSkill skill, int unlockLevel, int maxSkillLevel) { + this(skill, unlockLevel, maxSkillLevel, true); + } + + public ClassSkill(RegisteredSkill skill, int unlockLevel, int maxSkillLevel, boolean unlockedByDefault) { this.skill = skill; this.unlockLevel = unlockLevel; this.maxSkillLevel = maxSkillLevel; - + this.unlockedByDefault = unlockedByDefault; for (String mod : skill.getHandler().getModifiers()) this.modifiers.put(mod, skill.getModifierInfo(mod)); } @@ -44,7 +49,7 @@ public class ClassSkill implements CooldownObject { this.skill = skill; unlockLevel = config.getInt("level"); maxSkillLevel = config.getInt("max-level"); - + unlockedByDefault = config.getBoolean("unlocked-by-default", true); for (String mod : skill.getHandler().getModifiers()) { LinearValue defaultValue = skill.getModifierInfo(mod); this.modifiers.put(mod, config.isConfigurationSection(mod) ? readLinearValue(defaultValue, config.getConfigurationSection(mod)) : defaultValue); @@ -68,6 +73,10 @@ public class ClassSkill implements CooldownObject { return maxSkillLevel; } + public boolean isUnlockedByDefault() { + return unlockedByDefault; + } + /** * This method can only override default modifiers and * will throw an error when trying to define non existing modifiers From b1b1a6eddd4dc2b3231025900223425a0aca4c7a Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 20:39:07 +0100 Subject: [PATCH 37/58] UnlockSkillTrigger --- .../api/quest/trigger/StatTrigger.java | 4 ++- .../api/quest/trigger/UnlockSkillTrigger.java | 29 +++++++++++++++++++ .../api/quest/trigger/api/Removable.java | 7 +++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/api/Removable.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java index 4a77bdbf..a99fda41 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java @@ -4,11 +4,12 @@ import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.stat.modifier.StatModifier; import io.lumine.mythic.lib.player.modifier.ModifierType; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.quest.trigger.api.Removable; import org.apache.commons.lang.Validate; import java.util.UUID; -public class StatTrigger extends Trigger { +public class StatTrigger extends Trigger implements Removable { public static String TRIGGER_PREFIX = "mmocore_trigger"; private final StatModifier statModifier; private final String stat; @@ -42,6 +43,7 @@ public class StatTrigger extends Trigger { * opposite amount. (Little corrective term for the relative to have the inverse. * Not a problem to store twice the stat modifiers are there only remain in the RAM. */ + @Override public void remove(PlayerData playerData) { playerData.getMMOPlayerData().getStatMap().getInstance(stat).remove(modifierKey); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java new file mode 100644 index 00000000..4fc77c40 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java @@ -0,0 +1,29 @@ +package net.Indyuce.mmocore.api.quest.trigger; + +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.quest.trigger.api.Removable; +import net.Indyuce.mmocore.skill.RegisteredSkill; + +import java.util.Objects; + +public class UnlockSkillTrigger extends Trigger implements Removable { + private final RegisteredSkill skill; + + public UnlockSkillTrigger(MMOLineConfig config) { + super(config); + config.validateKeys("skill"); + skill = Objects.requireNonNull(MMOCore.plugin.skillManager.getSkill(config.getString("skill"))); + } + + @Override + public void apply(PlayerData player) { + player.unlock(skill); + } + + @Override + public void remove(PlayerData playerData) { + playerData.lock(skill); + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/api/Removable.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/api/Removable.java new file mode 100644 index 00000000..533683ca --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/api/Removable.java @@ -0,0 +1,7 @@ +package net.Indyuce.mmocore.api.quest.trigger.api; + +import net.Indyuce.mmocore.api.player.PlayerData; + +public interface Removable { + public void remove(PlayerData playerData); +} From e518cafc85b978c67cf3a0770c22f80b4e9b6653 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 20:41:30 +0100 Subject: [PATCH 38/58] Modifications to make UnlockSkillTrigger work with the rest of MMOCore. --- .../net/Indyuce/mmocore/api/load/DefaultMMOLoader.java | 2 ++ .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 8 ++++++++ .../mmocore/experience/droptable/ExperienceItem.java | 8 +++++--- .../mmocore/experience/droptable/ExperienceTable.java | 5 ++--- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java index 3957b537..8bfd04bb 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java @@ -21,6 +21,8 @@ public class DefaultMMOLoader extends MMOLoader { return new FromTrigger(config); if (config.getKey().equals("stat")) return new StatTrigger(config); + if (config.getKey().equals("unlock_skill")) + return new UnlockSkillTrigger(config); if (config.getKey().equals("message")) return new MessageTrigger(config); if (config.getKey().equals("sound") || config.getKey().equals("playsound")) 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 3910d815..9e6b1671 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 @@ -550,6 +550,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return unlockedItems.add(unlockable.getUnlockNamespacedKey()); } + /** + * Locks an item for the player by removing it from the unlocked items map if it is present. + * This is mainly used to remove unlocked items when changing class or reallocating a skill tree. + */ + public void lock(Unlockable unlockable){ + unlockedItems.remove(unlockable.getUnlockNamespacedKey()); + } + public void setLevel(int level) { this.level = Math.max(1, level); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceItem.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceItem.java index 05bbdb58..b8914d21 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceItem.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceItem.java @@ -5,6 +5,7 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.trigger.StatTrigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger; +import net.Indyuce.mmocore.api.quest.trigger.api.Removable; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; @@ -105,15 +106,16 @@ public class ExperienceItem { * Used when the player level is reset to 0 ( reallocate point in skill tree for instance) * Creates an opposite playerModifier to compensate all the effect that existed before. */ - public void removeStatTriggers(PlayerData playerData) { + public void removeTriggers(PlayerData playerData) { for (Trigger trigger : triggers) { - if (trigger instanceof StatTrigger statTrigger) - statTrigger.remove(playerData); + if (trigger instanceof Removable) + ((Removable) trigger).remove(playerData); } } /** * Used when a player connects back to give back all the stats that he should have. + * * @param playerData */ public void applyStatTriggers(PlayerData playerData) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceTable.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceTable.java index e79a8585..9fbdc0a6 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceTable.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/droptable/ExperienceTable.java @@ -4,7 +4,6 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.experience.ExperienceObject; import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import java.util.ArrayList; @@ -62,7 +61,7 @@ public class ExperienceTable { for (ExperienceItem item : items) { int timesClaimed = playerData.getClaims(object, this, item); for (int i = 0; i < timesClaimed; i++) - item.removeStatTriggers(playerData); + item.removeTriggers(playerData); } } @@ -74,7 +73,7 @@ public class ExperienceTable { int timesClaimed = playerData.getClaims(object, this, item); playerData.setClaims(object, this, item, 0); for (int i = 0; i < timesClaimed; i++) - item.removeStatTriggers(playerData); + item.removeTriggers(playerData); } } From bbab36ca1bca6e49176f98f81994751489bfcc71 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 20:58:14 +0100 Subject: [PATCH 39/58] Added unlockedItems in ClassDataContainer. --- .../net/Indyuce/mmocore/api/player/PlayerData.java | 10 ++++++++++ .../net/Indyuce/mmocore/player/ClassDataContainer.java | 3 +++ .../net/Indyuce/mmocore/player/DefaultPlayerData.java | 10 ++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) 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 9e6b1671..68eba7e4 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 @@ -374,6 +374,16 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return result; } + @Override + public Set getUnlockedItems() { + return new HashSet<>(unlockedItems); + } + + public void setUnlockedItems(Set unlockedItems) { + this.unlockedItems.clear(); + this.unlockedItems.addAll(unlockedItems); + } + public void resetTimesClaimed() { tableItemClaims.clear(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index f1198b19..5d6a7e1e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -7,6 +7,7 @@ import net.Indyuce.mmocore.skilltree.SkillTreeNode; import java.util.List; import java.util.Map; +import java.util.Set; /** * All the class-specific information i.e information being saved @@ -48,4 +49,6 @@ public interface ClassDataContainer { Map getNodeLevels(); Map getNodeTimesClaimed(); + + Set getUnlockedItems(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index 48c54d08..1a46af5e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -6,10 +6,7 @@ import net.Indyuce.mmocore.skilltree.SkillTreeNode; import org.bukkit.attribute.Attribute; import org.bukkit.configuration.ConfigurationSection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class DefaultPlayerData implements ClassDataContainer { private final int level, classPoints, skillPoints, attributePoints, attrReallocPoints, skillReallocPoints, skillTreeReallocPoints; @@ -122,6 +119,11 @@ public class DefaultPlayerData implements ClassDataContainer { return new HashMap<>(); } + @Override + public Set getUnlockedItems() { + return new HashSet<>(); + } + @Override public Map mapAttributeLevels() { return new HashMap<>(); From a7231d948ee40bf76b206df9e31c1fefe1640b63 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 20:58:50 +0100 Subject: [PATCH 40/58] Made unlockedItems class based. --- .../player/profess/SavedClassInformation.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index a1db0223..ab0bd9c9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -6,15 +6,17 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.player.ClassDataContainer; -import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.tree.SkillTree; import org.bukkit.attribute.Attribute; import org.bukkit.configuration.ConfigurationSection; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; public class SavedClassInformation { private final int level, skillPoints, attributePoints, attributeReallocationPoints, skillTreeReallocationPoints, skillReallocationPoints; @@ -25,7 +27,7 @@ public class SavedClassInformation { private final Map nodeLevels = new HashMap<>(); private final Map nodeTimesClaimed = new HashMap<>(); private final Map boundSkills = new HashMap<>(); - + private final Set unlockedItems= new HashSet<>(); /** * Used by YAML storage */ @@ -60,6 +62,7 @@ public class SavedClassInformation { if (config.isConfigurationSection("bound-skills")) config.getConfigurationSection("bound-skills").getKeys(false) .forEach(key -> boundSkills.put(Integer.parseInt(key), config.getString("bound-skills." + key))); + unlockedItems.addAll(config.getStringList("unlocked-items")); } /** @@ -96,6 +99,11 @@ public class SavedClassInformation { if (json.has("bound-skills") && json.get("bound-skills").isJsonObject()) for (Entry entry : json.getAsJsonObject("bound-skills").entrySet()) boundSkills.put(Integer.parseInt(entry.getKey()), entry.getValue().getAsString()); + if(json.has("unlocked-items")){ + for(JsonElement unlockedItem: json.get("unlocked-items").getAsJsonArray()){ + unlockedItems.add(unlockedItem.getAsString()); + } + } } public SavedClassInformation(ClassDataContainer data) { @@ -115,8 +123,8 @@ public class SavedClassInformation { data.mapSkillTreePoints().forEach((key, val) -> skillTreePoints.put(key, val)); data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node.getFullId(), level)); data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); - data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill)); + data.getUnlockedItems().forEach(item->unlockedItems.add(item)); } public int getLevel() { @@ -203,6 +211,10 @@ public class SavedClassInformation { return stamina; } + public Set getUnlockedItems() { + return unlockedItems; + } + public Set getAttributeKeys() { return attributeLevels.keySet(); } @@ -265,6 +277,7 @@ public class SavedClassInformation { player.setAttributeReallocationPoints(attributeReallocationPoints); player.setSkillTreeReallocationPoints(skillTreeReallocationPoints); player.setSkillReallocationPoints(skillReallocationPoints); + player.setUnlockedItems(unlockedItems); for (int slot : boundSkills.keySet()) player.bindSkill(slot, profess.getSkill(boundSkills.get(slot))); From 1deed752f48946f38e97dca47ac0f95347d9c5b8 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 21:01:43 +0100 Subject: [PATCH 41/58] Handling of unlockedItems on YamlPlayerDataManager when loading/saving playerData. --- .../mmocore/manager/data/yaml/YAMLPlayerDataManager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index f66ac9ab..c5d029b4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -92,6 +92,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { } } + data.setUnlockedItems(config.getStringList("unlocked-items").stream().collect(Collectors.toSet())); for ( SkillTreeNode node : MMOCore.plugin.skillTreeManager.getAllNodes()) { data.setNodeLevel(node, config.getInt("skill-tree-level." + node.getFullId(), 0)); @@ -157,8 +158,8 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.mapSkillLevels().forEach((key1, value) -> config.set("skill." + key1, value)); data.getItemClaims().forEach((key, times) -> config.set("times-claimed." + key, times)); - data.mapBoundSkills().forEach((slot,skill)->config.set("bound-skills."+slot,skill)); - + data.mapBoundSkills().forEach((slot, skill) -> config.set("bound-skills." + slot, skill)); + config.set("unlocked-items", data.getUnlockedItems().stream().collect(Collectors.toList())); config.set("attribute", null); config.createSection("attribute"); data.getAttributes().save(config.getConfigurationSection("attribute")); @@ -189,7 +190,8 @@ public class YAMLPlayerDataManager extends PlayerDataManager { info.getAttributeKeys().forEach(attribute -> config.set("class-info." + key + ".attribute." + attribute, info.getAttributeLevel(attribute))); info.getNodeKeys().forEach(node -> config.set("class-info." + key + ".node-levels." + node, info.getNodeLevel(node))); info.getSkillTreePointsKeys().forEach(skillTreeId -> config.set("class-info." + key + ".skill-tree-points." + skillTreeId, info.getAttributeLevel(skillTreeId))); - info.getBoundSkills().forEach((slot,skill)->config.set("class-info." + key + ".bound-skills."+slot,skill)); + info.getBoundSkills().forEach((slot, skill) -> config.set("class-info." + key + ".bound-skills." + slot, skill)); + config.set("class-info." + key + ".unlocked-items", info.getUnlockedItems()); } file.save(); From 713146d9dd90035f4a835969a48d844d967bb1aa Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 21:03:35 +0100 Subject: [PATCH 42/58] Handling of unlockedItems on MySQLPlayerDataManager when loading/saving playerData. --- .../data/mysql/MMOCoreDataSynchronizer.java | 15 +++++++-------- .../manager/data/mysql/MySQLDataProvider.java | 2 ++ .../data/mysql/MySQLPlayerDataManager.java | 18 ++++++++++++------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java index 48ee1850..a9eb4992 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MMOCoreDataSynchronizer.java @@ -1,9 +1,6 @@ package net.Indyuce.mmocore.manager.data.mysql; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import com.google.gson.*; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.sql.DataSynchronizer; import net.Indyuce.mmocore.MMOCore; @@ -20,8 +17,7 @@ import org.jetbrains.annotations.Nullable; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.logging.Level; public class MMOCoreDataSynchronizer extends DataSynchronizer { @@ -74,8 +70,11 @@ public class MMOCoreDataSynchronizer extends DataSynchronizer { } } data.setupSkillTree(); - - + Set unlockedItems = new HashSet<>(); + JsonArray unlockedItemsArray = new JsonParser().parse(result.getString("unlocked_items")).getAsJsonArray(); + for (JsonElement item : unlockedItemsArray) + unlockedItems.add(item.getAsString()); + data.setUnlockedItems(unlockedItems); if (!isEmpty(result.getString("guild"))) { Guild guild = MMOCore.plugin.dataProvider.getGuildManager().getGuild(result.getString("guild")); data.setGuild(guild.hasMember(data.getUniqueId()) ? guild : null); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java index 7a631b47..833c387d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java @@ -21,6 +21,7 @@ public class MySQLDataProvider extends MMODataSource implements DataProvider { "skill_tree_reallocation_points", "INT(11)", "skill_tree_points", "LONGTEXT", "skill_tree_levels", "LONGTEXT", + "unlocked_items","LONGTEXT", "mana","FLOAT", "stamina","FLOAT", "stellium","FLOAT"}; @@ -56,6 +57,7 @@ public class MySQLDataProvider extends MMODataSource implements DataProvider { "friends LONGTEXT," + "skills LONGTEXT," + "bound_skills LONGTEXT," + + "unlocked_items LONGTEXT," + "class_info LONGTEXT," + "is_saved TINYINT," + "PRIMARY KEY (uuid));"); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 9eb15b57..d2c7a2e1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.manager.data.mysql; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.lumine.mythic.lib.UtilityMethods; import net.Indyuce.mmocore.MMOCore; @@ -54,7 +55,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { updater.addData("guild", data.hasGuild() ? data.getGuild().getId() : null); updater.addJSONArray("waypoints", data.getWaypoints()); updater.addJSONArray("friends", data.getFriends().stream().map(UUID::toString).collect(Collectors.toList())); - updater.addJSONObject("bound_skills",data.mapBoundSkills().entrySet()); + updater.addJSONObject("bound_skills", data.mapBoundSkills().entrySet()); updater.addJSONObject("skills", data.mapSkillLevels().entrySet()); updater.addJSONObject("times_claimed", data.getItemClaims().entrySet()); updater.addJSONObject("skill_tree_points", data.mapSkillTreePoints().entrySet()); @@ -63,6 +64,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { updater.addData("professions", data.getCollectionSkills().toJsonString()); updater.addData("quests", data.getQuestData().toJsonString()); updater.addData("class_info", createClassInfoData(data).toString()); + updater.addJSONArray("unlocked_items", data.getUnlockedItems()); if (logout) updater.addData("is_saved", 1); @@ -88,7 +90,11 @@ public class MySQLPlayerDataManager extends PlayerDataManager { classinfo.addProperty("mana", info.getMana()); classinfo.addProperty("stamina", info.getStamina()); classinfo.addProperty("stellium", info.getStellium()); - + JsonArray array = new JsonArray(); + for (String unlockedItem : playerData.getUnlockedItems()) { + array.add(unlockedItem); + } + classinfo.add("unlocked-items", array); JsonObject skillinfo = new JsonObject(); for (String skill : info.getSkillKeys()) skillinfo.addProperty(skill, info.getSkillLevel(skill)); @@ -109,8 +115,8 @@ public class MySQLPlayerDataManager extends PlayerDataManager { classinfo.add("skill-tree-points", skillTreePointsInfo); JsonObject boundSkillInfo = new JsonObject(); - for(int slot:info.getBoundSkills().keySet()) - boundSkillInfo.addProperty(slot+"",info.getBoundSkills().get(slot)); + for (int slot : info.getBoundSkills().keySet()) + boundSkillInfo.addProperty(slot + "", info.getBoundSkills().get(slot)); classinfo.add("bound-skills", boundSkillInfo); json.add(c, classinfo); @@ -165,8 +171,8 @@ public class MySQLPlayerDataManager extends PlayerDataManager { @Override public void removeFriend(UUID uuid) { // TODO recode - // friends.remove(uuid); - // new PlayerDataTableUpdater(provider, uuid).updateData("friends", friends.stream().map(UUID::toString).collect(Collectors.toList())); + // friends.remove(uuid); + // new PlayerDataTableUpdater(provider, uuid).updateData("friends", friends.stream().map(UUID::toString).collect(Collectors.toList())); } @Override From 77d4f8e4e49dfe3e9b40738973fe34f6deab148e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 21 Mar 2023 21:20:14 +0100 Subject: [PATCH 43/58] Command to lock/unlock skill manually. It is better to use triggers as it enables the unlocking.. to go to its initial state after a reallocation. --- .../rpg/admin/SkillCommandTreeNode.java | 51 ++++++++++++++++--- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java index 869c44e5..38fdd94c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java @@ -18,7 +18,8 @@ import java.util.function.BiFunction; public class SkillCommandTreeNode extends CommandTreeNode { public SkillCommandTreeNode(CommandTreeNode parent) { super(parent, "skill"); - + addChild(new LockSkillCommandTreeNode(this, "lock", true)); + addChild(new LockSkillCommandTreeNode(this, "unlock", false)); addChild(new ActionCommandTreeNode(this, "give", (old, amount) -> old + amount)); addChild(new ActionCommandTreeNode(this, "set", (old, amount) -> amount)); } @@ -55,15 +56,14 @@ public class SkillCommandTreeNode extends CommandTreeNode { } - - ClassSkill classSkill=null; - for(ClassSkill var:playerData.getProfess().getSkills()) { - if(var.getSkill().equals(skill)) - classSkill=var; + ClassSkill classSkill = null; + for (ClassSkill var : playerData.getProfess().getSkills()) { + if (var.getSkill().equals(skill)) + classSkill = var; } - if(classSkill==null||classSkill.getUnlockLevel() > playerData.getLevel()) { - sender.sendMessage(ChatColor.RED+ skill.getName()+" is not unlockable for "+player.getName()+"."); + if (classSkill == null || classSkill.getUnlockLevel() > playerData.getLevel()) { + sender.sendMessage(ChatColor.RED + skill.getName() + " is not unlockable for " + player.getName() + "."); return CommandResult.FAILURE; } @@ -83,6 +83,41 @@ public class SkillCommandTreeNode extends CommandTreeNode { } } + public class LockSkillCommandTreeNode extends CommandTreeNode { + private final boolean lock; + + public LockSkillCommandTreeNode(CommandTreeNode parent, String id, boolean lock) { + super(parent, id); + this.lock = lock; + addParameter(Parameter.PLAYER); + } + + @Override + public CommandResult execute(CommandSender sender, String[] args) { + if (args.length < 4) + return CommandResult.THROW_USAGE; + Player player = Bukkit.getPlayer(args[3]); + if (player == null) { + sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[3] + "."); + return CommandResult.FAILURE; + } + PlayerData playerData = PlayerData.get(player); + + RegisteredSkill skill = MMOCore.plugin.skillManager.getSkill(args[4]); + if (skill == null) { + sender.sendMessage(ChatColor.RED + "Could not find the skill called " + args[4] + "."); + return CommandResult.FAILURE; + } + if (lock) + playerData.lock(skill); + else + playerData.unlock(skill); + CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, "The skill " + skill.getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); + return CommandResult.SUCCESS; + } + } + + @Override public CommandResult execute(CommandSender sender, String[] args) { return CommandResult.THROW_USAGE; From fbe431464964539329a195399d0ce9c47261d48a Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 26 Mar 2023 20:53:21 +0100 Subject: [PATCH 44/58] Transfer of Unlockable to MythicLib --- .../java/net/Indyuce/mmocore/MMOCore.java | 1 + .../mmocore/api/player/PlayerData.java | 66 ++++++++----------- .../player/profess/SavedClassInformation.java | 2 +- .../api/quest/trigger/UnlockSkillTrigger.java | 4 +- .../rpg/admin/SkillCommandTreeNode.java | 10 +-- .../net/Indyuce/mmocore/gui/SkillList.java | 5 +- .../data/mysql/MySQLPlayerDataManager.java | 5 +- .../data/yaml/YAMLPlayerDataManager.java | 2 +- .../mmocore/player/ClassDataContainer.java | 5 +- .../mmocore/player/DefaultPlayerData.java | 2 +- .../Indyuce/mmocore/player/Unlockable.java | 22 ------- .../mmocore/skill/RegisteredSkill.java | 5 +- .../Indyuce/mmocore/waypoint/Waypoint.java | 2 +- .../main/resources/default/gui/skill-list.yml | 2 +- 14 files changed, 48 insertions(+), 85 deletions(-) delete mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/player/Unlockable.java 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 71d465c4..e820d667 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -57,6 +57,7 @@ import java.util.logging.Level; public class MMOCore extends JavaPlugin { public static MMOCore plugin; + public final static String MMOCORE_ITEM_ID = "mmocore:"; public final WaypointManager waypointManager = new WaypointManager(); public final SoundManager soundManager = new SoundManager(); 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 68eba7e4..2984400e 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 @@ -38,7 +38,6 @@ import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.player.ClassDataContainer; import net.Indyuce.mmocore.player.CombatHandler; -import net.Indyuce.mmocore.player.Unlockable; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.cast.SkillCastingHandler; @@ -66,6 +65,8 @@ import java.util.*; import java.util.logging.Level; import java.util.stream.Collectors; +import static net.Indyuce.mmocore.MMOCore.MMOCORE_ITEM_ID; + public class PlayerData extends OfflinePlayerData implements Closable, ExperienceTableClaimer, ClassDataContainer { @@ -112,15 +113,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc private final Map nodeLevels = new HashMap<>(); private final Map skillTreePoints = new HashMap<>(); - /** - * Saves all the items that have been unlocked so far by - * the player. This is used for: - * - waypoints - * - skills - * - * @see {@link Unlockable} - */ - private final Set unlockedItems = new HashSet<>(); /** * Saves the amount of times the player has claimed some @@ -374,16 +366,29 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return result; } + /** + * @return All the unlocked items that are handled by MMOCore (the ones that MMOCore saves & load by itself. + */ @Override - public Set getUnlockedItems() { - return new HashSet<>(unlockedItems); + public Set getMMOUnlockedItems() { + return mmoData.getUnlockedItems().stream().filter(key->key.startsWith(MMOCORE_ITEM_ID)).collect(Collectors.toSet()); } + + /** + * Used to change the value of the unlockedItems handled by mmocore. + * @param unlockedItems + */ public void setUnlockedItems(Set unlockedItems) { - this.unlockedItems.clear(); - this.unlockedItems.addAll(unlockedItems); + Set mythicUnlockedItems=mmoData.getUnlockedItems() + .stream() + .filter((key)->!key.startsWith(MMOCORE_ITEM_ID)) + .collect(Collectors.toSet()); + mythicUnlockedItems.addAll(unlockedItems); + mmoData.setUnlockedItems(mythicUnlockedItems); } + public void resetTimesClaimed() { tableItemClaims.clear(); } @@ -542,32 +547,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return guild != null; } - /** - * @return If the item is unlocked by the player - * This is used for skills that can be locked & unlocked. - */ - public boolean hasUnlocked(Unlockable unlockable) { - return unlockedItems.contains(unlockable.getUnlockNamespacedKey()); - } - - - /** - * Unlocks an item for the player. This is mainly used to unlock skills. - * - * @return If the item was already unlocked when calling this method - */ - public boolean unlock(Unlockable unlockable) { - return unlockedItems.add(unlockable.getUnlockNamespacedKey()); - } - - /** - * Locks an item for the player by removing it from the unlocked items map if it is present. - * This is mainly used to remove unlocked items when changing class or reallocating a skill tree. - */ - public void lock(Unlockable unlockable){ - unlockedItems.remove(unlockable.getUnlockNamespacedKey()); - } - public void setLevel(int level) { this.level = Math.max(1, level); @@ -1149,6 +1128,13 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc // Update stats if (isOnline()) getStats().updateStats(); + + Bukkit.broadcastMessage("IN"); + //Loads the classUnlockedSkills + profess.getSkills() + .stream() + .filter(ClassSkill::isUnlockedByDefault) + .forEach(skill->mmoData.unlock(skill.getSkill())); } public boolean hasSkillBound(int slot) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index ab0bd9c9..2424f8cb 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -124,7 +124,7 @@ public class SavedClassInformation { data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node.getFullId(), level)); data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill)); - data.getUnlockedItems().forEach(item->unlockedItems.add(item)); + data.getMMOUnlockedItems().forEach(item->unlockedItems.add(item)); } public int getLevel() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java index 4fc77c40..e827f9b2 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java @@ -19,11 +19,11 @@ public class UnlockSkillTrigger extends Trigger implements Removable { @Override public void apply(PlayerData player) { - player.unlock(skill); + player.getMMOPlayerData().unlock(skill); } @Override public void remove(PlayerData playerData) { - playerData.lock(skill); + playerData.getMMOPlayerData().lock(skill); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java index 38fdd94c..21e93385 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java @@ -103,16 +103,16 @@ public class SkillCommandTreeNode extends CommandTreeNode { } PlayerData playerData = PlayerData.get(player); - RegisteredSkill skill = MMOCore.plugin.skillManager.getSkill(args[4]); + ClassSkill skill = playerData.getProfess().getSkill(args[4]); if (skill == null) { - sender.sendMessage(ChatColor.RED + "Could not find the skill called " + args[4] + "."); + sender.sendMessage(ChatColor.RED + "The player's class doesn't have a skill called " + args[4] + "."); return CommandResult.FAILURE; } if (lock) - playerData.lock(skill); + playerData.getMMOPlayerData().lock(skill.getSkill()); else - playerData.unlock(skill); - CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, "The skill " + skill.getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); + playerData.getMMOPlayerData().unlock(skill.getSkill()); + CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, "The skill " + skill.getSkill() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); return CommandResult.SUCCESS; } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 1a1bc7ed..6b7b10fc 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -322,10 +322,11 @@ public class SkillList extends EditableInventory { public SkillViewerInventory(PlayerData playerData, EditableInventory editable) { super(playerData, editable); - + Bukkit.broadcastMessage("UNLOCKED"); + playerData.getMMOPlayerData().getUnlockedItems().forEach(str->Bukkit.broadcastMessage(str)); skills = playerData.getProfess().getSkills() .stream() - .filter((classSkill)->playerData.hasUnlocked(classSkill.getSkill())) + .filter((classSkill)->playerData.getMMOPlayerData().hasUnlocked(classSkill.getSkill())) .collect(Collectors.toList()); skillSlots = getEditable().getByFunction("skill").getSlots(); Validate.notNull(getEditable().getByFunction("slot"), "Your skill GUI config file is out-of-date, please regenerate it."); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index d2c7a2e1..666b80ea 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -12,7 +12,6 @@ import net.Indyuce.mmocore.manager.data.PlayerDataManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -64,7 +63,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { updater.addData("professions", data.getCollectionSkills().toJsonString()); updater.addData("quests", data.getQuestData().toJsonString()); updater.addData("class_info", createClassInfoData(data).toString()); - updater.addJSONArray("unlocked_items", data.getUnlockedItems()); + updater.addJSONArray("unlocked_items", data.getMMOUnlockedItems()); if (logout) updater.addData("is_saved", 1); @@ -91,7 +90,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { classinfo.addProperty("stamina", info.getStamina()); classinfo.addProperty("stellium", info.getStellium()); JsonArray array = new JsonArray(); - for (String unlockedItem : playerData.getUnlockedItems()) { + for (String unlockedItem : playerData.getMMOUnlockedItems()) { array.add(unlockedItem); } classinfo.add("unlocked-items", array); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index c5d029b4..2f28b1f7 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -159,7 +159,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.getItemClaims().forEach((key, times) -> config.set("times-claimed." + key, times)); data.mapBoundSkills().forEach((slot, skill) -> config.set("bound-skills." + slot, skill)); - config.set("unlocked-items", data.getUnlockedItems().stream().collect(Collectors.toList())); + config.set("unlocked-items", data.getMMOUnlockedItems().stream().collect(Collectors.toList())); config.set("attribute", null); config.createSection("attribute"); data.getAttributes().save(config.getConfigurationSection("attribute")); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index 5d6a7e1e..c30934e5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -1,11 +1,8 @@ package net.Indyuce.mmocore.player; -import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; -import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; -import java.util.List; import java.util.Map; import java.util.Set; @@ -50,5 +47,5 @@ public interface ClassDataContainer { Map getNodeTimesClaimed(); - Set getUnlockedItems(); + Set getMMOUnlockedItems(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index 1a46af5e..06efa836 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -120,7 +120,7 @@ public class DefaultPlayerData implements ClassDataContainer { } @Override - public Set getUnlockedItems() { + public Set getMMOUnlockedItems() { return new HashSet<>(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/Unlockable.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/Unlockable.java deleted file mode 100644 index 9349f308..00000000 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/Unlockable.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.Indyuce.mmocore.player; - -import net.Indyuce.mmocore.api.player.PlayerData; - -/** - * Some item that can be unlocked. All unlockables are saved in the - * same list in the player data. This useful list can be used for: - * - waypoints - * - skill tree nodes - * - skills using skill books? TODO - * - external plugins that implement other unlockable items - * - * @see {@link PlayerData#unlock(Unlockable)} and {@link PlayerData#hasUnlocked(Unlockable)} - */ -public interface Unlockable { - - /** - * Format being used is the minecraft's default namespaced - * key format, e.g "skill_tree:strength_1_5" for readability - */ - String getUnlockNamespacedKey(); -} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java index 628cf616..a1610d12 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java @@ -1,12 +1,13 @@ package net.Indyuce.mmocore.skill; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.player.Unlockable; import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.trigger.TriggerType; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; -import net.Indyuce.mmocore.player.Unlockable; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -59,7 +60,7 @@ public class RegisteredSkill implements Unlockable { @Override public String getUnlockNamespacedKey() { - return "registered_skill:" + handler.getId().toLowerCase(); + return MMOCore.MMOCORE_ITEM_ID+"skill:" + handler.getId().toLowerCase(); } public SkillHandler getHandler() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java index b5f3d643..021261e1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java @@ -2,10 +2,10 @@ package net.Indyuce.mmocore.waypoint; import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.util.PostLoadObject; +import io.lumine.mythic.lib.player.Unlockable; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.loot.chest.condition.Condition; import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance; -import net.Indyuce.mmocore.player.Unlockable; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.Location; 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 3042f98e..0e88dd1a 100644 --- a/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml +++ b/MMOCore-Dist/src/main/resources/default/gui/skill-list.yml @@ -46,7 +46,7 @@ items: - '&eCosts 1 skill reallocation point.' - '&eâ—† Skill Reallocation Points: &6{points}' - skill-slot: + slot: slots: [ 8,17,26,35,44,53 ] function: slot item: BOOK From 9544745cb47e490166d7991c33263fb405637e7e Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 28 Mar 2023 14:30:21 +0100 Subject: [PATCH 45/58] Removed / Modified verbose --- .../main/java/net/Indyuce/mmocore/api/player/PlayerData.java | 1 - .../Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java | 2 +- .../src/main/java/net/Indyuce/mmocore/gui/SkillList.java | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) 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 2984400e..48afee92 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 @@ -1129,7 +1129,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc if (isOnline()) getStats().updateStats(); - Bukkit.broadcastMessage("IN"); //Loads the classUnlockedSkills profess.getSkills() .stream() diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java index 21e93385..2ee60cba 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java @@ -112,7 +112,7 @@ public class SkillCommandTreeNode extends CommandTreeNode { playerData.getMMOPlayerData().lock(skill.getSkill()); else playerData.getMMOPlayerData().unlock(skill.getSkill()); - CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, "The skill " + skill.getSkill() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); + CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.GOLD+"The skill " + skill.getSkill().getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); return CommandResult.SUCCESS; } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index 6b7b10fc..cb387708 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -322,8 +322,6 @@ public class SkillList extends EditableInventory { public SkillViewerInventory(PlayerData playerData, EditableInventory editable) { super(playerData, editable); - Bukkit.broadcastMessage("UNLOCKED"); - playerData.getMMOPlayerData().getUnlockedItems().forEach(str->Bukkit.broadcastMessage(str)); skills = playerData.getProfess().getSkills() .stream() .filter((classSkill)->playerData.getMMOPlayerData().hasUnlocked(classSkill.getSkill())) From 9facd8d3df1ff85fe126f59c301e0e207474b23f Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 28 Mar 2023 16:10:43 +0100 Subject: [PATCH 46/58] Improved Tab Completion for Skill Unlocking --- .../rpg/admin/SkillCommandTreeNode.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java index 2ee60cba..67b92505 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java @@ -32,7 +32,7 @@ public class SkillCommandTreeNode extends CommandTreeNode { super(parent, type); this.change = change; addParameter(Parameter.PLAYER); - addParameter(new Parameter("", + addParameter(new Parameter("", (explorer, list) -> MMOCore.plugin.skillManager.getAll().forEach(skill -> list.add(skill.getHandler().getId().toUpperCase())))); addParameter(Parameter.AMOUNT); } @@ -90,11 +90,13 @@ public class SkillCommandTreeNode extends CommandTreeNode { super(parent, id); this.lock = lock; addParameter(Parameter.PLAYER); + addParameter(new Parameter("", + (explorer, list) -> MMOCore.plugin.skillManager.getAll().forEach(skill -> list.add(skill.getHandler().getId().toUpperCase())))); } @Override public CommandResult execute(CommandSender sender, String[] args) { - if (args.length < 4) + if (args.length < 5) return CommandResult.THROW_USAGE; Player player = Bukkit.getPlayer(args[3]); if (player == null) { @@ -108,11 +110,21 @@ public class SkillCommandTreeNode extends CommandTreeNode { sender.sendMessage(ChatColor.RED + "The player's class doesn't have a skill called " + args[4] + "."); return CommandResult.FAILURE; } - if (lock) + if (lock) { + if (!playerData.getMMOPlayerData().hasUnlocked(skill.getSkill())) { + CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.RED + "The skill " + skill.getSkill().getName() + " is already locked" + " for " + player.getName()); + return CommandResult.SUCCESS; + } playerData.getMMOPlayerData().lock(skill.getSkill()); - else + + } else { + if (playerData.getMMOPlayerData().hasUnlocked(skill.getSkill())) { + CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.RED + "The skill " + skill.getSkill().getName() + " is already unlocked" + " for " + player.getName()); + return CommandResult.SUCCESS; + } playerData.getMMOPlayerData().unlock(skill.getSkill()); - CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.GOLD+"The skill " + skill.getSkill().getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); + } + CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.GOLD + "The skill " + skill.getSkill().getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); return CommandResult.SUCCESS; } } From b62b0e89e952429c72faafeaeea04587e919730d Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 28 Mar 2023 16:10:51 +0100 Subject: [PATCH 47/58] Reindent --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 48afee92..880812f9 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 @@ -371,18 +371,19 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc */ @Override public Set getMMOUnlockedItems() { - return mmoData.getUnlockedItems().stream().filter(key->key.startsWith(MMOCORE_ITEM_ID)).collect(Collectors.toSet()); + return mmoData.getUnlockedItems().stream().filter(key -> key.startsWith(MMOCORE_ITEM_ID)).collect(Collectors.toSet()); } /** * Used to change the value of the unlockedItems handled by mmocore. + * * @param unlockedItems */ public void setUnlockedItems(Set unlockedItems) { - Set mythicUnlockedItems=mmoData.getUnlockedItems() + Set mythicUnlockedItems = mmoData.getUnlockedItems() .stream() - .filter((key)->!key.startsWith(MMOCORE_ITEM_ID)) + .filter((key) -> !key.startsWith(MMOCORE_ITEM_ID)) .collect(Collectors.toSet()); mythicUnlockedItems.addAll(unlockedItems); mmoData.setUnlockedItems(mythicUnlockedItems); @@ -1133,7 +1134,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc profess.getSkills() .stream() .filter(ClassSkill::isUnlockedByDefault) - .forEach(skill->mmoData.unlock(skill.getSkill())); + .forEach(skill -> mmoData.unlock(skill.getSkill())); } public boolean hasSkillBound(int slot) { From fc5b34a35292776fe2d3b20e5ca521056d117ca3 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 28 Mar 2023 16:11:54 +0100 Subject: [PATCH 48/58] Debug by removing skills from SkillSlots when the skills gets locked.Done by creating a Listener for ItemLockedEvent. --- .../net/Indyuce/mmocore/MMOCoreBukkit.java | 1 + .../listener/SkillLockingListener.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java index 160c0922..4ded3211 100644 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java @@ -47,6 +47,7 @@ public class MMOCoreBukkit { Bukkit.getPluginManager().registerEvents(new FishingListener(), plugin); Bukkit.getPluginManager().registerEvents(new PlayerCollectStats(), plugin); Bukkit.getPluginManager().registerEvents(new PlayerPressKeyListener(), plugin); + Bukkit.getPluginManager().registerEvents(new SkillLockingListener(),plugin); // Bukkit.getPluginManager().registerEvents(new ClassTriggers(), plugin); } } diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java new file mode 100644 index 00000000..d65c79d9 --- /dev/null +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java @@ -0,0 +1,25 @@ +package net.Indyuce.mmocore.listener; + +import io.lumine.mythic.lib.api.event.unlocking.ItemLockedEvent; +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class SkillLockingListener implements Listener { + + /** + * Unbind the skill from boundSkills when it becomes locked. + */ + @EventHandler + public void onSkillLock(ItemLockedEvent event) { + if (event.getItemTypeId().equals("skill")) { + PlayerData playerData = PlayerData.get(event.getData().getUniqueId()); + playerData.mapBoundSkills() + .forEach((slot, skillId) -> { + if (skillId.equalsIgnoreCase(event.getItemId())) + playerData.unbindSkill(slot); + }); + } + } +} From 41aad7b6a146e2b389fb584153b6115a60052eca Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Wed, 29 Mar 2023 23:35:47 +0100 Subject: [PATCH 49/58] Transfered unlockedItems from MythicLib to MMOCore. --- .../java/net/Indyuce/mmocore/MMOCore.java | 2 - .../api/event/unlocking/ItemChangeEvent.java | 36 ++++++++++ .../api/event/unlocking/ItemLockedEvent.java | 24 +++++++ .../event/unlocking/ItemUnlockedEvent.java | 22 ++++++ .../mmocore/api/player/PlayerData.java | 72 ++++++++++++++----- .../mmocore/api/player/Unlockable.java | 24 +++++++ .../player/profess/SavedClassInformation.java | 2 +- .../api/quest/trigger/UnlockSkillTrigger.java | 4 +- .../rpg/admin/SkillCommandTreeNode.java | 8 +-- .../net/Indyuce/mmocore/gui/SkillList.java | 2 +- .../data/mysql/MySQLPlayerDataManager.java | 4 +- .../data/yaml/YAMLPlayerDataManager.java | 2 +- .../mmocore/player/ClassDataContainer.java | 2 +- .../mmocore/player/DefaultPlayerData.java | 2 +- .../mmocore/skill/RegisteredSkill.java | 23 +++++- .../Indyuce/mmocore/waypoint/Waypoint.java | 13 +++- .../net/Indyuce/mmocore/MMOCoreBukkit.java | 1 - .../listener/SkillLockingListener.java | 25 ------- 18 files changed, 206 insertions(+), 62 deletions(-) create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemChangeEvent.java create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemLockedEvent.java create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemUnlockedEvent.java create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java delete mode 100644 MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java 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 e820d667..e059aa65 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -57,8 +57,6 @@ import java.util.logging.Level; public class MMOCore extends JavaPlugin { public static MMOCore plugin; - public final static String MMOCORE_ITEM_ID = "mmocore:"; - public final WaypointManager waypointManager = new WaypointManager(); public final SoundManager soundManager = new SoundManager(); public final RequestManager requestManager = new RequestManager(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemChangeEvent.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemChangeEvent.java new file mode 100644 index 00000000..b4280658 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemChangeEvent.java @@ -0,0 +1,36 @@ +package net.Indyuce.mmocore.api.event.unlocking; + +import net.Indyuce.mmocore.api.event.PlayerDataEvent; +import net.Indyuce.mmocore.api.player.PlayerData; + +public abstract class ItemChangeEvent extends PlayerDataEvent { + private final String itemKey; + + public ItemChangeEvent(PlayerData playerData, String itemKey) { + super(playerData); + this.itemKey = itemKey; + } + + /** + * @return The full item key in the format ::. + */ + public String getItemKey() { + return itemKey; + } + + + /** + * @return The item-type-id which is the first parameter in the key format :. + */ + public String getItemTypeId() { + return itemKey.split(":")[0]; + } + + /** + * @return The item--id which is the last parameter in the key format :. + */ + public String getItemId() { + return itemKey.split(":")[1]; + } +} + diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemLockedEvent.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemLockedEvent.java new file mode 100644 index 00000000..0e9bf37f --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemLockedEvent.java @@ -0,0 +1,24 @@ +package net.Indyuce.mmocore.api.event.unlocking; + +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class ItemLockedEvent extends ItemChangeEvent { + private static final HandlerList handlers = new HandlerList(); + + public ItemLockedEvent(PlayerData playerData, String itemKey) { + super(playerData, itemKey); + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} + diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemUnlockedEvent.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemUnlockedEvent.java new file mode 100644 index 00000000..aa6158e9 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/unlocking/ItemUnlockedEvent.java @@ -0,0 +1,22 @@ +package net.Indyuce.mmocore.api.event.unlocking; +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class ItemUnlockedEvent extends ItemChangeEvent { + private static final HandlerList handlers = new HandlerList(); + + public ItemUnlockedEvent(PlayerData playerData, String itemKey) { + super(playerData, itemKey); + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} 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 880812f9..68c5a47d 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 @@ -12,6 +12,8 @@ import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent; import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; +import net.Indyuce.mmocore.api.event.unlocking.ItemLockedEvent; +import net.Indyuce.mmocore.api.event.unlocking.ItemUnlockedEvent; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes; import net.Indyuce.mmocore.api.player.profess.PlayerClass; @@ -65,9 +67,6 @@ import java.util.*; import java.util.logging.Level; import java.util.stream.Collectors; -import static net.Indyuce.mmocore.MMOCore.MMOCORE_ITEM_ID; - - public class PlayerData extends OfflinePlayerData implements Closable, ExperienceTableClaimer, ClassDataContainer { /** @@ -113,7 +112,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc private final Map nodeLevels = new HashMap<>(); private final Map skillTreePoints = new HashMap<>(); - + /** + * Saves the namespacedkey of the items that have been unlocked in the form item-type:item-key. + * This is used for: + * -Waypoints + * -Skills + * -Skill Books + */ + private final Set unlockedItems= new HashSet<>(); /** * Saves the amount of times the player has claimed some * exp item in exp tables, for both exp tables used @@ -366,27 +372,59 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return result; } + + /** - * @return All the unlocked items that are handled by MMOCore (the ones that MMOCore saves & load by itself. + * @return If the item is unlocked by the player + * This is used for skills that can be locked & unlocked. + *

+ * Looks at the real value and thus remove the plugin identifier */ - @Override - public Set getMMOUnlockedItems() { - return mmoData.getUnlockedItems().stream().filter(key -> key.startsWith(MMOCORE_ITEM_ID)).collect(Collectors.toSet()); + public boolean hasUnlocked(Unlockable unlockable) { + String unlockableKey = unlockable.getUnlockNamespacedKey().substring(unlockable.getUnlockNamespacedKey().indexOf(":")); + return unlockedItems + .stream() + .filter(key -> key.substring(key.indexOf(":")).equals(unlockableKey)) + .collect(Collectors.toList()).size() != 0; } /** - * Used to change the value of the unlockedItems handled by mmocore. + * Unlocks an item for the player. This is mainly used to unlock skills. * - * @param unlockedItems + * @return If the item was locked when calling this method. */ + public boolean unlock(Unlockable unlockable) { + boolean wasLocked = unlockedItems.add(unlockable.getUnlockNamespacedKey()); + if (wasLocked) + //Calls the event synchronously + Bukkit.getScheduler().runTask(MythicLib.plugin, + () -> Bukkit.getPluginManager().callEvent(new ItemUnlockedEvent(this, unlockable.getUnlockNamespacedKey()))); + + return wasLocked; + } + + /** + * Locks an item for the player by removing it from the unlocked items map if it is present. + * This is mainly used to remove unlocked items when changing class or reallocating a skill tree. + * + * @return If the item was unlocked when calling this method. + */ + public boolean lock(Unlockable unlockable) { + boolean wasUnlocked = unlockedItems.remove(unlockable.getUnlockNamespacedKey()); + if (wasUnlocked) + //Calls the event synchronously + Bukkit.getScheduler().runTask(MythicLib.plugin, () -> Bukkit.getPluginManager().callEvent(new ItemLockedEvent(this, unlockable.getUnlockNamespacedKey()))); + return wasUnlocked; + } + + public Set getUnlockedItems() { + return new HashSet<>(unlockedItems); + } + public void setUnlockedItems(Set unlockedItems) { - Set mythicUnlockedItems = mmoData.getUnlockedItems() - .stream() - .filter((key) -> !key.startsWith(MMOCORE_ITEM_ID)) - .collect(Collectors.toSet()); - mythicUnlockedItems.addAll(unlockedItems); - mmoData.setUnlockedItems(mythicUnlockedItems); + unlockedItems.clear(); + unlockedItems.addAll(unlockedItems); } @@ -1134,7 +1172,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc profess.getSkills() .stream() .filter(ClassSkill::isUnlockedByDefault) - .forEach(skill -> mmoData.unlock(skill.getSkill())); + .forEach(skill ->unlock(skill.getSkill())); } public boolean hasSkillBound(int slot) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java new file mode 100644 index 00000000..60926d91 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java @@ -0,0 +1,24 @@ +package net.Indyuce.mmocore.api.player; + +/** + * Some item that can be unlocked. All unlockables are saved in the + * same list in the player data. This useful list can be used for: + * - waypoints + * - skill tree nodes + * - skills using skill books? + * - external plugins that implement other unlockable items + * + * @see {@link PlayerData#unlock(Unlockable)} and {@link PlayerData#hasUnlocked(Unlockable)} + */ +public interface Unlockable { + + /** + * Format being used is the minecraft's default namespaced + * key format, e.g "skill_tree:strength_1_5" for readability + */ + String getUnlockNamespacedKey(); + + void whenLocked(PlayerData playerData); + + void whenUnlocked(PlayerData playerData); +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index 2424f8cb..ab0bd9c9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -124,7 +124,7 @@ public class SavedClassInformation { data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node.getFullId(), level)); data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill)); - data.getMMOUnlockedItems().forEach(item->unlockedItems.add(item)); + data.getUnlockedItems().forEach(item->unlockedItems.add(item)); } public int getLevel() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java index e827f9b2..4fc77c40 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java @@ -19,11 +19,11 @@ public class UnlockSkillTrigger extends Trigger implements Removable { @Override public void apply(PlayerData player) { - player.getMMOPlayerData().unlock(skill); + player.unlock(skill); } @Override public void remove(PlayerData playerData) { - playerData.getMMOPlayerData().lock(skill); + playerData.lock(skill); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java index 67b92505..7aa355fc 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/SkillCommandTreeNode.java @@ -111,18 +111,18 @@ public class SkillCommandTreeNode extends CommandTreeNode { return CommandResult.FAILURE; } if (lock) { - if (!playerData.getMMOPlayerData().hasUnlocked(skill.getSkill())) { + if (!playerData.hasUnlocked(skill.getSkill())) { CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.RED + "The skill " + skill.getSkill().getName() + " is already locked" + " for " + player.getName()); return CommandResult.SUCCESS; } - playerData.getMMOPlayerData().lock(skill.getSkill()); + playerData.lock(skill.getSkill()); } else { - if (playerData.getMMOPlayerData().hasUnlocked(skill.getSkill())) { + if (playerData.hasUnlocked(skill.getSkill())) { CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.RED + "The skill " + skill.getSkill().getName() + " is already unlocked" + " for " + player.getName()); return CommandResult.SUCCESS; } - playerData.getMMOPlayerData().unlock(skill.getSkill()); + playerData.unlock(skill.getSkill()); } CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.GOLD + "The skill " + skill.getSkill().getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName())); return CommandResult.SUCCESS; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index cb387708..0c53849c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -324,7 +324,7 @@ public class SkillList extends EditableInventory { super(playerData, editable); skills = playerData.getProfess().getSkills() .stream() - .filter((classSkill)->playerData.getMMOPlayerData().hasUnlocked(classSkill.getSkill())) + .filter((classSkill)->playerData.hasUnlocked(classSkill.getSkill())) .collect(Collectors.toList()); skillSlots = getEditable().getByFunction("skill").getSlots(); Validate.notNull(getEditable().getByFunction("slot"), "Your skill GUI config file is out-of-date, please regenerate it."); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 666b80ea..6aede10d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -63,7 +63,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { updater.addData("professions", data.getCollectionSkills().toJsonString()); updater.addData("quests", data.getQuestData().toJsonString()); updater.addData("class_info", createClassInfoData(data).toString()); - updater.addJSONArray("unlocked_items", data.getMMOUnlockedItems()); + updater.addJSONArray("unlocked_items", data.getUnlockedItems()); if (logout) updater.addData("is_saved", 1); @@ -90,7 +90,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { classinfo.addProperty("stamina", info.getStamina()); classinfo.addProperty("stellium", info.getStellium()); JsonArray array = new JsonArray(); - for (String unlockedItem : playerData.getMMOUnlockedItems()) { + for (String unlockedItem : playerData.getUnlockedItems()) { array.add(unlockedItem); } classinfo.add("unlocked-items", array); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index 2f28b1f7..c5d029b4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -159,7 +159,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.getItemClaims().forEach((key, times) -> config.set("times-claimed." + key, times)); data.mapBoundSkills().forEach((slot, skill) -> config.set("bound-skills." + slot, skill)); - config.set("unlocked-items", data.getMMOUnlockedItems().stream().collect(Collectors.toList())); + config.set("unlocked-items", data.getUnlockedItems().stream().collect(Collectors.toList())); config.set("attribute", null); config.createSection("attribute"); data.getAttributes().save(config.getConfigurationSection("attribute")); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java index c30934e5..0aa8a759 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/ClassDataContainer.java @@ -47,5 +47,5 @@ public interface ClassDataContainer { Map getNodeTimesClaimed(); - Set getMMOUnlockedItems(); + Set getUnlockedItems(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java index 06efa836..1a46af5e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/DefaultPlayerData.java @@ -120,7 +120,7 @@ public class DefaultPlayerData implements ClassDataContainer { } @Override - public Set getMMOUnlockedItems() { + public Set getUnlockedItems() { return new HashSet<>(); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java index a1610d12..91b505c6 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java @@ -1,10 +1,11 @@ package net.Indyuce.mmocore.skill; import io.lumine.mythic.lib.UtilityMethods; -import io.lumine.mythic.lib.player.Unlockable; import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.trigger.TriggerType; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.Unlockable; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; @@ -12,6 +13,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + import java.util.*; public class RegisteredSkill implements Unlockable { @@ -33,7 +35,7 @@ public class RegisteredSkill implements Unlockable { categories = config.getStringList("categories"); // Trigger type triggerType = getHandler().isTriggerable() ? (config.contains("passive-type") ? TriggerType.valueOf(UtilityMethods.enumName(config.getString("passive-type"))) : TriggerType.CAST) : TriggerType.API; - if(triggerType.isPassive()) + if (triggerType.isPassive()) categories.add("passive"); else categories.add("active"); @@ -60,7 +62,22 @@ public class RegisteredSkill implements Unlockable { @Override public String getUnlockNamespacedKey() { - return MMOCore.MMOCORE_ITEM_ID+"skill:" + handler.getId().toLowerCase(); + return "skill:" + handler.getId().toLowerCase(); + } + + @Override + public void whenLocked(PlayerData playerData) { + playerData.mapBoundSkills() + .forEach((slot, skill) -> + { + if (skill.equals(getUnlockNamespacedKey().split(":")[1])) + playerData.unbindSkill(slot); + }); + } + + @Override + public void whenUnlocked(PlayerData playerData) { + } public SkillHandler getHandler() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java index 021261e1..b7997687 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java @@ -2,8 +2,9 @@ package net.Indyuce.mmocore.waypoint; import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.util.PostLoadObject; -import io.lumine.mythic.lib.player.Unlockable; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.Unlockable; import net.Indyuce.mmocore.loot.chest.condition.Condition; import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance; import org.apache.commons.lang.Validate; @@ -212,6 +213,16 @@ public class Waypoint extends PostLoadObject implements Unlockable { return "waypoint:" + getId(); } + @Override + public void whenLocked(PlayerData playerData) { + + } + + @Override + public void whenUnlocked(PlayerData playerData) { + + } + @Override public int hashCode() { return Objects.hash(id); diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java index 4ded3211..160c0922 100644 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java @@ -47,7 +47,6 @@ public class MMOCoreBukkit { Bukkit.getPluginManager().registerEvents(new FishingListener(), plugin); Bukkit.getPluginManager().registerEvents(new PlayerCollectStats(), plugin); Bukkit.getPluginManager().registerEvents(new PlayerPressKeyListener(), plugin); - Bukkit.getPluginManager().registerEvents(new SkillLockingListener(),plugin); // Bukkit.getPluginManager().registerEvents(new ClassTriggers(), plugin); } } diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java deleted file mode 100644 index d65c79d9..00000000 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/SkillLockingListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.Indyuce.mmocore.listener; - -import io.lumine.mythic.lib.api.event.unlocking.ItemLockedEvent; -import net.Indyuce.mmocore.api.player.PlayerData; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -public class SkillLockingListener implements Listener { - - /** - * Unbind the skill from boundSkills when it becomes locked. - */ - @EventHandler - public void onSkillLock(ItemLockedEvent event) { - if (event.getItemTypeId().equals("skill")) { - PlayerData playerData = PlayerData.get(event.getData().getUniqueId()); - playerData.mapBoundSkills() - .forEach((slot, skillId) -> { - if (skillId.equalsIgnoreCase(event.getItemId())) - playerData.unbindSkill(slot); - }); - } - } -} From 14f1a7fcc2d34bbfad9368822c8068bc3af2c362 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 18:44:36 +0100 Subject: [PATCH 50/58] Version 1.12.0 --- MMOCore-API/pom.xml | 2 +- MMOCore-Dist/pom.xml | 4 ++-- README.md | 2 +- pom.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MMOCore-API/pom.xml b/MMOCore-API/pom.xml index 1ac1239c..3c833823 100644 --- a/MMOCore-API/pom.xml +++ b/MMOCore-API/pom.xml @@ -5,7 +5,7 @@ MMOCore net.Indyuce - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT 4.0.0 diff --git a/MMOCore-Dist/pom.xml b/MMOCore-Dist/pom.xml index cf6bc6f3..71382089 100644 --- a/MMOCore-Dist/pom.xml +++ b/MMOCore-Dist/pom.xml @@ -5,7 +5,7 @@ MMOCore net.Indyuce - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT 4.0.0 @@ -67,7 +67,7 @@ net.Indyuce MMOCore-API - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT true diff --git a/README.md b/README.md index 31b4de3a..e44b51be 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ And then add MMOCore-API as dependency net.Indyuce MMOCore-API - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT provided ``` diff --git a/pom.xml b/pom.xml index ec4f22e3..e4db384b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.Indyuce MMOCore pom - 1.11.2-SNAPSHOT + 1.12.0-SNAPSHOT MMOCore-API From 0f4699fbea346cd4003ad8bbb501732563c30bfd Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 18:45:03 +0100 Subject: [PATCH 51/58] Creation of SkillBuffTrigger. --- .../api/quest/trigger/SkillBuffTrigger.java | 50 +++++++++++++++++++ .../api/quest/trigger/StatTrigger.java | 1 - .../mmocore/api/quest/trigger/Trigger.java | 2 + 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java new file mode 100644 index 00000000..5675f821 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java @@ -0,0 +1,50 @@ +package net.Indyuce.mmocore.api.quest.trigger; + +import io.lumine.mythic.lib.api.MMOLineConfig; +import io.lumine.mythic.lib.api.skill.SkillBuff; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.quest.trigger.api.Removable; +import net.Indyuce.mmocore.skill.RegisteredSkill; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class SkillBuffTrigger extends Trigger implements Removable { + private final SkillBuff skillBuff; + private final String buffKey = TRIGGER_PREFIX + "." + UUID.randomUUID(); + private final double amount; + + + public SkillBuffTrigger(MMOLineConfig config) { + super(config); + config.validateKeys("skill-modifier"); + config.validateKeys("amount"); + config.validateKeys("formula"); + config.validateKeys("type"); + amount = config.getDouble("amount"); + String skillModifier = config.getString("skill-modifier"); + String formula = config.getString("formula"); + List targetSkills = new ArrayList<>(); + for (RegisteredSkill skill : MMOCore.plugin.skillManager.getAll()) { + if (skill.matchesFormula(formula)) + targetSkills.add(skill.getHandler().getId()); + } + skillBuff = new SkillBuff(buffKey, skillModifier, targetSkills, amount); + } + + @Override + public void apply(PlayerData player) { + if (player.getMMOPlayerData().getSkillBuffMap().hasSkillBuff(buffKey)) { + player.getMMOPlayerData().getSkillBuffMap().getSkillBuff(buffKey).add(amount).register(player.getMMOPlayerData()); + } else { + skillBuff.register(player.getMMOPlayerData()); + } + } + + @Override + public void remove(PlayerData playerData) { + skillBuff.unregister(playerData.getMMOPlayerData()); + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java index a99fda41..1348ffc5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/StatTrigger.java @@ -10,7 +10,6 @@ import org.apache.commons.lang.Validate; import java.util.UUID; public class StatTrigger extends Trigger implements Removable { - public static String TRIGGER_PREFIX = "mmocore_trigger"; private final StatModifier statModifier; private final String stat; private final String modifierKey = TRIGGER_PREFIX + "." + UUID.randomUUID(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/Trigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/Trigger.java index aa62fee9..2f1bb537 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/Trigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/Trigger.java @@ -6,6 +6,8 @@ import net.Indyuce.mmocore.api.player.PlayerData; import org.bukkit.Bukkit; public abstract class Trigger { + + public static String TRIGGER_PREFIX = "mmocore_trigger"; private final long delay; public Trigger(MMOLineConfig config) { From 7f07f9e3499ac6db45c2a9a934d03cfc97a79c07 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 18:45:43 +0100 Subject: [PATCH 52/58] Transferred the categories formulaEvaluation from SkillSlot to RegisteredSkill. --- .../profess/skillbinding/SkillSlot.java | 24 ++++--------------- .../mmocore/skill/RegisteredSkill.java | 16 +++++++++++++ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java index a1853363..852ead65 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/skillbinding/SkillSlot.java @@ -1,26 +1,22 @@ package net.Indyuce.mmocore.api.player.profess.skillbinding; -import bsh.EvalError; -import io.lumine.mythic.lib.MythicLib; -import net.Indyuce.mmocore.comp.mythicmobs.MythicHook; import net.Indyuce.mmocore.skill.ClassSkill; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import javax.script.ScriptException; import java.util.List; public class SkillSlot { private final int slot, modelData; - private final String expression; + private final String formula; private final String name; private final List lore; private Material item; - public SkillSlot(int slot, int modelData, String expression, String name, List lore, Material item) { + public SkillSlot(int slot, int modelData, String formula, String name, List lore, Material item) { this.slot = slot; this.modelData = modelData; - this.expression = expression; + this.formula = formula; this.name = name; this.lore = lore; this.item = item; @@ -28,7 +24,7 @@ public class SkillSlot { public SkillSlot(ConfigurationSection section) { this.slot = Integer.parseInt(section.getName()); - this.expression = section.contains("expression") ? section.getString("expression") : "true"; + this.formula = section.contains("expression") ? section.getString("expression") : "true"; this.name = section.getString("name"); this.lore = section.getStringList("lore"); if (section.contains("item")) @@ -61,16 +57,6 @@ public class SkillSlot { } public boolean canPlaceSkill(ClassSkill classSkill) { - - String parsedExpression = expression; - for (String category : classSkill.getSkill().getCategories()) - parsedExpression = parsedExpression.replace("<" + category + ">", "true"); - parsedExpression = parsedExpression.replaceAll("<.*>", "false"); - try { - boolean res = (boolean) MythicLib.plugin.getInterpreter().eval(parsedExpression); - return res; - } catch (EvalError e) { - throw new RuntimeException(e); - } + return classSkill.getSkill().matchesFormula(formula); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java index 91b505c6..2fc6b7da 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java @@ -1,5 +1,7 @@ package net.Indyuce.mmocore.skill; +import bsh.EvalError; +import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.trigger.TriggerType; @@ -35,6 +37,7 @@ public class RegisteredSkill implements Unlockable { categories = config.getStringList("categories"); // Trigger type triggerType = getHandler().isTriggerable() ? (config.contains("passive-type") ? TriggerType.valueOf(UtilityMethods.enumName(config.getString("passive-type"))) : TriggerType.CAST) : TriggerType.API; + categories.add(getHandler().getId()); if (triggerType.isPassive()) categories.add("passive"); else @@ -132,6 +135,19 @@ public class RegisteredSkill implements Unlockable { return defaultModifiers.get(modifier).calculate(level); } + public boolean matchesFormula(String formula) { + String parsedExpression = formula; + for (String category : categories) + parsedExpression = parsedExpression.replace("<" + category + ">", "true"); + parsedExpression = parsedExpression.replaceAll("<.*>", "false"); + try { + boolean res = (boolean) MythicLib.plugin.getInterpreter().eval(parsedExpression); + return res; + } catch (EvalError e) { + throw new RuntimeException(e); + } + } + @Override public boolean equals(Object o) { if (this == o) return true; From ddd303458411f26420ad48616cc52f374af11858 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 18:46:20 +0100 Subject: [PATCH 53/58] . --- .../net/Indyuce/mmocore/api/load/DefaultMMOLoader.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java index 8bfd04bb..bb807241 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java @@ -19,12 +19,19 @@ public class DefaultMMOLoader extends MMOLoader { public Trigger loadTrigger(MMOLineConfig config) { if (config.getKey().equals("from")) return new FromTrigger(config); + if (config.getKey().equals("stat")) return new StatTrigger(config); + if (config.getKey().equals("unlock_skill")) return new UnlockSkillTrigger(config); + + if (config.getKey().equals("skill_buff")) + return new SkillBuffTrigger(config); + if (config.getKey().equals("message")) return new MessageTrigger(config); + if (config.getKey().equals("sound") || config.getKey().equals("playsound")) return new SoundTrigger(config); From 1908b1d83e2c9c50318163bcdbdf6d1ac78281d3 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 18:47:05 +0100 Subject: [PATCH 54/58] Debug for SkillBuffs. --- .../src/main/java/net/Indyuce/mmocore/MMOCore.java | 8 ++++++++ .../main/java/net/Indyuce/mmocore/skill/ClassSkill.java | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) 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 e059aa65..a8647c2b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -45,6 +45,9 @@ 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; @@ -114,6 +117,11 @@ public class MMOCore extends JavaPlugin { MythicLib.plugin.getSkills().registerMechanic("stellium", config -> new StelliumMechanic(config)); MythicLib.plugin.getSkills().registerMechanic("mmocore_experience", config -> new ExperienceMechanic(config)); + //MMOCore Skills + MythicLib.plugin.getSkills().registerSkillHandler(new Ambers()); + MythicLib.plugin.getSkills().registerSkillHandler(new Neptune_Gift()); + MythicLib.plugin.getSkills().registerSkillHandler(new Sneaky_Picky()); + // Register extra objective, drop items... if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) loadManager.registerLoader(new WorldGuardMMOLoader()); 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 4a2cf373..c0867832 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 @@ -107,7 +107,9 @@ public class ClassSkill implements CooldownObject { // Calculate placeholders Placeholders placeholders = new Placeholders(); - modifiers.keySet().forEach(modifier -> placeholders.register(modifier, modifiers.get(modifier).getDisplay(x))); + modifiers.keySet().forEach(modifier -> + placeholders.register(modifier, data.getMMOPlayerData().getSkillBuffMap() + .getSkillInstance(skill.getHandler().getId()).getSkillModifier(modifier).getTotal(modifiers.get(modifier).calculate(x)))); placeholders.register("mana_name", data.getProfess().getManaDisplay().getName()); placeholders.register("mana_color", data.getProfess().getManaDisplay().getFull().toString()); From b6ef6cd4de1776282d879a3df36f0907ac58c0f4 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 21:28:42 +0100 Subject: [PATCH 55/58] Bug Fixing --- .../java/net/Indyuce/mmocore/MMOCore.java | 5 --- .../mmocore/skill/cast/listener/SkillBar.java | 9 ++-- .../resources/default/skills/arcane-hail.yml | 42 +++++++++++++++++++ 3 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 MMOCore-Dist/src/main/resources/default/skills/arcane-hail.yml 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 a8647c2b..991bfc5a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -117,11 +117,6 @@ public class MMOCore extends JavaPlugin { MythicLib.plugin.getSkills().registerMechanic("stellium", config -> new StelliumMechanic(config)); MythicLib.plugin.getSkills().registerMechanic("mmocore_experience", config -> new ExperienceMechanic(config)); - //MMOCore Skills - MythicLib.plugin.getSkills().registerSkillHandler(new Ambers()); - MythicLib.plugin.getSkills().registerSkillHandler(new Neptune_Gift()); - MythicLib.plugin.getSkills().registerSkillHandler(new Sneaky_Picky()); - // Register extra objective, drop items... if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) loadManager.registerLoader(new WorldGuardMMOLoader()); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java index 3f0be67c..fbe836ac 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java @@ -11,6 +11,7 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.cast.PlayerKey; import net.Indyuce.mmocore.skill.cast.SkillCastingHandler; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -116,13 +117,13 @@ public class SkillBar implements Listener { private String getFormat(PlayerData data) { StringBuilder str = new StringBuilder(); if (!data.isOnline()) return str.toString(); - for (int j = 0; j < data.getBoundSkills().size(); j++) { - ClassSkill skill = data.getBoundSkill(j); + for (int slot : data.mapBoundSkills().keySet()) { + ClassSkill skill = data.getBoundSkill(slot); str.append((str.length() == 0) ? "" : split).append((onCooldown(data, skill) ? onCooldown.replace("{cooldown}", String.valueOf(data.getCooldownMap().getInfo(skill).getRemaining() / 1000)) : noMana(data, skill) ? noMana : (noStamina( data, skill) ? noStamina : ready)).replace("{index}", - "" + (j + 1 + (data.getPlayer().getInventory().getHeldItemSlot() <= j ? 1 : 0))) - .replace("{skill}", data.getBoundSkill(j).getSkill().getName())); + "" + (slot + 1 + (data.getPlayer().getInventory().getHeldItemSlot() <= slot ? 1 : 0))) + .replace("{skill}", data.getBoundSkill(slot).getSkill().getName())); } return MMOCore.plugin.placeholderParser.parse(data.getPlayer(), str.toString()); } diff --git a/MMOCore-Dist/src/main/resources/default/skills/arcane-hail.yml b/MMOCore-Dist/src/main/resources/default/skills/arcane-hail.yml new file mode 100644 index 00000000..2ccb98bb --- /dev/null +++ b/MMOCore-Dist/src/main/resources/default/skills/arcane-hail.yml @@ -0,0 +1,42 @@ +name: Arcane Hail +lore: +- Surprise your foes with this +- quick firing hail of magic +- '' +- '&e{cooldown}s Cooldown' +- '&9Costs {mana} {mana_name}' +material: END_ROD +duration: + base: 4 + per-level: 1 + min: 0 + max: 0 +timer: + base: 0 + per-level: 0 + min: 0 + max: 0 +damage: + base: 3 + per-level: 1 +delay: + base: 2 + per-level: 1 + min: 0 + max: 0 +mana: + base: 2 + per-level: 1.1 +stamina: + base: 0 + per-level: 0 + min: 0 + max: 0 +cooldown: + base: 1 + per-level: -0.2 +radius: + base: 4 + per-level: 0.5 + min: 0 + max: 0 From 13b8b86b7bc6c66e86ba173b6a0e6682c52de6da Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 21:47:07 +0100 Subject: [PATCH 56/58] Bug Fixing --- .../Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java index 5675f821..2c9753c4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/SkillBuffTrigger.java @@ -19,12 +19,12 @@ public class SkillBuffTrigger extends Trigger implements Removable { public SkillBuffTrigger(MMOLineConfig config) { super(config); - config.validateKeys("skill-modifier"); + config.validateKeys("modifier"); config.validateKeys("amount"); config.validateKeys("formula"); config.validateKeys("type"); amount = config.getDouble("amount"); - String skillModifier = config.getString("skill-modifier"); + String skillModifier = config.getString("modifier"); String formula = config.getString("formula"); List targetSkills = new ArrayList<>(); for (RegisteredSkill skill : MMOCore.plugin.skillManager.getAll()) { diff --git a/pom.xml b/pom.xml index e4db384b..50f02b01 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ io.lumine MythicLib-dist - 1.5.1-SNAPSHOT + 1.5.2-SNAPSHOT provided From d19da5f1ccca9f413c098cb7da5b9b982d206b83 Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Thu, 30 Mar 2023 21:56:46 +0100 Subject: [PATCH 57/58] Made it possible to unlock a skill that is not defined in the class. --- .../mmocore/api/player/profess/PlayerClass.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) 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 d905220a..d18793ec 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 @@ -180,15 +180,13 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { + id + "': " + exception.getMessage()); } - if (config.contains("skills")) - for (String key : config.getConfigurationSection("skills").getKeys(false)) - try { - RegisteredSkill registered = MMOCore.plugin.skillManager.getSkillOrThrow(UtilityMethods.enumName(key)); - skills.put(registered.getHandler().getId(), new ClassSkill(registered, config.getConfigurationSection("skills." + key))); - } catch (RuntimeException exception) { - MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load skill info '" + key + "' from class '" - + id + "': " + exception.getMessage()); - } + for (RegisteredSkill registered : MMOCore.plugin.skillManager.getAll()) { + String key = registered.getHandler().getId(); + if (config.contains("skills." + key)) + skills.put(key, new ClassSkill(registered, config.getConfigurationSection("skills." + key))); + else + skills.put(key, new ClassSkill(registered, 1, 1)); + } castParticle = config.contains("cast-particle") ? new CastingParticle(config.getConfigurationSection("cast-particle")) : null; From b2982a9ffb69377a9b3f9fde7a47950cfeceb6fd Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Fri, 31 Mar 2023 07:35:47 +0100 Subject: [PATCH 58/58] Made CastableSkill.getModifier() take MMOPlayerData to enable it to check player buffs. --- .../api/player/profess/PlayerClass.java | 2 +- .../Indyuce/mmocore/skill/CastableSkill.java | 18 ++++++++++-------- .../mmocore/skill/list/Neptune_Gift.java | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-) 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 d18793ec..0fb0070b 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 @@ -185,7 +185,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { if (config.contains("skills." + key)) skills.put(key, new ClassSkill(registered, config.getConfigurationSection("skills." + key))); else - skills.put(key, new ClassSkill(registered, 1, 1)); + skills.put(key, new ClassSkill(registered, 1, 1,false)); } castParticle = config.contains("cast-particle") ? new CastingParticle(config.getConfigurationSection("cast-particle")) : null; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java index c9a31247..70fe5b3f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java @@ -1,6 +1,7 @@ package net.Indyuce.mmocore.skill; import io.lumine.mythic.lib.MythicLib; +import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.comp.flags.CustomFlag; import io.lumine.mythic.lib.player.cooldown.CooldownInfo; import io.lumine.mythic.lib.skill.Skill; @@ -49,13 +50,13 @@ public class CastableSkill extends Skill { } // Mana cost - if (playerData.getMana() < getModifier("mana")) { - if (loud) MMOCore.plugin.configManager.getSimpleMessage("casting.no-mana", "mana-required",MythicLib.plugin.getMMOConfig().decimal.format((getModifier("mana")-playerData.getMana())),"mana", playerData.getProfess().getManaDisplay().getName()).send(playerData.getPlayer()); + if (playerData.getMana() < getModifier("mana",playerData.getMMOPlayerData())) { + if (loud) MMOCore.plugin.configManager.getSimpleMessage("casting.no-mana", "mana-required",MythicLib.plugin.getMMOConfig().decimal.format((getModifier("mana",playerData.getMMOPlayerData())-playerData.getMana())),"mana", playerData.getProfess().getManaDisplay().getName()).send(playerData.getPlayer()); return false; } // Stamina cost - if (playerData.getStamina() < getModifier("stamina")) { + if (playerData.getStamina() < getModifier("stamina",skillMeta.getCaster().getData())) { if (loud) MMOCore.plugin.configManager.getSimpleMessage("casting.no-stamina").send(playerData.getPlayer()); return false; } @@ -76,11 +77,11 @@ public class CastableSkill extends Skill { // Cooldown double flatCooldownReduction = Math.max(0, Math.min(1, skillMeta.getCaster().getStat("COOLDOWN_REDUCTION") / 100)); - CooldownInfo cooldownHandler = skillMeta.getCaster().getData().getCooldownMap().applyCooldown(this, getModifier("cooldown")); + CooldownInfo cooldownHandler = skillMeta.getCaster().getData().getCooldownMap().applyCooldown(this, getModifier("cooldown",casterData.getMMOPlayerData())); cooldownHandler.reduceInitialCooldown(flatCooldownReduction); - casterData.giveMana(-getModifier("mana"), PlayerResourceUpdateEvent.UpdateReason.SKILL_COST); - casterData.giveStamina(-getModifier("stamina"), PlayerResourceUpdateEvent.UpdateReason.SKILL_COST); + casterData.giveMana(-getModifier("mana",skillMeta.getCaster().getData()), PlayerResourceUpdateEvent.UpdateReason.SKILL_COST); + casterData.giveStamina(-getModifier("stamina",casterData.getMMOPlayerData()), PlayerResourceUpdateEvent.UpdateReason.SKILL_COST); } if (!getTrigger().isPassive()) @@ -93,7 +94,8 @@ public class CastableSkill extends Skill { } @Override - public double getModifier(String mod) { - return skill.getModifier(mod, skillLevel); + public double getModifier(String mod, MMOPlayerData playerData) { + return playerData.getSkillBuffMap().getSkillInstance(getHandler().getId()) + .getSkillModifier(mod).getTotal(skill.getModifier(mod, skillLevel)); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/list/Neptune_Gift.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/list/Neptune_Gift.java index 71c036f3..dd22ef41 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/list/Neptune_Gift.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/list/Neptune_Gift.java @@ -5,6 +5,7 @@ import io.lumine.mythic.lib.skill.SkillMetadata; import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.result.def.SimpleSkillResult; import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; +import net.Indyuce.mmocore.api.player.PlayerData; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -33,7 +34,7 @@ public class Neptune_Gift extends SkillHandler implements Lis if (skill == null) return; - event.setAmount(event.getAmount() * (1 + skill.getTriggeredSkill().getModifier("extra") / 100)); + event.setAmount(event.getAmount() * (1 + skill.getTriggeredSkill().getModifier("extra", PlayerData.get(event.getPlayer()).getMMOPlayerData()) / 100)); } } }