Skills.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /*
  2. This file is part of mcMMO.
  3. mcMMO is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. mcMMO is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with mcMMO. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. package com.gmail.nossr50.skills;
  15. import java.util.logging.Logger;
  16. import org.bukkit.Bukkit;
  17. import org.bukkit.ChatColor;
  18. import org.bukkit.entity.Entity;
  19. import org.bukkit.entity.Player;
  20. import org.bukkit.inventory.ItemStack;
  21. import org.getspout.spoutapi.SpoutManager;
  22. import org.getspout.spoutapi.player.SpoutPlayer;
  23. import com.gmail.nossr50.Leaderboard;
  24. import com.gmail.nossr50.Users;
  25. import com.gmail.nossr50.m;
  26. import com.gmail.nossr50.mcMMO;
  27. import com.gmail.nossr50.mcPermissions;
  28. import com.gmail.nossr50.config.LoadProperties;
  29. import com.gmail.nossr50.spout.SpoutStuff;
  30. import com.gmail.nossr50.datatypes.PlayerProfile;
  31. import com.gmail.nossr50.datatypes.PlayerStat;
  32. import com.gmail.nossr50.datatypes.SkillType;
  33. import com.gmail.nossr50.events.McMMOPlayerLevelUpEvent;
  34. import com.gmail.nossr50.locale.mcLocale;
  35. public class Skills
  36. {
  37. protected static final Logger log = Logger.getLogger("Minecraft");
  38. public void updateSQLfromFile(Player player){
  39. }
  40. public static boolean cooldownOver(Player player, long oldTime, int cooldown){
  41. long currentTime = System.currentTimeMillis();
  42. if(currentTime - oldTime >= (cooldown * 1000)){
  43. return true;
  44. } else {
  45. return false;
  46. }
  47. }
  48. public boolean hasArrows(Player player){
  49. for(ItemStack x : player.getInventory().getContents()){
  50. if (x.getTypeId() == 262){
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56. public void addArrows(Player player){
  57. for(ItemStack x : player.getInventory().getContents()){
  58. if (x.getTypeId() == 262){
  59. x.setAmount(x.getAmount() + 1);
  60. return;
  61. }
  62. }
  63. }
  64. public static int calculateTimeLeft(Player player, long deactivatedTimeStamp, int cooldown)
  65. {
  66. return (int) (((deactivatedTimeStamp + (cooldown * 1000)) - System.currentTimeMillis())/1000);
  67. }
  68. public static void watchCooldowns(Player player){
  69. PlayerProfile PP = Users.getProfile(player);
  70. if(!PP.getGreenTerraInformed() && System.currentTimeMillis() - (PP.getGreenTerraDeactivatedTimeStamp()*1000) >= (LoadProperties.greenTerraCooldown * 1000)){
  71. PP.setGreenTerraInformed(true);
  72. player.sendMessage(mcLocale.getString("Skills.YourGreenTerra"));
  73. }
  74. if(!PP.getTreeFellerInformed() && System.currentTimeMillis() - (PP.getTreeFellerDeactivatedTimeStamp()*1000) >= (LoadProperties.greenTerraCooldown * 1000)){
  75. PP.setTreeFellerInformed(true);
  76. player.sendMessage(mcLocale.getString("Skills.YourTreeFeller"));
  77. }
  78. if(!PP.getSuperBreakerInformed() && System.currentTimeMillis() - (PP.getSuperBreakerDeactivatedTimeStamp()*1000) >= (LoadProperties.superBreakerCooldown * 1000)){
  79. PP.setSuperBreakerInformed(true);
  80. player.sendMessage(mcLocale.getString("Skills.YourSuperBreaker"));
  81. }
  82. if(!PP.getSerratedStrikesInformed() && System.currentTimeMillis() - (PP.getSerratedStrikesDeactivatedTimeStamp()*1000) >= (LoadProperties.serratedStrikeCooldown * 1000)){
  83. PP.setSerratedStrikesInformed(true);
  84. player.sendMessage(mcLocale.getString("Skills.YourSerratedStrikes"));
  85. }
  86. if(!PP.getBerserkInformed() && System.currentTimeMillis() - (PP.getBerserkDeactivatedTimeStamp()*1000) >= (LoadProperties.berserkCooldown * 1000)){
  87. PP.setBerserkInformed(true);
  88. player.sendMessage(mcLocale.getString("Skills.YourBerserk"));
  89. }
  90. if(!PP.getSkullSplitterInformed() && System.currentTimeMillis() - (PP.getSkullSplitterDeactivatedTimeStamp()*1000) >= (LoadProperties.skullSplitterCooldown * 1000)){
  91. PP.setSkullSplitterInformed(true);
  92. player.sendMessage(mcLocale.getString("Skills.YourSkullSplitter"));
  93. }
  94. if(!PP.getGigaDrillBreakerInformed() && System.currentTimeMillis() - (PP.getGigaDrillBreakerDeactivatedTimeStamp()*1000) >= (LoadProperties.gigaDrillBreakerCooldown * 1000)){
  95. PP.setGigaDrillBreakerInformed(true);
  96. player.sendMessage(mcLocale.getString("Skills.YourGigaDrillBreaker"));
  97. }
  98. }
  99. public static void hoeReadinessCheck(Player player)
  100. {
  101. if(LoadProperties.enableOnlyActivateWhenSneaking && !player.isSneaking())
  102. return;
  103. PlayerProfile PP = Users.getProfile(player);
  104. if(mcPermissions.getInstance().herbalismAbility(player) && m.isHoe(player.getItemInHand()) && !PP.getHoePreparationMode()){
  105. if(!PP.getGreenTerraMode() && !cooldownOver(player, (PP.getGreenTerraDeactivatedTimeStamp()*1000), LoadProperties.greenTerraCooldown)){
  106. player.sendMessage(mcLocale.getString("Skills.TooTired")
  107. +ChatColor.YELLOW+" ("+calculateTimeLeft(player, (PP.getGreenTerraDeactivatedTimeStamp()*1000), LoadProperties.greenTerraCooldown)+"s)");
  108. return;
  109. }
  110. if(LoadProperties.enableAbilityMessages)
  111. player.sendMessage(mcLocale.getString("Skills.ReadyHoe"));
  112. PP.setHoePreparationATS(System.currentTimeMillis());
  113. PP.setHoePreparationMode(true);
  114. }
  115. }
  116. public static void monitorSkills(Player player){
  117. PlayerProfile PP = Users.getProfile(player);
  118. if(PP != null)
  119. {
  120. if(PP.getHoePreparationMode() && System.currentTimeMillis() - (PP.getHoePreparationATS()*1000) >= 4000){
  121. PP.setHoePreparationMode(false);
  122. player.sendMessage(mcLocale.getString("Skills.LowerHoe"));
  123. }
  124. if(PP.getAxePreparationMode() && System.currentTimeMillis() - (PP.getAxePreparationATS()*1000) >= 4000){
  125. PP.setAxePreparationMode(false);
  126. player.sendMessage(mcLocale.getString("Skills.LowerAxe"));
  127. }
  128. if(PP.getPickaxePreparationMode() && System.currentTimeMillis() - (PP.getPickaxePreparationATS()*1000) >= 4000){
  129. PP.setPickaxePreparationMode(false);
  130. player.sendMessage(mcLocale.getString("Skills.LowerPickAxe"));
  131. }
  132. if(PP.getSwordsPreparationMode() && System.currentTimeMillis() - (PP.getSwordsPreparationATS()*1000) >= 4000){
  133. PP.setSwordsPreparationMode(false);
  134. player.sendMessage(mcLocale.getString("Skills.LowerSword"));
  135. }
  136. if(PP.getFistsPreparationMode() && System.currentTimeMillis() - (PP.getFistsPreparationATS()*1000) >= 4000){
  137. PP.setFistsPreparationMode(false);
  138. player.sendMessage(mcLocale.getString("Skills.LowerFists"));
  139. }
  140. if(PP.getShovelPreparationMode() && System.currentTimeMillis() - (PP.getShovelPreparationATS()*1000) >= 4000){
  141. PP.setShovelPreparationMode(false);
  142. player.sendMessage(mcLocale.getString("Skills.LowerShovel"));
  143. }
  144. /*
  145. * HERBALISM ABILITY
  146. */
  147. if(mcPermissions.getInstance().herbalismAbility(player)){
  148. if(PP.getGreenTerraMode() && (PP.getGreenTerraDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  149. PP.setGreenTerraMode(false);
  150. PP.setGreenTerraInformed(false);
  151. player.sendMessage(mcLocale.getString("Skills.GreenTerraOff"));
  152. }
  153. }
  154. /*
  155. * AXES ABILITY
  156. */
  157. if(mcPermissions.getInstance().axesAbility(player)){
  158. if(PP.getSkullSplitterMode() && (PP.getSkullSplitterDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  159. PP.setSkullSplitterMode(false);
  160. PP.setSkullSplitterInformed(false);
  161. player.sendMessage(mcLocale.getString("Skills.SkullSplitterOff"));
  162. }
  163. }
  164. /*
  165. * WOODCUTTING ABILITY
  166. */
  167. if(mcPermissions.getInstance().woodCuttingAbility(player)){
  168. if(PP.getTreeFellerMode() && (PP.getTreeFellerDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  169. PP.setTreeFellerMode(false);
  170. PP.setTreeFellerInformed(false);
  171. player.sendMessage(mcLocale.getString("Skills.TreeFellerOff"));
  172. }
  173. }
  174. /*
  175. * MINING ABILITY
  176. */
  177. if(mcPermissions.getInstance().miningAbility(player)){
  178. if(PP.getSuperBreakerMode() && (PP.getSuperBreakerDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  179. PP.setSuperBreakerMode(false);
  180. PP.setSuperBreakerInformed(false);
  181. player.sendMessage(mcLocale.getString("Skills.SuperBreakerOff"));
  182. }
  183. }
  184. /*
  185. * EXCAVATION ABILITY
  186. */
  187. if(mcPermissions.getInstance().excavationAbility(player)){
  188. if(PP.getGigaDrillBreakerMode() && (PP.getGigaDrillBreakerDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  189. PP.setGigaDrillBreakerMode(false);
  190. PP.setGigaDrillBreakerInformed(false);
  191. player.sendMessage(mcLocale.getString("Skills.GigaDrillBreakerOff"));
  192. }
  193. }
  194. /*
  195. * SWORDS ABILITY
  196. */
  197. if(mcPermissions.getInstance().swordsAbility(player)){
  198. if(PP.getSerratedStrikesMode() && (PP.getSerratedStrikesDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  199. PP.setSerratedStrikesMode(false);
  200. PP.setSerratedStrikesInformed(false);
  201. player.sendMessage(mcLocale.getString("Skills.SerratedStrikesOff"));
  202. }
  203. }
  204. /*
  205. * UNARMED ABILITY
  206. */
  207. if(mcPermissions.getInstance().unarmedAbility(player)){
  208. if(PP.getBerserkMode() && (PP.getBerserkDeactivatedTimeStamp()*1000) <= System.currentTimeMillis()){
  209. PP.setBerserkMode(false);
  210. PP.setBerserkInformed(false);
  211. player.sendMessage(mcLocale.getString("Skills.BerserkOff"));
  212. }
  213. }
  214. }
  215. }
  216. public static void abilityActivationCheck(Player player)
  217. {
  218. if(LoadProperties.enableOnlyActivateWhenSneaking && !player.isSneaking())
  219. return;
  220. PlayerProfile PP = Users.getProfile(player);
  221. if(PP != null)
  222. {
  223. if(!PP.getAbilityUse() || PP.getSuperBreakerMode() || PP.getSerratedStrikesMode() || PP.getTreeFellerMode() || PP.getGreenTerraMode() || PP.getBerserkMode() || PP.getGigaDrillBreakerMode())
  224. return;
  225. if(mcPermissions.getInstance().miningAbility(player) && m.isMiningPick(player.getItemInHand()) && !PP.getPickaxePreparationMode())
  226. {
  227. if(!PP.getSuperBreakerMode() && !cooldownOver(player, (PP.getSuperBreakerDeactivatedTimeStamp()*1000), LoadProperties.superBreakerCooldown))
  228. {
  229. player.sendMessage(mcLocale.getString("Skills.TooTired")
  230. +ChatColor.YELLOW+" ("+calculateTimeLeft(player, (PP.getSuperBreakerDeactivatedTimeStamp()*1000), LoadProperties.superBreakerCooldown)+"s)");
  231. return;
  232. }
  233. if(LoadProperties.enableAbilityMessages)
  234. player.sendMessage(mcLocale.getString("Skills.ReadyPickAxe"));
  235. PP.setPickaxePreparationATS(System.currentTimeMillis());
  236. PP.setPickaxePreparationMode(true);
  237. }
  238. if(mcPermissions.getInstance().excavationAbility(player) && m.isShovel(player.getItemInHand()) && !PP.getShovelPreparationMode())
  239. {
  240. if(!PP.getGigaDrillBreakerMode() && !cooldownOver(player, (PP.getGigaDrillBreakerDeactivatedTimeStamp()*1000), LoadProperties.gigaDrillBreakerCooldown))
  241. {
  242. player.sendMessage(mcLocale.getString("Skills.TooTired")
  243. +ChatColor.YELLOW+" ("+calculateTimeLeft(player, (PP.getGigaDrillBreakerDeactivatedTimeStamp()*1000), LoadProperties.gigaDrillBreakerCooldown)+"s)");
  244. return;
  245. }
  246. if(LoadProperties.enableAbilityMessages)
  247. player.sendMessage(mcLocale.getString("Skills.ReadyShovel"));
  248. PP.setShovelPreparationATS(System.currentTimeMillis());
  249. PP.setShovelPreparationMode(true);
  250. }
  251. if(mcPermissions.getInstance().swordsAbility(player) && m.isSwords(player.getItemInHand()) && !PP.getSwordsPreparationMode())
  252. {
  253. if(!PP.getSerratedStrikesMode() && !cooldownOver(player, (PP.getSerratedStrikesDeactivatedTimeStamp()*1000), LoadProperties.serratedStrikeCooldown))
  254. {
  255. player.sendMessage(mcLocale.getString("Skills.TooTired")
  256. +ChatColor.YELLOW+" ("+calculateTimeLeft(player, (PP.getSerratedStrikesDeactivatedTimeStamp()*1000), LoadProperties.serratedStrikeCooldown)+"s)");
  257. return;
  258. }
  259. if(LoadProperties.enableAbilityMessages)
  260. player.sendMessage(mcLocale.getString("Skills.ReadySword"));
  261. PP.setSwordsPreparationATS(System.currentTimeMillis());
  262. PP.setSwordsPreparationMode(true);
  263. }
  264. if(mcPermissions.getInstance().unarmedAbility(player) && player.getItemInHand().getTypeId() == 0 && !PP.getFistsPreparationMode())
  265. {
  266. if(!PP.getBerserkMode() && !cooldownOver(player, (PP.getBerserkDeactivatedTimeStamp()*1000), LoadProperties.berserkCooldown))
  267. {
  268. player.sendMessage(mcLocale.getString("Skills.TooTired")
  269. +ChatColor.YELLOW+" ("+calculateTimeLeft(player, (PP.getBerserkDeactivatedTimeStamp()*1000), LoadProperties.berserkCooldown)+"s)");
  270. return;
  271. }
  272. if(LoadProperties.enableAbilityMessages)
  273. player.sendMessage(mcLocale.getString("Skills.ReadyFists"));
  274. PP.setFistsPreparationATS(System.currentTimeMillis());
  275. PP.setFistsPreparationMode(true);
  276. }
  277. if((mcPermissions.getInstance().axesAbility(player) || mcPermissions.getInstance().woodCuttingAbility(player)) && !PP.getAxePreparationMode())
  278. {
  279. if(m.isAxes(player.getItemInHand()))
  280. {
  281. if(LoadProperties.enableAbilityMessages)
  282. player.sendMessage(mcLocale.getString("Skills.ReadyAxe"));
  283. PP.setAxePreparationATS(System.currentTimeMillis());
  284. PP.setAxePreparationMode(true);
  285. }
  286. }
  287. }
  288. }
  289. public static void ProcessLeaderboardUpdate(SkillType skillType, Player player)
  290. {
  291. PlayerProfile PP = Users.getProfile(player);
  292. PlayerStat ps = new PlayerStat();
  293. if(skillType != SkillType.ALL)
  294. ps.statVal = PP.getSkillLevel(skillType);
  295. else
  296. ps.statVal = m.getPowerLevel(player);
  297. ps.name = player.getName();
  298. Leaderboard.updateLeaderboard(ps, skillType);
  299. }
  300. public static void XpCheckSkill(SkillType skillType, Player player)
  301. {
  302. PlayerProfile PP = Users.getProfile(player);
  303. if(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
  304. {
  305. int skillups = 0;
  306. while(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
  307. {
  308. skillups++;
  309. PP.removeXP(skillType, PP.getXpToLevel(skillType));
  310. PP.skillUp(skillType, 1);
  311. McMMOPlayerLevelUpEvent eventToFire = new McMMOPlayerLevelUpEvent(player, skillType);
  312. Bukkit.getPluginManager().callEvent(eventToFire);
  313. }
  314. if(!LoadProperties.useMySQL)
  315. {
  316. ProcessLeaderboardUpdate(skillType, player);
  317. ProcessLeaderboardUpdate(SkillType.ALL, player);
  318. }
  319. String capitalized = m.getCapitalized(skillType.toString());
  320. //Contrib stuff
  321. if(LoadProperties.spoutEnabled && player instanceof SpoutPlayer)
  322. {
  323. SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
  324. if(sPlayer.isSpoutCraftEnabled())
  325. {
  326. SpoutStuff.levelUpNotification(skillType, sPlayer);
  327. } else
  328. {
  329. player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
  330. }
  331. }
  332. else
  333. player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
  334. }
  335. if(LoadProperties.xpbar && LoadProperties.spoutEnabled)
  336. {
  337. SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
  338. if(sPlayer.isSpoutCraftEnabled())
  339. {
  340. SpoutStuff.updateXpBar(sPlayer);
  341. }
  342. }
  343. }
  344. public static void XpCheckAll(Player player)
  345. {
  346. for(SkillType x : SkillType.values())
  347. {
  348. //Don't want to do anything with this one
  349. if(x == SkillType.ALL)
  350. continue;
  351. XpCheckSkill(x, player);
  352. }
  353. }
  354. public static SkillType getSkillType(String skillName)
  355. {
  356. for(SkillType x : SkillType.values())
  357. {
  358. if(x.toString().equals(skillName.toUpperCase()))
  359. return x;
  360. }
  361. return null;
  362. }
  363. public static boolean isSkill(String skillname){
  364. skillname = skillname.toUpperCase();
  365. for(SkillType x : SkillType.values())
  366. {
  367. if(x.toString().equals(skillname))
  368. return true;
  369. }
  370. return false;
  371. }
  372. public static void arrowRetrievalCheck(Entity entity, mcMMO plugin)
  373. {
  374. if(plugin.misc.arrowTracker.containsKey(entity))
  375. {
  376. Integer x = 0;
  377. while(x < plugin.misc.arrowTracker.get(entity))
  378. {
  379. m.mcDropItem(entity.getLocation(), 262);
  380. x++;
  381. }
  382. }
  383. plugin.misc.arrowTracker.remove(entity);
  384. }
  385. public static String getSkillStats(String skillname, Integer level, Integer XP, Integer XPToLevel)
  386. {
  387. ChatColor parColor = ChatColor.DARK_AQUA;
  388. ChatColor xpColor = ChatColor.GRAY;
  389. ChatColor LvlColor = ChatColor.GREEN;
  390. ChatColor skillColor = ChatColor.YELLOW;
  391. return skillColor+skillname+LvlColor+level+parColor+" XP"+"("+xpColor+XP+parColor+"/"+xpColor+XPToLevel+parColor+")";
  392. }
  393. public static boolean hasCombatSkills(Player player)
  394. {
  395. if(mcPermissions.getInstance().axes(player) || mcPermissions.getInstance().archery(player) || mcPermissions.getInstance().swords(player) || mcPermissions.getInstance().taming(player) || mcPermissions.getInstance().unarmed(player))
  396. return true;
  397. else
  398. return false;
  399. }
  400. public static boolean hasGatheringSkills(Player player)
  401. {
  402. if(mcPermissions.getInstance().excavation(player) || mcPermissions.getInstance().herbalism(player) || mcPermissions.getInstance().mining(player) || mcPermissions.getInstance().woodcutting(player))
  403. return true;
  404. else
  405. return false;
  406. }
  407. public static boolean hasMiscSkills(Player player)
  408. {
  409. if(mcPermissions.getInstance().acrobatics(player) || mcPermissions.getInstance().repair(player))
  410. return true;
  411. else
  412. return false;
  413. }
  414. }