From 4d8d5b3a9f90d24412aaffb5fce2cea32885cbe8 Mon Sep 17 00:00:00 2001 From: EnZaXD Date: Sat, 23 Aug 2025 13:08:28 +0200 Subject: [PATCH] fix: special handle thrown eggs for projectile hit checks (#4728) Cancelling the ProjectileHitEvent will not cover for thrown eggs spawning chickens due to how Bukkit has these events structured. The provided patch calls the same code used for normal projectiles in the specialized egg event to prevent unwanted chickens from spawning on other plots. Signed-off-by: FlorianMichael --- .../listener/ProjectileEventListener.java | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java index 47e3b76e7..0f5b551e0 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java @@ -47,6 +47,7 @@ import org.bukkit.event.entity.LingeringPotionSplashEvent; import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerEggThrowEvent; import org.bukkit.projectiles.BlockProjectileSource; import org.bukkit.projectiles.ProjectileSource; import org.checkerframework.checker.nullness.qual.NonNull; @@ -157,14 +158,26 @@ public class ProjectileEventListener implements Listener { @EventHandler public void onProjectileHit(ProjectileHitEvent event) { - Projectile entity = event.getEntity(); + if (cancelProjectileHit(event.getEntity())) { + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerEggThrow(PlayerEggThrowEvent event) { + if (cancelProjectileHit(event.getEgg())) { + event.setHatching(false); + } + } + + private boolean cancelProjectileHit(Projectile entity) { Location location = BukkitUtil.adapt(entity.getLocation()); if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { - return; + return false; } PlotArea area = location.getPlotArea(); if (area == null) { - return; + return false; } Plot plot = area.getPlot(location); ProjectileSource shooter = entity.getShooter(); @@ -172,15 +185,14 @@ public class ProjectileEventListener implements Listener { if (!((Player) shooter).isOnline()) { if (plot != null) { if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) { - return; + return false; } } else if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true)) { - return; + return false; } entity.remove(); - event.setCancelled(true); - return; + return true; } PlotPlayer pp = BukkitUtil.adapt((Player) shooter); @@ -189,38 +201,36 @@ public class ProjectileEventListener implements Listener { Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED )) { entity.remove(); - event.setCancelled(true); + return true; } - return; + return false; } if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag( ProjectilesFlag.class) || (entity instanceof FishHook && plot.getFlag( FishingFlag.class))) { - return; + return false; } entity.remove(); - event.setCancelled(true); - return; + return true; } if (!(shooter instanceof Entity) && shooter != null) { if (plot == null) { entity.remove(); - event.setCancelled(true); - return; + return true; } Location sLoc = BukkitUtil.adapt(((BlockProjectileSource) shooter).getBlock().getLocation()); if (!area.contains(sLoc.getX(), sLoc.getZ())) { entity.remove(); - event.setCancelled(true); - return; + return true; } Plot sPlot = area.getOwnedPlotAbs(sLoc); if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) { entity.remove(); - event.setCancelled(true); + return true; } } + return false; } }