AdvancedConfig.java 46 KB

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