diff --git a/Spigot-API-Patches/Make-ProjectileHitEvent-Cancellable.patch b/Spigot-API-Patches/Make-ProjectileHitEvent-Cancellable.patch new file mode 100644 index 0000000000..843efc8924 --- /dev/null +++ b/Spigot-API-Patches/Make-ProjectileHitEvent-Cancellable.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 16 Jan 2021 14:00:16 -0500 +Subject: [PATCH] Make ProjectileHitEvent Cancellable + +Allows cancelling things like detonating TNT from Fire Arrows + +diff --git a/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java b/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java ++++ b/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java +@@ -0,0 +0,0 @@ import org.bukkit.block.Block; + import org.bukkit.block.BlockFace; + import org.bukkit.entity.Entity; + import org.bukkit.entity.Projectile; ++import org.bukkit.event.Cancellable; + import org.bukkit.event.HandlerList; + import org.jetbrains.annotations.NotNull; + import org.jetbrains.annotations.Nullable; +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable; + /** + * Called when a projectile hits an object + */ +-public class ProjectileHitEvent extends EntityEvent { ++public class ProjectileHitEvent extends EntityEvent implements Cancellable { // Paper + private static final HandlerList handlers = new HandlerList(); + private final Entity hitEntity; + private final Block hitBlock; + private final BlockFace hitFace; ++ // Paper start - make cancellable ++ private boolean canceled; ++ /** ++ * @return If the arrow activating a block should be cancelled ++ */ ++ public boolean isCancelled() { ++ return canceled; ++ } ++ ++ /** ++ * Whether or not to cancel any behavior that would occur from the arrow hitting the block ++ * @param cancel true if you wish to cancel this event ++ */ ++ public void setCancelled(boolean cancel) { ++ canceled = cancel; ++ } ++ // Paper end + + public ProjectileHitEvent(@NotNull final Projectile projectile) { + this(projectile, null, null); diff --git a/Spigot-Server-Patches/Make-ProjectileHitEvent-Cancellable.patch b/Spigot-Server-Patches/Make-ProjectileHitEvent-Cancellable.patch new file mode 100644 index 0000000000..d421b6342c --- /dev/null +++ b/Spigot-Server-Patches/Make-ProjectileHitEvent-Cancellable.patch @@ -0,0 +1,58 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 16 Jan 2021 14:30:12 -0500 +Subject: [PATCH] Make ProjectileHitEvent Cancellable + +Allows cancelling things like detonating TNT from Fire Arrows + +diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/EntityFireball.java ++++ b/src/main/java/net/minecraft/server/EntityFireball.java +@@ -0,0 +0,0 @@ public abstract class EntityFireball extends IProjectile { + + // CraftBukkit start - Fire ProjectileHitEvent + if (this.dead) { +- CraftEventFactory.callProjectileHitEvent(this, movingobjectposition); ++ if (!CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) return; // Paper - this is an undesired duplicate event, but make cancellable + } + // CraftBukkit end + } +diff --git a/src/main/java/net/minecraft/server/IProjectile.java b/src/main/java/net/minecraft/server/IProjectile.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/IProjectile.java ++++ b/src/main/java/net/minecraft/server/IProjectile.java +@@ -0,0 +0,0 @@ public abstract class IProjectile extends Entity { + } + + protected void a(MovingObjectPosition movingobjectposition) { +- org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition); // CraftBukkit - Call event ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) return; // CraftBukkit - Call event // Paper - make cancellable + MovingObjectPosition.EnumMovingObjectType movingobjectposition_enummovingobjecttype = movingobjectposition.getType(); + + if (movingobjectposition_enummovingobjecttype == MovingObjectPosition.EnumMovingObjectType.ENTITY) { +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -0,0 +0,0 @@ public class CraftEventFactory { + return event; + } + +- public static void callProjectileHitEvent(Entity entity, MovingObjectPosition position) { ++ public static boolean callProjectileHitEvent(Entity entity, MovingObjectPosition position) { // Paper - make cancellable + if (position.getType() == MovingObjectPosition.EnumMovingObjectType.MISS) { +- return; ++ return false; // Paper - make cancellable + } + + Block hitBlock = null; +@@ -0,0 +0,0 @@ public class CraftEventFactory { + } + + ProjectileHitEvent event = new ProjectileHitEvent((Projectile) entity.getBukkitEntity(), hitEntity, hitBlock, hitFace); +- entity.world.getServer().getPluginManager().callEvent(event); ++ return event.callEvent(); // Paper + } + + public static ExpBottleEvent callExpBottleEvent(Entity entity, int exp) {