Skip to content

Commit 4d8d5b3

Browse files
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 <[email protected]>
1 parent cd6a32c commit 4d8d5b3

File tree

1 file changed

+27
-17
lines changed

1 file changed

+27
-17
lines changed

Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.bukkit.event.entity.PotionSplashEvent;
4848
import org.bukkit.event.entity.ProjectileHitEvent;
4949
import org.bukkit.event.entity.ProjectileLaunchEvent;
50+
import org.bukkit.event.player.PlayerEggThrowEvent;
5051
import org.bukkit.projectiles.BlockProjectileSource;
5152
import org.bukkit.projectiles.ProjectileSource;
5253
import org.checkerframework.checker.nullness.qual.NonNull;
@@ -157,30 +158,41 @@ public void onProjectileLaunch(ProjectileLaunchEvent event) {
157158

158159
@EventHandler
159160
public void onProjectileHit(ProjectileHitEvent event) {
160-
Projectile entity = event.getEntity();
161+
if (cancelProjectileHit(event.getEntity())) {
162+
event.setCancelled(true);
163+
}
164+
}
165+
166+
@EventHandler
167+
public void onPlayerEggThrow(PlayerEggThrowEvent event) {
168+
if (cancelProjectileHit(event.getEgg())) {
169+
event.setHatching(false);
170+
}
171+
}
172+
173+
private boolean cancelProjectileHit(Projectile entity) {
161174
Location location = BukkitUtil.adapt(entity.getLocation());
162175
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
163-
return;
176+
return false;
164177
}
165178
PlotArea area = location.getPlotArea();
166179
if (area == null) {
167-
return;
180+
return false;
168181
}
169182
Plot plot = area.getPlot(location);
170183
ProjectileSource shooter = entity.getShooter();
171184
if (shooter instanceof Player) {
172185
if (!((Player) shooter).isOnline()) {
173186
if (plot != null) {
174187
if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) {
175-
return;
188+
return false;
176189
}
177190
} else if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true)) {
178-
return;
191+
return false;
179192
}
180193

181194
entity.remove();
182-
event.setCancelled(true);
183-
return;
195+
return true;
184196
}
185197

186198
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
@@ -189,38 +201,36 @@ public void onProjectileHit(ProjectileHitEvent event) {
189201
Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED
190202
)) {
191203
entity.remove();
192-
event.setCancelled(true);
204+
return true;
193205
}
194-
return;
206+
return false;
195207
}
196208
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
197209
ProjectilesFlag.class) || (entity instanceof FishHook && plot.getFlag(
198210
FishingFlag.class))) {
199-
return;
211+
return false;
200212
}
201213
entity.remove();
202-
event.setCancelled(true);
203-
return;
214+
return true;
204215
}
205216
if (!(shooter instanceof Entity) && shooter != null) {
206217
if (plot == null) {
207218
entity.remove();
208-
event.setCancelled(true);
209-
return;
219+
return true;
210220
}
211221
Location sLoc =
212222
BukkitUtil.adapt(((BlockProjectileSource) shooter).getBlock().getLocation());
213223
if (!area.contains(sLoc.getX(), sLoc.getZ())) {
214224
entity.remove();
215-
event.setCancelled(true);
216-
return;
225+
return true;
217226
}
218227
Plot sPlot = area.getOwnedPlotAbs(sLoc);
219228
if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) {
220229
entity.remove();
221-
event.setCancelled(true);
230+
return true;
222231
}
223232
}
233+
return false;
224234
}
225235

226236
}

0 commit comments

Comments
 (0)