diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java b/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java index 2f676bb..6294599 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java @@ -205,13 +205,18 @@ public abstract class AbstractCustomEventListener implements Listener { public void onBlockChange(BlockFadeEvent event) { Block block = event.getBlock(); if (block.getType() == Material.FARMLAND) { - Pos3 above = Pos3.from(block.getLocation()).add(0,1,0); - BukkitCustomCropsPlugin.getInstance().getWorldManager().getWorld(block.getWorld()) - .flatMap(world -> world.getBlockState(above)).ifPresent(blockState -> { - if (blockState.type() instanceof CropBlock) { + Pos3 pos3 = Pos3.from(block.getLocation()); + Pos3 above = pos3.add(0,1,0); + Optional> optionalWorld = BukkitCustomCropsPlugin.getInstance().getWorldManager().getWorld(block.getWorld()); + if (optionalWorld.isPresent()) { + CustomCropsWorld world = optionalWorld.get(); + Optional optionalState = world.getBlockState(above); + if (optionalState.isPresent() && optionalState.get().type() instanceof CropBlock) { event.setCancelled(true); + return; } - }); + this.itemManager.handlePhysicsBreak(block.getLocation(), "FARMLAND", event); + } } } diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/AbstractItemManager.java b/api/src/main/java/net/momirealms/customcrops/api/core/AbstractItemManager.java index 9ebf724..54d2f34 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/AbstractItemManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/AbstractItemManager.java @@ -62,6 +62,12 @@ public abstract class AbstractItemManager implements ItemManager { Cancellable event ); + public abstract void handlePhysicsBreak( + Location location, + String brokenID, + Cancellable event + ); + public abstract void handleEntityTrample( Entity entity, Location location, diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/BreakReason.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/BreakReason.java index e381777..42d3cc3 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/BreakReason.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/BreakReason.java @@ -21,5 +21,6 @@ public enum BreakReason { BREAK, TRAMPLE, EXPLODE, - ACTION + ACTION, + PHYSICS, } diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java index 412aa9a..fbec063 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java @@ -474,6 +474,21 @@ public class BukkitItemManager extends AbstractItemManager { } } + @Override + public void handlePhysicsBreak(Location location, String brokenID, Cancellable event) { + Optional> optionalWorld = plugin.getWorldManager().getWorld(location.getWorld()); + if (optionalWorld.isEmpty()) { + return; + } + + CustomCropsWorld world = optionalWorld.get(); + WrappedBreakEvent wrapped = new WrappedBreakEvent(null, null, world, location, brokenID, null, null, BreakReason.PHYSICS, event); + CustomCropsBlock customCropsBlock = Registries.BLOCKS.get(brokenID); + if (customCropsBlock != null) { + customCropsBlock.onBreak(wrapped); + } + } + @Override public void handleEntityTrample(Entity entity, Location location, String brokenID, Cancellable event) { Optional> optionalWorld = plugin.getWorldManager().getWorld(entity.getWorld());