Fixes skill tree points consumption dupe bug

This commit is contained in:
Jules 2024-08-14 11:36:10 -07:00
parent 15e759a70b
commit 84e587ba0b
3 changed files with 16 additions and 19 deletions

View File

@ -232,11 +232,12 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
} }
public void setSkillTreePoints(@NotNull String treeId, int points) { public void setSkillTreePoints(@NotNull String treeId, int points) {
skillTreePoints.put(treeId, points); if (points <= 0) skillTreePoints.remove(treeId);
else skillTreePoints.put(treeId, points);
} }
public void giveSkillTreePoints(@NotNull String id, int val) { public void giveSkillTreePoints(@NotNull String id, int val) {
skillTreePoints.merge(id, val, (points, ignored) -> points + val); skillTreePoints.merge(id, Math.max(0, val), (points, ignored) -> Math.max(0, points + val));
} }
public int countSkillTreePoints(@NotNull SkillTree skillTree) { public int countSkillTreePoints(@NotNull SkillTree skillTree) {
@ -340,7 +341,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
skillTreePoints.computeIfPresent(node.getTree().getId(), (key, points) -> { skillTreePoints.computeIfPresent(node.getTree().getId(), (key, points) -> {
final int withdrawn = Math.min(points, cost.get()); final int withdrawn = Math.min(points, cost.get());
cost.set(cost.get() - withdrawn); cost.set(cost.get() - withdrawn);
return points == withdrawn ? null : points - withdrawn; return points <= withdrawn ? null : points - withdrawn;
}); });
if (cost.get() > 0) withdrawSkillTreePoints("global", cost.get()); if (cost.get() > 0) withdrawSkillTreePoints("global", cost.get());

View File

@ -125,13 +125,13 @@ public class SavedClassInformation implements ClassDataContainer {
this.stellium = data.getStellium(); this.stellium = data.getStellium();
this.stamina = data.getStamina(); this.stamina = data.getStamina();
data.mapAttributeLevels().forEach((key, val) -> this.attributeLevels.put(key, val)); attributeLevels.putAll(data.mapAttributeLevels());
data.mapSkillLevels().forEach((key, val) -> skillLevels.put(key, val)); skillLevels.putAll(data.mapSkillLevels());
data.mapSkillTreePoints().forEach((key, val) -> skillTreePoints.put(key, val)); skillTreePoints.putAll(data.mapSkillTreePoints());
data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node, level)); nodeLevels.putAll(data.getNodeLevels());
data.getNodeTimesClaimed().forEach((key, val) -> nodeTimesClaimed.put(key, val)); nodeTimesClaimed.putAll(data.getNodeTimesClaimed());
data.mapBoundSkills().forEach((slot, skill) -> boundSkills.put(slot, skill)); boundSkills.putAll(data.mapBoundSkills());
data.getUnlockedItems().forEach(item -> unlockedItems.add(item)); unlockedItems.addAll(data.getUnlockedItems());
} }
@Override @Override
@ -324,10 +324,7 @@ public class SavedClassInformation implements ClassDataContainer {
player.bindSkill(slot, profess.getSkill(boundSkills.get(slot))); player.bindSkill(slot, profess.getSkill(boundSkills.get(slot)));
skillLevels.forEach(player::setSkillLevel); skillLevels.forEach(player::setSkillLevel);
attributeLevels.forEach((id, pts) -> { attributeLevels.forEach((id, pts) -> player.getAttributes().getInstance(id).setBase(pts));
final PlayerAttributes.AttributeInstance ins = player.getAttributes().getInstance(id);
if (ins != null) ins.setBase(pts);
});
// Careful, the global points must not be forgotten. // Careful, the global points must not be forgotten.
player.setSkillTreePoints("global", skillTreePoints.getOrDefault("global", 0)); player.setSkillTreePoints("global", skillTreePoints.getOrDefault("global", 0));

View File

@ -9,6 +9,7 @@ import net.Indyuce.mmocore.guild.provided.Guild;
import net.Indyuce.mmocore.manager.data.OfflinePlayerData; import net.Indyuce.mmocore.manager.data.OfflinePlayerData;
import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@ -82,11 +83,8 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler<PlayerDat
data.bindSkill(Integer.parseInt(key), skill); data.bindSkill(Integer.parseInt(key), skill);
} }
for (String key : MMOCore.plugin.skillTreeManager.getAll(). for (SkillTree tree : MMOCore.plugin.skillTreeManager.getAll()) {
stream(). data.setSkillTreePoints(tree.getId(), config.getInt("skill-tree-points." + tree.getId()));
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)); data.setSkillTreePoints("global", config.getInt("skill-tree-points.global", 0));
@ -145,6 +143,7 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler<PlayerDat
config.set("friends", data.getFriends().stream().map(UUID::toString).collect(Collectors.toList())); config.set("friends", data.getFriends().stream().map(UUID::toString).collect(Collectors.toList()));
config.set("last-login", data.getLastLogin()); config.set("last-login", data.getLastLogin());
config.set("guild", data.hasGuild() ? data.getGuild().getId() : null); config.set("guild", data.hasGuild() ? data.getGuild().getId() : null);
config.set("skill-tree-points", null); // Fixes skill tree points leftovers
data.mapSkillTreePoints().forEach((key1, value) -> config.set("skill-tree-points." + key1, value)); data.mapSkillTreePoints().forEach((key1, value) -> config.set("skill-tree-points." + key1, value));
config.set("skill-tree-reallocation-points", data.getSkillTreeReallocationPoints()); config.set("skill-tree-reallocation-points", data.getSkillTreeReallocationPoints());
config.set("skill", null); config.set("skill", null);