aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSpottedleaf <[email protected]>2020-06-20 14:56:08 -0400
committerAikar <[email protected]>2020-06-20 14:56:08 -0400
commit96feb68ad9a79292a1bb2f23312b7bd3b2717bc9 (patch)
tree33cad174c70d0ff99867d91672385e0f3d40ea7d
parent3e75d908100814a2d6ce0bf94fecf0d4eda5a22b (diff)
downloadPaper-96feb68ad9a79292a1bb2f23312b7bd3b2717bc9.tar.gz
Paper-96feb68ad9a79292a1bb2f23312b7bd3b2717bc9.zip
Fix carpet and rail duping by pistons under same TNT duping config
This renames the config from enable tnt duping to enable piston duping Normally we would not have a config for rails and carpet duping, but the fix for TNT is the same fix for rails and carpet, so they are having to be covered under that same config.
-rw-r--r--Spigot-Server-Patches/0542-Fix-piston-physics-inconsistency-MC-188840.patch45
1 files changed, 33 insertions, 12 deletions
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 8f9ad2edd8..21338460af 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)) {