AdvancedConfig.java 35 KB

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