Woodcutting.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.gmail.nossr50.skills.woodcutting;
  2. import org.bukkit.Location;
  3. import org.bukkit.Material;
  4. import org.bukkit.TreeSpecies;
  5. import org.bukkit.block.Block;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.event.block.BlockBreakEvent;
  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.AdvancedConfig;
  13. import com.gmail.nossr50.config.Config;
  14. import com.gmail.nossr50.datatypes.mods.CustomBlock;
  15. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  16. import com.gmail.nossr50.skills.SkillType;
  17. import com.gmail.nossr50.skills.Skills;
  18. import com.gmail.nossr50.spout.SpoutSounds;
  19. import com.gmail.nossr50.util.Misc;
  20. import com.gmail.nossr50.util.ModChecks;
  21. import com.gmail.nossr50.util.Permissions;
  22. import com.gmail.nossr50.util.Users;
  23. public abstract class Woodcutting {
  24. public static final int DOUBLE_DROP_MAX_LEVEL = AdvancedConfig.getInstance().getMiningDoubleDropMaxLevel();
  25. public static final double DOUBLE_DROP_CHANCE = AdvancedConfig.getInstance().getMiningDoubleDropChance();
  26. public static final int LEAF_BLOWER_UNLOCK_LEVEL = AdvancedConfig.getInstance().getLeafBlowUnlockLevel();
  27. public static final boolean DOUBLE_DROP_DISABLED = Config.getInstance().woodcuttingDoubleDropsDisabled();
  28. public static final int TREE_FELLER_THRESHOLD = Config.getInstance().getTreeFellerThreshold();
  29. /**
  30. * Begins the Tree Feller ability
  31. *
  32. * @param event Event to process
  33. */
  34. public static void beginTreeFeller(BlockBreakEvent event) {
  35. TreeFeller.process(event);
  36. }
  37. /**
  38. * Begins the Leaf Blower ability
  39. *
  40. * @param player Player using the ability
  41. * @param block Block being broken
  42. */
  43. public static void beginLeafBlower(Player player, Block block) {
  44. mcMMO.p.getServer().getPluginManager().callEvent(new FakePlayerAnimationEvent(player));
  45. if (mcMMO.spoutEnabled) {
  46. SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
  47. }
  48. }
  49. /**
  50. * Begins Woodcutting
  51. *
  52. * @param player Player breaking the block
  53. * @param block Block being broken
  54. */
  55. public static void beginWoodcutting(Player player, Block block) {
  56. int xp = 0;
  57. if (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLogBlock(block)) {
  58. xp = ModChecks.getCustomBlock(block).getXpGain();
  59. }
  60. else {
  61. try {
  62. xp = getExperienceFromLog(block);
  63. }
  64. catch (IllegalArgumentException exception) {
  65. return;
  66. }
  67. }
  68. checkDoubleDrop(player, block);
  69. Skills.xpProcessing(player, Users.getProfile(player), SkillType.WOODCUTTING, xp);
  70. }
  71. /**
  72. * Retrieves the experience reward from a log
  73. *
  74. * @param log Log being broken
  75. * @return Amount of experience
  76. * @throws IllegalArgumentException if 'log' is invalid
  77. */
  78. protected static int getExperienceFromLog(Block log) {
  79. TreeSpecies logType = TreeSpecies.getByData(extractLogItemData(log.getData()));
  80. // Apparently species can be null in certain cases (custom server mods?)
  81. // https://github.com/mcMMO-Dev/mcMMO/issues/229
  82. if (logType == null) {
  83. throw new IllegalArgumentException();
  84. }
  85. switch (logType) {
  86. case GENERIC:
  87. return Config.getInstance().getWoodcuttingXPOak();
  88. case REDWOOD:
  89. return Config.getInstance().getWoodcuttingXPSpruce();
  90. case BIRCH:
  91. return Config.getInstance().getWoodcuttingXPBirch();
  92. case JUNGLE:
  93. return Config.getInstance().getWoodcuttingXPJungle();
  94. default:
  95. throw new IllegalArgumentException();
  96. }
  97. }
  98. /**
  99. * Checks for double drops
  100. *
  101. * @param player Player breaking the block
  102. * @param block Block being broken
  103. */
  104. protected static void checkDoubleDrop(Player player, Block block) {
  105. if (!Permissions.woodcuttingDoubleDrops(player)) {
  106. return;
  107. }
  108. int chance = (int) ((DOUBLE_DROP_CHANCE / DOUBLE_DROP_MAX_LEVEL) * Users.getProfile(player).getSkillLevel(SkillType.WOODCUTTING));
  109. int activationChance = Misc.calculateActivationChance(Permissions.luckyWoodcutting(player));
  110. if (chance > DOUBLE_DROP_CHANCE) {
  111. chance = (int) DOUBLE_DROP_CHANCE;
  112. }
  113. if (chance <= Misc.getRandom().nextInt(activationChance)) {
  114. return;
  115. }
  116. if (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLogBlock(block)) {
  117. CustomBlock customBlock = ModChecks.getCustomBlock(block);
  118. int minimumDropAmount = customBlock.getMinimumDropAmount();
  119. int maximumDropAmount = customBlock.getMaximumDropAmount();
  120. Location location = block.getLocation();
  121. ItemStack item = customBlock.getItemDrop();
  122. Misc.dropItems(location, item, minimumDropAmount);
  123. if (minimumDropAmount != maximumDropAmount) {
  124. Misc.randomDropItems(location, item, 50, maximumDropAmount - minimumDropAmount);
  125. }
  126. }
  127. else {
  128. byte itemData = extractLogItemData(block.getData());
  129. Location location = block.getLocation();
  130. ItemStack item = new MaterialData(Material.LOG, itemData).toItemStack(1);
  131. switch (TreeSpecies.getByData(itemData)) {
  132. case GENERIC:
  133. if (Config.getInstance().getOakDoubleDropsEnabled()) {
  134. Misc.dropItem(location, item);
  135. }
  136. break;
  137. case REDWOOD:
  138. if (Config.getInstance().getSpruceDoubleDropsEnabled()) {
  139. Misc.dropItem(location, item);
  140. }
  141. break;
  142. case BIRCH:
  143. if (Config.getInstance().getBirchDoubleDropsEnabled()) {
  144. Misc.dropItem(location, item);
  145. }
  146. break;
  147. case JUNGLE:
  148. if (Config.getInstance().getJungleDoubleDropsEnabled()) {
  149. Misc.dropItem(location, item);
  150. }
  151. break;
  152. default:
  153. break;
  154. }
  155. }
  156. }
  157. /**
  158. * Extracts the log type from the block data (i.e. removes rotation)
  159. *
  160. * @param data Original block data
  161. * @return Extracted log type
  162. */
  163. protected static byte extractLogItemData(byte data) {
  164. return (byte) (data & 0x3);
  165. }
  166. }