AdvancedConfig.java 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028
  1. package com.gmail.nossr50.config;
  2. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  3. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  4. import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
  5. import com.gmail.nossr50.mcMMO;
  6. import net.md_5.bungee.api.ChatColor;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class AdvancedConfig extends AutoUpdateConfigLoader {
  10. private static AdvancedConfig instance;
  11. private AdvancedConfig() {
  12. super("advanced.yml");
  13. validate();
  14. }
  15. public static AdvancedConfig getInstance() {
  16. if (instance == null) {
  17. instance = new AdvancedConfig();
  18. }
  19. return instance;
  20. }
  21. @Override
  22. protected boolean validateKeys() {
  23. // Validate all the settings!
  24. List<String> reason = new ArrayList<String>();
  25. /* GENERAL */
  26. if (getAbilityLength() < 1) {
  27. reason.add("Skills.General.Ability.Length.<mode>.IncreaseLevel should be at least 1!");
  28. }
  29. if (getEnchantBuff() < 1) {
  30. reason.add("Skills.General.Ability.EnchantBuff should be at least 1!");
  31. }
  32. /* ACROBATICS */
  33. if (getMaximumProbability(SubSkillType.ACROBATICS_DODGE) < 1) {
  34. reason.add("Skills.Acrobatics.Dodge.ChanceMax should be at least 1!");
  35. }
  36. if (getMaxBonusLevel(SubSkillType.ACROBATICS_DODGE) < 1) {
  37. reason.add("Skills.Acrobatics.Dodge.MaxBonusLevel should be at least 1!");
  38. }
  39. if (getDodgeDamageModifier() <= 1) {
  40. reason.add("Skills.Acrobatics.Dodge.DamageModifier should be greater than 1!");
  41. }
  42. if (getMaximumProbability(SubSkillType.ACROBATICS_ROLL) < 1) {
  43. reason.add("Skills.Acrobatics.Roll.ChanceMax should be at least 1!");
  44. }
  45. if (getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL) < 1) {
  46. reason.add("Skills.Acrobatics.Roll.MaxBonusLevel should be at least 1!");
  47. }
  48. if (getRollDamageThreshold() < 0) {
  49. reason.add("Skills.Acrobatics.Roll.DamageThreshold should be at least 0!");
  50. }
  51. if (getGracefulRollDamageThreshold() < 0) {
  52. reason.add("Skills.Acrobatics.GracefulRoll.DamageThreshold should be at least 0!");
  53. }
  54. /* ALCHEMY */
  55. /*if (getCatalysisUnlockLevel() < 0) {
  56. reason.add("Skills.Alchemy.Catalysis.UnlockLevel should be at least 0!");
  57. }
  58. if (getCatalysisMaxBonusLevel() <= getCatalysisUnlockLevel()) {
  59. reason.add("Skills.Alchemy.Catalysis.MaxBonusLevel should be greater than Skills.Alchemy.Catalysis.UnlockLevel!");
  60. }*/
  61. if (getCatalysisMinSpeed() <= 0) {
  62. reason.add("Skills.Alchemy.Catalysis.MinSpeed must be greater than 0!");
  63. }
  64. if (getCatalysisMaxSpeed() < getCatalysisMinSpeed()) {
  65. reason.add("Skills.Alchemy.Catalysis.MaxSpeed should be at least Skills.Alchemy.Catalysis.MinSpeed!");
  66. }
  67. /*List<Alchemy.Tier> alchemyTierList = Arrays.asList(Alchemy.Tier.values());
  68. for (Alchemy.Tier tier : alchemyTierList) {
  69. if (getConcoctionsTierLevel(tier) < 0) {
  70. reason.add("Skills.Alchemy.Rank_Levels.Rank_" + rank + " should be at least 0!");
  71. }
  72. if (tier != Alchemy.Tier.fromNumerical(Alchemy.Tier.values().length)) {
  73. Alchemy.Tier nextTier = alchemyTierList.get(alchemyTierList.indexOf(tier) - 1);
  74. if (getConcoctionsTierLevel(tier) > getConcoctionsTierLevel(nextTier)) {
  75. reason.add("Skills.Alchemy.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Alchemy.Rank_Levels.Rank_" + nextrank + "!");
  76. }
  77. }
  78. }*/
  79. /* ARCHERY */
  80. if (getSkillShotRankDamageMultiplier() <= 0) {
  81. reason.add("Skills.Archery.SkillShot.RankDamageMultiplier should be greater than 0!");
  82. }
  83. if (getMaximumProbability(SubSkillType.ARCHERY_DAZE) < 1) {
  84. reason.add("Skills.Archery.Daze.ChanceMax should be at least 1!");
  85. }
  86. if (getMaxBonusLevel(SubSkillType.ARCHERY_DAZE) < 1) {
  87. reason.add("Skills.Archery.Daze.MaxBonusLevel should be at least 1!");
  88. }
  89. if (getDazeBonusDamage() < 0) {
  90. reason.add("Skills.Archery.Daze.BonusDamage should be at least 0!");
  91. }
  92. if (getMaximumProbability(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) {
  93. reason.add("Skills.Archery.Retrieve.ChanceMax should be at least 1!");
  94. }
  95. if (getMaxBonusLevel(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) {
  96. reason.add("Skills.Archery.Retrieve.MaxBonusLevel should be at least 1!");
  97. }
  98. if (getForceMultiplier() < 0) {
  99. reason.add("Skills.Archery.ForceMultiplier should be at least 0!");
  100. }
  101. /* AXES */
  102. if(getAxeMasteryRankDamageMultiplier() < 0)
  103. {
  104. reason.add("Skills.Axes.AxeMastery.RankDamageMultiplier should be at least 0!");
  105. }
  106. if (getMaximumProbability(SubSkillType.AXES_CRITICAL_STRIKES) < 1) {
  107. reason.add("Skills.Axes.CriticalHit.ChanceMax should be at least 1!");
  108. }
  109. if (getMaxBonusLevel(SubSkillType.AXES_CRITICAL_STRIKES) < 1) {
  110. reason.add("Skills.Axes.CriticalHit.MaxBonusLevel should be at least 1!");
  111. }
  112. if (getCriticalStrikesPVPModifier() < 1) {
  113. reason.add("Skills.Axes.CriticalStrikes.PVP_Modifier should be at least 1!");
  114. }
  115. if (getCriticalStrikesPVPModifier() < 1) {
  116. reason.add("Skills.Axes.CriticalStrikes.PVE_Modifier should be at least 1!");
  117. }
  118. if (getGreaterImpactChance() < 1) {
  119. reason.add("Skills.Axes.GreaterImpact.Chance should be at least 1!");
  120. }
  121. if (getGreaterImpactModifier() < 1) {
  122. reason.add("Skills.Axes.GreaterImpact.KnockbackModifier should be at least 1!");
  123. }
  124. if (getGreaterImpactBonusDamage() < 1) {
  125. reason.add("Skills.Axes.GreaterImpact.BonusDamage should be at least 1!");
  126. }
  127. if (getArmorImpactIncreaseLevel() < 1) {
  128. reason.add("Skills.Axes.ArmorImpact.IncreaseLevel should be at least 1!");
  129. }
  130. if (getImpactChance() < 1) {
  131. reason.add("Skills.Axes.ArmorImpact.Chance should be at least 1!");
  132. }
  133. if (getArmorImpactMaxDurabilityDamage() < 1) {
  134. reason.add("Skills.Axes.ArmorImpact.MaxPercentageDurabilityDamage should be at least 1!");
  135. }
  136. if (getSkullSplitterModifier() < 1) {
  137. reason.add("Skills.Axes.SkullSplitter.DamageModifier should be at least 1!");
  138. }
  139. /* FISHING */
  140. /*List<Fishing.Tier> fishingTierList = Arrays.asList(Fishing.Tier.values());
  141. for (int rank : fishingTierList) {
  142. if (getFishingTierLevel(tier) < 0) {
  143. reason.add("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be at least 0!");
  144. }
  145. if (getShakeChance(tier) < 0) {
  146. reason.add("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be at least 0!");
  147. }
  148. if (getFishingVanillaXPModifier(tier) < 0) {
  149. reason.add("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be at least 0!");
  150. }
  151. if (tier != Fishing.Tier.EIGHT) {
  152. Fishing.Tier nextTier = fishingTierList.get(fishingTierList.indexOf(tier) - 1);
  153. if (getFishingTierLevel(tier) > getFishingTierLevel(nextTier)) {
  154. reason.add("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Fishing.Rank_Levels.Rank_" + nextrank + "!");
  155. }
  156. if (getShakeChance(tier) > getShakeChance(nextTier)) {
  157. reason.add("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be less than or equal to Skills.Fishing.Shake_Chance.Rank_" + nextrank + "!");
  158. }
  159. if (getFishingVanillaXPModifier(tier) > getFishingVanillaXPModifier(nextTier)) {
  160. reason.add("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Fishing.VanillaXPMultiplier.Rank_" + nextrank + "!");
  161. }
  162. }
  163. }*/
  164. if (getFishermanDietRankChange() < 1) {
  165. reason.add("Skills.Fishing.FishermansDiet.RankChange should be at least 1!");
  166. }
  167. /*if (getIceFishingUnlockLevel() < 0) {
  168. reason.add("Skills.Fishing.IceFishing.UnlockLevel should be at least 0!");
  169. }
  170. if (getMasterAnglerUnlockLevel() < 0) {
  171. reason.add("Skills.Fishing.MasterAngler.UnlockLevel should be at least 0!");
  172. }*/
  173. if (getMasterAnglerBoatModifier() < 1) {
  174. reason.add("Skills.Fishing.MasterAngler.BoatModifier should be at least 1!");
  175. }
  176. if (getMasterAnglerBiomeModifier() < 1) {
  177. reason.add("Skills.Fishing.MasterAngler.BiomeModifier should be at least 1!");
  178. }
  179. /* HERBALISM */
  180. if (getFarmerDietRankChange() < 1) {
  181. reason.add("Skills.Herbalism.FarmersDiet.RankChange should be at least 1!");
  182. }
  183. if (getGreenThumbStageChange() < 1) {
  184. reason.add("Skills.Herbalism.GreenThumb.StageChange should be at least 1!");
  185. }
  186. if (getMaximumProbability(SubSkillType.HERBALISM_GREEN_THUMB) < 1) {
  187. reason.add("Skills.Herbalism.GreenThumb.ChanceMax should be at least 1!");
  188. }
  189. if (getMaxBonusLevel(SubSkillType.HERBALISM_GREEN_THUMB) < 1) {
  190. reason.add("Skills.Herbalism.GreenThumb.MaxBonusLevel should be at least 1!");
  191. }
  192. if (getMaximumProbability(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) {
  193. reason.add("Skills.Herbalism.DoubleDrops.ChanceMax should be at least 1!");
  194. }
  195. if (getMaxBonusLevel(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) {
  196. reason.add("Skills.Herbalism.DoubleDrops.MaxBonusLevel should be at least 1!");
  197. }
  198. if (getMaximumProbability(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) {
  199. reason.add("Skills.Herbalism.HylianLuck.ChanceMax should be at least 1!");
  200. }
  201. if (getMaxBonusLevel(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) {
  202. reason.add("Skills.Herbalism.HylianLuck.MaxBonusLevel should be at least 1!");
  203. }
  204. if (getMaximumProbability(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) {
  205. reason.add("Skills.Herbalism.ShroomThumb.ChanceMax should be at least 1!");
  206. }
  207. if (getMaxBonusLevel(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) {
  208. reason.add("Skills.Herbalism.ShroomThumb.MaxBonusLevel should be at least 1!");
  209. }
  210. /* MINING */
  211. if (getMaximumProbability(SubSkillType.MINING_DOUBLE_DROPS) < 1) {
  212. reason.add("Skills.Mining.DoubleDrops.ChanceMax should be at least 1!");
  213. }
  214. if (getMaxBonusLevel(SubSkillType.MINING_DOUBLE_DROPS) < 1) {
  215. reason.add("Skills.Mining.DoubleDrops.MaxBonusLevel should be at least 1!");
  216. }
  217. /*List<BlastMining.Tier> blastMiningTierList = Arrays.asList(BlastMining.Tier.values());
  218. for (int rank : blastMiningTierList) {
  219. if (getBlastMiningRankLevel(tier) < 0) {
  220. reason.add("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank + " should be at least 0!");
  221. }
  222. if (getBlastDamageDecrease(tier) < 0) {
  223. reason.add("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank + " should be at least 0!");
  224. }
  225. if (getOreBonus(tier) < 0) {
  226. reason.add("Skills.Mining.BlastMining.OreBonus.Rank_" + rank + " should be at least 0!");
  227. }
  228. if (getDebrisReduction(tier) < 0) {
  229. reason.add("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank + " should be at least 0!");
  230. }
  231. if (getDropMultiplier(tier) < 0) {
  232. reason.add("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank + " should be at least 0!");
  233. }
  234. if (getBlastRadiusModifier(tier) < 0) {
  235. reason.add("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank + " should be at least 0!");
  236. }
  237. if (tier != BlastMining.Tier.EIGHT) {
  238. BlastMining.Tier nextTier = blastMiningTierList.get(blastMiningTierList.indexOf(tier) - 1);
  239. if (getBlastMiningRankLevel(tier) > getBlastMiningRankLevel(nextTier)) {
  240. reason.add("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.Rank_Levels.Rank_" + nextrank + "!");
  241. }
  242. if (getBlastDamageDecrease(tier) > getBlastDamageDecrease(nextTier)) {
  243. reason.add("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + nextrank + "!");
  244. }
  245. if (getOreBonus(tier) > getOreBonus(nextTier)) {
  246. reason.add("Skills.Mining.BlastMining.OreBonus.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.OreBonus.Rank_" + nextrank + "!");
  247. }
  248. if (getDebrisReduction(tier) > getDebrisReduction(nextTier)) {
  249. reason.add("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.DebrisReduction.Rank_" + nextrank + "!");
  250. }
  251. if (getDropMultiplier(tier) > getDropMultiplier(nextTier)) {
  252. reason.add("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.DropMultiplier.Rank_" + nextrank + "!");
  253. }
  254. if (getBlastRadiusModifier(tier) > getBlastRadiusModifier(nextTier)) {
  255. reason.add("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + nextrank + "!");
  256. }
  257. }
  258. }*/
  259. /* REPAIR */
  260. if (getRepairMasteryMaxBonus() < 1) {
  261. reason.add("Skills.Repair.RepairMastery.MaxBonusPercentage should be at least 1!");
  262. }
  263. if (getRepairMasteryMaxLevel() < 1) {
  264. reason.add("Skills.Repair.RepairMastery.MaxBonusLevel should be at least 1!");
  265. }
  266. if (getMaximumProbability(SubSkillType.REPAIR_SUPER_REPAIR) < 1) {
  267. reason.add("Skills.Repair.SuperRepair.ChanceMax should be at least 1!");
  268. }
  269. if (getMaxBonusLevel(SubSkillType.REPAIR_SUPER_REPAIR) < 1) {
  270. reason.add("Skills.Repair.SuperRepair.MaxBonusLevel should be at least 1!");
  271. }
  272. /*List<ArcaneForging.Tier> arcaneForgingTierList = Arrays.asList(ArcaneForging.Tier.values());
  273. for (ArcaneForging.Tier tier : arcaneForgingTierList) {
  274. if (getArcaneForgingRankLevel(tier) < 0) {
  275. reason.add("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank + " should be at least 0!");
  276. }
  277. if (getArcaneForgingDowngradeChance(tier) < 0 || getArcaneForgingDowngradeChance(tier) > 100) {
  278. reason.add("Skills.Repair.ArcaneForging.Downgrades.Chance.Rank_" + rank + " only accepts values from 0 to 100!");
  279. }
  280. if (getArcaneForgingKeepEnchantsChance(tier) < 0 || getArcaneForgingKeepEnchantsChance(tier) > 100) {
  281. reason.add("Skills.Repair.ArcaneForging.Keep_Enchants.Chance.Rank_" + rank + " only accepts values from 0 to 100!");
  282. }
  283. if (tier != ArcaneForging.Tier.EIGHT) {
  284. ArcaneForging.Tier nextTier = arcaneForgingTierList.get(arcaneForgingTierList.indexOf(tier) - 1);
  285. if (getArcaneForgingRankLevel(tier) > getArcaneForgingRankLevel(nextTier)) {
  286. reason.add("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + nextrank + "!");
  287. }
  288. if (getArcaneForgingDowngradeChance(nextTier) > getArcaneForgingDowngradeChance(tier)) {
  289. reason.add("Skills.Repair.ArcaneForging.Downgrades.Chance.Rank_" + nextrank + " should be less than or equal to Skills.Repair.ArcaneForging.Downgrades.Chance.Rank_" + rank + "!");
  290. }
  291. if (getArcaneForgingKeepEnchantsChance(tier) > getArcaneForgingKeepEnchantsChance(nextTier)) {
  292. reason.add("Skills.Repair.ArcaneForging.Keep_Enchants.Chance.Rank_" + rank + " should be less than or equal to Skills.Repair.ArcaneForging.Keep_Enchants.Chance.Rank_" + nextrank + "!");
  293. }
  294. }
  295. }*/
  296. /* SALVAGE */
  297. /*if (getSalvageMaxPercentage() < 1) {
  298. reason.add("Skills.Salvage.MaxPercentage should be at least 1!");
  299. }
  300. if (getSalvageMaxPercentageLevel() < 1) {
  301. reason.add("Skills.Salvage.MaxPercentageLevel should be at least 1!");
  302. }*/
  303. /*if (getAdvancedSalvageUnlockLevel() < 0) {
  304. reason.add("Skills.Salvage.AdvancedSalvage.UnlockLevel should be at least 0!");
  305. }*/
  306. /*List<Salvage.Tier> salvageTierList = Arrays.asList(Salvage.Tier.values());
  307. for (Salvage.Tier tier : salvageTierList) {
  308. if (getArcaneSalvageRankLevel(tier) < 0) {
  309. reason.add("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank + " should be at least 0!");
  310. }
  311. if (getArcaneSalvageExtractFullEnchantsChance(tier) < 0 || getArcaneSalvageExtractFullEnchantsChance(tier) > 100) {
  312. reason.add("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank + " only accepts values from 0 to 100!");
  313. }
  314. if (getArcaneSalvageExtractPartialEnchantsChance(tier) < 0 || getArcaneSalvageExtractPartialEnchantsChance(tier) > 100) {
  315. reason.add("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank + " only accepts values from 0 to 100!");
  316. }
  317. if (tier != Salvage.Tier.EIGHT) {
  318. Salvage.Tier nextTier = salvageTierList.get(salvageTierList.indexOf(tier) - 1);
  319. if (getArcaneSalvageRankLevel(tier) > getArcaneSalvageRankLevel(nextTier)) {
  320. reason.add("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + nextrank + "!");
  321. }
  322. if (getArcaneSalvageExtractFullEnchantsChance(tier) > getArcaneSalvageExtractFullEnchantsChance(nextTier)) {
  323. reason.add("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank + " should be less than or equal to Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + nextrank + "!");
  324. }
  325. if (getArcaneSalvageExtractPartialEnchantsChance(tier) > getArcaneSalvageExtractPartialEnchantsChance(nextTier)) {
  326. reason.add("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank + " should be less than or equal to Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + nextrank + "!");
  327. }
  328. }
  329. }*/
  330. /* SMELTING */
  331. if (getBurnModifierMaxLevel() < 1) {
  332. reason.add("Skills.Smelting.FuelEfficiency.MaxBonusLevel should be at least 1!");
  333. }
  334. if (getBurnTimeMultiplier() < 1) {
  335. reason.add("Skills.Smelting.FuelEfficiency.Multiplier should be at least 1!");
  336. }
  337. if (getMaxBonusLevel(SubSkillType.SMELTING_SECOND_SMELT) < 1) {
  338. reason.add("Skills.Smelting.SecondSmelt.MaxBonusLevel should be at least 1!");
  339. }
  340. if (getMaximumProbability(SubSkillType.SMELTING_SECOND_SMELT) < 1) {
  341. reason.add("Skills.Smelting.SecondSmelt.ChanceMax should be at least 1!");
  342. }
  343. /*if (getFluxMiningUnlockLevel() < 0) {
  344. reason.add("Skills.Smelting.FluxMining.UnlockLevel should be at least 0!");
  345. }*/
  346. if (getFluxMiningChance() < 1) {
  347. reason.add("Skills.Smelting.FluxMining.Chance should be at least 1!");
  348. }
  349. /*List<Smelting.Tier> smeltingTierList = Arrays.asList(Smelting.Tier.values());
  350. for (int rank : smeltingTierList) {
  351. if (getSmeltingRankLevel(tier) < 0) {
  352. reason.add("Skills.Smelting.Rank_Levels.Rank_" + rank + " should be at least 0!");
  353. }
  354. if (getSmeltingVanillaXPBoostMultiplier(tier) < 1) {
  355. reason.add("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank + " should be at least 1!");
  356. }
  357. if (tier != Smelting.Tier.EIGHT) {
  358. Smelting.Tier nextTier = smeltingTierList.get(smeltingTierList.indexOf(tier) - 1);
  359. if (getSmeltingRankLevel(tier) > getSmeltingRankLevel(nextTier)) {
  360. reason.add("Skills.Smelting.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Smelting.Rank_Levels.Rank_" + nextrank + "!");
  361. }
  362. if (getSmeltingVanillaXPBoostMultiplier(tier) > getSmeltingVanillaXPBoostMultiplier(nextTier)) {
  363. reason.add("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Smelting.VanillaXPMultiplier.Rank_" + nextrank + "!");
  364. }
  365. }
  366. }*/
  367. /* SWORDS */
  368. if (getMaximumProbability(SubSkillType.SWORDS_RUPTURE) < 1) {
  369. reason.add("Skills.Swords.Rupture.ChanceMax should be at least 1!");
  370. }
  371. if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) {
  372. reason.add("Skills.Swords.Rupture.MaxBonusLevel should be at least 1!");
  373. }
  374. if (getRuptureMaxTicks() < 1) {
  375. reason.add("Skills.Swords.Rupture.MaxTicks should be at least 1!");
  376. }
  377. if (getRuptureMaxTicks() < getRuptureBaseTicks()) {
  378. reason.add("Skills.Swords.Rupture.MaxTicks should be at least Skills.Swords.Rupture.BaseTicks!");
  379. }
  380. if (getRuptureBaseTicks() < 1) {
  381. reason.add("Skills.Swords.Rupture.BaseTicks should be at least 1!");
  382. }
  383. if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
  384. reason.add("Skills.Swords.CounterAttack.ChanceMax should be at least 1!");
  385. }
  386. if (getMaxBonusLevel(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
  387. reason.add("Skills.Swords.CounterAttack.MaxBonusLevel should be at least 1!");
  388. }
  389. if (getCounterModifier() < 1) {
  390. reason.add("Skills.Swords.CounterAttack.DamageModifier should be at least 1!");
  391. }
  392. if (getSerratedStrikesModifier() < 1) {
  393. reason.add("Skills.Swords.SerratedStrikes.DamageModifier should be at least 1!");
  394. }
  395. if (getSerratedStrikesTicks() < 1) {
  396. reason.add("Skills.Swords.SerratedStrikes.RuptureTicks should be at least 1!");
  397. }
  398. /* TAMING */
  399. if (getMaximumProbability(SubSkillType.TAMING_GORE) < 1) {
  400. reason.add("Skills.Taming.Gore.ChanceMax should be at least 1!");
  401. }
  402. if (getMaxBonusLevel(SubSkillType.TAMING_GORE) < 1) {
  403. reason.add("Skills.Taming.Gore.MaxBonusLevel should be at least 1!");
  404. }
  405. /*if (getGoreRuptureTicks() < 1) {
  406. reason.add("Skills.Taming.Gore.RuptureTicks should be at least 1!");
  407. }*/
  408. if (getGoreModifier() < 1) {
  409. reason.add("Skills.Taming.Gore.Modifier should be at least 1!");
  410. }
  411. /*if (getFastFoodUnlock() < 0) {
  412. reason.add("Skills.Taming.FastFood.UnlockLevel should be at least 0!");
  413. }*/
  414. if (getFastFoodChance() < 1) {
  415. reason.add("Skills.Taming.FastFood.Chance should be at least 1!");
  416. }
  417. /*if (getEnviromentallyAwareUnlock() < 0) {
  418. reason.add("Skills.Taming.EnvironmentallyAware.UnlockLevel should be at least 0!");
  419. }*/
  420. /*if (getThickFurUnlock() < 0) {
  421. reason.add("Skills.Taming.ThickFur.UnlockLevel should be at least 0!");
  422. }*/
  423. if (getThickFurModifier() < 1) {
  424. reason.add("Skills.Taming.ThickFur.Modifier should be at least 1!");
  425. }
  426. /*if (getHolyHoundUnlock() < 0) {
  427. reason.add("Skills.Taming.HolyHound.UnlockLevel should be at least 0!");
  428. }
  429. if (getShockProofUnlock() < 0) {
  430. reason.add("Skills.Taming.ShockProof.UnlockLevel should be at least 0!");
  431. }*/
  432. if (getShockProofModifier() < 1) {
  433. reason.add("Skills.Taming.ShockProof.Modifier should be at least 1!");
  434. }
  435. /*if (getSharpenedClawsUnlock() < 0) {
  436. reason.add("Skills.Taming.SharpenedClaws.UnlockLevel should be at least 0!");
  437. }*/
  438. if (getSharpenedClawsBonus() < 1) {
  439. reason.add("Skills.Taming.SharpenedClaws.Bonus should be at least 1!");
  440. }
  441. if (getMaxHorseJumpStrength() < 0 || getMaxHorseJumpStrength() > 2) {
  442. reason.add("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength should be between 0 and 2!");
  443. }
  444. /* UNARMED */
  445. if (getMaximumProbability(SubSkillType.UNARMED_DISARM) < 1) {
  446. reason.add("Skills.Unarmed.Disarm.ChanceMax should be at least 1!");
  447. }
  448. if (getMaxBonusLevel(SubSkillType.UNARMED_DISARM) < 1) {
  449. reason.add("Skills.Unarmed.Disarm.MaxBonusLevel should be at least 1!");
  450. }
  451. if (getMaximumProbability(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) {
  452. reason.add("Skills.Unarmed.ArrowDeflect.ChanceMax should be at least 1!");
  453. }
  454. if (getMaxBonusLevel(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) {
  455. reason.add("Skills.Unarmed.ArrowDeflect.MaxBonusLevel should be at least 1!");
  456. }
  457. if (getMaximumProbability(SubSkillType.UNARMED_IRON_GRIP) < 1) {
  458. reason.add("Skills.Unarmed.IronGrip.ChanceMax should be at least 1!");
  459. }
  460. if (getMaxBonusLevel(SubSkillType.UNARMED_IRON_GRIP) < 1) {
  461. reason.add("Skills.Unarmed.IronGrip.MaxBonusLevel should be at least 1!");
  462. }
  463. /* WOODCUTTING */
  464. /*if (getLeafBlowUnlockLevel() < 0) {
  465. reason.add("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!");
  466. }*/
  467. if (getMaximumProbability(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) {
  468. reason.add("Skills.Woodcutting.HarvestLumber.ChanceMax should be at least 1!");
  469. }
  470. if (getMaxBonusLevel(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) {
  471. reason.add("Skills.Woodcutting.HarvestLumber.MaxBonusLevel should be at least 1!");
  472. }
  473. /* KRAKEN */
  474. if (getKrakenTriesBeforeRelease() < 1) {
  475. reason.add("Kraken.Tries_Before_Release should be at least 1!");
  476. }
  477. if (getKrakenHealth() < 1) {
  478. reason.add("Kraken.Health should be at least 1!");
  479. }
  480. if (getKrakenAttackInterval() < 1) {
  481. reason.add("Kraken.Attack_Interval_Seconds should be at least 1!");
  482. }
  483. if (getKrakenAttackDamage() < 1) {
  484. reason.add("Kraken.Attack_Damage should be at least 1!");
  485. }
  486. return noErrorsInConfig(reason);
  487. }
  488. @Override
  489. protected void loadKeys() {}
  490. /* GENERAL */
  491. public int getStartingLevel() { return config.getInt("Skills.General.StartingLevel", 1); }
  492. /**
  493. * This returns the maximum level at which superabilities will stop lengthening from scaling alongside skill level.
  494. * It returns a different value depending on whether or not the server is in retro mode
  495. * @return the level at which abilities stop increasing in length
  496. */
  497. public int getAbilityLengthCap() {
  498. if(!mcMMO.isRetroModeEnabled())
  499. return config.getInt("Skills.General.Ability.Length.Standard.CapLevel", 50);
  500. else
  501. return config.getInt("Skills.General.Ability.Length.RetroMode.CapLevel", 500);
  502. }
  503. /**
  504. * This returns the frequency at which abilities will increase in length
  505. * It returns a different value depending on whether or not the server is in retro mode
  506. * @return the number of levels required per ability length increase
  507. */
  508. public int getAbilityLength() {
  509. if(!mcMMO.isRetroModeEnabled())
  510. return config.getInt("Skills.General.Ability.Length.Standard.IncreaseLevel", 5);
  511. else
  512. return config.getInt("Skills.General.Ability.Length.RetroMode.IncreaseLevel", 50);
  513. }
  514. public int getEnchantBuff() { return config.getInt("Skills.General.Ability.EnchantBuff", 5); }
  515. /**
  516. * Grabs the max bonus level for a skill used in RNG calculations
  517. * All max level values in the config are multiplied by 10 if the server is in retro mode as the values in the config are based around the new 1-100 skill system scaling
  518. * A value of 10 in the file will be returned as 100 for retro mode servers to accommodate the change in scaling
  519. * @param subSkillType target subskill
  520. * @return the level at which this skills max benefits will be reached on the curve
  521. */
  522. public int getMaxBonusLevel(SubSkillType subSkillType) {
  523. int maxBonusLevel = config.getInt(subSkillType.getAdvConfigAddress() + ".MaxBonusLevel", 100);
  524. if(mcMMO.isRetroModeEnabled())
  525. maxBonusLevel *= 10;
  526. if(maxBonusLevel == 0)
  527. mcMMO.p.getLogger().severe("Warning Max Bonus Level for "+subSkillType.getAdvConfigAddress() + ".MaxBonusLevel"+" is set to 0! Typically this value should be 100.");
  528. return maxBonusLevel;
  529. }
  530. public int getMaxBonusLevel(AbstractSubSkill abstractSubSkill) {
  531. int maxBonusLevel = config.getInt("Skills."+abstractSubSkill.getPrimaryKeyName()+"."+abstractSubSkill.getConfigKeyName()+".MaxBonusLevel", 100);
  532. if(mcMMO.isRetroModeEnabled())
  533. maxBonusLevel *= 10;
  534. return maxBonusLevel;
  535. }
  536. public double getMaximumProbability(SubSkillType subSkillType) {
  537. double maximumProbability = config.getDouble(subSkillType.getAdvConfigAddress() + ".ChanceMax", 100.0D);
  538. /*if(mcMMO.isRetroModeEnabled())
  539. maximumProbability *= 10; // It seems weird but our formulas need this*/
  540. return maximumProbability;
  541. }
  542. public double getMaximumProbability(AbstractSubSkill abstractSubSkill)
  543. {
  544. double maximumProbability = config.getDouble("Skills."+abstractSubSkill.getPrimaryKeyName()+"."+abstractSubSkill.getConfigKeyName()+".ChanceMax", 100.0D);
  545. if(mcMMO.isRetroModeEnabled())
  546. maximumProbability *= 10; // It seems weird but our formulas need this
  547. return maximumProbability;
  548. }
  549. /* Notification Settings */
  550. public boolean doesSkillCommandSendBlankLines()
  551. {
  552. return config.getBoolean("Feedback.SkillCommand.BlankLinesAboveHeader", true);
  553. }
  554. public boolean doesNotificationUseActionBar(NotificationType notificationType)
  555. {
  556. return config.getBoolean("Feedback.ActionBarNotifications."+notificationType.toString()+".Enabled", true);
  557. }
  558. public boolean doesNotificationSendCopyToChat(NotificationType notificationType)
  559. {
  560. return config.getBoolean("Feedback.ActionBarNotifications."+notificationType.toString()+".SendCopyOfMessageToChat", false);
  561. }
  562. public boolean useTitlesForXPEvent()
  563. {
  564. return config.getBoolean("Feedback.Events.XP.SendTitles", true);
  565. }
  566. /*
  567. * JSON Style Settings
  568. */
  569. /*public ChatColor getJSONStatHoverElementColor(StatType statType, boolean isPrefix)
  570. {
  571. String keyAddress = isPrefix ? "Prefix" : "Value";
  572. String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Color";
  573. return getChatColorFromKey(keyLocation);
  574. }*/
  575. /**
  576. * Used to color our details header in our JSON Hover Object tooltips
  577. * @return the ChatColor for this element
  578. */
  579. /*public ChatColor getJSONStatHoverDetailsColor()
  580. {
  581. String keyLocation = "Style.JSON.Hover.Details.Header.Color";
  582. return getChatColorFromKey(keyLocation);
  583. }
  584. public boolean isJSONDetailsHeaderBold()
  585. {
  586. return config.getBoolean("Style.JSON.Hover.Details.Header.Bold");
  587. }
  588. public boolean isJSONDetailsHeaderItalic()
  589. {
  590. return config.getBoolean("Style.JSON.Hover.Details.Header.Italics");
  591. }
  592. public boolean isJSONDetailsHeaderUnderlined()
  593. {
  594. return config.getBoolean("Style.JSON.Hover.Details.Header.Underlined");
  595. }
  596. public ChatColor getJSONStatHoverDescriptionColor()
  597. {
  598. String keyLocation = "Style.JSON.Hover.Details.Description.Color";
  599. return getChatColorFromKey(keyLocation);
  600. }
  601. public boolean isJSONDetailsDescriptionBold()
  602. {
  603. return config.getBoolean("Style.JSON.Hover.Details.Description.Bold");
  604. }
  605. public boolean isJSONDetailsDescriptionItalic()
  606. {
  607. return config.getBoolean("Style.JSON.Hover.Details.Description.Italics");
  608. }
  609. public boolean isJSONDetailsDescriptionUnderlined()
  610. {
  611. return config.getBoolean("Style.JSON.Hover.Details.Description.Underlined");
  612. }
  613. public ChatColor getJSONActionBarColor(NotificationType notificationType)
  614. {
  615. return getChatColor(config.getString("Style.JSON.Notification."+notificationType.toString()+".Color"));
  616. }*/
  617. private ChatColor getChatColorFromKey(String keyLocation) {
  618. String colorName = config.getString(keyLocation);
  619. return getChatColor(colorName);
  620. }
  621. private ChatColor getChatColor(String configColor) {
  622. for (ChatColor chatColor : ChatColor.values()) {
  623. if (configColor.equalsIgnoreCase(chatColor.getName()))
  624. return chatColor;
  625. }
  626. //Invalid Color
  627. System.out.println("[mcMMO] " + configColor + " is an invalid color value");
  628. return ChatColor.WHITE;
  629. }
  630. /*public boolean isJSONStatHoverElementBold(StatType statType, boolean isPrefix)
  631. {
  632. String keyAddress = isPrefix ? "Prefix" : "Value";
  633. String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Bold";
  634. return config.getBoolean(keyLocation);
  635. }
  636. public boolean isJSONStatHoverElementItalic(StatType statType, boolean isPrefix)
  637. {
  638. String keyAddress = isPrefix ? "Prefix" : "Value";
  639. String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Italics";
  640. return config.getBoolean(keyLocation);
  641. }
  642. public boolean isJSONStatHoverElementUnderlined(StatType statType, boolean isPrefix)
  643. {
  644. String keyAddress = isPrefix ? "Prefix" : "Value";
  645. String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Underline";
  646. return config.getBoolean(keyLocation);
  647. }*/
  648. /**
  649. * Some SubSkills have the ability to retain classic functionality
  650. * @param subSkillType SubSkillType with classic functionality
  651. * @return true if the subskill is in classic mode
  652. */
  653. public boolean isSubSkillClassic(SubSkillType subSkillType)
  654. {
  655. return config.getBoolean(subSkillType.getAdvConfigAddress()+".Classic");
  656. }
  657. /* ACROBATICS */
  658. public double getDodgeDamageModifier() { return config.getDouble("Skills.Acrobatics.Dodge.DamageModifier", 2.0D); }
  659. public double getRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.Roll.DamageThreshold", 7.0D); }
  660. public double getGracefulRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.GracefulRoll.DamageThreshold", 14.0D); }
  661. /* ALCHEMY */
  662. /*public int getCatalysisUnlockLevel() { return config.getInt("Skills.Alchemy.Catalysis.UnlockLevel", 100); }*/
  663. public int getCatalysisMaxBonusLevel() { return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000); }
  664. public double getCatalysisMinSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MinSpeed", 1.0D); }
  665. public double getCatalysisMaxSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MaxSpeed", 4.0D); }
  666. //public int getConcoctionsTierLevel(Alchemy.Tier tier) { return config.getInt("Skills.Alchemy.Rank_Levels.Rank_" + rank); }
  667. /* ARCHERY */
  668. public double getSkillShotRankDamageMultiplier() { return config.getDouble("Skills.Archery.SkillShot.RankDamageMultiplier", 10.0D); }
  669. public double getSkillShotDamageMax() { return config.getDouble("Skills.Archery.SkillShot.MaxDamage", 9.0D); }
  670. public double getDazeBonusDamage() { return config.getDouble("Skills.Archery.Daze.BonusDamage", 4.0D); }
  671. public double getForceMultiplier() { return config.getDouble("Skills.Archery.ForceMultiplier", 2.0D); }
  672. /* AXES */
  673. public double getAxeMasteryRankDamageMultiplier() { return config.getDouble("Skills.Axes.AxeMastery.RankDamageMultiplier", 1.0D); }
  674. public double getCriticalStrikesPVPModifier() { return config.getDouble("Skills.Axes.CriticalStrikes.PVP_Modifier", 1.5D); }
  675. public double getCriticalStrikesPVEModifier() { return config.getDouble("Skills.Axes.CriticalStrikes.PVE_Modifier", 2.0D); }
  676. public double getGreaterImpactChance() { return config.getDouble("Skills.Axes.GreaterImpact.Chance", 25.0D); }
  677. public double getGreaterImpactModifier() { return config.getDouble("Skills.Axes.GreaterImpact.KnockbackModifier", 1.5D); }
  678. public double getGreaterImpactBonusDamage() { return config.getDouble("Skills.Axes.GreaterImpact.BonusDamage", 2.0D); }
  679. public int getArmorImpactIncreaseLevel() {
  680. int increaseLevel = config.getInt("Skills.Axes.ArmorImpact.IncreaseLevel", 5);
  681. if(mcMMO.isRetroModeEnabled())
  682. return increaseLevel * 10;
  683. return increaseLevel;
  684. }
  685. public double getImpactChance() { return config.getDouble("Skills.Axes.ArmorImpact.Chance", 25.0D); }
  686. public double getArmorImpactMaxDurabilityDamage() { return config.getDouble("Skills.Axes.ArmorImpact.MaxPercentageDurabilityDamage", 20.0D); }
  687. public double getSkullSplitterModifier() { return config.getDouble("Skills.Axes.SkullSplitter.DamageModifier", 2.0D); }
  688. /* EXCAVATION */
  689. //Nothing to configure, everything is already configurable in config.yml
  690. /* FISHING */
  691. //public int getFishingTierLevel(int rank) { return config.getInt("Skills.Fishing.Rank_Levels.Rank_" + rank); }
  692. public double getShakeChance(int rank) { return config.getDouble("Skills.Fishing.ShakeChance.Rank_" + rank); }
  693. public int getFishingVanillaXPModifier(int rank) { return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); }
  694. public int getFishermanDietRankChange() { return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); }
  695. /*public int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); }
  696. public int getMasterAnglerUnlockLevel() {return config.getInt("Skills.Fishing.MasterAngler.UnlockLevel", 125); }*/
  697. public double getMasterAnglerBoatModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BoatModifier", 2.0); }
  698. public double getMasterAnglerBiomeModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BiomeModifier", 2.0); }
  699. /* HERBALISM */
  700. public int getFarmerDietRankChange() { return config.getInt("Skills.Herbalism.FarmersDiet.RankChange", 200); }
  701. public int getGreenThumbStageChange() { return config.getInt("Skills.Herbalism.GreenThumb.StageChange", 200); }
  702. /* MINING */
  703. public int getBlastMiningRankLevel(int rank) { return config.getInt("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank); }
  704. public double getBlastDamageDecrease(int rank) { return config.getDouble("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank); }
  705. public double getOreBonus(int rank) { return config.getDouble("Skills.Mining.BlastMining.OreBonus.Rank_" + rank); }
  706. public double getDebrisReduction(int rank) { return config.getDouble("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank); }
  707. public int getDropMultiplier(int rank) { return config.getInt("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank); }
  708. public double getBlastRadiusModifier(int rank) { return config.getDouble("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank); }
  709. /* REPAIR */
  710. public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); }
  711. public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); }
  712. /* Arcane Forging */
  713. //public int getArcaneForgingRankLevel(int rank) { return config.getInt("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank); }
  714. public boolean getArcaneForgingEnchantLossEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", true); }
  715. public double getArcaneForgingKeepEnchantsChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); }
  716. public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.Downgrades_Enabled", true); }
  717. public double getArcaneForgingDowngradeChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Downgrades_Chance.Rank_" + rank); }
  718. /* SALVAGE */
  719. //public double getSalvageMaxPercentage() { return config.getDouble("Skills.Salvage.MaxPercentage", 100.0D); }
  720. //public int getSalvageMaxPercentageLevel() { return config.getInt("Skills.Salvage.MaxPercentageLevel", 1000); }
  721. public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); }
  722. public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); }
  723. //public int getArcaneSalvageRankLevel(int rank) { return config.getInt("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank); }
  724. public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank); }
  725. public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank); }
  726. /* SMELTING */
  727. public int getBurnModifierMaxLevel() { return config.getInt("Skills.Smelting.FuelEfficiency.MaxBonusLevel", 100); }
  728. public double getBurnTimeMultiplier() { return config.getDouble("Skills.Smelting.FuelEfficiency.Multiplier", 3.0D); }
  729. /*public int getFluxMiningUnlockLevel() { return config.getInt("Skills.Smelting.FluxMining.UnlockLevel", 250); }*/
  730. public double getFluxMiningChance() { return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); }
  731. public int getSmeltingRankLevel(int rank) { return config.getInt("Skills.Smelting.Rank_Levels.Rank_" + rank); }
  732. public int getSmeltingVanillaXPBoostMultiplier(int rank) { return config.getInt("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank); }
  733. /* SWORDS */
  734. public double getRuptureDamagePlayer() { return config.getDouble("Skills.Swords.Rupture.DamagePlayer", 1.0); }
  735. public double getRuptureDamageMobs() { return config.getDouble("Skills.Swords.Rupture.DamageMobs", 2.0); }
  736. public int getRuptureMaxTicks() { return config.getInt("Skills.Swords.Rupture.MaxTicks", 8); }
  737. public int getRuptureBaseTicks() { return config.getInt("Skills.Swords.Rupture.BaseTicks", 2); }
  738. public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); }
  739. public double getSerratedStrikesModifier() { return config.getDouble("Skills.Swords.SerratedStrikes.DamageModifier", 4.0D); }
  740. public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); }
  741. /* TAMING */
  742. //public int getGoreRuptureTicks() { return config.getInt("Skills.Taming.Gore.RuptureTicks", 2); }
  743. public double getGoreModifier() { return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); }
  744. /*public int getFastFoodUnlock() { return config.getInt("Skills.Taming.FastFood.UnlockLevel", 50); }*/
  745. public double getFastFoodChance() { return config.getDouble("Skills.Taming.FastFoodService.Chance", 50.0D); }
  746. public double getPummelChance() { return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); }
  747. //public int getEnviromentallyAwareUnlock() { return config.getInt("Skills.Taming.EnvironmentallyAware.UnlockLevel", 100); }
  748. /*public int getThickFurUnlock() { return config.getInt("Skills.Taming.ThickFur.UnlockLevel", 250); }*/
  749. public double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); }
  750. /*public int getHolyHoundUnlock() {return config.getInt("Skills.Taming.HolyHound.UnlockLevel", 375); }*/
  751. /*public int getShockProofUnlock() { return config.getInt("Skills.Taming.ShockProof.UnlockLevel", 500); }*/
  752. public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); }
  753. /*public int getSharpenedClawsUnlock() { return config.getInt("Skills.Taming.SharpenedClaws.UnlockLevel", 750); }*/
  754. public double getSharpenedClawsBonus() { return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); }
  755. public double getMinHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); }
  756. public double getMaxHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength", 2.0D); }
  757. /* UNARMED */
  758. public boolean getDisarmProtected() { return config.getBoolean("Skills.Unarmed.Disarm.AntiTheft", false); }
  759. /* WOODCUTTING */
  760. /*public int getLeafBlowUnlockLevel() { return config.getInt("Skills.Woodcutting.LeafBlower.UnlockLevel", 100); }*/
  761. /* KRAKEN STUFF */
  762. public boolean getKrakenEnabled() { return config.getBoolean("Kraken.Enabled", true); }
  763. public int getKrakenTriesBeforeRelease() { return config.getInt("Kraken.Tries_Before_Release", 50); }
  764. public double getKrakenHealth() { return config.getDouble("Kraken.Health", 50.0D); }
  765. public String getKrakenName() { return config.getString("Kraken.Name", "The Kraken"); }
  766. public int getKrakenAttackInterval() { return config.getInt("Kraken.Attack_Interval_Seconds", 1); }
  767. public double getKrakenAttackDamage() { return config.getDouble("Kraken.Attack_Damage", 1.0D); }
  768. public boolean getKrakenGlobalEffectsEnabled() { return config.getBoolean("Kraken.Global_Effects", false); }
  769. public boolean getKrakenEscapeAllowed() { return config.getBoolean("Kraken.Allow_Escaping", false); }
  770. public String getServerUnleashMessage() { return config.getString("Kraken.Unleashed_Message.Server", ""); }
  771. public String getPlayerUnleashMessage() { return config.getString("Kraken.Unleashed_Message.Player", ""); }
  772. public String getPlayerDefeatMessage() { return config.getString("Kraken.Defeated_Message.Killed", ""); }
  773. public String getPlayerEscapeMessage() { return config.getString("Kraken.Defeated_Message.Escape", ""); }
  774. }