From 4d89fa8fd9d193dadb7227366f7ee8ee2342154f Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Sun, 19 Mar 2023 22:23:33 +0100 Subject: [PATCH] Class based Ressources that are also saved/set when quitting & connecting to the server. --- .../mmocore/api/player/PlayerData.java | 11 +++++- .../player/profess/SavedClassInformation.java | 38 ++++++++++++++++++- .../data/mysql/MMOCoreDataSynchronizer.java | 10 +++++ .../manager/data/mysql/MySQLDataProvider.java | 11 ++++-- .../data/mysql/MySQLPlayerDataManager.java | 1 + .../data/yaml/YAMLPlayerDataManager.java | 6 ++- .../mmocore/player/ClassDataContainer.java | 8 ++++ .../mmocore/player/DefaultPlayerData.java | 34 +++++++++++++++-- 8 files changed, 110 insertions(+), 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 9224c564..f51527f1 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 @@ -233,7 +233,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public void resetTriggerStats() { - for(StatInstance instance:mmoData.getStatMap().getInstances()) { + for (StatInstance instance : mmoData.getStatMap().getInstances()) { Iterator iter = instance.getModifiers().iterator(); while (iter.hasNext()) { StatModifier modifier = iter.next(); @@ -939,18 +939,27 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc stellium = Math.max(0, Math.min(stellium + event.getAmount(), max)); } + @Override public double getMana() { return mana; } + @Override + public double getHealth() { + return getPlayer().getHealth(); + } + + @Override public double getStamina() { return stamina; } + @Override public double getStellium() { return stellium; } + public PlayerStats getStats() { return playerStats; } 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..31ac030c 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.getDouble("health", 20); + mana = config.getDouble("mana", 0); + stamina = config.getDouble("stamina", 0); + stellium = config.getDouble("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,11 @@ 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,6 +98,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)); @@ -119,6 +133,22 @@ public class SavedClassInformation { return attributeReallocationPoints; } + public double getHealth() { + return health; + } + + public double getMana() { + return mana; + } + + public double getStellium() { + return stellium; + } + + public double getStamina() { + return stamina; + } + public Set getSkillKeys() { return skillLevels.keySet(); } @@ -265,6 +295,12 @@ public class SavedClassInformation { player.setClass(profess); player.unloadClassInfo(profess); + + //These should be loaded after to make sure that the MAX_MANA, MAX_STAMINA & MAX_STELLIUM stats are already loaded. + player.setMana(mana); + player.setStellium(stellium); + player.setStamina(stamina); + player.getPlayer().setHealth(Math.min(health,player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); // Updates level on exp bar player.refreshVanillaExp(); } 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 15923c17..afa1f397 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 @@ -16,6 +16,7 @@ import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.tree.SkillTree; import org.apache.commons.lang.Validate; +import org.bukkit.attribute.Attribute; import org.jetbrains.annotations.Nullable; import java.sql.ResultSet; @@ -121,6 +122,15 @@ public class MMOCoreDataSynchronizer extends DataSynchronizer { } } + //These should be loaded after to make sure that the MAX_MANA, MAX_STAMINA & MAX_STELLIUM stats are already loaded. + data.setMana(result.getDouble("mana")); + data.setStamina(result.getDouble("stamina")); + data.setStellium(result.getDouble("stamina")); + double health = result.getDouble("health"); + health = Math.min(health, data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + data.getPlayer().setHealth(health); + + UtilityMethods.debug(MMOCore.plugin, "SQL", String.format("{ class: %s, level: %d }", data.getProfess().getId(), data.getLevel())); data.setFullyLoaded(); } 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..652714cb 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,9 +21,10 @@ public class MySQLDataProvider extends MMODataSource implements DataProvider { "skill_tree_reallocation_points", "INT(11)", "skill_tree_points", "LONGTEXT", "skill_tree_levels", "LONGTEXT", - "mana","FLOAT", - "stamina","FLOAT", - "stellium","FLOAT"}; + "health", "FLOAT", + "mana", "FLOAT", + "stamina", "FLOAT", + "stellium", "FLOAT"}; public MySQLDataProvider(FileConfiguration config) { super(MMOCore.plugin); @@ -56,6 +57,10 @@ public class MySQLDataProvider extends MMODataSource implements DataProvider { "friends LONGTEXT," + "skills LONGTEXT," + "bound_skills LONGTEXT," + + "health FLOAT," + + "mana FLOAT," + + "stamina FLOAT," + + "stellium FLOAT," + "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 1b994b11..e6f8ca30 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 @@ -44,6 +44,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { updater.addData("attribute_realloc_points", data.getAttributeReallocationPoints()); updater.addJSONArray("waypoints", data.getWaypoints()); updater.addData("skill_tree_reallocation_points", data.getSkillTreeReallocationPoints()); + updater.addData("health",data.getPlayer().getHealth()); updater.addData("mana", data.getMana()); updater.addData("stellium", data.getStellium()); updater.addData("stamina", data.getStamina()); 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 a06eb434..40926977 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 @@ -12,6 +12,7 @@ import net.Indyuce.mmocore.manager.data.PlayerDataManager; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; import org.apache.commons.lang.Validate; +import org.bukkit.attribute.Attribute; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.NotNull; @@ -120,7 +121,9 @@ public class YAMLPlayerDataManager extends PlayerDataManager { 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")); - + double health=config.contains("health") ? config.getDouble("health") : data.getStats().getStat("MAX_HEALTH"); + health=Math.min(health,data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + data.getPlayer().setHealth(health); data.setFullyLoaded(); } @@ -145,6 +148,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { data.mapSkillTreePoints().forEach((key1, value) -> config.set("skill-tree-points." + key1, value)); config.set("skill-tree-reallocation-points", data.getSkillTreeReallocationPoints()); config.set("skill", null); + config.set("health",data.getHealth()); config.set("mana", data.getMana()); config.set("stellium", data.getStellium()); config.set("stamina", data.getStamina()); 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..62f1695a 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 @@ -13,8 +13,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 +24,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",20); + mana=config.getDouble("mana",20); + stamina=config.getDouble("stamina",20); + stellium=config.getDouble("stellium",20); } - 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 +38,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() { @@ -45,6 +53,26 @@ public class DefaultPlayerData implements ClassDataContainer { return 0; } + @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 int getSkillPoints() { return skillPoints;