浏览代码

No more Standard or Retro, use cosmetic scale modifier setting instead

nossr50 5 年之前
父节点
当前提交
aaffafb88b
共有 35 个文件被更改,包括 75 次插入443 次删除
  1. 0 13
      mcmmo-core/src/main/java/com/gmail/nossr50/config/ConfigManager.java
  2. 0 33
      mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/MaxBonusLevelSerializer.java
  3. 4 10
      mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/SkillRankPropertySerializer.java
  4. 2 4
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ConfigMaxLevel.java
  5. 3 19
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/dodge/ConfigDodge.java
  6. 3 22
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/roll/ConfigRoll.java
  7. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryArrowRetrieval.java
  8. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryDaze.java
  9. 3 8
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/axes/ConfigAxesCriticalStrikes.java
  10. 0 6
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismDoubleDrops.java
  11. 0 6
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismGreenThumb.java
  12. 0 6
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismHylianLuck.java
  13. 0 5
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismShroomThumb.java
  14. 0 5
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/mining/ConfigMiningDoubleDrops.java
  15. 30 58
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ranks/SkillRankProperty.java
  16. 2 14
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/ConfigRepairSuperRepair.java
  17. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/repairmastery/ConfigRepairRepairMastery.java
  18. 1 6
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmelting.java
  19. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSecondSmelt.java
  20. 0 5
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSubSkills.java
  21. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwords.java
  22. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsCounterAttack.java
  23. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsRupture.java
  24. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsSubSkills.java
  25. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/taming/ConfigTamingGore.java
  26. 0 9
      mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/woodcutting/ConfigWoodcuttingHarvest.java
  27. 5 10
      mcmmo-core/src/main/java/com/gmail/nossr50/core/SkillPropertiesManager.java
  28. 0 35
      mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractMaxBonusLevel.java
  29. 0 19
      mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractScalingProperty.java
  30. 0 17
      mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/MaxBonusLevel.java
  31. 0 10
      mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/ScalingProperty.java
  32. 1 1
      mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java
  33. 6 13
      mcmmo-core/src/main/java/com/gmail/nossr50/mcMMO.java
  34. 14 27
      mcmmo-core/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java
  35. 1 1
      mcmmo-core/src/main/java/com/gmail/nossr50/util/skills/RankTools.java

+ 0 - 13
mcmmo-core/src/main/java/com/gmail/nossr50/config/ConfigManager.java

@@ -51,7 +51,6 @@ import com.gmail.nossr50.datatypes.experience.FormulaType;
 import com.gmail.nossr50.datatypes.party.PartyFeature;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.properties.DamageProperty;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType;
 import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon;
 import com.gmail.nossr50.mcMMO;
@@ -266,7 +265,6 @@ public final class ConfigManager {
         customSerializers.registerType(TypeToken.of(CustomXPPerk.class), new CustomXPPerkSerializer());
         customSerializers.registerType(TypeToken.of(DamageProperty.class), new DamagePropertySerializer());
         customSerializers.registerType(TypeToken.of(SkillRankProperty.class), new SkillRankPropertySerializer());
-        customSerializers.registerType(TypeToken.of(MaxBonusLevel.class), new MaxBonusLevelSerializer());
         customSerializers.registerType(TypeToken.of(PlayerNotificationSettings.class), new PlayerNotificationSerializer());
         customSerializers.registerType(TypeToken.of(SoundSetting.class), new SoundSettingSerializer());
 //        customSerializers.registerType(TypeToken.of(ItemWildcards.class), new ItemWildcardSerializer());
@@ -483,17 +481,6 @@ public final class ConfigManager {
         return configRanks.getRootNode();
     }
 
-    /**
-     * Checks if this plugin is using retro mode
-     * Retro mode is a 0-1000 skill system
-     * Standard mode is scaled for 1-100
-     *
-     * @return true if retro mode is enabled
-     */
-    public boolean isRetroMode() {
-        return getConfigLeveling().getConfigSectionLevelingGeneral().getConfigSectionLevelScaling().isRetroModeEnabled();
-    }
-
     public ConfigExperience getConfigExperience() {
         return configExperience.getConfig();
     }

+ 0 - 33
mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/MaxBonusLevelSerializer.java

@@ -1,33 +0,0 @@
-package com.gmail.nossr50.config.serializers;
-
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
-import com.google.common.reflect.TypeToken;
-import ninja.leaping.configurate.ConfigurationNode;
-import ninja.leaping.configurate.objectmapping.ObjectMappingException;
-import ninja.leaping.configurate.objectmapping.serialize.TypeSerializer;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
-
-public class MaxBonusLevelSerializer implements TypeSerializer<MaxBonusLevel> {
-
-    public static final String STANDARD_NODE = "Standard-Max-Bonus-Level";
-    public static final String RETRO_NODE = "Retro-Max-Bonus-Level";
-
-    @Nullable
-    @Override
-    public MaxBonusLevel deserialize(@NonNull TypeToken<?> type, @NonNull ConfigurationNode value) throws ObjectMappingException {
-        int standard = value.getNode(STANDARD_NODE).getValue(TypeToken.of(Integer.class));
-        int retro = value.getNode(RETRO_NODE).getValue(TypeToken.of(Integer.class));
-
-        AbstractMaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(standard, retro);
-        return maxBonusLevel;
-    }
-
-    @Override
-    public void serialize(@NonNull TypeToken<?> type, @Nullable MaxBonusLevel obj, @NonNull ConfigurationNode value) throws ObjectMappingException {
-        value.getNode(STANDARD_NODE).setValue(obj.getStandardScaleValue());
-        value.getNode(RETRO_NODE).setValue(obj.getRetroScaleValue());
-    }
-
-}

+ 4 - 10
mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/SkillRankPropertySerializer.java

@@ -13,21 +13,17 @@ import java.util.Map;
 
 public class SkillRankPropertySerializer implements TypeSerializer<SkillRankProperty> {
 
-    private static final String STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS = "Standard-Rank-Unlock-Level-Requirements";
-    private static final String RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS = "Retro-Rank-Unlock-Level-Requirements";
+    private static final String RANK_UNLOCK_LEVEL_REQUIREMENTS = "Standard-Rank-Unlock-Level-Requirements";
 
     @Nullable
     @Override
     public SkillRankProperty deserialize(@NonNull TypeToken<?> type, @NonNull ConfigurationNode value) throws ObjectMappingException {
         HashMap<Integer, Integer> standardHashMap;
-        HashMap<Integer, Integer> retroHashMap;
 
         try {
-            Map<? extends Integer, ? extends Integer> standardMap = value.getNode(STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken<Map<? extends Integer, ? extends Integer>>() {});
-            Map<? extends Integer, ? extends Integer> retroMap = value.getNode(RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken<Map<? extends Integer, ? extends Integer>>() {});
+            Map<? extends Integer, ? extends Integer> standardMap = value.getNode(RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken<Map<? extends Integer, ? extends Integer>>() {});
 
             standardHashMap = new HashMap<>(standardMap);
-            retroHashMap = new HashMap<>(retroMap);
 
         } catch (ObjectMappingException e) {
             System.out.println("[mcMMO Deserializer Debug] Unable to deserialize rank property information from the config, make sure the ranks are correctly set in the config. You can delete the rank config to generate a new one if problems persist.");
@@ -35,15 +31,13 @@ public class SkillRankPropertySerializer implements TypeSerializer<SkillRankProp
         }
 
         SkillRankProperty skillRankProperty = new SkillRankProperty();
-        skillRankProperty.setStandardRanks(standardHashMap);
-        skillRankProperty.setRetroRanks(retroHashMap);
+        skillRankProperty.setRanks(standardHashMap);
 
         return skillRankProperty;
     }
 
     @Override
     public void serialize(@NonNull TypeToken<?> type, @Nullable SkillRankProperty obj, @NonNull ConfigurationNode value) throws ObjectMappingException {
-        value.getNode(STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getStandardRanks());
-        value.getNode(RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getRetroRanks());
+        value.getNode(RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getRanks());
     }
 }

+ 2 - 4
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ConfigMaxLevel.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -11,9 +9,9 @@ public class ConfigMaxLevel {
     @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." +
             "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " +
             "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.")
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
+    private int maxBonusLevel = 1000;
 
-    public MaxBonusLevel getMaxBonusLevel() {
+    public int getMaxBonusLevel() {
         return maxBonusLevel;
     }
 }

+ 3 - 19
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/dodge/ConfigDodge.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.acrobatics.dodge;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -22,25 +20,11 @@ public class ConfigDodge {
             "\nDefault value: " + DAMAGE_REDUCTION_DIVISOR_DEFAULT)
     private double damageReductionDivisor = DAMAGE_REDUCTION_DIVISOR_DEFAULT;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." +
-            "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " +
-            "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.")
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
-    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "The maximum success chance for this Sub-Skill." +
-            "\nA value of 100.0 would be equivalent to 100% chance of success." +
-            "\nPlayers only have Max-Success-Chance when their skill level has reached the maximum bonus level." +
-            "\nMax skill chance is dynamically adjusted based on the players level difference from the \"Max-Bonus-Level\", you can think of it as a curve where reaching \"Max-Bonus-Level\" is the peak." +
-            "\nAs an example, imagine \""+ConfigConstants.MAX_CHANCE_FIELD_NAME+"\" was set to " + FIFTY_PERCENT_EXAMPLE + " and the \""+ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME+"\" was " + MAX_BONUS_LEVEL_EXAMPLE + "," +
-            "\n and the player was level " + FIFTY_PERCENT_EXAMPLE + " for this skill, that would give the player " + ODDS_PERCENTAGE_EXAMPLE + " odds to succeed with this skill.")
-    private double chanceAtMaxSkill = CHANCE_AT_MAX_SKILL_DEFAULT;
-
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
+    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
+    private double maxChance = 100.0;
 
     public double getChanceAtMaxSkill() {
-        return chanceAtMaxSkill;
+        return maxChance;
     }
 
     public double getDamageReductionDivisor() {

+ 3 - 22
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/roll/ConfigRoll.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.acrobatics.roll;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -10,9 +8,6 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 public class ConfigRoll {
 
     public static final double ROLL_DAMAGE_THRESHOLD_DEFAULT = 7.0D;
-    public static final String FIFTY_PERCENT_EXAMPLE = "50";
-    public static final String MAX_BONUS_LEVEL_EXAMPLE = "100";
-    public static final String ODDS_PERCENTAGE_EXAMPLE = "25%";
     public static final double CHANCE_AT_MAX_SKILL_DEFAULT = 100.0D;
 
     @Setting(value = "Damage-Threshold", comment = "Rolling will reduce up to this much damage." +
@@ -24,24 +19,10 @@ public class ConfigRoll {
         return damageTheshold;
     }
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." +
-            "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " +
-            "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.")
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
-    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "The maximum success chance for this Sub-Skill." +
-            "\nA value of 100.0 would be equivalent to 100% chance of success." +
-            "\nPlayers only have Max-Success-Chance when their skill level has reached the maximum bonus level." +
-            "\nMax skill chance is dynamically adjusted based on the players level difference from the \"Max-Bonus-Level\", you can think of it as a curve where reaching \"Max-Bonus-Level\" is the peak." +
-            "\nAs an example, imagine \""+ConfigConstants.MAX_CHANCE_FIELD_NAME+"\" was set to " + FIFTY_PERCENT_EXAMPLE + " and the \""+ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME+"\" was " + MAX_BONUS_LEVEL_EXAMPLE + "," +
-            "\n and the player was level " + FIFTY_PERCENT_EXAMPLE + " for this skill, that would give the player " + ODDS_PERCENTAGE_EXAMPLE + " odds to succeed with this skill.")
-    private double chanceAtMaxSkill = CHANCE_AT_MAX_SKILL_DEFAULT;
-
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
+    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
+    private double maxChance = 100.0D;
 
     public double getChanceAtMaxSkill() {
-        return chanceAtMaxSkill;
+        return maxChance;
     }
 }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryArrowRetrieval.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.archery;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -12,14 +10,7 @@ public class ConfigArcheryArrowRetrieval {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 100.0D;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     public double getMaxChance() {
         return maxChance;
     }
-
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
 }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryDaze.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.archery;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -15,9 +13,6 @@ public class ConfigArcheryDaze {
         + "\nDefault value: "+DAZE_MAX_CHANCE_DEFAULT)
     private double maxChance = DAZE_MAX_CHANCE_DEFAULT;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     @Setting(value = "Bonus-Damage", comment = "How much bonus damage is applied when daze is applied to a target." +
             "\nDefault value: "+DAZE_BONUS_DMG_DEFAULT)
     private double bonusDamage = DAZE_BONUS_DMG_DEFAULT;
@@ -26,10 +21,6 @@ public class ConfigArcheryDaze {
         return maxChance;
     }
 
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
-
     public double getDazeBonusDamage() {
         return bonusDamage;
     }

+ 3 - 8
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/axes/ConfigAxesCriticalStrikes.java

@@ -2,7 +2,6 @@ package com.gmail.nossr50.config.skills.axes;
 
 import com.gmail.nossr50.config.ConfigConstants;
 import com.gmail.nossr50.datatypes.skills.properties.AbstractDamageProperty;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
 import com.gmail.nossr50.datatypes.skills.properties.DamageProperty;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@@ -12,18 +11,14 @@ public class ConfigAxesCriticalStrikes {
 
     private static final double MAX_ACTIVATION_CHANCE_DEFAULT = 37.50D;
 
-    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "This is max percentage chance that is used to determine whether or not the ability is successful." +
-            "\nA value of 50.0 would mean at most the ability can only have a 50% chance to work at max skill level.")
-    private double maxActivationChance = MAX_ACTIVATION_CHANCE_DEFAULT;
-
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION)
-    private AbstractMaxBonusLevel maximumProgressionLevel = new AbstractMaxBonusLevel(100);
+    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
+    private double maxChance = MAX_ACTIVATION_CHANCE_DEFAULT;
 
     @Setting(value = "Damage-Modifiers", comment = "Damage dealt is multiplied by these values when this skill is successfully activated.")
     private DamageProperty damageProperty = new AbstractDamageProperty(1.5, 2.0);
 
     public double getMaxActivationChance() {
-        return maxActivationChance;
+        return maxChance;
     }
 
     public DamageProperty getDamageProperty() {

+ 0 - 6
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismDoubleDrops.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.herbalism;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -11,8 +9,4 @@ public class ConfigHerbalismDoubleDrops {
 
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 100.0;
-
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
 }

+ 0 - 6
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismGreenThumb.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.herbalism;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -11,8 +9,4 @@ public class ConfigHerbalismGreenThumb {
 
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 100.0;
-
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
 }

+ 0 - 6
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismHylianLuck.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.herbalism;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -11,8 +9,4 @@ public class ConfigHerbalismHylianLuck {
 
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 10.0;
-
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
 }

+ 0 - 5
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismShroomThumb.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.herbalism;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -12,7 +10,4 @@ public class ConfigHerbalismShroomThumb {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 50.0;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
 }

+ 0 - 5
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/mining/ConfigMiningDoubleDrops.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.mining;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -11,9 +9,6 @@ public class ConfigMiningDoubleDrops {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 100.0;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     @Setting(value = "Silk-Touch-Double-Drops", comment = "Allow silk touch to benefit from double drops.")
     private boolean allowSilkTouchDoubleDrops = true;
 

+ 30 - 58
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ranks/SkillRankProperty.java

@@ -2,13 +2,14 @@ package com.gmail.nossr50.config.skills.ranks;
 
 import com.gmail.nossr50.api.exceptions.MissingSkillPropertyDefinition;
 import com.gmail.nossr50.datatypes.skills.properties.SkillProperty;
+import com.gmail.nossr50.mcMMO;
+import org.apache.logging.log4j.Level;
 
 import java.util.HashMap;
 
 public class SkillRankProperty implements SkillProperty {
 
-    private HashMap<Integer, Integer> standardRanks;
-    private HashMap<Integer, Integer> retroRanks;
+    private HashMap<Integer, Integer> ranks;
 
     public SkillRankProperty(Integer... rankDefinitions) {
         initRankMaps();
@@ -16,88 +17,59 @@ public class SkillRankProperty implements SkillProperty {
         for(int x = 0; x < rankDefinitions.length; x++) {
             int curRank = x+1;
 
-            addStandardAndRetroRank(curRank, rankDefinitions[x]);
+            addRank(curRank, rankDefinitions[x]);
         }
     }
 
-    public SkillRankProperty(HashMap<Integer, Integer> standardRanks, HashMap<Integer, Integer> retroRanks) {
-        this.standardRanks = standardRanks;
-        this.retroRanks = retroRanks;
+    public SkillRankProperty(HashMap<Integer, Integer> ranks) {
+        this.ranks = ranks;
     }
 
     /**
-     * Convenience method to add Standard and Retro at the same time for default initialization of values
-     * Only requires standard values be passed
+     * Fill in the rank map and mutate it by the cosmetic modifier
      * @param curRank the rank to fill in the value for
-     * @param standardValue the value of the rank in Standard
+     * @param rankValue the value of the rank in Standard
      */
-    private void addStandardAndRetroRank(int curRank, int standardValue) {
-        //Retro will be equal to standards rank requirement multiplied by 10 unless that value is 1, in which case it will also be 1
-        int retroValue = standardValue == 1 ? 1 : standardValue * 10;
-
+    private void addRank(int curRank, int rankValue) {
         //Avoid negative numbers
-        if(standardValue < 0) {
-            standardRanks.put(curRank, 0);
-            retroRanks.put(curRank, 0);
-        } else {
-            standardRanks.put(curRank, standardValue);
-            retroRanks.put(curRank, retroValue);
-        }
-    }
+        rankValue = Math.max(0, rankValue);
 
-    /**
-     * Convenience method to add Standard and Retro at the same time
-     * @param curRank the rank to fill in the value for
-     * @param standardValue the value of the rank in Standard
-     * @param retroValue the value of the rank in Retro
-     */
-    private void addStandardAndRetroRank(int curRank, int standardValue, int retroValue) {
-        //Avoid negative numbers
-        standardValue = Math.max(0, standardValue);
-        retroValue = Math.max(0, retroValue);
-
-        standardRanks.put(curRank, standardValue);
-        retroRanks.put(curRank, retroValue);
+        ranks.put(curRank, rankValue);
     }
 
     private void initRankMaps() {
-        standardRanks = new HashMap<>();
-        retroRanks = new HashMap<>();
+        ranks = new HashMap<>();
     }
 
     /**
      * Gets the unlock level for this skill as defined by this SkillRankProperty
-     * @param retroMode whether or not mcMMO is using RetroMode, true for if it is
      * @param targetRank the rank to get the unlock level for
      * @return the unlock level for target rank
      */
-    public int getUnlockLevel(boolean retroMode, int targetRank) throws MissingSkillPropertyDefinition {
-        if(retroMode) {
-            if(retroRanks.get(targetRank) == null) {
-                throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Retro scaling");
-            }
-            return retroRanks.get(targetRank);
-        } else {
-            if(standardRanks.get(targetRank) == null) {
-                throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Standard scaling");
-            }
-            return standardRanks.get(targetRank);
+    public int getUnlockLevel(mcMMO pluginRef, int targetRank) throws MissingSkillPropertyDefinition {
+        if(ranks.get(targetRank) == null) {
+            throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Standard scaling");
         }
-    }
 
-    public void setStandardRanks(HashMap<Integer, Integer> standardRanks) {
-        this.standardRanks = standardRanks;
-    }
+        //Avoid zero or lower
+        int cosmeticModifier = Math.max(1, pluginRef.getPlayerLevelingSettings().getCosmeticLevelScaleModifier());
 
-    public void setRetroRanks(HashMap<Integer, Integer> retroRanks) {
-        this.retroRanks = retroRanks;
+        if(cosmeticModifier == 1)
+            return ranks.get(targetRank);
+
+        //Mutate rank
+        int rankValue = ranks.get(targetRank);
+        rankValue = rankValue / cosmeticModifier;
+
+        return rankValue;
     }
 
-    public HashMap<Integer, Integer> getStandardRanks() {
-        return standardRanks;
+    public void setRanks(HashMap<Integer, Integer> ranks) {
+        this.ranks = ranks;
     }
 
-    public HashMap<Integer, Integer> getRetroRanks() {
-        return retroRanks;
+    public HashMap<Integer, Integer> getRanks() {
+        return ranks;
     }
+
 }

+ 2 - 14
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/ConfigRepairSuperRepair.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.repair;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -14,17 +12,7 @@ public class ConfigRepairSuperRepair {
     private static final String ODDS_PERCENTAGE_EXAMPLE = "25%";
     private static final double CHANCE_AT_MAX_SKILL_DEFAULT = 100.0D;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." +
-            "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " +
-            "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.")
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
-    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "The maximum success chance for this Sub-Skill." +
-            "\nA value of 100.0 would be equivalent to 100% chance of success." +
-            "\nPlayers only have Max-Success-Chance when their skill level has reached the maximum bonus level." +
-            "\nMax skill chance is dynamically adjusted based on the players level difference from the \"Max-Bonus-Level\", you can think of it as a curve where reaching \"Max-Bonus-Level\" is the peak." +
-            "\nAs an example, imagine \""+ConfigConstants.MAX_CHANCE_FIELD_NAME+"\" was set to " + FIFTY_PERCENT_EXAMPLE + " and the \""+ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME+"\" was " + MAX_BONUS_LEVEL_EXAMPLE + "," +
-            "\n and the player was level " + FIFTY_PERCENT_EXAMPLE + " for this skill, that would give the player " + ODDS_PERCENTAGE_EXAMPLE + " odds to succeed with this skill.")
-    private double chanceAtMaxSkill = CHANCE_AT_MAX_SKILL_DEFAULT;
+    @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
+    private double maxChance = 100.0;
 
 }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/repairmastery/ConfigRepairRepairMastery.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.repair.repairmastery;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -12,14 +10,7 @@ public class ConfigRepairRepairMastery {
     @Setting(value = ConfigConstants.MAX_BONUS_PERCENTAGE_FIELD_NAME)
     private double maxBonusPercentage = 200.0D;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     public double getMaxBonusPercentage() {
         return maxBonusPercentage;
     }
-
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
 }

+ 1 - 6
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmelting.java

@@ -1,7 +1,6 @@
 package com.gmail.nossr50.config.skills.smelting;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -13,7 +12,7 @@ public class ConfigSmelting {
     @Setting(value = ConfigConstants.SUB_SKILL_NODE)
     private ConfigSmeltingSubSkills subskills = new ConfigSmeltingSubSkills();
 
-    public ConfigSmeltingSubSkills getSubskills() {
+    public ConfigSmeltingSubSkills getSubSkills() {
         return subskills;
     }
 
@@ -26,10 +25,6 @@ public class ConfigSmelting {
         return subskills.getMaxChance();
     }
 
-    public MaxBonusLevel getMaxBonusLevel() {
-        return subskills.getMaxBonusLevel();
-    }
-
     public HashMap<Integer, Integer> getXpMultiplierTable() {
         return subskills.getXpMultiplierTable();
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSecondSmelt.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.smelting;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -28,17 +26,10 @@ public class ConfigSmeltingSecondSmelt {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 50.0;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     public double getMaxChance() {
         return maxChance;
     }
 
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
-
     @Setting(value = "XP-Multiplier-Per-Rank")
     private HashMap<Integer, Integer> xpMultiplierTable = XP_MULT_MAP_DEFAULT;
 

+ 0 - 5
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSubSkills.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.config.skills.smelting;
 
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -20,10 +19,6 @@ public class ConfigSmeltingSubSkills {
         return smeltingSecondSmelt.getMaxChance();
     }
 
-    public MaxBonusLevel getMaxBonusLevel() {
-        return smeltingSecondSmelt.getMaxBonusLevel();
-    }
-
     public HashMap<Integer, Integer> getXpMultiplierTable() {
         return smeltingSecondSmelt.getXpMultiplierTable();
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwords.java

@@ -1,7 +1,6 @@
 package com.gmail.nossr50.config.skills.swords;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -31,10 +30,6 @@ public class ConfigSwords {
         return subSkills.getCounterAttackMaxChance();
     }
 
-    public MaxBonusLevel getCounterAttackMaxBonusLevel() {
-        return subSkills.getCounterAttackMaxBonusLevel();
-    }
-
     public double getCounterAttackDamageModifier() {
         return subSkills.getCounterAttackDamageModifier();
     }
@@ -47,10 +42,6 @@ public class ConfigSwords {
         return subSkills.getRuptureMaxChance();
     }
 
-    public MaxBonusLevel getRuptureMaxBonusLevel() {
-        return subSkills.getRuptureMaxBonusLevel();
-    }
-
     public double getRuptureDamagePlayer() {
         return subSkills.getRuptureDamagePlayer();
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsCounterAttack.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.swords;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -14,9 +12,6 @@ public class ConfigSwordsCounterAttack {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = 30.0;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     @Setting(value = "Damage-Modifier", comment = "The damage returned from Counter-Attack will be equal to the damage dealt divided by this number." +
             "\nDefault value: "+DAMAGE_MODIFIER_DEFAULT)
     private double damageModifier = DAMAGE_MODIFIER_DEFAULT;
@@ -25,10 +20,6 @@ public class ConfigSwordsCounterAttack {
         return maxChance;
     }
 
-    public MaxBonusLevel getCounterAttackMaxBonusLevel() {
-        return maxBonusLevel;
-    }
-
     public double getCounterAttackDamageModifier() {
         return damageModifier;
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsRupture.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.swords;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -17,9 +15,6 @@ public class ConfigSwordsRupture {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = MAX_CHANCE_DEFAULT;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     @Setting(value = "Damage-Per-Tick-PVP")
     private double damagePlayer = DAMAGE_PVP_DEFAULT;
 
@@ -35,10 +30,6 @@ public class ConfigSwordsRupture {
         return maxChance;
     }
 
-    public MaxBonusLevel getRuptureMaxBonusLevel() {
-        return maxBonusLevel;
-    }
-
     public double getRuptureDamagePlayer() {
         return damagePlayer;
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsSubSkills.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.config.skills.swords;
 
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -35,10 +34,6 @@ public class ConfigSwordsSubSkills {
         return counterAttack.getCounterAttackMaxChance();
     }
 
-    public MaxBonusLevel getCounterAttackMaxBonusLevel() {
-        return counterAttack.getCounterAttackMaxBonusLevel();
-    }
-
     public double getCounterAttackDamageModifier() {
         return counterAttack.getCounterAttackDamageModifier();
     }
@@ -51,10 +46,6 @@ public class ConfigSwordsSubSkills {
         return rupture.getRuptureMaxChance();
     }
 
-    public MaxBonusLevel getRuptureMaxBonusLevel() {
-        return rupture.getRuptureMaxBonusLevel();
-    }
-
     public double getRuptureDamagePlayer() {
         return rupture.getRuptureDamagePlayer();
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/taming/ConfigTamingGore.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.taming;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -15,9 +13,6 @@ public class ConfigTamingGore {
     @Setting(value = "Gore-Bleed-Tick-Length", comment = "How many times to apply the bleed DOT from gore before it wears off.")
     private int goreBleedTicks = 2;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     @Setting(value = "Gore-Damage-Modifier")
     private double goreMofifier = 2.0;
 
@@ -25,10 +20,6 @@ public class ConfigTamingGore {
         return maxChance;
     }
 
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
-
     public double getGoreMofifier() {
         return goreMofifier;
     }

+ 0 - 9
mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/woodcutting/ConfigWoodcuttingHarvest.java

@@ -1,8 +1,6 @@
 package com.gmail.nossr50.config.skills.woodcutting;
 
 import com.gmail.nossr50.config.ConfigConstants;
-import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import ninja.leaping.configurate.objectmapping.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
@@ -14,15 +12,8 @@ public class ConfigWoodcuttingHarvest {
     @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
     private double maxChance = MAX_CHANCE_DEFAULT;
 
-    @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
-    private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
-
     public double getMaxChance() {
         return maxChance;
     }
 
-    public MaxBonusLevel getMaxBonusLevel() {
-        return maxBonusLevel;
-    }
-
 }

+ 5 - 10
mcmmo-core/src/main/java/com/gmail/nossr50/core/SkillPropertiesManager.java

@@ -3,7 +3,6 @@ package com.gmail.nossr50.core;
 import com.gmail.nossr50.config.ConfigConstants;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
-import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.random.InvalidStaticChance;
 import com.google.common.reflect.TypeToken;
@@ -31,8 +30,8 @@ public class SkillPropertiesManager {
         staticActivationChanceMap = new HashMap<>();
     }
 
-    public void registerMaxBonusLevel(SubSkillType subSkillType, MaxBonusLevel maxBonusLevel) {
-        maxBonusLevelMap.put(subSkillType, pluginRef.isRetroModeEnabled() ? maxBonusLevel.getRetroScaleValue() : maxBonusLevel.getStandardScaleValue());
+    public void registerMaxBonusLevel(SubSkillType subSkillType, int maxBonusLevel) {
+        maxBonusLevelMap.put(subSkillType, maxBonusLevel);
     }
 
     public void registerMaxBonus(SubSkillType subSkillType, double maxBonus) {
@@ -133,13 +132,9 @@ public class SkillPropertiesManager {
     }
 
     private void attemptRegisterMaxBonusLevel(SubSkillType subSkillType, CommentedConfigurationNode childNode) {
-        try {
-            pluginRef.getLogger().info("Registering MaxBonusLevel for "+subSkillType.toString());
-            MaxBonusLevel maxBonusLevel = childNode.getValue(TypeToken.of(MaxBonusLevel.class));
-            registerMaxBonusLevel(subSkillType, maxBonusLevel);
-        } catch (ObjectMappingException e) {
-            //This time a silent exception is fine
-        }
+        pluginRef.getLogger().info("Registering MaxBonusLevel for "+subSkillType.toString());
+        int maxBonusLevel = childNode.getInt();
+        registerMaxBonusLevel(subSkillType, maxBonusLevel);
     }
 
     private void attemptRegisterMaxChance(SubSkillType subSkillType, CommentedConfigurationNode childNode) {

+ 0 - 35
mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractMaxBonusLevel.java

@@ -1,35 +0,0 @@
-package com.gmail.nossr50.datatypes.skills.properties;
-
-public class AbstractMaxBonusLevel implements MaxBonusLevel {
-
-    private int retro;
-    private int standard;
-
-    public AbstractMaxBonusLevel(int standard, int retro) {
-        this.standard = standard;
-        this.retro = retro;
-    }
-
-    public AbstractMaxBonusLevel(int standard) {
-        this.standard = standard;
-        this.retro = standard * 10;
-    }
-
-    @Override
-    public int getRetroScaleValue() {
-        return retro;
-    }
-
-    @Override
-    public int getStandardScaleValue() {
-        return standard;
-    }
-
-    public void setRetro(int retro) {
-        this.retro = retro;
-    }
-
-    public void setStandard(int standard) {
-        this.standard = standard;
-    }
-}

+ 0 - 19
mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractScalingProperty.java

@@ -1,19 +0,0 @@
-package com.gmail.nossr50.datatypes.skills.properties;
-
-import com.gmail.nossr50.datatypes.skills.SubSkillType;
-
-public abstract class AbstractScalingProperty implements ScalingProperty {
-    public SubSkillType subSkillType;
-
-    public AbstractScalingProperty(SubSkillType subSkillType) {
-        super();
-        this.subSkillType = subSkillType;
-    }
-
-    @Override
-    public String toString() {
-        return "AbstractScalingProperty{" +
-                "subSkillType=" + subSkillType +
-                '}';
-    }
-}

+ 0 - 17
mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/MaxBonusLevel.java

@@ -1,17 +0,0 @@
-package com.gmail.nossr50.datatypes.skills.properties;
-
-public interface MaxBonusLevel {
-
-    /**
-     * Get the max level for this skill for Retro scaling
-     * @return Retro Mode max bonus level
-     */
-    int getRetroScaleValue();
-
-    /**
-     * Get the max level for this skill for Standard scaling
-     * @return Standard Mode max bonus level
-     */
-    int getStandardScaleValue();
-
-}

+ 0 - 10
mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/ScalingProperty.java

@@ -1,10 +0,0 @@
-package com.gmail.nossr50.datatypes.skills.properties;
-
-public interface ScalingProperty extends SkillProperty {
-    /**
-     * Returns the appropriate value for this scaling property whether it is Standard or Retro
-     *
-     * @return the value used in scaling calculations for this ScalingProperty
-     */
-    double getValue();
-}

+ 1 - 1
mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java

@@ -372,7 +372,7 @@ public class Roll extends AcrobaticsSubSkill {
 
         //Chance to roll at half max skill
         RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(pluginRef, null, subSkillType);
-        int halfMaxSkillValue = pluginRef.isRetroModeEnabled() ? 500 : 50;
+        int halfMaxSkillValue = (int) pluginRef.getDynamicSettingsManager().getSkillMaxBonusLevel(subSkillType) / 2;
         rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue);
 
         //Chance to graceful roll at full skill

+ 6 - 13
mcmmo-core/src/main/java/com/gmail/nossr50/mcMMO.java

@@ -236,10 +236,14 @@ public class mcMMO extends JavaPlugin {
                 metrics = new Metrics(this);
                 metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion()));
 
-                if (!configManager.getConfigLeveling().getConfigSectionLevelingGeneral().getConfigSectionLevelScaling().isRetroModeEnabled())
+                int levelScaleModifier = configManager.getConfigLeveling().getConfigSectionLevelingGeneral().getConfigSectionLevelScaling().getCosmeticLevelScaleModifier();
+
+                if (levelScaleModifier == 10)
                     metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard"));
-                else
+                else if (levelScaleModifier == 1)
                     metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro"));
+                else
+                    metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Custom"));
             }
         } catch (Throwable t) {
             getLogger().severe("There was an error while enabling mcMMO!");
@@ -510,17 +514,6 @@ public class mcMMO extends JavaPlugin {
         return healthBarPluginEnabled;
     }
 
-    /**
-     * Checks if this plugin is using retro mode
-     * Retro mode is a 0-1000 skill system
-     * Standard mode is scaled for 1-100
-     *
-     * @return true if retro mode is enabled
-     */
-    public boolean isRetroModeEnabled() {
-        return configManager.isRetroMode();
-    }
-
     public ConfigManager getConfigManager() {
         return configManager;
     }

+ 14 - 27
mcmmo-core/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java

@@ -9,10 +9,10 @@ import java.util.Map;
 
 public class FormulaManager {
     // Experience needed to reach a level, cached values for speed
-    private Map<Integer, Integer> experienceNeededRetroLinear;
-    private Map<Integer, Integer> experienceNeededStandardLinear;
-    private Map<Integer, Integer> experienceNeededRetroExponential;
-    private Map<Integer, Integer> experienceNeededStandardExponential;
+    private Map<Integer, Integer> experienceNeededCosmeticLinear;
+    private Map<Integer, Integer> experienceNeededLinear;
+    private Map<Integer, Integer> experienceNeededCosmeticExponential;
+    private Map<Integer, Integer> experienceNeededExponential;
 
     private FormulaType currentFormula;
     private final mcMMO pluginRef;
@@ -27,10 +27,10 @@ public class FormulaManager {
      * Initialize maps used for XP to next level
      */
     private void initExperienceNeededMaps() {
-        experienceNeededRetroLinear = new HashMap<>();
-        experienceNeededRetroExponential = new HashMap<>();
-        experienceNeededStandardLinear = new HashMap<>();
-        experienceNeededStandardExponential = new HashMap<>();
+        experienceNeededCosmeticLinear = new HashMap<>();
+        experienceNeededCosmeticExponential = new HashMap<>();
+        experienceNeededLinear = new HashMap<>();
+        experienceNeededExponential = new HashMap<>();
     }
 
     /**
@@ -120,34 +120,21 @@ public class FormulaManager {
         return processXPToNextLevel(level, currentFormula);
     }
 
-    /**
-     * Gets the value of XP needed for the next level based on the level Scaling, the level, and the formula type
-     * @param level target level
-     * @param formulaType target formulaType
-     */
-    private int processXPToNextLevel(int level, FormulaType formulaType) {
-        if(pluginRef.isRetroModeEnabled())
-        {
-            return processXPRetroToNextLevel(level, formulaType);
-        } else {
-            return processStandardXPToNextLevel(level, formulaType);
-        }
-    }
-
     /**
      * Calculate the XP needed for the next level for the linear formula for Standard scaling (1-100)
      * @param level target level
      * @return raw xp needed to reach the next level
      */
-    private int processStandardXPToNextLevel(int level, FormulaType formulaType) {
-        Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededStandardLinear : experienceNeededStandardExponential;
+    private int processXPToNextLevel(int level, FormulaType formulaType) {
+        Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededLinear : experienceNeededExponential;
 
         if(!experienceMapRef.containsKey(level)) {
+            int cosmeticScaleMod = pluginRef.getPlayerLevelingSettings().getCosmeticLevelScaleModifier();
             int experienceSum = 0;
-            int retroIndex = (level * 10) + 1;
+            int cosmeticIndex = (level * cosmeticScaleMod) + 1;
 
             //Sum the range of levels in Retro that this Standard level would represent
-            for(int x = retroIndex; x < (retroIndex + 10); x++) {
+            for(int x = cosmeticIndex; x < (cosmeticIndex + cosmeticScaleMod); x++) {
                 //calculateXPNeeded doesn't cache results so we use that instead of invoking the Retro XP methods to avoid memory bloat
                 experienceSum += calculateXPNeeded(x, formulaType);
             }
@@ -166,7 +153,7 @@ public class FormulaManager {
      * @return raw xp needed to reach the next level based on formula type
      */
     private int processXPRetroToNextLevel(int level, FormulaType formulaType) {
-        Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededRetroLinear : experienceNeededRetroExponential;
+        Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededCosmeticLinear : experienceNeededCosmeticExponential;
 
         if (!experienceMapRef.containsKey(level)) {
             int experience = calculateXPNeeded(level, formulaType);

+ 1 - 1
mcmmo-core/src/main/java/com/gmail/nossr50/util/skills/RankTools.java

@@ -392,7 +392,7 @@ public class RankTools {
                     .getNode(subSkillType.getHoconFriendlyConfigName())
                     .getValue(TypeToken.of(SkillRankProperty.class));
 
-            int unlockLevel = skillRankProperty.getUnlockLevel(pluginRef.isRetroModeEnabled(), rank);
+            int unlockLevel = skillRankProperty.getUnlockLevel(pluginRef, rank);
             return unlockLevel;
 
         } catch (ObjectMappingException | MissingSkillPropertyDefinition | NullPointerException e) {