Skills.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. package com.gmail.nossr50.skills;
  2. import java.util.logging.Logger;
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.ChatColor;
  5. import org.bukkit.block.Block;
  6. import org.bukkit.enchantments.Enchantment;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.inventory.ItemStack;
  9. import org.getspout.spoutapi.SpoutManager;
  10. import org.getspout.spoutapi.player.SpoutPlayer;
  11. import com.gmail.nossr50.Leaderboard;
  12. import com.gmail.nossr50.Users;
  13. import com.gmail.nossr50.m;
  14. import com.gmail.nossr50.mcPermissions;
  15. import com.gmail.nossr50.config.LoadProperties;
  16. import com.gmail.nossr50.spout.SpoutStuff;
  17. import com.gmail.nossr50.datatypes.AbilityType;
  18. import com.gmail.nossr50.datatypes.PlayerProfile;
  19. import com.gmail.nossr50.datatypes.PlayerStat;
  20. import com.gmail.nossr50.datatypes.SkillType;
  21. import com.gmail.nossr50.datatypes.ToolType;
  22. import com.gmail.nossr50.events.McMMOPlayerLevelUpEvent;
  23. import com.gmail.nossr50.locale.mcLocale;
  24. public class Skills
  25. {
  26. protected static final Logger log = Logger.getLogger("Minecraft");
  27. public static boolean cooldownOver(Player player, long oldTime, int cooldown){
  28. long currentTime = System.currentTimeMillis();
  29. if(currentTime - oldTime >= (cooldown * 1000))
  30. return true;
  31. else
  32. return false;
  33. }
  34. public static int calculateTimeLeft(Player player, long deactivatedTimeStamp, int cooldown)
  35. {
  36. return (int) (((deactivatedTimeStamp + (cooldown * 1000)) - System.currentTimeMillis())/1000);
  37. }
  38. public static void watchCooldown(Player player, PlayerProfile PP, long curTime, AbilityType ability)
  39. {
  40. if(!ability.getInformed(PP) && curTime - (PP.getSkillDATS(ability) * 1000) >= (ability.getCooldown() * 1000))
  41. {
  42. ability.setInformed(PP, true);
  43. player.sendMessage(ability.getAbilityRefresh());
  44. }
  45. }
  46. public static void activationCheck(Player player, SkillType skill)
  47. {
  48. if(LoadProperties.enableOnlyActivateWhenSneaking && !player.isSneaking())
  49. return;
  50. PlayerProfile PP = Users.getProfile(player);
  51. AbilityType ability = skill.getAbility();
  52. ToolType tool = skill.getTool();
  53. if(!PP.getAbilityUse() || PP.getSuperBreakerMode() || PP.getSerratedStrikesMode() || PP.getTreeFellerMode() || PP.getGreenTerraMode() || PP.getBerserkMode() || PP.getGigaDrillBreakerMode())
  54. return;
  55. //Woodcutting & Axes need to be treated differently
  56. //Basically the tool always needs to ready and we check to see if the cooldown is over when the user takes action
  57. if(skill == SkillType.WOODCUTTING || skill == SkillType.AXES)
  58. {
  59. if(tool.inHand(player.getItemInHand()) && !tool.getToolMode(PP))
  60. {
  61. if(LoadProperties.enableAbilityMessages)
  62. player.sendMessage(tool.getRaiseTool());
  63. tool.setToolATS(PP, System.currentTimeMillis());
  64. tool.setToolMode(PP, true);
  65. }
  66. } else if(ability.getPermissions(player) && tool.inHand(player.getItemInHand()) && !tool.getToolMode(PP))
  67. {
  68. if(!ability.getMode(PP) && !cooldownOver(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()))
  69. {
  70. player.sendMessage(mcLocale.getString("Skills.TooTired") + ChatColor.YELLOW + " (" + calculateTimeLeft(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()) + "s)");
  71. return;
  72. }
  73. if(LoadProperties.enableAbilityMessages)
  74. player.sendMessage(tool.getRaiseTool());
  75. tool.setToolATS(PP, System.currentTimeMillis());
  76. tool.setToolMode(PP, true);
  77. }
  78. }
  79. public static void monitorSkill(Player player, PlayerProfile PP, long curTime, SkillType skill)
  80. {
  81. ToolType tool = skill.getTool();
  82. AbilityType ability = skill.getAbility();
  83. if(tool.getToolMode(PP) && curTime - (tool.getToolATS(PP) * 1000) >= 4000)
  84. {
  85. tool.setToolMode(PP, false);
  86. player.sendMessage(tool.getLowerTool());
  87. }
  88. if(ability.getPermissions(player))
  89. {
  90. if(ability.getMode(PP) && (PP.getSkillDATS(ability) * 1000) <= curTime)
  91. {
  92. ability.setMode(PP, false);
  93. ability.setInformed(PP, false);
  94. player.sendMessage(ability.getAbilityOff());
  95. for(Player y : player.getWorld().getPlayers())
  96. {
  97. if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10))
  98. y.sendMessage(ability.getAbilityPlayerOff(player));
  99. }
  100. }
  101. }
  102. }
  103. public static void ProcessLeaderboardUpdate(SkillType skillType, Player player)
  104. {
  105. PlayerProfile PP = Users.getProfile(player);
  106. PlayerStat ps = new PlayerStat();
  107. if(skillType != SkillType.ALL)
  108. ps.statVal = PP.getSkillLevel(skillType);
  109. else
  110. ps.statVal = m.getPowerLevel(player, PP);
  111. ps.name = player.getName();
  112. Leaderboard.updateLeaderboard(ps, skillType);
  113. }
  114. public static void XpCheckSkill(SkillType skillType, Player player)
  115. {
  116. PlayerProfile PP = Users.getProfile(player);
  117. if(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
  118. {
  119. int skillups = 0;
  120. while(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
  121. {
  122. if(skillType.getMaxLevel() >= PP.getSkillLevel(skillType) + 1)
  123. {
  124. skillups++;
  125. PP.removeXP(skillType, PP.getXpToLevel(skillType));
  126. PP.skillUp(skillType, 1);
  127. McMMOPlayerLevelUpEvent eventToFire = new McMMOPlayerLevelUpEvent(player, skillType);
  128. Bukkit.getPluginManager().callEvent(eventToFire);
  129. } else
  130. {
  131. PP.removeXP(skillType, PP.getXpToLevel(skillType));
  132. }
  133. }
  134. if(!LoadProperties.useMySQL)
  135. {
  136. ProcessLeaderboardUpdate(skillType, player);
  137. ProcessLeaderboardUpdate(SkillType.ALL, player);
  138. }
  139. String capitalized = m.getCapitalized(skillType.toString());
  140. //Contrib stuff
  141. if(LoadProperties.spoutEnabled && player instanceof SpoutPlayer)
  142. {
  143. SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
  144. if(sPlayer.isSpoutCraftEnabled())
  145. {
  146. SpoutStuff.levelUpNotification(skillType, sPlayer);
  147. } else
  148. {
  149. player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
  150. }
  151. }
  152. else
  153. player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
  154. }
  155. if(LoadProperties.xpbar && LoadProperties.spoutEnabled)
  156. {
  157. SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
  158. if(sPlayer.isSpoutCraftEnabled())
  159. {
  160. SpoutStuff.updateXpBar(sPlayer);
  161. }
  162. }
  163. }
  164. public static void XpCheckAll(Player player)
  165. {
  166. for(SkillType x : SkillType.values())
  167. {
  168. //Don't want to do anything with this one
  169. if(x == SkillType.ALL)
  170. continue;
  171. XpCheckSkill(x, player);
  172. }
  173. }
  174. public static SkillType getSkillType(String skillName)
  175. {
  176. for(SkillType x : SkillType.values())
  177. {
  178. if(x.toString().equals(skillName.toUpperCase()))
  179. return x;
  180. }
  181. return null;
  182. }
  183. public static boolean isSkill(String skillname){
  184. skillname = skillname.toUpperCase();
  185. for(SkillType x : SkillType.values())
  186. {
  187. if(x.toString().equals(skillname))
  188. return true;
  189. }
  190. return false;
  191. }
  192. //We should probably rework this - it's a fairly ugly way to do this, compared to our other command formatting.
  193. public static String getSkillStats(String skillname, Integer level, Integer XP, Integer XPToLevel)
  194. {
  195. ChatColor parColor = ChatColor.DARK_AQUA;
  196. ChatColor xpColor = ChatColor.GRAY;
  197. ChatColor LvlColor = ChatColor.GREEN;
  198. ChatColor skillColor = ChatColor.YELLOW;
  199. return skillColor+skillname+LvlColor+level+parColor+" XP"+"("+xpColor+XP+parColor+"/"+xpColor+XPToLevel+parColor+")";
  200. }
  201. public static boolean hasCombatSkills(Player player)
  202. {
  203. if(mcPermissions.getInstance().axes(player) || mcPermissions.getInstance().archery(player) || mcPermissions.getInstance().swords(player) || mcPermissions.getInstance().taming(player) || mcPermissions.getInstance().unarmed(player))
  204. return true;
  205. else
  206. return false;
  207. }
  208. public static boolean hasGatheringSkills(Player player)
  209. {
  210. if(mcPermissions.getInstance().excavation(player) || mcPermissions.getInstance().fishing(player) || mcPermissions.getInstance().herbalism(player) || mcPermissions.getInstance().mining(player) || mcPermissions.getInstance().woodcutting(player))
  211. return true;
  212. else
  213. return false;
  214. }
  215. public static boolean hasMiscSkills(Player player)
  216. {
  217. if(mcPermissions.getInstance().acrobatics(player) || mcPermissions.getInstance().repair(player))
  218. return true;
  219. else
  220. return false;
  221. }
  222. public static void abilityDurabilityLoss(ItemStack inhand, int durabilityLoss)
  223. {
  224. if(LoadProperties.toolsLoseDurabilityFromAbilities)
  225. {
  226. if(!inhand.containsEnchantment(Enchantment.DURABILITY))
  227. {
  228. inhand.setDurability((short)(inhand.getDurability()+durabilityLoss));
  229. }
  230. }
  231. }
  232. /**
  233. * Check to see if an ability can be activated.
  234. *
  235. * @param player The player activating the ability
  236. * @param type The skill the ability is based on
  237. */
  238. public static void abilityCheck(Player player, SkillType type)
  239. {
  240. PlayerProfile PP = Users.getProfile(player);
  241. AbilityType ability = type.getAbility();
  242. if(type.getTool().inHand(player.getItemInHand()))
  243. {
  244. if(type.getTool().getToolMode(PP))
  245. type.getTool().setToolMode(PP, false);
  246. //Axes and Woodcutting are odd because they share the same tool so we show them the too tired message when they take action
  247. if(type == SkillType.WOODCUTTING || type == SkillType.AXES)
  248. {
  249. if(!ability.getMode(PP) && !cooldownOver(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()))
  250. {
  251. player.sendMessage(mcLocale.getString("Skills.TooTired") + ChatColor.YELLOW + " (" + calculateTimeLeft(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()) + "s)");
  252. return;
  253. }
  254. }
  255. int ticks = 2 + (PP.getSkillLevel(type) / 50);
  256. if(!ability.getMode(PP) && cooldownOver(player, PP.getSkillDATS(ability), ability.getCooldown()))
  257. {
  258. player.sendMessage(ability.getAbilityOn());
  259. for(Player y : player.getWorld().getPlayers())
  260. {
  261. if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10))
  262. y.sendMessage(ability.getAbilityPlayer(player));
  263. }
  264. PP.setSkillDATS(ability, System.currentTimeMillis()+(ticks*1000));
  265. ability.setMode(PP, true);
  266. }
  267. }
  268. }
  269. public static boolean triggerCheck(Player player, Block block, AbilityType ability) {
  270. boolean activate = true;
  271. if (!ability.getPermissions(player)) {
  272. activate = false;
  273. return activate;
  274. }
  275. switch (ability) {
  276. case BERSERK:
  277. case GIGA_DRILL_BREAKER:
  278. case SUPER_BREAKER:
  279. case LEAF_BLOWER:
  280. if (!m.blockBreakSimulate(block, player, true)) {
  281. activate = false;
  282. break;
  283. }
  284. if (!ability.blockCheck(block)) {
  285. activate = false;
  286. break;
  287. }
  288. break;
  289. default:
  290. activate = false;
  291. break;
  292. }
  293. return activate;
  294. }
  295. }