Mining.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package com.gmail.nossr50.skills.gathering;
  2. import java.util.Random;
  3. import org.bukkit.CoalType;
  4. import org.bukkit.Location;
  5. import org.bukkit.Material;
  6. import org.bukkit.block.Block;
  7. import org.bukkit.enchantments.Enchantment;
  8. import org.bukkit.entity.Player;
  9. import org.bukkit.inventory.ItemStack;
  10. import org.getspout.spoutapi.sound.SoundEffect;
  11. import com.gmail.nossr50.mcMMO;
  12. import com.gmail.nossr50.spout.SpoutSounds;
  13. import com.gmail.nossr50.util.Misc;
  14. import com.gmail.nossr50.util.ModChecks;
  15. import com.gmail.nossr50.util.Permissions;
  16. import com.gmail.nossr50.util.Skills;
  17. import com.gmail.nossr50.util.Users;
  18. import com.gmail.nossr50.config.Config;
  19. import com.gmail.nossr50.config.SpoutConfig;
  20. import com.gmail.nossr50.datatypes.PlayerProfile;
  21. import com.gmail.nossr50.datatypes.SkillType;
  22. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  23. public class Mining {
  24. private static Random random = new Random();
  25. /**
  26. * Handle double drops when using Silk Touch.
  27. *
  28. * @param block The block to process drops for
  29. */
  30. private static void silkTouchDrops(Block block) {
  31. Location loc = block.getLocation();
  32. Material type = block.getType();
  33. ItemStack item = new ItemStack(type);
  34. Config configInstance = Config.getInstance();
  35. switch (type) {
  36. case ENDER_STONE:
  37. case GOLD_ORE:
  38. case IRON_ORE:
  39. case MOSSY_COBBLESTONE:
  40. case NETHERRACK:
  41. case OBSIDIAN:
  42. case SANDSTONE:
  43. miningDrops(block);
  44. break;
  45. case COAL_ORE:
  46. if (configInstance.getCoalDoubleDropsEnabled()) {
  47. Misc.dropItem(loc, item);
  48. }
  49. break;
  50. case DIAMOND_ORE:
  51. if (configInstance.getDiamondDoubleDropsEnabled()) {
  52. Misc.dropItem(loc, item);
  53. }
  54. break;
  55. case GLOWING_REDSTONE_ORE:
  56. case REDSTONE_ORE:
  57. if (configInstance.getRedstoneDoubleDropsEnabled()) {
  58. Misc.dropItem(loc, item);
  59. }
  60. break;
  61. case GLOWSTONE:
  62. if (configInstance.getGlowstoneDoubleDropsEnabled()) {
  63. Misc.dropItem(loc, item);
  64. }
  65. break;
  66. case LAPIS_ORE:
  67. if (configInstance.getLapisDoubleDropsEnabled()) {
  68. Misc.dropItem(loc, item);
  69. }
  70. break;
  71. case STONE:
  72. if (configInstance.getStoneDoubleDropsEnabled()) {
  73. Misc.dropItem(loc, item);
  74. }
  75. break;
  76. default:
  77. if (ModChecks.isCustomMiningBlock(block)) {
  78. Misc.dropItem(loc, item);
  79. }
  80. break;
  81. }
  82. }
  83. /**
  84. * Drop items from Mining & Blast Mining skills.
  85. *
  86. * @param block The block to process drops for
  87. */
  88. public static void miningDrops(Block block) {
  89. Location loc = block.getLocation();
  90. Material type = block.getType();
  91. ItemStack item = new ItemStack(type);
  92. Config configInstance = Config.getInstance();
  93. switch (type) {
  94. case COAL_ORE:
  95. if (configInstance.getCoalDoubleDropsEnabled()) {
  96. item = new ItemStack(Material.COAL, 1, (short) 0, CoalType.COAL.getData());
  97. Misc.dropItem(loc, item);
  98. }
  99. break;
  100. case DIAMOND_ORE:
  101. if (configInstance.getDiamondDoubleDropsEnabled()) {
  102. item = new ItemStack(Material.DIAMOND);
  103. Misc.dropItem(loc, item);
  104. }
  105. break;
  106. case ENDER_STONE:
  107. if (configInstance.getEndStoneDoubleDropsEnabled()) {
  108. Misc.dropItem(loc, item);
  109. }
  110. break;
  111. case GLOWING_REDSTONE_ORE:
  112. case REDSTONE_ORE:
  113. if (configInstance.getRedstoneDoubleDropsEnabled()) {
  114. item = new ItemStack(Material.REDSTONE);
  115. Misc.dropItems(loc, item, 4);
  116. Misc.randomDropItem(loc, item, 50);
  117. }
  118. break;
  119. case GLOWSTONE:
  120. if (configInstance.getGlowstoneDoubleDropsEnabled()) {
  121. item = new ItemStack(Material.GLOWSTONE_DUST);
  122. Misc.dropItems(loc, item, 2);
  123. Misc.randomDropItems(loc, item, 50, 2);
  124. }
  125. break;
  126. case GOLD_ORE:
  127. if (configInstance.getGoldDoubleDropsEnabled()) {
  128. Misc.dropItem(loc, item);
  129. }
  130. break;
  131. case IRON_ORE:
  132. if (configInstance.getIronDoubleDropsEnabled()) {
  133. Misc.dropItem(loc, item);
  134. }
  135. break;
  136. case LAPIS_ORE:
  137. if (configInstance.getLapisDoubleDropsEnabled()) {
  138. item = new ItemStack(Material.INK_SACK, 1, (short) 0, (byte) 0x4);
  139. Misc.dropItems(loc, item, 4);
  140. Misc.randomDropItems(loc, item, 50, 4);
  141. }
  142. break;
  143. case MOSSY_COBBLESTONE:
  144. if (configInstance.getMossyCobblestoneDoubleDropsEnabled()) {
  145. Misc.dropItem(loc, item);
  146. }
  147. break;
  148. case NETHERRACK:
  149. if (configInstance.getNetherrackDoubleDropsEnabled()) {
  150. Misc.dropItem(loc, item);
  151. }
  152. break;
  153. case OBSIDIAN:
  154. if (configInstance.getObsidianDoubleDropsEnabled()) {
  155. Misc.dropItem(loc, item);
  156. }
  157. break;
  158. case SANDSTONE:
  159. if (configInstance.getSandstoneDoubleDropsEnabled()) {
  160. Misc.dropItem(loc, item);
  161. }
  162. break;
  163. case STONE:
  164. if (configInstance.getStoneDoubleDropsEnabled()) {
  165. item = new ItemStack(Material.COBBLESTONE);
  166. Misc.dropItem(loc, item);
  167. }
  168. break;
  169. default:
  170. if (ModChecks.isCustomMiningBlock(block)) {
  171. item = ModChecks.getCustomBlock(block).getItemDrop();
  172. Misc.dropItem(loc, item);
  173. }
  174. break;
  175. }
  176. }
  177. /**
  178. * Award XP for Mining blocks.
  179. *
  180. * @param player The player to award XP to
  181. * @param block The block to award XP for
  182. */
  183. public static void miningXP(Player player, Block block) {
  184. PlayerProfile PP = Users.getProfile(player);
  185. Material type = block.getType();
  186. int xp = 0;
  187. switch (type) {
  188. case COAL_ORE:
  189. xp += Config.getInstance().getMiningXPCoalOre();
  190. break;
  191. case DIAMOND_ORE:
  192. xp += Config.getInstance().getMiningXPDiamondOre();
  193. break;
  194. case ENDER_STONE:
  195. xp += Config.getInstance().getMiningXPEndStone();
  196. break;
  197. case GLOWING_REDSTONE_ORE:
  198. case REDSTONE_ORE:
  199. xp += Config.getInstance().getMiningXPRedstoneOre();
  200. break;
  201. case GLOWSTONE:
  202. xp += Config.getInstance().getMiningXPGlowstone();
  203. break;
  204. case GOLD_ORE:
  205. xp += Config.getInstance().getMiningXPGoldOre();
  206. break;
  207. case IRON_ORE:
  208. xp += Config.getInstance().getMiningXPIronOre();
  209. break;
  210. case LAPIS_ORE:
  211. xp += Config.getInstance().getMiningXPLapisOre();
  212. break;
  213. case MOSSY_COBBLESTONE:
  214. xp += Config.getInstance().getMiningXPMossyStone();
  215. break;
  216. case NETHERRACK:
  217. xp += Config.getInstance().getMiningXPNetherrack();
  218. break;
  219. case OBSIDIAN:
  220. xp += Config.getInstance().getMiningXPObsidian();
  221. break;
  222. case SANDSTONE:
  223. xp += Config.getInstance().getMiningXPSandstone();
  224. break;
  225. case STONE:
  226. xp += Config.getInstance().getMiningXPStone();
  227. break;
  228. default:
  229. if (ModChecks.isCustomMiningBlock(block)) {
  230. xp += ModChecks.getCustomBlock(block).getXpGain();
  231. }
  232. break;
  233. }
  234. PP.addXP(player, SkillType.MINING, xp);
  235. Skills.XpCheckSkill(SkillType.MINING, player);
  236. }
  237. /**
  238. * Process Mining block drops.
  239. *
  240. * @param player The player mining the block
  241. * @param block The block being broken
  242. */
  243. public static void miningBlockCheck(Player player, Block block) {
  244. if (mcMMO.placeStore.isTrue(block)) {
  245. return;
  246. }
  247. miningXP(player, block);
  248. final int MAX_BONUS_LEVEL = 1000;
  249. int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING);
  250. int skillCheck = Misc.skillCheck(skillLevel, MAX_BONUS_LEVEL);
  251. if (random.nextInt(1000) <= skillCheck && Permissions.getInstance().miningDoubleDrops(player)) {
  252. if (player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
  253. silkTouchDrops(block);
  254. }
  255. else {
  256. miningDrops(block);
  257. }
  258. }
  259. }
  260. /**
  261. * Handle the Super Breaker ability.
  262. *
  263. * @param player The player using the ability
  264. * @param block The block being affected
  265. */
  266. public static void superBreakerBlockCheck(Player player, Block block) {
  267. Material type = block.getType();
  268. int tier = Misc.getTier(player.getItemInHand());
  269. int durabilityLoss = Config.getInstance().getAbilityToolDamage();
  270. FakePlayerAnimationEvent armswing = new FakePlayerAnimationEvent(player);
  271. if (ModChecks.isCustomMiningBlock(block)) {
  272. if (ModChecks.getCustomBlock(block).getTier() < tier) {
  273. return;
  274. }
  275. if (mcMMO.placeStore.isTrue(block)) {
  276. return;
  277. }
  278. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  279. Skills.abilityDurabilityLoss(player.getItemInHand(), durabilityLoss);
  280. miningBlockCheck(player, block);
  281. if (SpoutConfig.getInstance().spoutEnabled) {
  282. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  283. }
  284. }
  285. else {
  286. switch (type) {
  287. case OBSIDIAN:
  288. if (tier < 4) {
  289. return;
  290. }
  291. durabilityLoss = durabilityLoss * 5; //Obsidian needs to do more damage than normal
  292. /* FALL THROUGH */
  293. case DIAMOND_ORE:
  294. case GLOWING_REDSTONE_ORE:
  295. case GOLD_ORE:
  296. case LAPIS_ORE:
  297. case REDSTONE_ORE:
  298. if (tier < 3) {
  299. return;
  300. }
  301. /* FALL THROUGH */
  302. case IRON_ORE:
  303. if (tier < 2) {
  304. return;
  305. }
  306. /* FALL THROUGH */
  307. case COAL_ORE:
  308. case ENDER_STONE:
  309. case GLOWSTONE:
  310. case MOSSY_COBBLESTONE:
  311. case NETHERRACK:
  312. case SANDSTONE:
  313. case STONE:
  314. if (mcMMO.placeStore.isTrue(block)) {
  315. return;
  316. }
  317. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  318. Skills.abilityDurabilityLoss(player.getItemInHand(), durabilityLoss);
  319. miningBlockCheck(player, block);
  320. if (SpoutConfig.getInstance().spoutEnabled) {
  321. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  322. }
  323. }
  324. }
  325. }
  326. }