Skills.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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.Player;
  19. import org.getspout.spoutapi.SpoutManager;
  20. import org.getspout.spoutapi.player.SpoutPlayer;
  21. import com.gmail.nossr50.Leaderboard;
  22. import com.gmail.nossr50.Users;
  23. import com.gmail.nossr50.m;
  24. import com.gmail.nossr50.mcPermissions;
  25. import com.gmail.nossr50.config.LoadProperties;
  26. import com.gmail.nossr50.spout.SpoutStuff;
  27. import com.gmail.nossr50.datatypes.AbilityType;
  28. import com.gmail.nossr50.datatypes.PlayerProfile;
  29. import com.gmail.nossr50.datatypes.PlayerStat;
  30. import com.gmail.nossr50.datatypes.SkillType;
  31. import com.gmail.nossr50.datatypes.ToolType;
  32. import com.gmail.nossr50.events.McMMOPlayerLevelUpEvent;
  33. import com.gmail.nossr50.locale.mcLocale;
  34. public class Skills
  35. {
  36. protected static final Logger log = Logger.getLogger("Minecraft");
  37. public static boolean cooldownOver(Player player, long oldTime, int cooldown){
  38. long currentTime = System.currentTimeMillis();
  39. if(currentTime - oldTime >= (cooldown * 1000))
  40. return true;
  41. else
  42. return false;
  43. }
  44. public static int calculateTimeLeft(Player player, long deactivatedTimeStamp, int cooldown)
  45. {
  46. return (int) (((deactivatedTimeStamp + (cooldown * 1000)) - System.currentTimeMillis())/1000);
  47. }
  48. public static void watchCooldown(Player player, PlayerProfile PP, long curTime, SkillType skill)
  49. {
  50. AbilityType ability = skill.getAbility();
  51. if(!ability.getInformed(PP) && curTime - (PP.getSkillDATS(ability) * 1000) >= (ability.getCooldown() * 1000))
  52. {
  53. ability.setInformed(PP, true);
  54. player.sendMessage(ability.getAbilityRefresh());
  55. }
  56. }
  57. public static void activationCheck(Player player, SkillType skill)
  58. {
  59. if(LoadProperties.enableOnlyActivateWhenSneaking && !player.isSneaking())
  60. return;
  61. PlayerProfile PP = Users.getProfile(player);
  62. AbilityType ability = skill.getAbility();
  63. ToolType tool = skill.getTool();
  64. if(!PP.getAbilityUse() || PP.getSuperBreakerMode() || PP.getSerratedStrikesMode() || PP.getTreeFellerMode() || PP.getGreenTerraMode() || PP.getBerserkMode() || PP.getGigaDrillBreakerMode())
  65. return;
  66. 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. }
  96. }
  97. }
  98. public static void ProcessLeaderboardUpdate(SkillType skillType, Player player)
  99. {
  100. PlayerProfile PP = Users.getProfile(player);
  101. PlayerStat ps = new PlayerStat();
  102. if(skillType != SkillType.ALL)
  103. ps.statVal = PP.getSkillLevel(skillType);
  104. else
  105. ps.statVal = m.getPowerLevel(player);
  106. ps.name = player.getName();
  107. Leaderboard.updateLeaderboard(ps, skillType);
  108. }
  109. public static void XpCheckSkill(SkillType skillType, Player player)
  110. {
  111. PlayerProfile PP = Users.getProfile(player);
  112. if(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
  113. {
  114. int skillups = 0;
  115. while(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
  116. {
  117. if(skillType.getMaxLevel() >= PP.getSkillLevel(skillType) + 1)
  118. {
  119. skillups++;
  120. PP.removeXP(skillType, PP.getXpToLevel(skillType));
  121. PP.skillUp(skillType, 1);
  122. McMMOPlayerLevelUpEvent eventToFire = new McMMOPlayerLevelUpEvent(player, skillType);
  123. Bukkit.getPluginManager().callEvent(eventToFire);
  124. } else
  125. {
  126. PP.removeXP(skillType, PP.getXpToLevel(skillType));
  127. }
  128. }
  129. if(!LoadProperties.useMySQL)
  130. {
  131. ProcessLeaderboardUpdate(skillType, player);
  132. ProcessLeaderboardUpdate(SkillType.ALL, player);
  133. }
  134. String capitalized = m.getCapitalized(skillType.toString());
  135. //Contrib stuff
  136. if(LoadProperties.spoutEnabled && player instanceof SpoutPlayer)
  137. {
  138. SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
  139. if(sPlayer.isSpoutCraftEnabled())
  140. {
  141. SpoutStuff.levelUpNotification(skillType, sPlayer);
  142. } else
  143. {
  144. player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
  145. }
  146. }
  147. else
  148. player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
  149. }
  150. if(LoadProperties.xpbar && LoadProperties.spoutEnabled)
  151. {
  152. SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
  153. if(sPlayer.isSpoutCraftEnabled())
  154. {
  155. SpoutStuff.updateXpBar(sPlayer);
  156. }
  157. }
  158. }
  159. public static void XpCheckAll(Player player)
  160. {
  161. for(SkillType x : SkillType.values())
  162. {
  163. //Don't want to do anything with this one
  164. if(x == SkillType.ALL)
  165. continue;
  166. XpCheckSkill(x, player);
  167. }
  168. }
  169. public static SkillType getSkillType(String skillName)
  170. {
  171. for(SkillType x : SkillType.values())
  172. {
  173. if(x.toString().equals(skillName.toUpperCase()))
  174. return x;
  175. }
  176. return null;
  177. }
  178. public static boolean isSkill(String skillname){
  179. skillname = skillname.toUpperCase();
  180. for(SkillType x : SkillType.values())
  181. {
  182. if(x.toString().equals(skillname))
  183. return true;
  184. }
  185. return false;
  186. }
  187. //We should probably rework this - it's a fairly ugly way to do this, compared to our other command formatting.
  188. public static String getSkillStats(String skillname, Integer level, Integer XP, Integer XPToLevel)
  189. {
  190. ChatColor parColor = ChatColor.DARK_AQUA;
  191. ChatColor xpColor = ChatColor.GRAY;
  192. ChatColor LvlColor = ChatColor.GREEN;
  193. ChatColor skillColor = ChatColor.YELLOW;
  194. return skillColor+skillname+LvlColor+level+parColor+" XP"+"("+xpColor+XP+parColor+"/"+xpColor+XPToLevel+parColor+")";
  195. }
  196. public static boolean hasCombatSkills(Player player)
  197. {
  198. if(mcPermissions.getInstance().axes(player) || mcPermissions.getInstance().archery(player) || mcPermissions.getInstance().swords(player) || mcPermissions.getInstance().taming(player) || mcPermissions.getInstance().unarmed(player))
  199. return true;
  200. else
  201. return false;
  202. }
  203. public static boolean hasGatheringSkills(Player player)
  204. {
  205. if(mcPermissions.getInstance().excavation(player) || mcPermissions.getInstance().fishing(player) || mcPermissions.getInstance().herbalism(player) || mcPermissions.getInstance().mining(player) || mcPermissions.getInstance().woodcutting(player))
  206. return true;
  207. else
  208. return false;
  209. }
  210. public static boolean hasMiscSkills(Player player)
  211. {
  212. if(mcPermissions.getInstance().acrobatics(player) || mcPermissions.getInstance().repair(player))
  213. return true;
  214. else
  215. return false;
  216. }
  217. /**
  218. * Check to see if an ability can be activated.
  219. *
  220. * @param player The player activating the ability
  221. * @param type The skill the ability is based on
  222. */
  223. public static void abilityCheck(Player player, SkillType type)
  224. {
  225. PlayerProfile PP = Users.getProfile(player);
  226. AbilityType ability = type.getAbility();
  227. if(type.getTool().inHand(player.getItemInHand()))
  228. {
  229. if(type.getTool().getToolMode(PP))
  230. type.getTool().setToolMode(PP, false);
  231. int ticks = 2 + (PP.getSkillLevel(type) / 50);
  232. if(!ability.getMode(PP) && cooldownOver(player, PP.getSkillDATS(ability), ability.getCooldown()))
  233. {
  234. player.sendMessage(ability.getAbilityOn());
  235. for(Player y : player.getWorld().getPlayers())
  236. {
  237. if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10))
  238. y.sendMessage(ability.getAbilityPlayer(player));
  239. }
  240. PP.setSkillDATS(ability, System.currentTimeMillis()+(ticks*1000));
  241. ability.setMode(PP, true);
  242. }
  243. }
  244. }
  245. }