mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-26 14:30:17 +01:00
40 lines
2.6 KiB
Diff
40 lines
2.6 KiB
Diff
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 a7d52f2f9c324c5af979fc39b3662ebc880e36fb..872e52e13293a99d45f93d90d8fa7f6aa99d1f3a 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
|
|
@@ -157,7 +157,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);
|
|
}
|