diff --git a/Spigot-Server-Patches/0542-Fix-piston-physics-inconsistency-MC-188840.patch b/Spigot-Server-Patches/0542-Fix-piston-physics-inconsistency-MC-188840.patch index 8f9ad2edd..21338460a 100644 --- a/Spigot-Server-Patches/0542-Fix-piston-physics-inconsistency-MC-188840.patch +++ b/Spigot-Server-Patches/0542-Fix-piston-physics-inconsistency-MC-188840.patch @@ -12,6 +12,10 @@ 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 @@ -25,39 +29,56 @@ 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/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java -index f0284e81db3ab7c45018de2b446f2d8296df15c3..863bec74a6a0ee916b7db05687e588ae52eed4cd 100644 +index f0284e81db3ab7c45018de2b446f2d8296df15c3..8444819f071b13e98ba07032520016a664b7b9bc 100644 --- a/src/main/java/com/destroystokyo/paper/PaperConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java -@@ -442,4 +442,8 @@ public class PaperConfig { +@@ -442,4 +442,9 @@ public class PaperConfig { consoleHasAllPermissions = getBoolean("settings.console-has-all-permissions", consoleHasAllPermissions); } -+ public static boolean allowTntDuplication = false; -+ private static void allowTntDuplication() { -+ allowTntDuplication = getBoolean("settings.unsupported-settings.allow-tnt-duplication", allowTntDuplication); ++ public static boolean allowPistonDuplication; ++ private static void allowPistonDuplication() { ++ allowPistonDuplication = getBoolean("settings.unsupported-settings.allow-piston-duplication", config.getBoolean("settings.unsupported-settings.allow-tnt-duplication", false)); ++ set("settings.unsupported-settings.allow-tnt-duplication", null); + } } diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java -index b29525c40dc8e3ae747b8ddf5a3bd79b7cc0b792..32ff3f65cf9c2f9f4be1c1e78f5df555efe67b07 100644 +index 39cd8ab5925ceb9494e0ac910c73338c24ecda2c..f90ac88d33fb6e83eb7bf1e1432df14e452387ec 100644 --- a/src/main/java/net/minecraft/server/BlockPiston.java +++ b/src/main/java/net/minecraft/server/BlockPiston.java -@@ -364,11 +364,11 @@ public class BlockPiston extends BlockDirectional { +@@ -376,12 +376,24 @@ public class BlockPiston extends BlockDirectional { + } for (k = list.size() - 1; k >= 0; --k) { - blockposition3 = (BlockPosition) list.get(k); +- blockposition3 = (BlockPosition) list.get(k); - iblockdata1 = world.getType(blockposition3); -+ iblockdata1 = world.getType(blockposition3); if (!com.destroystokyo.paper.PaperConfig.allowTntDuplication) map.replace(blockposition3, iblockdata1); // Paper start - fix piston physics inconsistency ++ // Paper start - fix a variety of piston desync dupes ++ boolean allowDesync = com.destroystokyo.paper.PaperConfig.allowPistonDuplication; ++ BlockPosition oldPos = blockposition3 = (BlockPosition) list.get(k); ++ iblockdata1 = allowDesync ? world.getType(oldPos) : null; ++ // Paper end - fix a variety of piston desync dupes blockposition3 = blockposition3.shift(enumdirection1); map.remove(blockposition3); world.setTypeAndData(blockposition3, (IBlockData) Blocks.MOVING_PISTON.getBlockData().set(BlockPiston.FACING, enumdirection), 68); - world.setTileEntity(blockposition3, BlockPistonMoving.a((IBlockData) list1.get(k), enumdirection, flag, false)); -+ world.setTileEntity(blockposition3, BlockPistonMoving.a(com.destroystokyo.paper.PaperConfig.allowTntDuplication ? list1.get(k) : iblockdata1, enumdirection, flag, false)); // Paper - fix piston physics inconsistency ++ // Paper start - fix a variety of piston desync dupes ++ if (!allowDesync) { ++ iblockdata1 = world.getType(oldPos); ++ map.replace(oldPos, iblockdata1); ++ } ++ world.setTileEntity(blockposition3, BlockPistonMoving.a(allowDesync ? list1.get(k) : iblockdata1, enumdirection, flag, false)); ++ if (!allowDesync) { ++ world.setTypeAndData(oldPos, Blocks.AIR.getBlockData(), 4 | 16 | 1024); // set air to prevent later physics updates from seeing this block ++ } ++ // Paper end - fix a variety of piston desync dupes --j; aiblockdata[j] = iblockdata1; } diff --git a/src/main/java/net/minecraft/server/TileEntityPiston.java b/src/main/java/net/minecraft/server/TileEntityPiston.java -index 489175abd8e582a3c082364fec357c4f061a22d7..634e37843097cdb08bab3a800565b42a58dce1d8 100644 +index 489175abd8e582a3c082364fec357c4f061a22d7..d700e8281fe50b1c4131ac260ff6c0d0dd8412f0 100644 --- a/src/main/java/net/minecraft/server/TileEntityPiston.java +++ b/src/main/java/net/minecraft/server/TileEntityPiston.java @@ -275,7 +275,7 @@ public class TileEntityPiston extends TileEntity implements ITickable { @@ -65,7 +86,7 @@ index 489175abd8e582a3c082364fec357c4f061a22d7..634e37843097cdb08bab3a800565b42a if (iblockdata.isAir()) { - this.world.setTypeAndData(this.position, this.a, 84); -+ this.world.setTypeAndData(this.position, this.a, 84 | (com.destroystokyo.paper.PaperConfig.allowTntDuplication ? 0 : 2)); // Paper - force notify (flag 2), it's possible the set type by the piston block (which doesn't notify) set this block to air ++ this.world.setTypeAndData(this.position, this.a, com.destroystokyo.paper.PaperConfig.allowPistonDuplication ? 84 : (84 | 2)); // Paper - force notify (flag 2), it's possible the set type by the piston block (which doesn't notify) set this block to air Block.a(this.a, iblockdata, this.world, this.position, 3); } else { if (iblockdata.b((IBlockState) BlockProperties.C) && (Boolean) iblockdata.get(BlockProperties.C)) {