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) {
skillTreePoints.put(treeId, points);
if (points <= 0) skillTreePoints.remove(treeId);
else skillTreePoints.put(treeId, points);
}
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) {
@ -340,7 +341,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
skillTreePoints.computeIfPresent(node.getTree().getId(), (key, points) -> {
final int withdrawn = Math.min(points, cost.get());
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());

View File

@ -125,13 +125,13 @@ public class SavedClassInformation implements ClassDataContainer {
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));
data.getNodeLevels().forEach((node, level) -> nodeLevels.put(node, 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));
attributeLevels.putAll(data.mapAttributeLevels());
skillLevels.putAll(data.mapSkillLevels());
skillTreePoints.putAll(data.mapSkillTreePoints());
nodeLevels.putAll(data.getNodeLevels());
nodeTimesClaimed.putAll(data.getNodeTimesClaimed());
boundSkills.putAll(data.mapBoundSkills());
unlockedItems.addAll(data.getUnlockedItems());
}
@Override
@ -324,10 +324,7 @@ public class SavedClassInformation implements ClassDataContainer {
player.bindSkill(slot, profess.getSkill(boundSkills.get(slot)));
skillLevels.forEach(player::setSkillLevel);
attributeLevels.forEach((id, pts) -> {
final PlayerAttributes.AttributeInstance ins = player.getAttributes().getInstance(id);
if (ins != null) ins.setBase(pts);
});
attributeLevels.forEach((id, pts) -> player.getAttributes().getInstance(id).setBase(pts));
// Careful, the global points must not be forgotten.
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.skill.ClassSkill;
import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.plugin.Plugin;
@ -82,11 +83,8 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler<PlayerDat
data.bindSkill(Integer.parseInt(key), skill);
}
for (String key : MMOCore.plugin.skillTreeManager.getAll().
stream().
map(skillTree -> skillTree.getId()).
toList()) {
data.setSkillTreePoints(key, config.getInt("skill-tree-points." + key, 0));
for (SkillTree tree : MMOCore.plugin.skillTreeManager.getAll()) {
data.setSkillTreePoints(tree.getId(), config.getInt("skill-tree-points." + tree.getId()));
}
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("last-login", data.getLastLogin());
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));
config.set("skill-tree-reallocation-points", data.getSkillTreeReallocationPoints());
config.set("skill", null);