diff --git a/Spigot-API-Patches/0172-BlockDestroyEvent.patch b/Spigot-API-Patches/0172-BlockDestroyEvent.patch new file mode 100644 index 0000000000..a0479d2c52 --- /dev/null +++ b/Spigot-API-Patches/0172-BlockDestroyEvent.patch @@ -0,0 +1,109 @@ +From b893b69e6c29a4b590d43c8b10d04b5a303f1b9d Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 6 Feb 2019 00:19:33 -0500 +Subject: [PATCH] BlockDestroyEvent + +Adds an event for when the server is going to destroy a current block, +potentially causing it to drop. This event can be cancelled to avoid +the block destruction, such as preventing signs from popping when +floating in the air. + +This can replace many uses of BlockPhysicsEvent + +diff --git a/src/main/java/com/destroystokyo/paper/event/block/BlockDestroyEvent.java b/src/main/java/com/destroystokyo/paper/event/block/BlockDestroyEvent.java +new file mode 100644 +index 00000000..a6247718 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/block/BlockDestroyEvent.java +@@ -0,0 +1,88 @@ ++package com.destroystokyo.paper.event.block; ++ ++import org.bukkit.block.Block; ++import org.bukkit.block.data.BlockData; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.block.BlockEvent; ++ ++/** ++ * Fired anytime the server intends to 'destroy' a block through some triggering reason. ++ * This does not fire anytime a block is set to air, but only with more direct triggers such ++ * as physics updates, pistons, Entities changing blocks, commands set to "Destroy". ++ * ++ * This event is associated with the game playing a sound effect at the block in question, when ++ * something can be described as "intend to destroy what is there", ++ * ++ * Events such as leaves decaying, pistons retracting (where the block is moving), does NOT fire this event. ++ * ++ */ ++public class BlockDestroyEvent extends BlockEvent implements Cancellable { ++ ++ private static final HandlerList handlers = new HandlerList(); ++ ++ private final BlockData newState; ++ private final boolean willDrop; ++ private boolean playEffect; ++ ++ private boolean cancelled = false; ++ ++ public BlockDestroyEvent(Block block, BlockData newState, boolean willDrop) { ++ super(block); ++ this.newState = newState; ++ this.willDrop = willDrop; ++ } ++ ++ /** ++ * @return The new state of this block (Air, or a Fluid type) ++ */ ++ public BlockData getNewState() { ++ return newState; ++ } ++ ++ /** ++ * @return If the server is going to drop the block in question with this destroy event ++ */ ++ public boolean willDrop() { ++ return this.willDrop; ++ } ++ ++ /** ++ * @return If the server is going to play the sound effect for this destruction ++ */ ++ public boolean playEffect() { ++ return this.playEffect; ++ } ++ ++ /** ++ * @param playEffect If the server should play the sound effect for this destruction ++ */ ++ public void setPlayEffect(boolean playEffect) { ++ this.playEffect = playEffect; ++ } ++ ++ /** ++ * @return If the event is cancelled, meaning the block will not be destroyed ++ */ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ /** ++ * If the event is cancelled, the block will remain in its previous state. ++ * @param cancel true if you wish to cancel this event ++ */ ++ @Override ++ public void setCancelled(boolean cancel) { ++ cancelled = cancel; ++ } ++ ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} +-- +2.20.1 + diff --git a/Spigot-Server-Patches/0417-BlockDestroyEvent.patch b/Spigot-Server-Patches/0417-BlockDestroyEvent.patch new file mode 100644 index 0000000000..5dcee4af2a --- /dev/null +++ b/Spigot-Server-Patches/0417-BlockDestroyEvent.patch @@ -0,0 +1,41 @@ +From 6e4b13bf79a67d16ff7c429afa6e9d7cc8673a35 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 6 Feb 2019 00:20:33 -0500 +Subject: [PATCH] BlockDestroyEvent + +Adds an event for when the server is going to destroy a current block, +potentially causing it to drop. This event can be cancelled to avoid +the block destruction, such as preventing signs from popping when +floating in the air. + +This can replace many uses of BlockPhysicsEvent + +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index ac14f562d4..8da2c3196b 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -548,8 +548,20 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc + return false; + } else { + Fluid fluid = this.getFluid(blockposition); ++ // Paper start - while the above setAir method is named same and looks very similar ++ // they are NOT used with same intent and the above should not fire this event. The above method is more of a BlockSetToAirEvent, ++ // it doesn't imply destruction of a block that plays a sound effect / drops an item. ++ boolean playEffect = true; ++ if (com.destroystokyo.paper.event.block.BlockDestroyEvent.getHandlerList().getRegisteredListeners().length > 0) { ++ com.destroystokyo.paper.event.block.BlockDestroyEvent event = new com.destroystokyo.paper.event.block.BlockDestroyEvent(MCUtil.toBukkitBlock(this, blockposition), fluid.i().createCraftBlockData(), flag); ++ if (!event.callEvent()) { ++ return false; ++ } ++ playEffect = event.playEffect(); ++ } ++ // Paper end + +- this.triggerEffect(2001, blockposition, Block.getCombinedId(iblockdata)); ++ if (playEffect) this.triggerEffect(2001, blockposition, Block.getCombinedId(iblockdata)); // Paper + if (flag) { + iblockdata.a(this, blockposition, 0); + } +-- +2.20.1 +