papermc/Spigot-Server-Patches/0537-Fix-some-rails-connecting-improperly.patch
Shane Freeder e886d8118e
Updated Upstream ()
Upstream has released updates that appear to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing
2021-02-06 00:00:18 +00:00

95 lines
4.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <spottedleaf@spottedleaf.dev>
Date: Fri, 24 Jul 2020 15:56:05 -0700
Subject: [PATCH] Fix some rails connecting improperly
diff --git a/src/main/java/net/minecraft/server/BlockMinecartDetector.java b/src/main/java/net/minecraft/server/BlockMinecartDetector.java
index 9681e08edf34f17806819115336874b574b880bc..77fde30769860828b6f16eefb186962c140beaae 100644
--- a/src/main/java/net/minecraft/server/BlockMinecartDetector.java
+++ b/src/main/java/net/minecraft/server/BlockMinecartDetector.java
@@ -51,6 +51,7 @@ public class BlockMinecartDetector extends BlockMinecartTrackAbstract {
private void a(World world, BlockPosition blockposition, IBlockData iblockdata) {
if (this.canPlace(iblockdata, world, blockposition)) {
+ if (iblockdata.getBlock() != this) { return; } // Paper - not our block, don't do anything
boolean flag = (Boolean) iblockdata.get(BlockMinecartDetector.POWERED);
boolean flag1 = false;
List<EntityMinecartAbstract> list = this.a(world, blockposition, EntityMinecartAbstract.class, (Predicate) null);
diff --git a/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java b/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java
index 5609eeec9a7991167b57b724fa3279d3e8bf6b94..0de3fa45487e996b79d1031c9ee4b0728cfe1bcf 100644
--- a/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java
+++ b/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java
@@ -46,6 +46,7 @@ public abstract class BlockMinecartTrackAbstract extends Block {
iblockdata = this.a(world, blockposition, iblockdata, true);
if (this.c) {
iblockdata.doPhysics(world, blockposition, this, blockposition, flag);
+ iblockdata = world.getType(blockposition); // Paper - don't desync, update again
}
return iblockdata;
diff --git a/src/main/java/net/minecraft/server/MinecartTrackLogic.java b/src/main/java/net/minecraft/server/MinecartTrackLogic.java
index 10bc2165159514d484e73a3acd08ca5929be72f2..e0be3a425aae51e1aced8eb6d8a5e84fc9315e3a 100644
--- a/src/main/java/net/minecraft/server/MinecartTrackLogic.java
+++ b/src/main/java/net/minecraft/server/MinecartTrackLogic.java
@@ -7,13 +7,19 @@ import javax.annotation.Nullable;
public class MinecartTrackLogic {
- private final World a;
- private final BlockPosition b;
+ private final World a; public final World getWorld() { return this.a; } // Paper - OBFHELPER
+ private final BlockPosition b; public final BlockPosition getPos() { return this.b; } // Paper - OBFHELPER
private final BlockMinecartTrackAbstract c;
- private IBlockData d;
+ private IBlockData d; public final IBlockData getRailState() { return this.d; } // Paper - OBFHELPER
private final boolean e;
private final List<BlockPosition> f = Lists.newArrayList();
+ // Paper start - prevent desync
+ public boolean isValid() {
+ return this.getWorld().getType(this.getPos()).getBlock() == this.getRailState().getBlock();
+ }
+ // Paper end - prevent desync
+
public MinecartTrackLogic(World world, BlockPosition blockposition, IBlockData iblockdata) {
this.a = world;
this.b = blockposition;
@@ -148,6 +154,11 @@ public class MinecartTrackLogic {
}
private void c(MinecartTrackLogic minecarttracklogic) {
+ // Paper start - prevent desync
+ if (!this.isValid() || !minecarttracklogic.isValid()) {
+ return;
+ }
+ // Paper end - prevent desync
this.f.add(minecarttracklogic.b);
BlockPosition blockposition = this.b.north();
BlockPosition blockposition1 = this.b.south();
@@ -342,11 +353,16 @@ public class MinecartTrackLogic {
this.d = (IBlockData) this.d.set(this.c.d(), blockpropertytrackposition1);
if (flag1 || this.a.getType(this.b) != this.d) {
this.a.setTypeAndData(this.b, this.d, 3);
+ // Paper start - prevent desync
+ if (!this.isValid()) {
+ return this;
+ }
+ // Paper end - prevent desync
for (int i = 0; i < this.f.size(); ++i) {
MinecartTrackLogic minecarttracklogic = this.b((BlockPosition) this.f.get(i));
- if (minecarttracklogic != null) {
+ if (minecarttracklogic != null && minecarttracklogic.isValid()) { // Paper - prevent desync
minecarttracklogic.d();
if (minecarttracklogic.b(this)) {
minecarttracklogic.c(this);
@@ -359,6 +375,6 @@ public class MinecartTrackLogic {
}
public IBlockData c() {
- return this.d;
+ return this.getWorld().getType(this.getPos()); // Paper - prevent desync
}
}