aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0835-Break-redstone-on-top-of-trap-doors-early.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0835-Break-redstone-on-top-of-trap-doors-early.patch')
-rw-r--r--patches/server/0835-Break-redstone-on-top-of-trap-doors-early.patch40
1 files changed, 40 insertions, 0 deletions
diff --git a/patches/server/0835-Break-redstone-on-top-of-trap-doors-early.patch b/patches/server/0835-Break-redstone-on-top-of-trap-doors-early.patch
new file mode 100644
index 0000000000..2f89b7d780
--- /dev/null
+++ b/patches/server/0835-Break-redstone-on-top-of-trap-doors-early.patch
@@ -0,0 +1,40 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Mon, 1 May 2023 18:31:26 -0700
+Subject: [PATCH] Break redstone on top of trap doors early
+
+This logic hooks into the neighbour update which should be invoked
+as a result of redstone powering the trap door.
+
+diff --git a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
+index 26096c28f654118b0d541f33c659fbc43b34509b..2b5fdcb12dcd8730df24113b9a6d295f000dd9f6 100644
+--- a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
+@@ -153,7 +153,26 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW
+ flag1 = eventRedstone.getNewCurrent() > 0;
+ }
+ // CraftBukkit end
+- if ((Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1) {
++ // Paper start - break redstone on trapdoors early
++ boolean open = (Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1;
++ // note: this must run before any state for this block/its neighborus are written to the world
++ // we allow the redstone event to fire so that plugins can block
++ if (flag1 && open) { // if we are now powered and it caused the trap door to open
++ // in this case, first check for the redstone on top first
++ BlockPos abovePos = pos.above();
++ BlockState above = world.getBlockState(abovePos);
++ if (above.getBlock() instanceof RedStoneWireBlock) {
++ world.setBlock(abovePos, Blocks.AIR.defaultBlockState(), Block.UPDATE_CLIENTS | Block.UPDATE_NEIGHBORS);
++ Block.popResource(world, abovePos, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.REDSTONE));
++ // now check that this didn't change our state
++ if (world.getBlockState(pos) != state) {
++ // our state was changed, so we cannot propagate this update
++ return;
++ }
++ }
++ }
++ if (open) {
++ // Paper end - break redstone on trapdoors early
+ state = (BlockState) state.setValue(TrapDoorBlock.OPEN, flag1);
+ this.playSound((Player) null, world, pos, flag1);
+ }