aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0365-Fix-piston-physics-inconsistency-MC-188840.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0365-Fix-piston-physics-inconsistency-MC-188840.patch')
-rw-r--r--patches/server/0365-Fix-piston-physics-inconsistency-MC-188840.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/patches/server/0365-Fix-piston-physics-inconsistency-MC-188840.patch b/patches/server/0365-Fix-piston-physics-inconsistency-MC-188840.patch
new file mode 100644
index 0000000000..44f85960c4
--- /dev/null
+++ b/patches/server/0365-Fix-piston-physics-inconsistency-MC-188840.patch
@@ -0,0 +1,80 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Thu, 11 Jun 2020 17:29:42 -0700
+Subject: [PATCH] Fix piston physics inconsistency - MC-188840
+
+Pistons invoke physics when they move blocks. The physics can cause
+tnt blocks to ignite. However, pistons (when storing the blocks they "moved")
+don't actually go back to the world state sometimes to check if something
+like that happened. As a result they end up moving the tnt like it was
+never ignited. This resulted in the ability to create machines
+that can duplicate tnt, called "world eaters".
+This patch makes the piston logic retrieve the block state from the world
+prevent this from occuring.
+
+This patch also sets the moved pos to air immediately after creating
+the moving piston TE. This prevents the block from being updated from
+other physics calls by the piston.
+
+Tested against the following tnt duper design:
+https://www.youtube.com/watch?v=mS7xxNGhjxs
+
+This patch also affects every type of machine that utilises
+this mechanic. For example, dead coral is removed by a physics
+update when being moved while it is attached to slimeblocks.
+
+Standard piston machines that don't destroy or modify the
+blocks they move by physics updates should be entirely
+unaffected.
+
+This patch fixes https://bugs.mojang.com/browse/MC-188840
+
+This patch also fixes rail duping and carpet duping.
+
+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 530b6af1ca2e0ac81c0a8a55dbc7cf5c796c93ce..4aa34b7df734bb755906b228e0df9eb629569ea0 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
+@@ -414,14 +414,26 @@ public class PistonBaseBlock extends DirectionalBlock {
+ }
+
+ for (j = list.size() - 1; j >= 0; --j) {
+- blockposition3 = (BlockPos) list.get(j);
+- iblockdata1 = world.getBlockState(blockposition3);
++ // Paper start - fix a variety of piston desync dupes
++ boolean allowDesync = io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPistonDuplication;
++ BlockPos oldPos = blockposition3 = (BlockPos) list.get(j);
++ iblockdata1 = allowDesync ? world.getBlockState(oldPos) : null;
++ // Paper end - fix a variety of piston desync dupes
+ blockposition3 = blockposition3.relative(enumdirection1);
+ map.remove(blockposition3);
+ BlockState iblockdata2 = (BlockState) Blocks.MOVING_PISTON.defaultBlockState().setValue(PistonBaseBlock.FACING, dir);
+
+ world.setBlock(blockposition3, iblockdata2, 68);
+- world.setBlockEntity(MovingPistonBlock.newMovingBlockEntity(blockposition3, iblockdata2, (BlockState) list1.get(j), dir, retract, false));
++ // Paper start - fix a variety of piston desync dupes
++ if (!allowDesync) {
++ iblockdata1 = world.getBlockState(oldPos);
++ map.replace(oldPos, iblockdata1);
++ }
++ world.setBlockEntity(MovingPistonBlock.newMovingBlockEntity(blockposition3, iblockdata2, allowDesync ? list1.get(j) : iblockdata1, dir, retract, false));
++ if (!allowDesync) {
++ world.setBlock(oldPos, Blocks.AIR.defaultBlockState(), Block.UPDATE_CLIENTS | Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_MOVE_BY_PISTON | 1024); // set air to prevent later physics updates from seeing this block
++ }
++ // Paper end - fix a variety of piston desync dupes
+ aiblockdata[i++] = iblockdata1;
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
+index 8ea7d7da26e7d5644a8ee1a8d9e4c828c6b70a00..d7b963571c900f0f68005d6954bcd9ef1d9e0b7c 100644
+--- a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
+@@ -297,7 +297,7 @@ public class PistonMovingBlockEntity extends BlockEntity {
+ if (world.getBlockState(pos).is(Blocks.MOVING_PISTON)) {
+ BlockState blockState = Block.updateFromNeighbourShapes(blockEntity.movedState, world, pos);
+ if (blockState.isAir()) {
+- world.setBlock(pos, blockEntity.movedState, 84);
++ world.setBlock(pos, blockEntity.movedState, io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPistonDuplication ? 84 : (84 | Block.UPDATE_CLIENTS)); // Paper - fix a variety of piston desync dupes; force notify (flag 2), it's possible the set type by the piston block (which doesn't notify) set this block to air
+ Block.updateOrDestroy(blockEntity.movedState, blockState, world, pos, 3);
+ } else {
+ if (blockState.hasProperty(BlockStateProperties.WATERLOGGED) && blockState.getValue(BlockStateProperties.WATERLOGGED)) {