2021-06-11 14:02:28 +02:00
|
|
|
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
|
2024-02-01 10:15:57 +01:00
|
|
|
index 181201ecd6c617cc37ba097a667bd96ae3b1823e..28ed20fc6e53490392c59b927889d78eb268b777 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -26,6 +26,7 @@ import net.minecraft.nbt.CompoundTag;
|
2021-06-13 10:26:58 +02:00
|
|
|
import net.minecraft.network.protocol.Packet;
|
2021-06-11 14:02:28 +02:00
|
|
|
import net.minecraft.resources.ResourceKey;
|
|
|
|
import net.minecraft.resources.ResourceLocation;
|
2022-10-24 21:43:46 +02:00
|
|
|
+import io.papermc.paper.util.MCUtil;
|
2021-06-11 14:02:28 +02:00
|
|
|
import net.minecraft.server.MinecraftServer;
|
2023-06-07 22:41:26 +02:00
|
|
|
import net.minecraft.server.level.FullChunkStatus;
|
2021-06-11 14:02:28 +02:00
|
|
|
import net.minecraft.server.level.ServerLevel;
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -581,9 +582,26 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
2021-06-11 14:02:28 +02:00
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
FluidState fluid = this.getFluidState(pos);
|
2024-01-21 13:56:22 +01:00
|
|
|
+ // Paper start - BlockDestroyEvent; while the above setAir method is named same and looks very similar
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // 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;
|
2024-01-04 21:18:59 +01:00
|
|
|
+ BlockState effectType = iblockdata;
|
|
|
|
+ int xp = iblockdata.getBlock().getExpDrop(iblockdata, (ServerLevel) this, pos, ItemStack.EMPTY, true);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ if (com.destroystokyo.paper.event.block.BlockDestroyEvent.getHandlerList().getRegisteredListeners().length > 0) {
|
2024-02-01 10:15:57 +01:00
|
|
|
+ com.destroystokyo.paper.event.block.BlockDestroyEvent event = new com.destroystokyo.paper.event.block.BlockDestroyEvent(org.bukkit.craftbukkit.block.CraftBlock.at(this, pos), fluid.createLegacyBlock().createCraftBlockData(), effectType.createCraftBlockData(), xp, drop);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ if (!event.callEvent()) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
2024-01-04 21:18:59 +01:00
|
|
|
+ effectType = ((CraftBlockData) event.getEffectBlock()).getState();
|
2021-06-11 14:02:28 +02:00
|
|
|
+ playEffect = event.playEffect();
|
2022-09-08 17:13:50 +02:00
|
|
|
+ drop = event.willDrop();
|
2024-01-04 21:18:59 +01:00
|
|
|
+ xp = event.getExpToDrop();
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
2024-01-21 13:56:22 +01:00
|
|
|
+ // Paper end - BlockDestroyEvent
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
- if (!(iblockdata.getBlock() instanceof BaseFireBlock)) {
|
2024-01-04 21:18:59 +01:00
|
|
|
- this.levelEvent(2001, pos, Block.getId(iblockdata));
|
2024-01-21 13:56:22 +01:00
|
|
|
+ if (playEffect && !(effectType.getBlock() instanceof BaseFireBlock)) { // Paper - BlockDestroyEvent
|
|
|
|
+ this.levelEvent(2001, pos, Block.getId(effectType)); // Paper - BlockDestroyEvent
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
2024-01-04 21:18:59 +01:00
|
|
|
if (drop) {
|