ExperienceConfig.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package com.gmail.nossr50.config.experience;
  2. import com.gmail.nossr50.config.AutoUpdateConfigLoader;
  3. import com.gmail.nossr50.datatypes.experience.FormulaType;
  4. import com.gmail.nossr50.datatypes.skills.MaterialType;
  5. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  6. import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage;
  7. import com.gmail.nossr50.util.StringUtils;
  8. import org.bukkit.Material;
  9. import org.bukkit.block.data.BlockData;
  10. import org.bukkit.boss.BarColor;
  11. import org.bukkit.boss.BarStyle;
  12. import org.bukkit.entity.EntityType;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. public class ExperienceConfig extends AutoUpdateConfigLoader {
  16. private static ExperienceConfig instance;
  17. private ExperienceConfig() {
  18. super("experience.yml");
  19. validate();
  20. }
  21. public static ExperienceConfig getInstance() {
  22. if (instance == null) {
  23. instance = new ExperienceConfig();
  24. }
  25. return instance;
  26. }
  27. @Override
  28. protected void loadKeys() {}
  29. @Override
  30. protected boolean validateKeys() {
  31. List<String> reason = new ArrayList<String>();
  32. /*
  33. * FORMULA SETTINGS
  34. */
  35. /* Curve values */
  36. if (getMultiplier(FormulaType.EXPONENTIAL) <= 0) {
  37. reason.add("Experience_Formula.Exponential_Values.multiplier should be greater than 0!");
  38. }
  39. if (getMultiplier(FormulaType.LINEAR) <= 0) {
  40. reason.add("Experience_Formula.Linear_Values.multiplier should be greater than 0!");
  41. }
  42. if (getExponent(FormulaType.EXPONENTIAL) <= 0) {
  43. reason.add("Experience_Formula.Exponential_Values.exponent should be greater than 0!");
  44. }
  45. /* Global modifier */
  46. if (getExperienceGainsGlobalMultiplier() <= 0) {
  47. reason.add("Experience_Formula.Multiplier.Global should be greater than 0!");
  48. }
  49. /* PVP modifier */
  50. if (getPlayerVersusPlayerXP() < 0) {
  51. reason.add("Experience_Formula.Multiplier.PVP should be at least 0!");
  52. }
  53. /* Spawned Mob modifier */
  54. if (getSpawnedMobXpMultiplier() < 0) {
  55. reason.add("Experience_Formula.Mobspawners.Multiplier should be at least 0!");
  56. }
  57. /* Bred Mob modifier */
  58. if (getBredMobXpMultiplier() < 0) {
  59. reason.add("Experience_Formula.Breeding.Multiplier should be at least 0!");
  60. }
  61. /* Conversion */
  62. if (getExpModifier() <= 0) {
  63. reason.add("Conversion.Exp_Modifier should be greater than 0!");
  64. }
  65. /*
  66. * XP SETTINGS
  67. */
  68. /* Alchemy */
  69. for (PotionStage potionStage : PotionStage.values()) {
  70. if (getPotionXP(potionStage) < 0) {
  71. reason.add("Experience_Values.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!");
  72. }
  73. }
  74. /* Archery */
  75. if (getArcheryDistanceMultiplier() < 0) {
  76. reason.add("Experience_Values.Archery.Distance_Multiplier should be at least 0!");
  77. }
  78. /* Combat XP Multipliers */
  79. if (getAnimalsXP() < 0) {
  80. reason.add("Experience_Values.Combat.Multiplier.Animals should be at least 0!");
  81. }
  82. if (getDodgeXPModifier() < 0) {
  83. reason.add("Skills.Acrobatics.Dodge_XP_Modifier should be at least 0!");
  84. }
  85. if (getRollXPModifier() < 0) {
  86. reason.add("Skills.Acrobatics.Roll_XP_Modifier should be at least 0!");
  87. }
  88. if (getFallXPModifier() < 0) {
  89. reason.add("Skills.Acrobatics.Fall_XP_Modifier should be at least 0!");
  90. }
  91. /* Fishing */
  92. // TODO: Add validation for each fish type once enum is available.
  93. if (getFishingShakeXP() <= 0) {
  94. reason.add("Experience_Values.Fishing.Shake should be greater than 0!");
  95. }
  96. /* Repair */
  97. if (getRepairXPBase() <= 0) {
  98. reason.add("Experience_Values.Repair.Base should be greater than 0!");
  99. }
  100. /* Taming */
  101. if (getTamingXP(EntityType.WOLF) <= 0) {
  102. reason.add("Experience_Values.Taming.Animal_Taming.Wolf should be greater than 0!");
  103. }
  104. if (getTamingXP(EntityType.OCELOT) <= 0) {
  105. reason.add("Experience_Values.Taming.Animal_Taming.Ocelot should be greater than 0!");
  106. }
  107. return noErrorsInConfig(reason);
  108. }
  109. public boolean isEarlyGameBoostEnabled() { return config.getBoolean("EarlyGameBoost.Enabled", true); }
  110. /*
  111. * FORMULA SETTINGS
  112. */
  113. /* EXPLOIT TOGGLES */
  114. public boolean isEndermanEndermiteFarmingPrevented() { return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); }
  115. public boolean isPistonCheatingPrevented() { return config.getBoolean("ExploitFix.PistonCheating", true); }
  116. public boolean isPistonExploitPrevented() { return config.getBoolean("ExploitFix.Pistons", false); }
  117. public boolean allowUnsafeEnchantments() { return config.getBoolean("ExploitFix.UnsafeEnchantments", false); }
  118. public boolean isCOTWBreedingPrevented() { return config.getBoolean("ExploitFix.COTWBreeding", true); }
  119. public boolean isFishingExploitingPrevented() { return config.getBoolean("ExploitFix.Fishing", true); }
  120. public boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); }
  121. public boolean isTreeFellerXPReduced() { return config.getBoolean("ExploitFix.TreeFellerReducedXP", true); }
  122. /* Curve settings */
  123. public FormulaType getFormulaType() { return FormulaType.getFormulaType(config.getString("Experience_Formula.Curve")); }
  124. public boolean getCumulativeCurveEnabled() { return config.getBoolean("Experience_Formula.Cumulative_Curve", false); }
  125. /* Curve values */
  126. public double getMultiplier(FormulaType type) { return config.getDouble("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.multiplier"); }
  127. public int getBase(FormulaType type) { return config.getInt("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.base"); }
  128. public double getExponent(FormulaType type) { return config.getDouble("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.exponent"); }
  129. /* Global modifier */
  130. public double getExperienceGainsGlobalMultiplier() { return config.getDouble("Experience_Formula.Multiplier.Global", 1.0); }
  131. public void setExperienceGainsGlobalMultiplier(double value) { config.set("Experience_Formula.Multiplier.Global", value); }
  132. /* PVP modifier */
  133. public double getPlayerVersusPlayerXP() { return config.getDouble("Experience_Formula.Multiplier.PVP", 1.0); }
  134. /* Spawned Mob modifier */
  135. public double getSpawnedMobXpMultiplier() { return config.getDouble("Experience_Formula.Mobspawners.Multiplier", 0.0); }
  136. public double getBredMobXpMultiplier() { return config.getDouble("Experience_Formula.Breeding.Multiplier", 1.0); }
  137. /* Skill modifiers */
  138. public double getFormulaSkillModifier(PrimarySkillType skill) { return config.getDouble("Experience_Formula.Modifier." + StringUtils.getCapitalized(skill.toString())); }
  139. /* Custom XP perk */
  140. public double getCustomXpPerkBoost() { return config.getDouble("Experience_Formula.Custom_XP_Perk.Boost", 1.25); }
  141. /* Diminished Returns */
  142. public float getDiminishedReturnsCap() { return (float) config.getDouble("Dimished_Returns.Guaranteed_Minimum_Percentage", 0.05D); }
  143. public boolean getDiminishedReturnsEnabled() { return config.getBoolean("Diminished_Returns.Enabled", false); }
  144. public int getDiminishedReturnsThreshold(PrimarySkillType skill) { return config.getInt("Diminished_Returns.Threshold." + StringUtils.getCapitalized(skill.toString()), 20000); }
  145. public int getDiminishedReturnsTimeInterval() { return config.getInt("Diminished_Returns.Time_Interval", 10); }
  146. /* Conversion */
  147. public double getExpModifier() { return config.getDouble("Conversion.Exp_Modifier", 1); }
  148. /*
  149. * XP SETTINGS
  150. */
  151. /* General Settings */
  152. public boolean getExperienceGainsPlayerVersusPlayerEnabled() { return config.getBoolean("Experience_Values.PVP.Rewards", true); }
  153. /* Combat XP Multipliers */
  154. public double getCombatXP(EntityType entity) { return config.getDouble("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); }
  155. public double getAnimalsXP(EntityType entity) { return config.getDouble("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_"), getAnimalsXP()); }
  156. public double getAnimalsXP() { return config.getDouble("Experience_Values.Combat.Multiplier.Animals", 1.0); }
  157. public boolean hasCombatXP(EntityType entity) {return config.contains("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); }
  158. /* Materials */
  159. public int getXp(PrimarySkillType skill, Material data)
  160. {
  161. String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
  162. String explicitString = baseString + StringUtils.getExplicitConfigMaterialString(data);
  163. if (config.contains(explicitString))
  164. return config.getInt(explicitString);
  165. String friendlyString = baseString + StringUtils.getFriendlyConfigMaterialString(data);
  166. if (config.contains(friendlyString))
  167. return config.getInt(friendlyString);
  168. String wildcardString = baseString + StringUtils.getWildcardConfigMaterialString(data);
  169. if (config.contains(wildcardString))
  170. return config.getInt(wildcardString);
  171. return 0;
  172. }
  173. /* Materials */
  174. public int getXp(PrimarySkillType skill, BlockData data)
  175. {
  176. String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
  177. String explicitString = baseString + StringUtils.getExplicitConfigBlockDataString(data);
  178. if (config.contains(explicitString))
  179. return config.getInt(explicitString);
  180. String friendlyString = baseString + StringUtils.getFriendlyConfigBlockDataString(data);
  181. if (config.contains(friendlyString))
  182. return config.getInt(friendlyString);
  183. String wildcardString = baseString + StringUtils.getWildcardConfigBlockDataString(data);
  184. if (config.contains(wildcardString))
  185. return config.getInt(wildcardString);
  186. return 0;
  187. }
  188. public boolean doesBlockGiveSkillXP(PrimarySkillType skill, Material data)
  189. {
  190. String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
  191. String explicitString = baseString + StringUtils.getExplicitConfigMaterialString(data);
  192. if (config.contains(explicitString))
  193. return true;
  194. String friendlyString = baseString + StringUtils.getFriendlyConfigMaterialString(data);
  195. if (config.contains(friendlyString))
  196. return true;
  197. String wildcardString = baseString + StringUtils.getWildcardConfigMaterialString(data);
  198. return config.contains(wildcardString);
  199. }
  200. public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockData data)
  201. {
  202. String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
  203. String explicitString = baseString + StringUtils.getExplicitConfigBlockDataString(data);
  204. if (config.contains(explicitString))
  205. return true;
  206. String friendlyString = baseString + StringUtils.getFriendlyConfigBlockDataString(data);
  207. if (config.contains(friendlyString))
  208. return true;
  209. String wildcardString = baseString + StringUtils.getWildcardConfigBlockDataString(data);
  210. return config.contains(wildcardString);
  211. }
  212. /*
  213. * Experience Bar Stuff
  214. */
  215. public boolean isPartyExperienceBarsEnabled()
  216. {
  217. return config.getBoolean("Experience_Bars.Update.Party", true);
  218. }
  219. public boolean isPassiveGainsExperienceBarsEnabled()
  220. {
  221. return config.getBoolean("Experience_Bars.Update.Passive", true);
  222. }
  223. public boolean getDoExperienceBarsAlwaysUpdateTitle()
  224. {
  225. return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.Enable", false) || getAddExtraDetails();
  226. }
  227. public boolean getAddExtraDetails() { return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.ExtraDetails", false);}
  228. public boolean isExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Enable", true); }
  229. public boolean isExperienceBarEnabled(PrimarySkillType primarySkillType) { return config.getBoolean("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".Enable", true);}
  230. public BarColor getExperienceBarColor(PrimarySkillType primarySkillType)
  231. {
  232. String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".Color");
  233. for(BarColor barColor : BarColor.values())
  234. {
  235. if(barColor.toString().equalsIgnoreCase(colorValueFromConfig))
  236. return barColor;
  237. }
  238. //In case the value is invalid
  239. return BarColor.WHITE;
  240. }
  241. public BarStyle getExperienceBarStyle(PrimarySkillType primarySkillType)
  242. {
  243. String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".BarStyle");
  244. for(BarStyle barStyle : BarStyle.values())
  245. {
  246. if(barStyle.toString().equalsIgnoreCase(colorValueFromConfig))
  247. return barStyle;
  248. }
  249. //In case the value is invalid
  250. return BarStyle.SOLID;
  251. }
  252. /* Acrobatics */
  253. public int getDodgeXPModifier() { return config.getInt("Experience_Values.Acrobatics.Dodge", 120); }
  254. public int getRollXPModifier() { return config.getInt("Experience_Values.Acrobatics.Roll", 80); }
  255. public int getFallXPModifier() { return config.getInt("Experience_Values.Acrobatics.Fall", 120); }
  256. public double getFeatherFallXPModifier() { return config.getDouble("Experience_Values.Acrobatics.FeatherFall_Multiplier", 2.0); }
  257. /* Alchemy */
  258. public double getPotionXP(PotionStage stage) { return config.getDouble("Experience_Values.Alchemy.Potion_Stage_" + stage.toNumerical(), 10D); }
  259. /* Archery */
  260. public double getArcheryDistanceMultiplier() { return config.getDouble("Experience_Values.Archery.Distance_Multiplier", 0.025); }
  261. public int getFishingShakeXP() { return config.getInt("Experience_Values.Fishing.Shake", 50); }
  262. /* Repair */
  263. public double getRepairXPBase() { return config.getDouble("Experience_Values.Repair.Base", 1000.0); }
  264. public double getRepairXP(MaterialType repairMaterialType) { return config.getDouble("Experience_Values.Repair." + StringUtils.getCapitalized(repairMaterialType.toString())); }
  265. /* Taming */
  266. public int getTamingXP(EntityType type)
  267. {
  268. return config.getInt("Experience_Values.Taming.Animal_Taming." + StringUtils.getPrettyEntityTypeString(type));
  269. }
  270. public boolean preventStoneLavaFarming() { return config.getBoolean("ExploitFix.LavaStoneAndCobbleFarming", true);}
  271. }