Mining.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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.entity.Player;
  8. import org.bukkit.inventory.ItemStack;
  9. import org.getspout.spoutapi.sound.SoundEffect;
  10. import org.bukkit.enchantments.Enchantment;
  11. import com.gmail.nossr50.mcMMO;
  12. import com.gmail.nossr50.spout.SpoutSounds;
  13. import com.gmail.nossr50.util.BlockChecks;
  14. import com.gmail.nossr50.util.Misc;
  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.datatypes.PlayerProfile;
  20. import com.gmail.nossr50.datatypes.SkillType;
  21. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  22. public class Mining {
  23. private static Random random = new Random();
  24. /**
  25. * Drop items from Mining & Blast Mining skills.
  26. *
  27. * @param block The block to process drops for
  28. */
  29. public static void miningDrops(Block block) {
  30. Location loc = block.getLocation();
  31. Material type = block.getType();
  32. ItemStack item = new ItemStack(type);
  33. Config configInstance = Config.getInstance();
  34. switch (type) {
  35. case COAL_ORE:
  36. if (configInstance.getCoalDoubleDropsEnabled()) {
  37. item = new ItemStack(Material.COAL, 1, (short) 0, CoalType.COAL.getData());
  38. Misc.mcDropItem(loc, item);
  39. }
  40. break;
  41. case DIAMOND_ORE:
  42. if (configInstance.getDiamondDoubleDropsEnabled()) {
  43. item = new ItemStack(Material.DIAMOND);
  44. Misc.mcDropItem(loc, item);
  45. }
  46. break;
  47. case ENDER_STONE:
  48. if (configInstance.getEndStoneDoubleDropsEnabled()) {
  49. Misc.mcDropItem(loc, item);
  50. }
  51. break;
  52. case GLOWING_REDSTONE_ORE:
  53. case REDSTONE_ORE:
  54. if (configInstance.getRedstoneDoubleDropsEnabled()) {
  55. item = new ItemStack(Material.REDSTONE);
  56. Misc.mcDropItems(loc, item, 4);
  57. Misc.mcRandomDropItem(loc, item, 50);
  58. }
  59. break;
  60. case GLOWSTONE:
  61. if (configInstance.getGlowstoneDoubleDropsEnabled()) {
  62. item = new ItemStack(Material.GLOWSTONE_DUST);
  63. Misc.mcDropItems(loc, item, 2);
  64. Misc.mcRandomDropItems(loc, item, 50, 2);
  65. }
  66. break;
  67. case GOLD_ORE:
  68. if (configInstance.getGoldDoubleDropsEnabled()) {
  69. Misc.mcDropItem(loc, item);
  70. }
  71. break;
  72. case IRON_ORE:
  73. if (configInstance.getIronDoubleDropsEnabled()) {
  74. Misc.mcDropItem(loc, item);
  75. }
  76. break;
  77. case LAPIS_ORE:
  78. if (configInstance.getLapisDoubleDropsEnabled()) {
  79. item = new ItemStack(Material.INK_SACK, 1, (short) 0, (byte) 0x4);
  80. Misc.mcDropItems(loc, item, 4);
  81. Misc.mcRandomDropItems(loc, item, 50, 4);
  82. }
  83. break;
  84. case MOSSY_COBBLESTONE:
  85. if (configInstance.getMossyCobblestoneDoubleDropsEnabled()) {
  86. Misc.mcDropItem(loc, item);
  87. }
  88. break;
  89. case NETHERRACK:
  90. if (configInstance.getNetherrackDoubleDropsEnabled()) {
  91. Misc.mcDropItem(loc, item);
  92. }
  93. break;
  94. case OBSIDIAN:
  95. if (configInstance.getObsidianDoubleDropsEnabled()) {
  96. Misc.mcDropItem(loc, item);
  97. }
  98. break;
  99. case SANDSTONE:
  100. if (configInstance.getSandstoneDoubleDropsEnabled()) {
  101. Misc.mcDropItem(loc, item);
  102. }
  103. break;
  104. case STONE:
  105. if (configInstance.getStoneDoubleDropsEnabled()) {
  106. item = new ItemStack(Material.COBBLESTONE);
  107. Misc.mcDropItem(loc, item);
  108. }
  109. break;
  110. default:
  111. break;
  112. }
  113. }
  114. /**
  115. * Award XP for Mining blocks.
  116. *
  117. * @param player The player to award XP to
  118. * @param block The block to award XP for
  119. */
  120. public static void miningXP(Player player, Block block) {
  121. PlayerProfile PP = Users.getProfile(player);
  122. Material type = block.getType();
  123. int xp = 0;
  124. switch (type) {
  125. case COAL_ORE:
  126. xp += Config.getInstance().getMiningXPCoalOre();
  127. break;
  128. case DIAMOND_ORE:
  129. xp += Config.getInstance().getMiningXPDiamondOre();
  130. break;
  131. case ENDER_STONE:
  132. xp += Config.getInstance().getMiningXPEndStone();
  133. break;
  134. case GLOWING_REDSTONE_ORE:
  135. case REDSTONE_ORE:
  136. xp += Config.getInstance().getMiningXPRedstoneOre();
  137. break;
  138. case GLOWSTONE:
  139. xp += Config.getInstance().getMiningXPGlowstone();
  140. break;
  141. case GOLD_ORE:
  142. xp += Config.getInstance().getMiningXPGoldOre();
  143. break;
  144. case IRON_ORE:
  145. xp += Config.getInstance().getMiningXPIronOre();
  146. break;
  147. case LAPIS_ORE:
  148. xp += Config.getInstance().getMiningXPLapisOre();
  149. break;
  150. case MOSSY_COBBLESTONE:
  151. xp += Config.getInstance().getMiningXPMossyStone();
  152. break;
  153. case NETHERRACK:
  154. xp += Config.getInstance().getMiningXPNetherrack();
  155. break;
  156. case OBSIDIAN:
  157. xp += Config.getInstance().getMiningXPObsidian();
  158. break;
  159. case SANDSTONE:
  160. xp += Config.getInstance().getMiningXPSandstone();
  161. break;
  162. case STONE:
  163. xp += Config.getInstance().getMiningXPStone();
  164. break;
  165. default:
  166. break;
  167. }
  168. PP.addXP(SkillType.MINING, xp);
  169. Skills.XpCheckSkill(SkillType.MINING, player);
  170. }
  171. /**
  172. * Process Mining block drops.
  173. *
  174. * @param player The player mining the block
  175. * @param block The block being broken
  176. */
  177. public static void miningBlockCheck(Player player, Block block) {
  178. if (block.hasMetadata("mcmmoPlacedBlock") || player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
  179. return;
  180. }
  181. miningXP(player, block);
  182. if (BlockChecks.canBeSuperBroken(block.getType())) {
  183. final int MAX_BONUS_LEVEL = 1000;
  184. int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING);
  185. if ((skillLevel > MAX_BONUS_LEVEL || random.nextInt(1000) <= skillLevel) && Permissions.getInstance().miningDoubleDrops(player)) {
  186. miningDrops(block);
  187. }
  188. }
  189. }
  190. /**
  191. * Handle the Super Breaker ability.
  192. *
  193. * @param player The player using the ability
  194. * @param block The block being affected
  195. */
  196. public static void SuperBreakerBlockCheck(Player player, Block block) {
  197. Material type = block.getType();
  198. int tier = Misc.getTier(player.getItemInHand());
  199. int durabilityLoss = Config.getInstance().getAbilityToolDamage();
  200. FakePlayerAnimationEvent armswing = new FakePlayerAnimationEvent(player);
  201. switch (type) {
  202. case OBSIDIAN:
  203. if (tier < 4) {
  204. return;
  205. }
  206. durabilityLoss = durabilityLoss * 5; //Obsidian needs to do more damage than normal
  207. /* FALL THROUGH */
  208. case DIAMOND_ORE:
  209. case GLOWING_REDSTONE_ORE:
  210. case GOLD_ORE:
  211. case LAPIS_ORE:
  212. case REDSTONE_ORE:
  213. if (tier < 3) {
  214. return;
  215. }
  216. /* FALL THROUGH */
  217. case IRON_ORE:
  218. if (tier < 2) {
  219. return;
  220. }
  221. /* FALL THROUGH */
  222. case COAL_ORE:
  223. case ENDER_STONE:
  224. case GLOWSTONE:
  225. case MOSSY_COBBLESTONE:
  226. case NETHERRACK:
  227. case SANDSTONE:
  228. case STONE:
  229. if (block.hasMetadata("mcmmoPlacedBlock")) {
  230. return;
  231. }
  232. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  233. Skills.abilityDurabilityLoss(player.getItemInHand(), durabilityLoss);
  234. miningBlockCheck(player, block);
  235. if (Config.getInstance().spoutEnabled) {
  236. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  237. }
  238. }
  239. }
  240. }