From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf 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 aa3fdadd1cc2200adb6e0cf523c38833dc01b71b..b9e3c9cd709d42bced85436720ccc7b9c7e49552 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); }