2
0

AdvancedConfig.java 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  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 org.bukkit.ChatColor;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class AdvancedConfig extends ConfigValidated {
  10. public static final String SKILLS = "Skills";
  11. public static final String GENERAL = "General";
  12. public static final String ABILITY = "Ability";
  13. public static final String LENGTH = "Length";
  14. public static final String INCREASE_LEVEL = "IncreaseLevel";
  15. public static final String ENCHANT_BUFF = "EnchantBuff";
  16. public static final String ACROBATICS = "Acrobatics";
  17. public static final String DODGE = "Dodge";
  18. public static final String CHANCE = "Chance";
  19. public static final String CHANCE_MAX = CHANCE + "Max";
  20. public static final String BONUS = "Bonus";
  21. public static final String MAX_BONUS_LEVEL = "Max" + BONUS + "Level";
  22. public static final String MODIFIER = "Modifier";
  23. public static final String DAMAGE_MODIFIER = "Damage" + MODIFIER;
  24. public static final String DAMAGE_THRESHOLD = "DamageThreshold";
  25. public static final String ALCHEMY = "Alchemy";
  26. public static final String CATALYSIS = "Catalysis";
  27. public static final String MIN_SPEED = "MinSpeed";
  28. public static final String MAX_SPEED = "MaxSpeed";
  29. public static final String ARCHERY = "Archery";
  30. public static final String SKILL_SHOT = "SkillShot";
  31. public static final String MULTIPLIER = "Multiplier";
  32. public static final String RANK_DAMAGE_MULTIPLIER = "RankDamage" + MULTIPLIER;
  33. public static final String BONUS_DAMAGE = BONUS + "Damage";
  34. public static final String FORCE_MULTIPLIER = "Force" + MULTIPLIER;
  35. public static final String AXES = "Axes";
  36. public static final String STANDARD = "Standard";
  37. public static final String RETRO_MODE = "RetroMode";
  38. public static final String CAP_LEVEL = "CapLevel";
  39. public static final String KNOCKBACK_MODIFIER = "Knockback" + MODIFIER;
  40. public static final String PVP_MODIFIER = "PVP_" + MODIFIER;
  41. public static final String PVE_MODIFIER = "PVE_" + MODIFIER;
  42. public static final String FISHING = "Fishing";
  43. public static final String MASTER_ANGLER = "MasterAngler";
  44. public static final String BOAT_MODIFIER = "Boat" + MODIFIER;
  45. public static final String BIOME_MODIFIER = "Biome" + MODIFIER;
  46. public static final String XP = "XP";
  47. public static final String VANILLA_XPMULTIPLIER = "Vanilla" + XP + MULTIPLIER;
  48. public static final String RANK = "Rank_";
  49. public static final String TAMING = "Taming";
  50. public static final String CALL_OF_THE_WILD = "CallOfTheWild";
  51. public static final String MIN_HORSE_JUMP_STRENGTH = "MinHorseJumpStrength";
  52. public static final String MAX_HORSE_JUMP_STRENGTH = "MaxHorseJumpStrength";
  53. public static final String SHOCK_PROOF = "ShockProof";
  54. public static final String UNARMED = "Unarmed";
  55. public static final String STARTING_LEVEL = "StartingLevel";
  56. public static final String AXE_MASTERY = "AxeMastery";
  57. public static final String CRITICAL_STRIKES = "CriticalStrikes";
  58. public static final String GREATER_IMPACT = "GreaterImpact";
  59. public static final String ARMOR_IMPACT = "ArmorImpact";
  60. public static final String SKULL_SPLITTER = "SkullSplitter.";
  61. public static final String MAX_PERCENTAGE_DURABILITY_DAMAGE = "MaxPercentageDurabilityDamage";
  62. public static final String SHAKE = "Shake";
  63. public static final String MINING = "Mining";
  64. public static final String BLAST_MINING = "BlastMining";
  65. public static final String LEVELS = "Levels";
  66. public static final String BLAST_DAMAGE_DECREASE = "BlastDamageDecrease";
  67. public static final String ORE_BONUS = "Ore" + BONUS;
  68. public static final String DEBRIS_REDUCTION = "DebrisReduction";
  69. public static final String DROP_MULTIPLIER = "Drop" + MULTIPLIER;
  70. public static final String BLAST_RADIUS = "BlastRadius";
  71. public static final String REPAIR = "Repair";
  72. public static final String REPAIR_MASTERY = "RepairMastery";
  73. public static final String MAX_BONUS_PERCENTAGE = "Max" + BONUS + "Percentage";
  74. public static final String ARCANE_FORGING = "ArcaneForging";
  75. public static final String MAY_LOSE_ENCHANTS = "May_Lose_Enchants";
  76. public static final String KEEP_ENCHANTS = "Keep_Enchants_";
  77. public static final String DOWNGRADES = "Downgrades_";
  78. public static final String ENABLED = "Enabled";
  79. public static final String DOWNGRADES_ENABLED = DOWNGRADES + ENABLED;
  80. public static final String SALVAGE = "Salvage";
  81. public static final String ARCANE_SALVAGE = "ArcaneSalvage";
  82. public static final String ENCHANT_DOWNGRADE_ENABLED = "EnchantDowngrade" + ENABLED;
  83. public static final String ENCHANT_LOSS_ENABLED = "EnchantLoss" + ENABLED;
  84. public static final String EXTRACT_FULL_ENCHANT = "ExtractFullEnchant";
  85. public static final String EXTRACT_PARTIAL_ENCHANT = "ExtractPartialEnchant";
  86. public static final String SMELTING = "Smelting";
  87. public static final String FUEL_EFFICIENCY = "FuelEfficiency";
  88. public static final String FLUX = "Flux";
  89. public static final String SWORDS = "Swords";
  90. public static final String RUPTURE = "Rupture";
  91. public static final String DAMAGE_PLAYER = "DamagePlayer";
  92. public static final String DAMAGE_MOBS = "DamageMobs";
  93. public static final String MAX_TICKS = "MaxTicks";
  94. public static final String BASE_TICKS = "BaseTicks";
  95. public static final String COUNTER_ATTACK = "CounterAttack";
  96. public static final String SERRATED_STRIKES = "SerratedStrikes";
  97. public static final String TICKS = "Ticks";
  98. public static final String GORE = "Gore";
  99. public static final String FAST_FOOD = "FastFood";
  100. public static final String FAST_FOOD_SERVICE = FAST_FOOD + "Service";
  101. public static final String PUMMEL = "Pummel";
  102. public static final String THICK_FUR = "ThickFur";
  103. public static final String SHARPENED_CLAWS = "SharpenedClaws";
  104. public static final String DISARM = "Disarm";
  105. public static final String ANTI_THEFT = "AntiTheft";
  106. public static final String DAZE = "Daze";
  107. public static final String MAX_DAMAGE = "MaxDamage";
  108. public static final String ROLL = "Roll";
  109. public static final String GRACEFUL_ROLL = "Graceful" + ROLL;
  110. public static final String ARROW_DEFLECT = "ArrowDeflect";
  111. public static final String IRON_GRIP = "IronGrip";
  112. public static final String WOODCUTTING = "Woodcutting";
  113. public static final String HARVEST_LUMBER = "HarvestLumber";
  114. public static final String FEEDBACK = "Feedback";
  115. public static final String SKILL_COMMAND = "SkillCommand";
  116. public static final String BLANK_LINES_ABOVE_HEADER = "BlankLinesAboveHeader";
  117. public static final String ACTION_BAR_NOTIFICATIONS = "ActionBarNotifications";
  118. public static final String SEND_COPY_OF_MESSAGE_TO_CHAT = "SendCopyOfMessageToChat";
  119. public static final String EVENTS = "Events";
  120. public static final String SEND_TITLES = "SendTitles";
  121. //private static AdvancedConfig instance;
  122. public AdvancedConfig() {
  123. //super(mcMMO.getDataFolderPath().getAbsoluteFile(), "advanced.yml", true);
  124. super(mcMMO.p.getDataFolder().getAbsoluteFile(), "advanced.yml", true, true);
  125. }
  126. @Override
  127. public void unload() {
  128. //do nothing
  129. }
  130. /**
  131. * This grabs an instance of this config class from the Config Manager
  132. * This method is deprecated and will be removed in the future
  133. * @see mcMMO#getConfigManager()
  134. * @return the instance of this config
  135. * @deprecated Please use mcMMO.getConfigManager() to grab a specific config instead
  136. */
  137. @Deprecated
  138. public static AdvancedConfig getInstance() {
  139. return mcMMO.getConfigManager().getAdvancedConfig();
  140. }
  141. /**
  142. * The version of this config
  143. *
  144. * @return
  145. */
  146. @Override
  147. public double getConfigVersion() {
  148. return 1;
  149. }
  150. @Override
  151. public List<String> validateKeys() {
  152. // Validate all the settings!
  153. List<String> reason = new ArrayList<String>();
  154. /* GENERAL */
  155. if (getAbilityLength() < 1) {
  156. reason.add(SKILLS + "." + GENERAL + "." + ABILITY + "." + LENGTH + ".<mode>." + INCREASE_LEVEL + " should be at least 1!");
  157. }
  158. if (getEnchantBuff() < 1) {
  159. reason.add(SKILLS + "." + GENERAL + "." + ABILITY + "." + ENCHANT_BUFF + " should be at least 1!");
  160. }
  161. /* ACROBATICS */
  162. if (getMaximumProbability(SubSkillType.ACROBATICS_DODGE) < 1) {
  163. reason.add(SKILLS + "." + ACROBATICS + "." + DODGE + "." + CHANCE_MAX + " should be at least 1!");
  164. }
  165. if (getMaxBonusLevel(SubSkillType.ACROBATICS_DODGE) < 1) {
  166. reason.add(SKILLS + "." + ACROBATICS + "." + DODGE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  167. }
  168. if (getDodgeDamageModifier() <= 1) {
  169. reason.add(SKILLS + "." + ACROBATICS + "." + DODGE + "." + DAMAGE_MODIFIER + " should be greater than 1!");
  170. }
  171. if (getMaximumProbability(SubSkillType.ACROBATICS_ROLL) < 1) {
  172. reason.add(SKILLS + "." + ACROBATICS + "." + ROLL + "." + CHANCE_MAX + " should be at least 1!");
  173. }
  174. if (getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL) < 1) {
  175. reason.add(SKILLS + "." + ACROBATICS + "." + ROLL + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  176. }
  177. if (getRollDamageThreshold() < 0) {
  178. reason.add(SKILLS + "." + ACROBATICS + "." + ROLL + "." + DAMAGE_THRESHOLD + " should be at least 0!");
  179. }
  180. if (getGracefulRollDamageThreshold() < 0) {
  181. reason.add(SKILLS + "." + ACROBATICS + "." + GRACEFUL_ROLL + "." + DAMAGE_THRESHOLD + " should be at least 0!");
  182. }
  183. if (getCatalysisMinSpeed() <= 0) {
  184. reason.add(SKILLS + "." + ALCHEMY + "." + CATALYSIS + "." + MIN_SPEED + " must be greater than 0!");
  185. }
  186. if (getCatalysisMaxSpeed() < getCatalysisMinSpeed()) {
  187. reason.add(SKILLS + "." + ALCHEMY + "." + CATALYSIS + "." + MAX_SPEED + " should be at least Skills.Alchemy.Catalysis." + MIN_SPEED + "!");
  188. }
  189. /* ARCHERY */
  190. if (getSkillShotRankDamageMultiplier() <= 0) {
  191. reason.add(SKILLS + "." + ARCHERY + "." + SKILL_SHOT + "." + RANK_DAMAGE_MULTIPLIER + " should be greater than 0!");
  192. }
  193. if (getMaximumProbability(SubSkillType.ARCHERY_DAZE) < 1) {
  194. reason.add(SKILLS + "." + ARCHERY + "." + DAZE + "." + CHANCE_MAX + " should be at least 1!");
  195. }
  196. if (getMaxBonusLevel(SubSkillType.ARCHERY_DAZE) < 1) {
  197. reason.add(SKILLS + "." + ARCHERY + "." + DAZE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  198. }
  199. if (getDazeBonusDamage() < 0) {
  200. reason.add(SKILLS + "." + ARCHERY + "." + DAZE + "." + BONUS_DAMAGE + " should be at least 0!");
  201. }
  202. if (getMaximumProbability(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) {
  203. reason.add(SKILLS + "." + ARCHERY + ".Retrieve." + CHANCE_MAX + " should be at least 1!");
  204. }
  205. if (getMaxBonusLevel(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) {
  206. reason.add(SKILLS + "." + ARCHERY + ".Retrieve." + MAX_BONUS_LEVEL + " should be at least 1!");
  207. }
  208. if (getForceMultiplier() < 0) {
  209. reason.add(SKILLS + "." + ARCHERY + "." + FORCE_MULTIPLIER + " should be at least 0!");
  210. }
  211. /* AXES */
  212. if(getAxeMasteryRankDamageMultiplier() < 0)
  213. {
  214. reason.add(SKILLS + "." + AXES + "." + AXE_MASTERY + "." + RANK_DAMAGE_MULTIPLIER + " should be at least 0!");
  215. }
  216. if (getMaximumProbability(SubSkillType.AXES_CRITICAL_STRIKES) < 1) {
  217. reason.add(SKILLS + "." + AXES + ".CriticalHit." + CHANCE_MAX + " should be at least 1!");
  218. }
  219. if (getMaxBonusLevel(SubSkillType.AXES_CRITICAL_STRIKES) < 1) {
  220. reason.add(SKILLS + "." + AXES + ".CriticalHit." + MAX_BONUS_LEVEL + " should be at least 1!");
  221. }
  222. if (getCriticalStrikesPVPModifier() < 1) {
  223. reason.add(SKILLS + "." + AXES + "." + CRITICAL_STRIKES + "." + PVP_MODIFIER + " should be at least 1!");
  224. }
  225. if (getCriticalStrikesPVPModifier() < 1) {
  226. reason.add(SKILLS + "." + AXES + "." + CRITICAL_STRIKES + "." + PVE_MODIFIER + " should be at least 1!");
  227. }
  228. if (getGreaterImpactChance() < 1) {
  229. reason.add(SKILLS + "." + AXES + "." + GREATER_IMPACT + "." + CHANCE + " should be at least 1!");
  230. }
  231. if (getGreaterImpactModifier() < 1) {
  232. reason.add(SKILLS + "." + AXES + "." + GREATER_IMPACT + "." + KNOCKBACK_MODIFIER + " should be at least 1!");
  233. }
  234. if (getGreaterImpactBonusDamage() < 1) {
  235. reason.add(SKILLS + "." + AXES + "." + GREATER_IMPACT + "." + BONUS_DAMAGE + " should be at least 1!");
  236. }
  237. if (getArmorImpactIncreaseLevel() < 1) {
  238. reason.add(SKILLS + "." + AXES + "." + ARMOR_IMPACT + "." + INCREASE_LEVEL + " should be at least 1!");
  239. }
  240. if (getImpactChance() < 1) {
  241. reason.add(SKILLS + "." + AXES + "." + ARMOR_IMPACT + "." + CHANCE + " should be at least 1!");
  242. }
  243. if (getArmorImpactMaxDurabilityDamage() < 1) {
  244. reason.add(SKILLS + "." + AXES + "." + ARMOR_IMPACT + "." + MAX_PERCENTAGE_DURABILITY_DAMAGE + " should be at least 1!");
  245. }
  246. if (getSkullSplitterModifier() < 1) {
  247. reason.add(SKILLS + "." + AXES + "." + SKULL_SPLITTER + DAMAGE_MODIFIER + " should be at least 1!");
  248. }
  249. /*if (getFishermanDietRankChange() < 1) {
  250. reason.add(SKILLS + "." + FISHING + ".FishermansDiet.RankChange should be at least 1!");
  251. }*/
  252. if (getMasterAnglerBoatModifier() < 1) {
  253. reason.add(SKILLS + "." + FISHING + "." + MASTER_ANGLER + "." + BOAT_MODIFIER + " should be at least 1!");
  254. }
  255. if (getMasterAnglerBiomeModifier() < 1) {
  256. reason.add(SKILLS + "." + FISHING + "." + MASTER_ANGLER + "." + BIOME_MODIFIER + " should be at least 1!");
  257. }
  258. /* HERBALISM */
  259. /*if (getFarmerDietRankChange() < 1) {
  260. reason.add(SKILLS + ".Herbalism.FarmersDiet.RankChange should be at least 1!");
  261. }
  262. if (getGreenThumbStageChange() < 1) {
  263. reason.add(SKILLS + ".Herbalism.GreenThumb.StageChange should be at least 1!");
  264. }*/
  265. if (getMaximumProbability(SubSkillType.HERBALISM_GREEN_THUMB) < 1) {
  266. reason.add(SKILLS + ".Herbalism.GreenThumb." + CHANCE_MAX + " should be at least 1!");
  267. }
  268. if (getMaxBonusLevel(SubSkillType.HERBALISM_GREEN_THUMB) < 1) {
  269. reason.add(SKILLS + ".Herbalism.GreenThumb." + MAX_BONUS_LEVEL + " should be at least 1!");
  270. }
  271. if (getMaximumProbability(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) {
  272. reason.add(SKILLS + ".Herbalism.DoubleDrops." + CHANCE_MAX + " should be at least 1!");
  273. }
  274. if (getMaxBonusLevel(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) {
  275. reason.add(SKILLS + ".Herbalism.DoubleDrops." + MAX_BONUS_LEVEL + " should be at least 1!");
  276. }
  277. if (getMaximumProbability(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) {
  278. reason.add(SKILLS + ".Herbalism.HylianLuck." + CHANCE_MAX + " should be at least 1!");
  279. }
  280. if (getMaxBonusLevel(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) {
  281. reason.add(SKILLS + ".Herbalism.HylianLuck." + MAX_BONUS_LEVEL + " should be at least 1!");
  282. }
  283. if (getMaximumProbability(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) {
  284. reason.add(SKILLS + ".Herbalism.ShroomThumb." + CHANCE_MAX + " should be at least 1!");
  285. }
  286. if (getMaxBonusLevel(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) {
  287. reason.add(SKILLS + ".Herbalism.ShroomThumb." + MAX_BONUS_LEVEL + " should be at least 1!");
  288. }
  289. /* MINING */
  290. if (getMaximumProbability(SubSkillType.MINING_DOUBLE_DROPS) < 1) {
  291. reason.add(SKILLS + "." + MINING + ".DoubleDrops." + CHANCE_MAX + " should be at least 1!");
  292. }
  293. if (getMaxBonusLevel(SubSkillType.MINING_DOUBLE_DROPS) < 1) {
  294. reason.add(SKILLS + "." + MINING + ".DoubleDrops." + MAX_BONUS_LEVEL + " should be at least 1!");
  295. }
  296. /* REPAIR */
  297. if (getRepairMasteryMaxBonus() < 1) {
  298. reason.add(SKILLS + "." + REPAIR + "." + REPAIR_MASTERY + "." + MAX_BONUS_PERCENTAGE + " should be at least 1!");
  299. }
  300. if (getRepairMasteryMaxLevel() < 1) {
  301. reason.add(SKILLS + "." + REPAIR + "." + REPAIR_MASTERY + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  302. }
  303. if (getMaximumProbability(SubSkillType.REPAIR_SUPER_REPAIR) < 1) {
  304. reason.add(SKILLS + "." + REPAIR + ".SuperRepair." + CHANCE_MAX + " should be at least 1!");
  305. }
  306. if (getMaxBonusLevel(SubSkillType.REPAIR_SUPER_REPAIR) < 1) {
  307. reason.add(SKILLS + "." + REPAIR + ".SuperRepair." + MAX_BONUS_LEVEL + " should be at least 1!");
  308. }
  309. /* SMELTING */
  310. if (getBurnModifierMaxLevel() < 1) {
  311. reason.add(SKILLS + "." + SMELTING + "." + FUEL_EFFICIENCY + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  312. }
  313. if (getMaxBonusLevel(SubSkillType.SMELTING_SECOND_SMELT) < 1) {
  314. reason.add(SKILLS + "." + SMELTING + ".SecondSmelt." + MAX_BONUS_LEVEL + " should be at least 1!");
  315. }
  316. if (getMaximumProbability(SubSkillType.SMELTING_SECOND_SMELT) < 1) {
  317. reason.add(SKILLS + "." + SMELTING + ".SecondSmelt." + CHANCE_MAX + " should be at least 1!");
  318. }
  319. if (getFluxMiningChance() < 1) {
  320. reason.add(SKILLS + "." + SMELTING + "." + FLUX + MINING + "." + CHANCE + " should be at least 1!");
  321. }
  322. /* SWORDS */
  323. if (getMaximumProbability(SubSkillType.SWORDS_RUPTURE) < 1) {
  324. reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + CHANCE_MAX + " should be at least 1!");
  325. }
  326. if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) {
  327. reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  328. }
  329. if (getRuptureMaxTicks() < 1) {
  330. reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + MAX_TICKS + " should be at least 1!");
  331. }
  332. if (getRuptureMaxTicks() < getRuptureBaseTicks()) {
  333. reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + MAX_TICKS + " should be at least Skills.Swords.Rupture." + BASE_TICKS + "!");
  334. }
  335. if (getRuptureBaseTicks() < 1) {
  336. reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + BASE_TICKS + " should be at least 1!");
  337. }
  338. if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
  339. reason.add(SKILLS + "." + SWORDS + "." + COUNTER_ATTACK + "." + CHANCE_MAX + " should be at least 1!");
  340. }
  341. if (getMaxBonusLevel(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
  342. reason.add(SKILLS + "." + SWORDS + "." + COUNTER_ATTACK + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  343. }
  344. if (getCounterModifier() < 1) {
  345. reason.add(SKILLS + "." + SWORDS + "." + COUNTER_ATTACK + "." + DAMAGE_MODIFIER + " should be at least 1!");
  346. }
  347. if (getSerratedStrikesModifier() < 1) {
  348. reason.add(SKILLS + "." + SWORDS + "." + SERRATED_STRIKES + "." + DAMAGE_MODIFIER + " should be at least 1!");
  349. }
  350. if (getSerratedStrikesTicks() < 1) {
  351. reason.add(SKILLS + "." + SWORDS + "." + SERRATED_STRIKES + "." + RUPTURE + "Ticks should be at least 1!");
  352. }
  353. /* TAMING */
  354. if (getMaximumProbability(SubSkillType.TAMING_GORE) < 1) {
  355. reason.add(SKILLS + "." + TAMING + "." + GORE + "." + CHANCE_MAX + " should be at least 1!");
  356. }
  357. if (getMaxBonusLevel(SubSkillType.TAMING_GORE) < 1) {
  358. reason.add(SKILLS + "." + TAMING + "." + GORE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  359. }
  360. if (getGoreModifier() < 1) {
  361. reason.add(SKILLS + "." + TAMING + "." + GORE + "." + MODIFIER + " should be at least 1!");
  362. }
  363. if (getFastFoodChance() < 1) {
  364. reason.add(SKILLS + "." + TAMING + "." + FAST_FOOD + "." + CHANCE + " should be at least 1!");
  365. }
  366. if (getThickFurModifier() < 1) {
  367. reason.add(SKILLS + "." + TAMING + "." + THICK_FUR + "." + MODIFIER + " should be at least 1!");
  368. }
  369. if (getShockProofModifier() < 1) {
  370. reason.add(SKILLS + "." + TAMING + "." + SHOCK_PROOF + "." + MODIFIER + " should be at least 1!");
  371. }
  372. if (getSharpenedClawsBonus() < 1) {
  373. reason.add(SKILLS + "." + TAMING + "." + SHARPENED_CLAWS + "." + BONUS + " should be at least 1!");
  374. }
  375. if (getMaxHorseJumpStrength() < 0 || getMaxHorseJumpStrength() > 2) {
  376. reason.add(SKILLS + "." + TAMING + "." + CALL_OF_THE_WILD + "." + MAX_HORSE_JUMP_STRENGTH + " should be between 0 and 2!");
  377. }
  378. /* UNARMED */
  379. if (getMaximumProbability(SubSkillType.UNARMED_DISARM) < 1) {
  380. reason.add(SKILLS + "." + UNARMED + "." + DISARM + "." + CHANCE_MAX + " should be at least 1!");
  381. }
  382. if (getMaxBonusLevel(SubSkillType.UNARMED_DISARM) < 1) {
  383. reason.add(SKILLS + "." + UNARMED + "." + DISARM + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  384. }
  385. if (getMaximumProbability(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) {
  386. reason.add(SKILLS + "." + UNARMED + "." + ARROW_DEFLECT + "." + CHANCE_MAX + " should be at least 1!");
  387. }
  388. if (getMaxBonusLevel(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) {
  389. reason.add(SKILLS + "." + UNARMED + "." + ARROW_DEFLECT + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  390. }
  391. if (getMaximumProbability(SubSkillType.UNARMED_IRON_GRIP) < 1) {
  392. reason.add(SKILLS + "." + UNARMED + "." + IRON_GRIP + "." + CHANCE_MAX + " should be at least 1!");
  393. }
  394. if (getMaxBonusLevel(SubSkillType.UNARMED_IRON_GRIP) < 1) {
  395. reason.add(SKILLS + "." + UNARMED + "." + IRON_GRIP + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  396. }
  397. /* WOODCUTTING */
  398. /*if (getLeafBlowUnlockLevel() < 0) {
  399. reason.add("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!");
  400. }*/
  401. if (getMaximumProbability(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) {
  402. reason.add(SKILLS + "." + WOODCUTTING + "." + HARVEST_LUMBER + "." + CHANCE_MAX + " should be at least 1!");
  403. }
  404. if (getMaxBonusLevel(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) {
  405. reason.add(SKILLS + "." + WOODCUTTING + "." + HARVEST_LUMBER + "." + MAX_BONUS_LEVEL + " should be at least 1!");
  406. }
  407. return reason;
  408. }
  409. /* GENERAL */
  410. public int getStartingLevel() { return getIntValue(SKILLS, GENERAL, STARTING_LEVEL); }
  411. /**
  412. * This returns the maximum level at which superabilities will stop lengthening from scaling alongside skill level.
  413. * It returns a different value depending on whether or not the server is in retro mode
  414. * @return the level at which abilities stop increasing in length
  415. */
  416. public int getAbilityLengthCap() {
  417. if(!mcMMO.isRetroModeEnabled())
  418. return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, STANDARD, CAP_LEVEL);
  419. else
  420. return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, RETRO_MODE, CAP_LEVEL);
  421. }
  422. /**
  423. * This returns the frequency at which abilities will increase in length
  424. * It returns a different value depending on whether or not the server is in retro mode
  425. * @return the number of levels required per ability length increase
  426. */
  427. public int getAbilityLength() {
  428. if(!mcMMO.isRetroModeEnabled())
  429. return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, STANDARD, INCREASE_LEVEL);
  430. else
  431. return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, RETRO_MODE, INCREASE_LEVEL);
  432. }
  433. public int getEnchantBuff() { return getIntValue(SKILLS, GENERAL, ABILITY, ENCHANT_BUFF); }
  434. /**
  435. * Grabs the max bonus level for a skill used in RNG calculations
  436. * 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
  437. * A value of 10 in the file will be returned as 100 for retro mode servers to accommodate the change in scaling
  438. * @param subSkillType target subskill
  439. * @return the level at which this skills max benefits will be reached on the curve
  440. */
  441. public int getMaxBonusLevel(SubSkillType subSkillType) {
  442. String[] category = subSkillType.getAdvConfigAddress();
  443. if(!mcMMO.isRetroModeEnabled())
  444. return getIntValue(category[0], category[1], category[2], MAX_BONUS_LEVEL, STANDARD);
  445. else
  446. return getIntValue(category[0], category[1], category[2], MAX_BONUS_LEVEL, RETRO_MODE);
  447. }
  448. public int getMaxBonusLevel(AbstractSubSkill abstractSubSkill) {
  449. return getMaxBonusLevel(abstractSubSkill.getSubSkillType());
  450. }
  451. public double getMaximumProbability(SubSkillType subSkillType) {
  452. String[] category = subSkillType.getAdvConfigAddress();
  453. double maximumProbability = getDoubleValue(category[0], category[1], category[2], CHANCE_MAX);
  454. return maximumProbability;
  455. }
  456. public double getMaximumProbability(AbstractSubSkill abstractSubSkill)
  457. {
  458. return getMaximumProbability(abstractSubSkill.getSubSkillType());
  459. }
  460. /* Notification Settings */
  461. public boolean doesSkillCommandSendBlankLines()
  462. {
  463. return getBooleanValue(FEEDBACK, SKILL_COMMAND, BLANK_LINES_ABOVE_HEADER);
  464. }
  465. public boolean doesNotificationUseActionBar(NotificationType notificationType)
  466. {
  467. return getBooleanValue(FEEDBACK, ACTION_BAR_NOTIFICATIONS, notificationType.toString(), ENABLED);
  468. }
  469. public boolean doesNotificationSendCopyToChat(NotificationType notificationType)
  470. {
  471. return getBooleanValue(FEEDBACK, ACTION_BAR_NOTIFICATIONS, notificationType.toString(), SEND_COPY_OF_MESSAGE_TO_CHAT);
  472. }
  473. public boolean useTitlesForXPEvent()
  474. {
  475. return getBooleanValue(FEEDBACK, EVENTS, XP, SEND_TITLES);
  476. }
  477. private ChatColor getChatColorFromKey(String keyLocation) {
  478. String colorName = getStringValue(keyLocation);
  479. return getChatColor(colorName);
  480. }
  481. private ChatColor getChatColor(String configColor) {
  482. for (ChatColor chatColor : ChatColor.values()) {
  483. if (configColor.equalsIgnoreCase(chatColor.toString()))
  484. return chatColor;
  485. }
  486. //Invalid Color
  487. System.out.println("[mcMMO] " + configColor + " is an invalid color value");
  488. return ChatColor.WHITE;
  489. }
  490. /* ACROBATICS */
  491. public double getDodgeDamageModifier() { return getDoubleValue(SKILLS, ACROBATICS, DODGE, DAMAGE_MODIFIER); }
  492. public double getRollDamageThreshold() { return getDoubleValue(SKILLS, ACROBATICS, ROLL, DAMAGE_THRESHOLD); }
  493. public double getGracefulRollDamageThreshold() { return getDoubleValue(SKILLS, ACROBATICS, GRACEFUL_ROLL, DAMAGE_THRESHOLD); }
  494. /* ALCHEMY */
  495. public int getCatalysisMaxBonusLevel() { return getIntValue(SKILLS, ALCHEMY, CATALYSIS, MAX_BONUS_LEVEL); }
  496. public double getCatalysisMinSpeed() { return getDoubleValue(SKILLS, ALCHEMY, CATALYSIS, MIN_SPEED); }
  497. public double getCatalysisMaxSpeed() { return getDoubleValue(SKILLS, ALCHEMY, CATALYSIS, MAX_SPEED); }
  498. /* ARCHERY */
  499. public double getSkillShotRankDamageMultiplier() { return getDoubleValue(SKILLS, ARCHERY, SKILL_SHOT, RANK_DAMAGE_MULTIPLIER); }
  500. public double getSkillShotDamageMax() { return getDoubleValue(SKILLS, ARCHERY, SKILL_SHOT, MAX_DAMAGE); }
  501. public double getDazeBonusDamage() { return getDoubleValue(SKILLS, ARCHERY, DAZE, BONUS_DAMAGE); }
  502. public double getForceMultiplier() { return getDoubleValue(SKILLS, ARCHERY, FORCE_MULTIPLIER); }
  503. /* AXES */
  504. public double getAxeMasteryRankDamageMultiplier() { return getDoubleValue(SKILLS, AXES, AXE_MASTERY, RANK_DAMAGE_MULTIPLIER); }
  505. public double getCriticalStrikesPVPModifier() { return getDoubleValue(SKILLS, AXES, CRITICAL_STRIKES, PVP_MODIFIER); }
  506. public double getCriticalStrikesPVEModifier() { return getDoubleValue(SKILLS, AXES, CRITICAL_STRIKES, PVE_MODIFIER); }
  507. public double getGreaterImpactChance() { return getDoubleValue(SKILLS, AXES, GREATER_IMPACT, CHANCE); }
  508. public double getGreaterImpactModifier() { return getDoubleValue(SKILLS, AXES, GREATER_IMPACT, KNOCKBACK_MODIFIER); }
  509. public double getGreaterImpactBonusDamage() { return getDoubleValue(SKILLS, AXES, GREATER_IMPACT, BONUS_DAMAGE); }
  510. public int getArmorImpactIncreaseLevel() {
  511. int increaseLevel = getIntValue(SKILLS, AXES, ARMOR_IMPACT, INCREASE_LEVEL);
  512. if(mcMMO.isRetroModeEnabled())
  513. return increaseLevel * 10;
  514. return increaseLevel;
  515. }
  516. public double getImpactChance() { return getDoubleValue(SKILLS, AXES, ARMOR_IMPACT, CHANCE); }
  517. public double getArmorImpactMaxDurabilityDamage() { return getDoubleValue(SKILLS, AXES, ARMOR_IMPACT, MAX_PERCENTAGE_DURABILITY_DAMAGE); }
  518. public double getSkullSplitterModifier() { return getDoubleValue(SKILLS, AXES, SKULL_SPLITTER, DAMAGE_MODIFIER); }
  519. /* EXCAVATION */
  520. //Nothing to configure, everything is already configurable in config.yml
  521. /* FISHING */
  522. public double getShakeChance(int rank) { return getDoubleValue(SKILLS, FISHING, SHAKE, CHANCE, RANK, String.valueOf(rank)); }
  523. public int getFishingVanillaXPModifier(int rank) { return getIntValue(SKILLS, FISHING, VANILLA_XPMULTIPLIER, RANK, String.valueOf(rank)); }
  524. public double getMasterAnglerBoatModifier() {return getDoubleValue(SKILLS, FISHING, MASTER_ANGLER, BOAT_MODIFIER); }
  525. public double getMasterAnglerBiomeModifier() {return getDoubleValue(SKILLS, FISHING, MASTER_ANGLER, BIOME_MODIFIER); }
  526. /* HERBALISM */
  527. //public int getFarmerDietRankChange() { return getIntValue(SKILLS, ".Herbalism.FarmersDiet.RankChange"); }
  528. //public int getGreenThumbStageChange() { return getIntValue(SKILLS, ".Herbalism.GreenThumb.StageChange"); }
  529. /* MINING */
  530. public boolean getDoubleDropSilkTouchEnabled() { return getBooleanValue(SKILLS, MINING, "DoubleDrops", "SilkTouch"); }
  531. public int getBlastMiningRankLevel(int rank) { return getIntValue(SKILLS, MINING, BLAST_MINING, RANK, LEVELS, RANK, String.valueOf(rank)); }
  532. public double getBlastDamageDecrease(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, BLAST_DAMAGE_DECREASE, RANK, String.valueOf(rank)); }
  533. public double getOreBonus(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, ORE_BONUS, RANK, String.valueOf(rank)); }
  534. public double getDebrisReduction(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, DEBRIS_REDUCTION, RANK, String.valueOf(rank)); }
  535. public int getDropMultiplier(int rank) { return getIntValue(SKILLS, MINING, BLAST_MINING, DROP_MULTIPLIER, RANK, String.valueOf(rank)); }
  536. public double getBlastRadiusModifier(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, BLAST_RADIUS, MODIFIER, RANK, String.valueOf(rank)); }
  537. /* REPAIR */
  538. public double getRepairMasteryMaxBonus() { return getDoubleValue(SKILLS, REPAIR, REPAIR_MASTERY, MAX_BONUS_PERCENTAGE); }
  539. public int getRepairMasteryMaxLevel() { return getIntValue(SKILLS, REPAIR, REPAIR_MASTERY, MAX_BONUS_LEVEL); }
  540. /* Arcane Forging */
  541. public boolean getArcaneForgingEnchantLossEnabled() { return getBooleanValue(SKILLS, REPAIR, ARCANE_FORGING, MAY_LOSE_ENCHANTS); }
  542. public double getArcaneForgingKeepEnchantsChance(int rank) { return getDoubleValue(SKILLS, REPAIR, ARCANE_FORGING, KEEP_ENCHANTS, CHANCE, RANK, String.valueOf(rank)); }
  543. public boolean getArcaneForgingDowngradeEnabled() { return getBooleanValue(SKILLS, REPAIR, ARCANE_FORGING, DOWNGRADES_ENABLED); }
  544. public double getArcaneForgingDowngradeChance(int rank) { return getDoubleValue(SKILLS, REPAIR, ARCANE_FORGING, DOWNGRADES, CHANCE, RANK, String.valueOf(rank)); }
  545. /* SALVAGE */
  546. public boolean getArcaneSalvageEnchantDowngradeEnabled() { return getBooleanValue(SKILLS, SALVAGE, ARCANE_SALVAGE, ENCHANT_DOWNGRADE_ENABLED); }
  547. public boolean getArcaneSalvageEnchantLossEnabled() { return getBooleanValue(SKILLS, SALVAGE, ARCANE_SALVAGE, ENCHANT_LOSS_ENABLED); }
  548. public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return getDoubleValue(SKILLS, SALVAGE, ARCANE_SALVAGE, EXTRACT_FULL_ENCHANT, RANK, String.valueOf(rank)); }
  549. public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return getDoubleValue(SKILLS, SALVAGE, ARCANE_SALVAGE, EXTRACT_PARTIAL_ENCHANT, RANK, String.valueOf(rank)); }
  550. /* SMELTING */
  551. public int getBurnModifierMaxLevel() { return getIntValue(SKILLS, SMELTING, FUEL_EFFICIENCY, MAX_BONUS_LEVEL); }
  552. public double getBurnTimeMultiplier() { return getDoubleValue(SKILLS, SMELTING, FUEL_EFFICIENCY, MULTIPLIER); }
  553. public double getFluxMiningChance() { return getDoubleValue(SKILLS, SMELTING, FLUX, MINING, CHANCE); }
  554. public int getSmeltingRankLevel(int rank) { return getIntValue(SKILLS, SMELTING, RANK, LEVELS, RANK, String.valueOf(rank)); }
  555. public int getSmeltingVanillaXPBoostMultiplier(int rank) { return getIntValue(SKILLS, SMELTING, VANILLA_XPMULTIPLIER, RANK, String.valueOf(rank)); }
  556. /* SWORDS */
  557. public double getRuptureDamagePlayer() { return getDoubleValue(SKILLS, SWORDS, RUPTURE, DAMAGE_PLAYER); }
  558. public double getRuptureDamageMobs() { return getDoubleValue(SKILLS, SWORDS, RUPTURE, DAMAGE_MOBS); }
  559. public int getRuptureMaxTicks() { return getIntValue(SKILLS, SWORDS, RUPTURE, MAX_TICKS); }
  560. public int getRuptureBaseTicks() { return getIntValue(SKILLS, SWORDS, RUPTURE, BASE_TICKS); }
  561. public double getCounterModifier() { return getDoubleValue(SKILLS, SWORDS, COUNTER_ATTACK, DAMAGE_MODIFIER); }
  562. public double getSerratedStrikesModifier() { return getDoubleValue(SKILLS, SWORDS, SERRATED_STRIKES, DAMAGE_MODIFIER); }
  563. public int getSerratedStrikesTicks() { return getIntValue(SKILLS, SWORDS, SERRATED_STRIKES, RUPTURE, TICKS); }
  564. /* TAMING */
  565. public double getGoreModifier() { return getDoubleValue(SKILLS, TAMING, GORE, MODIFIER); }
  566. public double getFastFoodChance() { return getDoubleValue(SKILLS, TAMING, FAST_FOOD_SERVICE, CHANCE); }
  567. public double getPummelChance() { return getDoubleValue(SKILLS, TAMING, PUMMEL, CHANCE); }
  568. public double getThickFurModifier() { return getDoubleValue(SKILLS, TAMING, THICK_FUR, MODIFIER); }
  569. public double getShockProofModifier() { return getDoubleValue(SKILLS, TAMING, SHOCK_PROOF, MODIFIER); }
  570. public double getSharpenedClawsBonus() { return getDoubleValue(SKILLS, TAMING, SHARPENED_CLAWS, BONUS); }
  571. public double getMinHorseJumpStrength() { return getDoubleValue(SKILLS, TAMING, CALL_OF_THE_WILD, MIN_HORSE_JUMP_STRENGTH); }
  572. public double getMaxHorseJumpStrength() { return getDoubleValue(SKILLS, TAMING, CALL_OF_THE_WILD, MAX_HORSE_JUMP_STRENGTH); }
  573. /* UNARMED */
  574. public boolean getDisarmProtected() { return getBooleanValue(SKILLS, UNARMED, DISARM, ANTI_THEFT); }
  575. /* WOODCUTTING */
  576. }