aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0937-Break-redstone-on-top-of-trap-doors-early.patch
blob: ff295ff9607374e79cd89d932a22d1bc3781e3ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
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 761bbb448acf1c3bf03d728f1a285b89963e61e1..d2f3af70449b0b24734433533167cae444ec4bde 100644
--- a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
@@ -124,7 +124,26 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW
                     flag1 = eventRedstone.getNewCurrent() > 0;
                 }
                 // CraftBukkit end
-                if ((Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1) {
+                boolean open = (Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1; // Paper - break redstone on trapdoors early
+                // Paper start - break redstone on trapdoors early
+                // 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;
+                        }
+                    }
+                }
+                // Paper end - break redstone on trapdoors early
+                if (open) { // Paper - break redstone on trapdoors early
                     state = (BlockState) state.setValue(TrapDoorBlock.OPEN, flag1);
                     this.playSound((Player) null, world, pos, flag1);
                 }