aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-12-05 11:18:29 +0100
committerNassim Jahnke <[email protected]>2024-12-05 12:20:56 +0100
commite4e24f3335609b38f460ced71d18babcf11bf9cb (patch)
tree51880d664b3444ce26d6f8cdeb3b8219e5616fca /patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch
parentc54c062e6ff742445bf7749c84106ca67090172d (diff)
downloadPaper-e4e24f3335609b38f460ced71d18babcf11bf9cb.tar.gz
Paper-e4e24f3335609b38f460ced71d18babcf11bf9cb.zip
Move around patches again
Diffstat (limited to 'patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch')
-rw-r--r--patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch85
1 files changed, 85 insertions, 0 deletions
diff --git a/patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch b/patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch
new file mode 100644
index 0000000000..b239d74e25
--- /dev/null
+++ b/patches/server/0631-Fix-sticky-pistons-and-BlockPistonRetractEvent.patch
@@ -0,0 +1,85 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Wed, 22 Dec 2021 09:51:48 -0800
+Subject: [PATCH] Fix sticky pistons and BlockPistonRetractEvent
+
+There is an explicit check in the handling code for empty pistons that
+prevents sticky pistons from firing the event. However when we look back
+at the history we see that this check was originally added so that ONLY
+sticky pistons would fire the retract event. I'm not sure why.
+https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/commits/1092acbddf07edfa4100bc6824504ac75088e913
+
+Over the course of several updates, the meaning of that field appears to
+have changed from "is NOT sticky" to "is sticky". So now its having the
+opposite effect. Only normal pistons fire the retraction event. And like
+all things in CB, it's just been carried around since.
+
+If we are to believe the history, the correct fix for this issue is to
+flip it so it only fires for sticky pistons, but that puts us in a
+bind. It's already firing for non-sticky pistons, changing it now would
+likely result in breakage. Furthermore, there is little documentation as
+to WHY that was ever intended to be the case.
+
+Instead we opt to remove the check entirely so that the event fires for
+all piston types.
+
+Co-authored-by: Zach Brown <[email protected]>
+Co-authored-by: Madeline Miller <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
+index 4973d75b26880e39d42b5ef533896f43a1f07cba..e841fccb8f298ef692677583b468869f56dc722c 100644
+--- a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
+@@ -163,15 +163,15 @@ public class PistonBaseBlock extends DirectionalBlock {
+ }
+
+ // CraftBukkit start
+- if (!this.isSticky) {
+- org.bukkit.block.Block block = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+- BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, ImmutableList.<org.bukkit.block.Block>of(), CraftBlock.notchToBlockFace(enumdirection));
+- world.getCraftServer().getPluginManager().callEvent(event);
+-
+- if (event.isCancelled()) {
+- return;
+- }
+- }
++ // if (!this.isSticky) { // Paper - Fix sticky pistons and BlockPistonRetractEvent; Move further down
++ // org.bukkit.block.Block block = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
++ // BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, ImmutableList.<org.bukkit.block.Block>of(), CraftBlock.notchToBlockFace(enumdirection));
++ // world.getCraftServer().getPluginManager().callEvent(event);
++ //
++ // if (event.isCancelled()) {
++ // return;
++ // }
++ // }
+ // PAIL: checkME - what happened to setTypeAndData?
+ // CraftBukkit end
+ world.blockEvent(pos, this, b0, enumdirection.get3DDataValue());
+@@ -248,6 +248,13 @@ public class PistonBaseBlock extends DirectionalBlock {
+
+ BlockState iblockdata2 = (BlockState) ((BlockState) Blocks.MOVING_PISTON.defaultBlockState().setValue(MovingPistonBlock.FACING, enumdirection)).setValue(MovingPistonBlock.TYPE, this.isSticky ? PistonType.STICKY : PistonType.DEFAULT);
+
++ // Paper start - Fix sticky pistons and BlockPistonRetractEvent; Move empty piston retract call to fix multiple event fires
++ if (!this.isSticky) {
++ if (!new BlockPistonRetractEvent(CraftBlock.at(world, pos), java.util.Collections.emptyList(), CraftBlock.notchToBlockFace(enumdirection)).callEvent()) {
++ return false;
++ }
++ }
++ // Paper end - Fix sticky pistons and BlockPistonRetractEvent
+ world.setBlock(pos, iblockdata2, 20);
+ world.setBlockEntity(MovingPistonBlock.newMovingBlockEntity(pos, iblockdata2, (BlockState) this.defaultBlockState().setValue(PistonBaseBlock.FACING, Direction.from3DDataValue(data & 7)), enumdirection, false, true));
+ world.blockUpdated(pos, iblockdata2.getBlock());
+@@ -274,6 +281,13 @@ public class PistonBaseBlock extends DirectionalBlock {
+ if (type == 1 && !iblockdata3.isAir() && PistonBaseBlock.isPushable(iblockdata3, world, blockposition1, enumdirection.getOpposite(), false, enumdirection) && (iblockdata3.getPistonPushReaction() == PushReaction.NORMAL || iblockdata3.is(Blocks.PISTON) || iblockdata3.is(Blocks.STICKY_PISTON))) {
+ this.moveBlocks(world, pos, enumdirection, false);
+ } else {
++ // Paper start - Fix sticky pistons and BlockPistonRetractEvent; fire BlockPistonRetractEvent for sticky pistons retracting nothing (air)
++ if (type == TRIGGER_CONTRACT && iblockdata2.isAir()) {
++ if (!new BlockPistonRetractEvent(CraftBlock.at(world, pos), java.util.Collections.emptyList(), CraftBlock.notchToBlockFace(enumdirection)).callEvent()) {
++ return false;
++ }
++ }
++ // Paper end - Fix sticky pistons and BlockPistonRetractEvent
+ world.removeBlock(pos.relative(enumdirection), false);
+ }
+ }