From f51aa3e3e1235d160f71fbfec8284c8327bf00ab Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:42:03 +0100 Subject: [PATCH] Fix BlockRedstoneEvent for tripwire hooks (#11791) --- .../level/block/TripWireHookBlock.java.patch | 62 ++++++++++++++++--- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch index 661176a03d..225f53b419 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch @@ -1,21 +1,65 @@ --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java -@@ -173,9 +_,18 @@ +@@ -127,10 +_,10 @@ + if (optionalValue.isPresent()) { + Direction direction = optionalValue.get(); + boolean flag = hookState.getOptionalValue(ATTACHED).orElse(false); +- boolean flag1 = hookState.getOptionalValue(POWERED).orElse(false); ++ boolean flag1 = hookState.getOptionalValue(POWERED).orElse(false); // Paper - diff on change, for event below + Block block = hookState.getBlock(); + boolean flag2 = !attaching; +- boolean flag3 = false; ++ boolean flag3 = false; // Paper - diff on change, for event below + int i = 0; + BlockState[] blockStates = new BlockState[42]; + +@@ -166,21 +_,48 @@ + flag2 &= i > 1; + flag3 &= flag2; + BlockState blockState1 = block.defaultBlockState().trySetValue(ATTACHED, Boolean.valueOf(flag2)).trySetValue(POWERED, Boolean.valueOf(flag3)); ++ boolean cancelledEmitterHook = false, cancelledReceiverHook = false; // Paper - Call BlockRedstoneEvent ++ boolean wasPowered = flag1, willBePowered = flag3; // Paper - OBFHELPER + if (i > 0) { + BlockPos blockPosx = pos.relative(direction, i); ++ // Paper start - Call BlockRedstoneEvent ++ if (wasPowered != willBePowered) { ++ int newCurrent = willBePowered ? 15 : 0; ++ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent( ++ org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPosx), wasPowered ? 15 : 0, newCurrent ++ ); ++ event.callEvent(); ++ cancelledReceiverHook = event.getNewCurrent() != newCurrent; ++ } ++ if (!cancelledReceiverHook) { // always trigger two events even when the first hook current change is cancelled ++ // Paper end - Call BlockRedstoneEvent + Direction opposite = direction.getOpposite(); + level.setBlock(blockPosx, blockState1.setValue(FACING, opposite), 3); notifyNeighbors(block, level, blockPosx, opposite); emitState(level, blockPosx, flag2, flag3, flag, flag1); - } -+ // CraftBukkit start -+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), 15, 0); -+ level.getCraftServer().getPluginManager().callEvent(eventRedstone); -+ -+ if (eventRedstone.getNewCurrent() > 0) { -+ return; +- } ++ } // Paper - Call BlockRedstoneEvent + } -+ // CraftBukkit end ++ // Paper start - Call BlockRedstoneEvent ++ if (wasPowered != willBePowered) { ++ int newCurrent = willBePowered ? 15 : 0; ++ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent( ++ org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), wasPowered ? 15 : 0, newCurrent ++ ); ++ event.callEvent(); ++ cancelledEmitterHook = event.getNewCurrent() != newCurrent; ++ } ++ // Paper end - Call BlockRedstoneEvent ++ if (!cancelledEmitterHook) { // Paper - Call BlockRedstoneEvent emitState(level, pos, flag2, flag3, flag, flag1); if (!attaching) { + if (level.getBlockState(pos).is(Blocks.TRIPWIRE_HOOK)) // Paper - Validate tripwire hook placement before update level.setBlock(pos, blockState1.setValue(FACING, direction), 3); if (shouldNotifyNeighbours) { notifyNeighbors(block, level, pos, direction); + } + } ++ } // Paper - Call BlockRedstoneEvent + + if (flag != flag2) { + for (int i2 = 1; i2 < i; i2++) {