Mining.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  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.config.Config;
  13. import com.gmail.nossr50.datatypes.PlayerProfile;
  14. import com.gmail.nossr50.datatypes.SkillType;
  15. import com.gmail.nossr50.datatypes.mods.CustomBlock;
  16. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  17. import com.gmail.nossr50.spout.SpoutSounds;
  18. import com.gmail.nossr50.util.Misc;
  19. import com.gmail.nossr50.util.ModChecks;
  20. import com.gmail.nossr50.util.Permissions;
  21. import com.gmail.nossr50.util.Skills;
  22. import com.gmail.nossr50.util.Users;
  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, new ItemStack(block.getTypeId(), 1, (short) 0, block.getData()));
  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. CustomBlock customBlock = ModChecks.getCustomBlock(block);
  172. int minimumDropAmount = customBlock.getMinimumDropAmount();
  173. int maximumDropAmount = customBlock.getMaximumDropAmount();
  174. item = ModChecks.getCustomBlock(block).getItemDrop();
  175. if (minimumDropAmount != maximumDropAmount) {
  176. Misc.dropItems(loc, item, minimumDropAmount);
  177. Misc.randomDropItems(loc, item, 50, maximumDropAmount - minimumDropAmount);
  178. }
  179. else {
  180. Misc.dropItems(loc, item, minimumDropAmount);
  181. }
  182. }
  183. break;
  184. }
  185. }
  186. /**
  187. * Award XP for Mining blocks.
  188. *
  189. * @param player The player to award XP to
  190. * @param block The block to award XP for
  191. */
  192. public static void miningXP(Player player, Block block) {
  193. PlayerProfile profile = Users.getProfile(player);
  194. Material type = block.getType();
  195. int xp = 0;
  196. switch (type) {
  197. case COAL_ORE:
  198. xp += Config.getInstance().getMiningXPCoalOre();
  199. break;
  200. case DIAMOND_ORE:
  201. xp += Config.getInstance().getMiningXPDiamondOre();
  202. break;
  203. case ENDER_STONE:
  204. xp += Config.getInstance().getMiningXPEndStone();
  205. break;
  206. case GLOWING_REDSTONE_ORE:
  207. case REDSTONE_ORE:
  208. xp += Config.getInstance().getMiningXPRedstoneOre();
  209. break;
  210. case GLOWSTONE:
  211. xp += Config.getInstance().getMiningXPGlowstone();
  212. break;
  213. case GOLD_ORE:
  214. xp += Config.getInstance().getMiningXPGoldOre();
  215. break;
  216. case IRON_ORE:
  217. xp += Config.getInstance().getMiningXPIronOre();
  218. break;
  219. case LAPIS_ORE:
  220. xp += Config.getInstance().getMiningXPLapisOre();
  221. break;
  222. case MOSSY_COBBLESTONE:
  223. xp += Config.getInstance().getMiningXPMossyStone();
  224. break;
  225. case NETHERRACK:
  226. xp += Config.getInstance().getMiningXPNetherrack();
  227. break;
  228. case OBSIDIAN:
  229. xp += Config.getInstance().getMiningXPObsidian();
  230. break;
  231. case SANDSTONE:
  232. xp += Config.getInstance().getMiningXPSandstone();
  233. break;
  234. case STONE:
  235. xp += Config.getInstance().getMiningXPStone();
  236. break;
  237. default:
  238. if (ModChecks.isCustomMiningBlock(block)) {
  239. xp += ModChecks.getCustomBlock(block).getXpGain();
  240. }
  241. break;
  242. }
  243. Skills.xpProcessing(player, profile, SkillType.MINING, xp);
  244. }
  245. /**
  246. * Process Mining block drops.
  247. *
  248. * @param player The player mining the block
  249. * @param block The block being broken
  250. */
  251. public static void miningBlockCheck(Player player, Block block) {
  252. if (mcMMO.placeStore.isTrue(block)) {
  253. return;
  254. }
  255. miningXP(player, block);
  256. final int MAX_BONUS_LEVEL = 1000;
  257. int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING);
  258. int skillCheck = Misc.skillCheck(skillLevel, MAX_BONUS_LEVEL);
  259. int randomChance = 1000;
  260. if (player.hasPermission("mcmmo.perks.lucky.mining")) {
  261. randomChance = (int) (randomChance * 0.75);
  262. }
  263. if (random.nextInt(randomChance) <= skillCheck && Permissions.getInstance().miningDoubleDrops(player)) {
  264. if (player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
  265. silkTouchDrops(block);
  266. }
  267. else {
  268. miningDrops(block);
  269. }
  270. }
  271. }
  272. /**
  273. * Handle the Super Breaker ability.
  274. *
  275. * @param player The player using the ability
  276. * @param block The block being affected
  277. */
  278. public static void superBreakerBlockCheck(Player player, Block block) {
  279. Material type = block.getType();
  280. int tier = Misc.getTier(player.getItemInHand());
  281. int durabilityLoss = Config.getInstance().getAbilityToolDamage();
  282. FakePlayerAnimationEvent armswing = new FakePlayerAnimationEvent(player);
  283. if (ModChecks.isCustomMiningBlock(block)) {
  284. if (ModChecks.getCustomBlock(block).getTier() < tier) {
  285. return;
  286. }
  287. if (mcMMO.placeStore.isTrue(block)) {
  288. return;
  289. }
  290. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  291. Skills.abilityDurabilityLoss(player.getItemInHand(), durabilityLoss);
  292. miningBlockCheck(player, block);
  293. if (mcMMO.spoutEnabled) {
  294. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  295. }
  296. }
  297. else {
  298. switch (type) {
  299. case OBSIDIAN:
  300. if (tier < 4) {
  301. return;
  302. }
  303. durabilityLoss = durabilityLoss * 5; //Obsidian needs to do more damage than normal
  304. /* FALL THROUGH */
  305. case DIAMOND_ORE:
  306. case GLOWING_REDSTONE_ORE:
  307. case GOLD_ORE:
  308. case LAPIS_ORE:
  309. case REDSTONE_ORE:
  310. if (tier < 3) {
  311. return;
  312. }
  313. /* FALL THROUGH */
  314. case IRON_ORE:
  315. if (tier < 2) {
  316. return;
  317. }
  318. /* FALL THROUGH */
  319. case COAL_ORE:
  320. case ENDER_STONE:
  321. case GLOWSTONE:
  322. case MOSSY_COBBLESTONE:
  323. case NETHERRACK:
  324. case SANDSTONE:
  325. case STONE:
  326. if (mcMMO.placeStore.isTrue(block)) {
  327. return;
  328. }
  329. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  330. Skills.abilityDurabilityLoss(player.getItemInHand(), durabilityLoss);
  331. miningBlockCheck(player, block);
  332. if (mcMMO.spoutEnabled) {
  333. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  334. }
  335. default:
  336. return;
  337. }
  338. }
  339. }
  340. }