diff --git a/Changelog.txt b/Changelog.txt index 850c261ff..01e0e9625 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -164,6 +164,9 @@ Version 2.2.0 Added API method to grab the level cap of a skill by its PrimarySkillType ENUM definition Added API method to check if a skill was being level capped +Version 2.1.53 + Fixed a critical bug where players earned too much XP + Version 2.1.52 Updated Japanese locale (thanks snake0053) Added a toggle for the early game XP boost to experience.yml 'EarlyGameBoost.Enabled' diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 21c4ce14d..ab229d9d2 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -90,19 +90,17 @@ public class SelfListener implements Listener { if(ExperienceConfig.getInstance().isEarlyGameBoostEnabled()) { - int earlyLevelBonusXPCap = (int) (ExperienceConfig.getInstance().getEarlyGameBoostMultiplier() * Config.getInstance().getLevelCap(event.getSkill())); int earlyGameBonusXP = 0; //Give some bonus XP for low levels - if(mcMMOPlayer.getSkillLevel(primarySkillType) < earlyLevelBonusXPCap) + if(mcMMOPlayer.getSkillLevel(primarySkillType) <= mcMMO.getPlayerLevelUtils().getEarlyGameCutoff(primarySkillType)) { earlyGameBonusXP += (mcMMOPlayer.getXpToLevel(primarySkillType) * 0.05); event.setRawXpGained(event.getRawXpGained() + earlyGameBonusXP); } } - int threshold = ExperienceConfig.getInstance().getDiminishedReturnsThreshold(primarySkillType); if (threshold <= 0 || !ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index e808f7171..bef8be278 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -33,6 +33,7 @@ import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManager; import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManagerFactory; import com.gmail.nossr50.util.commands.CommandRegistrationManager; import com.gmail.nossr50.util.experience.FormulaManager; +import com.gmail.nossr50.util.player.PlayerLevelUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.gmail.nossr50.util.skills.RankUtils; @@ -88,6 +89,8 @@ public class mcMMO extends JavaPlugin { private static DatabaseManager databaseManager; private static FormulaManager formulaManager; private static MaterialMapStore materialMapStore; + private static PlayerLevelUtils playerLevelUtils; + /* File Paths */ private static String mainDirectory; private static String localesDirectory; @@ -337,6 +340,13 @@ public class mcMMO extends JavaPlugin { //Init Material Maps materialMapStore = new MaterialMapStore(); + + //Init player level values + playerLevelUtils = new PlayerLevelUtils(); + } + + public static PlayerLevelUtils getPlayerLevelUtils() { + return playerLevelUtils; } private void checkForOutdatedAPI() { diff --git a/src/main/java/com/gmail/nossr50/util/player/PlayerLevelUtils.java b/src/main/java/com/gmail/nossr50/util/player/PlayerLevelUtils.java new file mode 100644 index 000000000..ec022c424 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/player/PlayerLevelUtils.java @@ -0,0 +1,40 @@ +package com.gmail.nossr50.util.player; + +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; + +import java.util.HashMap; + +public class PlayerLevelUtils { + HashMap earlyGameBoostCutoffs; + + public PlayerLevelUtils() + { + earlyGameBoostCutoffs = new HashMap<>(); + calculateEarlyGameBoostCutoffs(); + } + + private void calculateEarlyGameBoostCutoffs() + { + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) + { + int levelCap = Config.getInstance().getLevelCap(primarySkillType); + int cap; + + if(levelCap == Integer.MAX_VALUE || levelCap <= 0) + { + cap = Config.getInstance().getIsRetroMode() ? 50 : 5; + } else { + cap = (int) (levelCap * ExperienceConfig.getInstance().getEarlyGameBoostMultiplier()); + } + + earlyGameBoostCutoffs.put(primarySkillType, cap); + } + } + + public int getEarlyGameCutoff(PrimarySkillType primarySkillType) + { + return earlyGameBoostCutoffs.get(primarySkillType); + } +}