Excavation.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package com.gmail.nossr50.skills.excavation;
  2. import java.util.ArrayList;
  3. import java.util.List;
  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.bukkit.material.MaterialData;
  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.config.TreasuresConfig;
  14. import com.gmail.nossr50.config.mods.CustomBlocksConfig;
  15. import com.gmail.nossr50.datatypes.PlayerProfile;
  16. import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
  17. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  18. import com.gmail.nossr50.skills.SkillType;
  19. import com.gmail.nossr50.skills.SkillTools;
  20. import com.gmail.nossr50.spout.SpoutSounds;
  21. import com.gmail.nossr50.util.Misc;
  22. import com.gmail.nossr50.util.ModChecks;
  23. import com.gmail.nossr50.util.Permissions;
  24. import com.gmail.nossr50.util.Users;
  25. public class Excavation {
  26. public static boolean requiresTool = Config.getInstance().getExcavationRequiresTool();
  27. /**
  28. * Check to see if treasures were found.
  29. *
  30. * @param block The block to check
  31. * @param player The player who broke the block
  32. */
  33. public static void excavationProcCheck(Block block, Player player) {
  34. if (player == null)
  35. return;
  36. Material type = block.getType();
  37. Location location = block.getLocation();
  38. PlayerProfile profile = Users.getProfile(player);
  39. int skillLevel = profile.getSkillLevel(SkillType.EXCAVATION);
  40. ArrayList<ItemStack> is = new ArrayList<ItemStack>();
  41. List<ExcavationTreasure> treasures = new ArrayList<ExcavationTreasure>();
  42. int xp;
  43. ItemStack item = (new MaterialData(block.getTypeId(), block.getData())).toItemStack(1);
  44. if (Config.getInstance().getBlockModsEnabled() && CustomBlocksConfig.getInstance().customExcavationBlocks.contains(item)) {
  45. xp = ModChecks.getCustomBlock(block).getXpGain();
  46. }
  47. else {
  48. switch (type) {
  49. case CLAY:
  50. xp = Config.getInstance().getExcavationClayXP();
  51. break;
  52. case DIRT:
  53. xp = Config.getInstance().getExcavationDirtXP();
  54. break;
  55. case GRASS:
  56. xp = Config.getInstance().getExcavationGrassXP();
  57. break;
  58. case GRAVEL:
  59. xp = Config.getInstance().getExcavationGravelXP();
  60. break;
  61. case MYCEL:
  62. xp = Config.getInstance().getExcavationMycelXP();
  63. break;
  64. case SAND:
  65. xp = Config.getInstance().getExcavationSandXP();
  66. break;
  67. case SOUL_SAND:
  68. xp = Config.getInstance().getExcavationSoulSandXP();
  69. break;
  70. default:
  71. xp = 0;
  72. break;
  73. }
  74. }
  75. if (Permissions.excavationTreasures(player)) {
  76. switch (type) {
  77. case DIRT:
  78. treasures = TreasuresConfig.getInstance().excavationFromDirt;
  79. break;
  80. case GRASS:
  81. treasures = TreasuresConfig.getInstance().excavationFromGrass;
  82. break;
  83. case SAND:
  84. treasures = TreasuresConfig.getInstance().excavationFromSand;
  85. break;
  86. case GRAVEL:
  87. treasures = TreasuresConfig.getInstance().excavationFromGravel;
  88. break;
  89. case CLAY:
  90. treasures = TreasuresConfig.getInstance().excavationFromClay;
  91. break;
  92. case MYCEL:
  93. treasures = TreasuresConfig.getInstance().excavationFromMycel;
  94. break;
  95. case SOUL_SAND:
  96. treasures = TreasuresConfig.getInstance().excavationFromSoulSand;
  97. break;
  98. default:
  99. break;
  100. }
  101. for (ExcavationTreasure treasure : treasures) {
  102. if (skillLevel >= treasure.getDropLevel()) {
  103. int activationChance = Misc.calculateActivationChance(Permissions.luckyExcavation(player));
  104. if (Misc.getRandom().nextDouble() * activationChance <= treasure.getDropChance()) {
  105. xp += treasure.getXp();
  106. is.add(treasure.getDrop());
  107. }
  108. }
  109. }
  110. //Drop items
  111. for (ItemStack x : is) {
  112. if (x != null) {
  113. Misc.dropItem(location, x);
  114. }
  115. }
  116. }
  117. SkillTools.xpProcessing(player, profile, SkillType.EXCAVATION, xp);
  118. }
  119. /**
  120. * Handle triple drops from Giga Drill Breaker.
  121. *
  122. * @param player The player using the ability
  123. * @param block The block to check
  124. */
  125. public static void gigaDrillBreaker(Player player, Block block) {
  126. if (player == null)
  127. return;
  128. SkillTools.abilityDurabilityLoss(player.getItemInHand(), Misc.toolDurabilityLoss);
  129. if (!mcMMO.placeStore.isTrue(block) && Misc.blockBreakSimulate(block, player, true)) {
  130. FakePlayerAnimationEvent armswing = new FakePlayerAnimationEvent(player);
  131. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  132. Excavation.excavationProcCheck(block, player);
  133. Excavation.excavationProcCheck(block, player);
  134. }
  135. if (mcMMO.spoutEnabled) {
  136. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  137. }
  138. }
  139. }