47 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Aikar <aikar@aikar.co>
 | 
						|
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/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
 | 
						|
index 2225921e988cdcaa4fb906b281c237972c6e7c1b..d72804cd4491c60043e428c0d06e02f9ca7f9303 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/level/Level.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/level/Level.java
 | 
						|
@@ -28,6 +28,7 @@ import net.minecraft.nbt.CompoundTag;
 | 
						|
 import net.minecraft.network.protocol.Packet;
 | 
						|
 import net.minecraft.resources.ResourceKey;
 | 
						|
 import net.minecraft.resources.ResourceLocation;
 | 
						|
+import net.minecraft.server.MCUtil;
 | 
						|
 import net.minecraft.server.MinecraftServer;
 | 
						|
 import net.minecraft.server.level.ChunkHolder;
 | 
						|
 import net.minecraft.server.level.ServerLevel;
 | 
						|
@@ -578,8 +579,21 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
 | 
						|
             return false;
 | 
						|
         } else {
 | 
						|
             FluidState fluid = this.getFluidState(pos);
 | 
						|
+            // 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, pos), fluid.createLegacyBlock().createCraftBlockData(), drop);
 | 
						|
+                if (!event.callEvent()) {
 | 
						|
+                    return false;
 | 
						|
+                }
 | 
						|
+                playEffect = event.playEffect();
 | 
						|
+                drop = event.willDrop();
 | 
						|
+            }
 | 
						|
+            // Paper end
 | 
						|
 
 | 
						|
-            if (!(iblockdata.getBlock() instanceof BaseFireBlock)) {
 | 
						|
+            if (playEffect && !(iblockdata.getBlock() instanceof BaseFireBlock)) { // Paper
 | 
						|
                 this.levelEvent(2001, pos, Block.getId(iblockdata));
 | 
						|
             }
 | 
						|
 
 |