diff --git a/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 8d2c587..c16ebdd 100644 Binary files a/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log b/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log index db01c5a..00b64f8 100644 --- a/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log +++ b/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log @@ -1,2 +1,2 @@ Command: /opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -Xmx1G -classpath /Users/janik/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.11.1/6c1f29838864ba8f495855edfc8ef17706fedb5d/tiny-remapper-0.11.1-fat.jar net.fabricmc.tinyremapper.Main /Users/janik/Desktop/MCPlugins/environmentex-1.0-SNAPSHOT.jar /Users/janik/Desktop/MCPlugins/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/reobfMappings.tiny mojang spigot /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/mappedServerJar.jar --threads=1 -[INFO] Finished after 998,05 ms. +[INFO] Finished after 880,98 ms. diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/App.class b/environmentex/build/classes/java/main/de/hessj/environmentex/App.class index e428b1e..6af1ec0 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/App.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/App.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$1.class index 13dd892..8512ce1 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$2.class b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$2.class index 1f0cf16..4ec707f 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$2.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$2.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$3.class b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$3.class index a49a468..d1468f4 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$3.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners$3.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners.class b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners.class index ac03358..31bfc9f 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/EnvironmentExListeners.class differ diff --git a/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar b/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar index 1cfe040..577570d 100644 Binary files a/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar and b/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar differ diff --git a/environmentex/build/tmp/compileJava/previous-compilation-data.bin b/environmentex/build/tmp/compileJava/previous-compilation-data.bin index b413f2b..f98e583 100644 Binary files a/environmentex/build/tmp/compileJava/previous-compilation-data.bin and b/environmentex/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/environmentex/src/main/java/de/hessj/environmentex/App.java b/environmentex/src/main/java/de/hessj/environmentex/App.java index dc62e64..067c429 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/App.java +++ b/environmentex/src/main/java/de/hessj/environmentex/App.java @@ -6,8 +6,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitTask; - import net.kyori.adventure.text.Component; import net.md_5.bungee.api.ChatColor; import org.bukkit.NamespacedKey; @@ -15,9 +13,7 @@ import org.bukkit.World; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; @@ -463,6 +459,7 @@ public class App extends JavaPlugin { pM.registerEvents(new PinFeature(), this); pM.registerEvents(new SquidPrevention(), this); pM.registerEvents(new EntityMuter(), this); + pM.registerEvents(new BetterHoes(), this); getCommand("test").setExecutor(new EnvironmentExCommands()); getCommand("y").setExecutor(new EnvironmentExCommands()); getCommand("n").setExecutor(new EnvironmentExCommands()); diff --git a/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java b/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java new file mode 100644 index 0000000..acb9f37 --- /dev/null +++ b/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java @@ -0,0 +1,253 @@ +package de.hessj.environmentex; + +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityInteractEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.AnvilInventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.view.AnvilView; +import org.bukkit.scheduler.BukkitRunnable; + +import io.netty.util.internal.ThreadLocalRandom; +import java.util.EnumSet; +import java.util.Random; +import java.util.Set; + +public class BetterHoes implements Listener { + + @EventHandler + public void onAnvilPrepare(PrepareAnvilEvent event) { + AnvilInventory inv = event.getInventory(); + AnvilView av = event.getView(); + ItemStack left = inv.getItem(0); + ItemStack right = inv.getItem(1); + + if (left == null || right == null) return; + if (!left.getType().name().endsWith("_HOE")) return; + if (right.getType() != Material.ENCHANTED_BOOK) return; + + if (!(right.getItemMeta() instanceof EnchantmentStorageMeta bookMeta)) return; + if (!bookMeta.hasStoredEnchant(Enchantment.INFINITY)) return; + + // Create the new hoe with Infinity + ItemStack result = left.clone(); + result.addUnsafeEnchantment(Enchantment.INFINITY, 1); + event.setResult(result); + + // Set repair cost using the view (modern API) + new BukkitRunnable() { + @Override + public void run() { + av.setRepairCost(6); + } + }.runTaskLater(App.main, 1L); + } + + public boolean hasInfinity(ItemStack item) { + if (item == null || !item.hasItemMeta()) + return false; + + ItemMeta meta = item.getItemMeta(); + return meta.hasEnchant(Enchantment.INFINITY); + } + + private static final Set HARVESTABLE_CROPS = EnumSet.of( + Material.WHEAT, + Material.CARROTS, + Material.POTATOES, + Material.BEETROOTS); + + @EventHandler + public void onPlayerStepFarmland(PlayerInteractEvent event) { + if (event.getAction() == Action.PHYSICAL && event.getClickedBlock() != null && + event.getClickedBlock().getType() == Material.FARMLAND) { + event.setCancelled(true); + } + } + + @EventHandler + public void onEntityStepFarmland(EntityInteractEvent event) { + if (event.getEntityType() != EntityType.PLAYER && + event.getBlock() != null && event.getBlock().getType() == Material.FARMLAND) { + event.setCancelled(true); + } + } + + @EventHandler + public void onHoeHarvest(PlayerInteractEvent event) { + if (event.getAction() != Action.LEFT_CLICK_BLOCK || event.getClickedBlock() == null) + return; + + Block clicked = event.getClickedBlock(); + Material type = clicked.getType(); + if (!HARVESTABLE_CROPS.contains(type)) + return; + + ItemStack tool = event.getPlayer().getInventory().getItemInMainHand(); + if (tool == null || !tool.getType().name().endsWith("_HOE")) + return; + + int radius = switch (tool.getType()) { + case IRON_HOE -> 1; + case GOLDEN_HOE -> 2; + case DIAMOND_HOE -> 3; + case NETHERITE_HOE -> 4; + default -> 0; + }; + + harvest(event, clicked, radius); + } + + private void harvest(PlayerInteractEvent event, Block center, int radius) { + event.setCancelled(true); + PlayerInventoryHelper helper = new PlayerInventoryHelper(event.getPlayer()); + + if (radius > 0) { + event.getPlayer().spawnParticle(Particle.SWEEP_ATTACK, + event.getPlayer().getEyeLocation() + .add(event.getPlayer().getLocation().getDirection().multiply(1.5)), + 1); + } + + for (int dx = -radius; dx <= radius; dx++) { + for (int dy = -radius; dy <= radius; dy++) { + for (int dz = -radius; dz <= radius; dz++) { + Block target = center.getRelative(dx, dy, dz); + tryHarvestCrop(event, target, helper); + } + } + } + + // Also process the center block last to guarantee it runs even with radius 0 + tryHarvestCrop(event, center, helper); + } + + private void tryHarvestCrop(PlayerInteractEvent event, Block block, PlayerInventoryHelper helper) { + BlockData data = block.getBlockData(); + if (!(data instanceof Ageable ageable)) + return; + if (ageable.getAge() < ageable.getMaximumAge()) + return; + + Material cropType = block.getType(); + if (!HARVESTABLE_CROPS.contains(cropType)) + return; + + if (!helper.hasDurability()) { + helper.breakTool(); + return; + } + + block.setType(Material.AIR); + helper.damageTool(toolDamageChance(helper.getTool().getType())); + // block.getWorld().dropItemNaturally(block.getLocation(), getCropDrop(cropType)); + dropCrop(cropType, block.getLocation(), helper.getTool()); + if (hasInfinity(helper.getTool())) { + block.setType(cropType); // reset crop + } + } + + private void dropCrop(Material cropType, Location location, ItemStack tool) { + World world = location.getWorld(); + ThreadLocalRandom random = ThreadLocalRandom.current(); + + int fortuneLevel = 0; + if (tool != null && tool.containsEnchantment(Enchantment.FORTUNE)) { + fortuneLevel = tool.getEnchantmentLevel(Enchantment.FORTUNE); + } + + switch (cropType) { + case WHEAT -> { + world.dropItemNaturally(location, new ItemStack(Material.WHEAT)); + int seedCount = 1 + random.nextInt(3); // vanilla: 0–3 seeds (simplified) + world.dropItemNaturally(location, new ItemStack(Material.WHEAT_SEEDS, seedCount)); + } + + case CARROTS -> { + int base = 1; + int extra = random.nextInt(fortuneLevel + 2); // fortune increases upper bound + int total = base + extra; + world.dropItemNaturally(location, new ItemStack(Material.CARROT, total)); + } + + case POTATOES -> { + int base = 1; + int extra = random.nextInt(fortuneLevel + 2); + int total = base + extra; + world.dropItemNaturally(location, new ItemStack(Material.POTATO, total)); + + // Slightly increase chance of poisonous potato with Fortune + double poisonChance = 0.02 + (0.005 * fortuneLevel); + if (random.nextDouble() < poisonChance) { + world.dropItemNaturally(location, new ItemStack(Material.POISONOUS_POTATO)); + } + } + + case BEETROOTS -> { + world.dropItemNaturally(location, new ItemStack(Material.BEETROOT)); + int seedCount = 1 + random.nextInt(3); + world.dropItemNaturally(location, new ItemStack(Material.BEETROOT_SEEDS, seedCount)); + } + + default -> { + // No valid crop — optional: log or ignore + } + } + } + + private int toolDamageChance(Material toolType) { + double chance = switch (toolType) { + case WOODEN_HOE -> 0.70; + case STONE_HOE -> 0.75; + case IRON_HOE -> 0.80; + case GOLDEN_HOE -> 0.85; + case DIAMOND_HOE -> 0.90; + case NETHERITE_HOE -> 0.95; + default -> 0.70; + }; + return new Random().nextDouble() < chance ? 0 : 1; + } + + // Helper class for handling tool durability and inventory safely + static class PlayerInventoryHelper { + private final org.bukkit.entity.Player player; + private final ItemStack tool; + private final Damageable meta; + + public PlayerInventoryHelper(org.bukkit.entity.Player player) { + this.player = player; + this.tool = player.getInventory().getItemInMainHand(); + this.meta = (Damageable) tool.getItemMeta(); + } + + public ItemStack getTool() { + return tool; + } + + public boolean hasDurability() { + return meta.getDamage() < tool.getType().getMaxDurability(); + } + + public void damageTool(int amount) { + meta.setDamage(meta.getDamage() + amount); + tool.setItemMeta(meta); + } + + public void breakTool() { + player.getInventory().clear(player.getInventory().getHeldItemSlot()); + player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); + } + } +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java b/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java new file mode 100644 index 0000000..36e4964 --- /dev/null +++ b/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java @@ -0,0 +1,20 @@ +package de.hessj.environmentex; + +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityTargetEvent; + +public class EntityMuter implements Listener { + @EventHandler + public void onEntitySound(EntityTargetEvent event) { + if (event.getEntity().getType() != EntityType.ZOMBIE && event.getTarget() != null && event.getTarget().getType() != EntityType.VILLAGER) { + return; + } + if (event.getEntity().customName() != null) { + if (event.getEntity().customName().toString().contains("muted")) { + event.getEntity().setSilent(true); + } + } + } +} diff --git a/environmentex/src/main/java/de/hessj/environmentex/EnvironmentExListeners.java b/environmentex/src/main/java/de/hessj/environmentex/EnvironmentExListeners.java index 62fffa7..2b323f4 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/EnvironmentExListeners.java +++ b/environmentex/src/main/java/de/hessj/environmentex/EnvironmentExListeners.java @@ -1,6 +1,5 @@ package de.hessj.environmentex; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -13,20 +12,15 @@ import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.SoundCategory; import org.bukkit.Statistic; import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Ageable; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Fence; import org.bukkit.block.data.type.Leaves; import org.bukkit.block.data.type.Stairs; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Axolotl; import org.bukkit.entity.EntityType; import org.bukkit.entity.Fish; @@ -42,7 +36,6 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityInteractEvent; import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.ClickType; @@ -57,12 +50,9 @@ import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.player.PlayerAttemptPickupItemEvent; import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.util.Vector; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.MerchantRecipe; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; import net.kyori.adventure.text.Component; import de.hessj.helper.Helper; @@ -267,197 +257,6 @@ if(LoginListener.customConfig.getBoolean("players." + p.getUniqueId() + ".ignore } - @EventHandler - public void soilChangePlayer(PlayerInteractEvent event) { - if (event.getAction() == Action.PHYSICAL && event.getClickedBlock().getType() == Material.FARMLAND) { - event.setCancelled(true); - } - } - - @EventHandler - public void soilChangeEntity(EntityInteractEvent event) { - if (event.getEntityType() != EntityType.PLAYER && event.getBlock().getType() == Material.FARMLAND) { - event.setCancelled(true); - } - } - - @EventHandler - public void onClick(PlayerInteractEvent e) { - if (e.getAction() == Action.LEFT_CLICK_BLOCK - && (e.getClickedBlock().getType() == Material.WHEAT || e.getClickedBlock().getType() == Material.CARROTS - || e.getClickedBlock().getType() == Material.ATTACHED_MELON_STEM - || e.getClickedBlock().getType() == Material.MELON_STEM - || e.getClickedBlock().getType() == Material.ATTACHED_PUMPKIN_STEM - || e.getClickedBlock().getType() == Material.PUMPKIN_STEM - || e.getClickedBlock().getType() == Material.POTATOES - || e.getClickedBlock().getType() == Material.BEETROOTS)) { - if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.WOODEN_HOE)) { - harvest(0, e); - } else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.STONE_HOE)) { - harvest(0, e); - } else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.IRON_HOE)) { - harvest(1, e); - } else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.GOLDEN_HOE)) { - harvest(2, e); - } else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.DIAMOND_HOE)) { - harvest(3, e); - } else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NETHERITE_HOE)) { - harvest(4, e); - } - } - } - - public static int harvestDMG(Material weapon) { - - double perc = 0.70; - - if (weapon == Material.WOODEN_HOE) { - perc = 0.70; - } else if (weapon == Material.STONE_HOE) { - perc = 0.75; - } else if (weapon == Material.IRON_HOE) { - perc = 0.80; - } else if (weapon == Material.GOLDEN_HOE) { - perc = 0.85; - } else if (weapon == Material.DIAMOND_HOE) { - perc = 0.90; - } else if (weapon == Material.NETHERITE_HOE) { - perc = 0.95; - } - - Random rand = new Random(); - return (rand.nextDouble() < perc) ? 0 : 1; - } - - void harvest(int radius, PlayerInteractEvent e) { - e.setCancelled(true); - Block middle = e.getClickedBlock(); - Material cropM = middle.getType(); - - ItemStack isCropM; - switch (cropM) { - case POTATOES: - isCropM = new ItemStack(Material.POTATO, 1); - break; - case BEETROOTS: - isCropM = new ItemStack(Material.BEETROOT, 1); - break; - case WHEAT: - isCropM = new ItemStack(Material.WHEAT, 1); - break; - case CARROTS: - isCropM = new ItemStack(Material.CARROT, 1); - break; - default: - isCropM = new ItemStack(Material.AIR, 0); - break; - - } - if (middle.getBlockData() instanceof Ageable) { - Ageable ab = (Ageable) middle.getBlockData(); - if (ab.getAge() == ab.getMaximumAge()) { - if (e.getPlayer().getInventory().getItemInMainHand() != null - && ((Damageable) e.getPlayer().getInventory().getItemInMainHand().getItemMeta()) - .getDamage() <= e - .getPlayer().getInventory().getItemInMainHand().getType().getMaxDurability()) { - if (cropM != Material.PUMPKIN_STEM && cropM != Material.MELON_STEM) { - middle.setType(Material.AIR); - Bukkit.getWorlds().get(0).dropItem(middle.getLocation(), isCropM); - - ItemStack is = e.getPlayer().getInventory().getItemInMainHand(); - ItemMeta meta = is.getItemMeta(); - Damageable d = (Damageable) meta; - d.setDamage(d.getDamage() + harvestDMG(is.getType())); - is.setItemMeta(meta); - middle.setType(cropM); - } - } - if (e.getPlayer().getInventory().getItemInMainHand() != null - && ((Damageable) e.getPlayer().getInventory().getItemInMainHand().getItemMeta()) - .getDamage() >= e - .getPlayer().getInventory().getItemInMainHand().getType().getMaxDurability()) { - e.getPlayer().getInventory().clear(e.getPlayer().getInventory().getHeldItemSlot()); - e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); - } - } - } - if (radius != 0) { - Vector direction = e.getPlayer().getLocation().getDirection(); - Location location = e.getPlayer().getEyeLocation(); - location.add(direction.multiply(1.5D)); - e.getPlayer().getWorld().spawnParticle(Particle.SWEEP_ATTACK, location, 1); - - for (int x = radius; x >= -radius; x--) { - for (int y = radius; y >= -radius; y--) { - for (int z = radius; z >= -radius; z--) { - BlockData bd = (BlockData) middle.getRelative(x, y, z).getBlockData(); - if (bd instanceof Ageable) { - Ageable abR = (Ageable) bd; - if (abR.getAge() == abR.getMaximumAge()) { - try { - if (e.getPlayer().getInventory().getItemInMainHand() != null - && ((Damageable) e.getPlayer().getInventory().getItemInMainHand() - .getItemMeta()).getDamage() <= e.getPlayer().getInventory() - .getItemInMainHand().getType().getMaxDurability()) { - Material crop = middle.getRelative(x, y, z).getType(); - - Location loc = middle.getRelative(x, y, z).getLocation(); - - ItemStack isCrop; - - switch (crop) { - case POTATOES: - isCrop = new ItemStack(Material.POTATO, 1); - break; - case BEETROOTS: - isCrop = new ItemStack(Material.BEETROOT, 1); - break; - case WHEAT: - isCrop = new ItemStack(Material.WHEAT, 1); - break; - case CARROTS: - isCrop = new ItemStack(Material.CARROT, 1); - break; - default: - isCrop = new ItemStack(Material.AIR, 0); - break; - - } - - // middle.getRelative(x, y, z).breakNaturally(new ItemStack(Material.AIR)); - if (crop != Material.PUMPKIN_STEM && crop != Material.MELON_STEM) { - middle.getRelative(x, y, z).setType(Material.AIR); - Bukkit.getWorlds().get(0).dropItem(loc, isCrop); - - middle.getRelative(x, y, z).setType(crop); - - ItemStack is = e.getPlayer().getInventory().getItemInMainHand(); - ItemMeta meta = is.getItemMeta(); - Damageable d = (Damageable) meta; - d.setDamage(d.getDamage() + harvestDMG(is.getType())); - is.setItemMeta(meta); - } - } - if (e.getPlayer().getInventory().getItemInMainHand() != null - && ((Damageable) e.getPlayer().getInventory().getItemInMainHand() - .getItemMeta()).getDamage() >= e.getPlayer().getInventory() - .getItemInMainHand().getType().getMaxDurability()) { - e.getPlayer().getInventory() - .clear(e.getPlayer().getInventory().getHeldItemSlot()); - e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.ENTITY_ITEM_BREAK, 1, - 1); - } - } catch (NullPointerException ex) { - - } - } - } - } - } - } - } - } - private long breakDelay = 5; private long decayDelay = 2; private boolean spawnParticles = true; @@ -725,7 +524,7 @@ if(LoginListener.customConfig.getBoolean("players." + p.getUniqueId() + ".ignore return; } } - ItemStack is = e.getPlayer().getInventory().getItemInOffHand(); + // ItemStack is = e.getPlayer().getInventory().getItemInOffHand(); if (e.getPlayer().getInventory().getItemInMainHand() != null && e.getPlayer().getInventory().getItemInMainHand().getItemMeta() != null) { if (e.getPlayer().getInventory().getItemInMainHand().getItemMeta().getPersistentDataContainer()