Excavation.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.gmail.nossr50.skills.gathering;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Random;
  5. import org.bukkit.Location;
  6. import org.bukkit.Material;
  7. import org.bukkit.block.Block;
  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.config.TreasuresConfig;
  14. import com.gmail.nossr50.config.mods.CustomBlocksConfig;
  15. import com.gmail.nossr50.datatypes.PlayerProfile;
  16. import com.gmail.nossr50.datatypes.SkillType;
  17. import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
  18. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  19. import com.gmail.nossr50.spout.SpoutSounds;
  20. import com.gmail.nossr50.util.Misc;
  21. import com.gmail.nossr50.util.ModChecks;
  22. import com.gmail.nossr50.util.Permissions;
  23. import com.gmail.nossr50.util.Skills;
  24. import com.gmail.nossr50.util.Users;
  25. public class Excavation {
  26. private static Random random = new Random();
  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. if (Config.getInstance().getBlockModsEnabled() && CustomBlocksConfig.getInstance().customExcavationBlocks.contains(new ItemStack(block.getTypeId(), 1, (short) 0, block.getData()))) {
  44. xp = ModChecks.getCustomBlock(block).getXpGain();
  45. }
  46. else {
  47. xp = Config.getInstance().getExcavationBaseXP();
  48. }
  49. if (Permissions.getInstance().excavationTreasures(player)) {
  50. switch (type) {
  51. case DIRT:
  52. treasures = TreasuresConfig.getInstance().excavationFromDirt;
  53. break;
  54. case GRASS:
  55. treasures = TreasuresConfig.getInstance().excavationFromGrass;
  56. break;
  57. case SAND:
  58. treasures = TreasuresConfig.getInstance().excavationFromSand;
  59. break;
  60. case GRAVEL:
  61. treasures = TreasuresConfig.getInstance().excavationFromGravel;
  62. break;
  63. case CLAY:
  64. treasures = TreasuresConfig.getInstance().excavationFromClay;
  65. break;
  66. case MYCEL:
  67. treasures = TreasuresConfig.getInstance().excavationFromMycel;
  68. break;
  69. case SOUL_SAND:
  70. treasures = TreasuresConfig.getInstance().excavationFromSoulSand;
  71. break;
  72. default:
  73. break;
  74. }
  75. for (ExcavationTreasure treasure : treasures) {
  76. if (skillLevel >= treasure.getDropLevel()) {
  77. int randomChance = 100;
  78. if (player.hasPermission("mcmmo.perks.lucky.excavation")) {
  79. randomChance = (int) (randomChance * 0.75);
  80. }
  81. if (random.nextDouble() * randomChance <= treasure.getDropChance()) {
  82. xp += treasure.getXp();
  83. is.add(treasure.getDrop());
  84. }
  85. }
  86. }
  87. //Drop items
  88. for (ItemStack x : is) {
  89. if (x != null) {
  90. Misc.dropItem(location, x);
  91. }
  92. }
  93. }
  94. Skills.xpProcessing(player, profile, SkillType.EXCAVATION, xp);
  95. }
  96. /**
  97. * Handle triple drops from Giga Drill Breaker.
  98. *
  99. * @param player The player using the ability
  100. * @param block The block to check
  101. */
  102. public static void gigaDrillBreaker(Player player, Block block) {
  103. if(player == null)
  104. return;
  105. Skills.abilityDurabilityLoss(player.getItemInHand(), Config.getInstance().getAbilityToolDamage());
  106. if (!mcMMO.placeStore.isTrue(block) && !Misc.blockBreakSimulate(block, player, true)) {
  107. FakePlayerAnimationEvent armswing = new FakePlayerAnimationEvent(player);
  108. mcMMO.p.getServer().getPluginManager().callEvent(armswing);
  109. Excavation.excavationProcCheck(block, player);
  110. Excavation.excavationProcCheck(block, player);
  111. }
  112. if (mcMMO.spoutEnabled) {
  113. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  114. }
  115. }
  116. }