Plugin.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package timber.core;
  2. import java.util.Arrays;
  3. import java.util.HashSet;
  4. import java.util.LinkedList;
  5. import java.util.logging.Level;
  6. import org.bukkit.Bukkit;
  7. import org.bukkit.GameMode;
  8. import org.bukkit.Location;
  9. import org.bukkit.Material;
  10. import org.bukkit.block.Block;
  11. import org.bukkit.entity.Player;
  12. import org.bukkit.event.EventHandler;
  13. import org.bukkit.event.EventPriority;
  14. import org.bukkit.event.Listener;
  15. import org.bukkit.event.block.BlockBreakEvent;
  16. import org.bukkit.inventory.ItemStack;
  17. import org.bukkit.plugin.java.JavaPlugin;
  18. @SuppressWarnings("deprecation")
  19. public class Plugin extends JavaPlugin implements Listener {
  20. public static HashSet<String> validLogMaterials = new HashSet<>(Arrays.asList("LOG", "LOG_2", "LEGACY_LOG", "LEGACY_LOG_2", "ACACIA_LOG", "BIRCH_LOG", "DARK_OAK_LOG", "JUNGLE_LOG", "OAK_LOG", "SPRUCE_LOG"));
  21. public static HashSet<String> validAxeMaterials = new HashSet<>(Arrays.asList("DIAMOND_AXE", "GOLDEN_AXE", "IRON_AXE", "STONE_AXE", "WOODEN_AXE", "GOLD_AXE", "WOOD_AXE"));
  22. public static HashSet<Material> logMaterials = new HashSet<>();
  23. public static HashSet<Material> axeMaterials = new HashSet<>();
  24. public static boolean reverseSneakFunction = false;
  25. public void initializeHashSets()
  26. {
  27. for (Material material : Material.values())
  28. {
  29. if (validLogMaterials.contains(material.name()))
  30. {
  31. logMaterials.add(material);
  32. }
  33. if (validAxeMaterials.contains(material.name()))
  34. {
  35. axeMaterials.add(material);
  36. }
  37. }
  38. Bukkit.getLogger().log(Level.INFO, "Timber Log Materials: " + logMaterials.toString());
  39. Bukkit.getLogger().log(Level.INFO, "Timber Axe Materials: " + axeMaterials.toString());
  40. }
  41. @Override
  42. public void onEnable()
  43. {
  44. saveDefaultConfig();
  45. reverseSneakFunction = getConfig().getBoolean("reverseSneakFunction");
  46. initializeHashSets();
  47. getServer().getPluginManager().registerEvents(this, this);
  48. }
  49. @EventHandler(priority = EventPriority.MONITOR)
  50. public void onBlockBreak(BlockBreakEvent e)
  51. {
  52. Player player = e.getPlayer();
  53. boolean check = !player.isSneaking();
  54. if (reverseSneakFunction)
  55. {
  56. check = !check;
  57. }
  58. if (check)
  59. {
  60. if (!player.hasPermission("timber.disallow") || player.isOp())
  61. {
  62. ItemStack handStack = player.getItemInHand();
  63. if (axeMaterials.contains(handStack.getType()))
  64. {
  65. Block block = e.getBlock();
  66. if (logMaterials.contains(block.getType()))
  67. {
  68. cutDownTree(block.getLocation(), player.getGameMode() == GameMode.CREATIVE ? handStack.clone() : handStack);
  69. }
  70. }
  71. }
  72. }
  73. }
  74. private void cutDownTree(Location location, ItemStack handStack)
  75. {
  76. LinkedList<Block> blocks = new LinkedList<>();
  77. for (int i = location.getBlockY(); i < location.getWorld().getHighestBlockYAt(location.getBlockX(), location.getBlockZ());)
  78. {
  79. Location l = location.add(0.0D, 1.0D, 0.0D);
  80. Block block = l.getBlock();
  81. if (logMaterials.contains(block.getType()))
  82. {
  83. blocks.add(l.getBlock());
  84. l = null;
  85. i++;
  86. } else
  87. {
  88. break;
  89. }
  90. }
  91. for (Block block : blocks)
  92. {
  93. if (block.breakNaturally(handStack))
  94. {
  95. handStack.setDurability((short) (handStack.getDurability() + 1));
  96. if (handStack.getType().getMaxDurability() == handStack.getDurability())
  97. {
  98. handStack.setType(Material.AIR);
  99. return;
  100. }
  101. }
  102. }
  103. blocks = null;
  104. }
  105. }