geforkt von Mirrors/Paper
aa52bf9e33
Mojang made some changes to priorities in 1.17 and it seems that these changes conflict with the changes made in this patch, which in some cases appears to cause excessive rescheduling of tasks. This, however, is not confirmed as such but seems to be the behavior that we're seeing to cause this issue, if mojang has adopted the changes we suggested, then a good chunk of this patch may be unneeded, but, this needs a much better look than I'm currently able to do
85 Zeilen
4.2 KiB
Diff
85 Zeilen
4.2 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/world/level/block/BaseRailBlock.java b/src/main/java/net/minecraft/world/level/block/BaseRailBlock.java
|
|
index 41c23abf78c2ca95c26633860adb9360139b3ceb..1242eb55996bca8a63bd7b95d01d0299fb36d105 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/BaseRailBlock.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/BaseRailBlock.java
|
|
@@ -65,6 +65,7 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl
|
|
state = this.updateDir(world, pos, state, true);
|
|
if (this.isStraight) {
|
|
state.neighborChanged(world, pos, this, pos, notify);
|
|
+ state = world.getBlockState(pos); // Paper - don't desync, update again
|
|
}
|
|
|
|
return state;
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java b/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java
|
|
index 2335e7af6bc16a0d65c7818c316f3194c680c69d..63c7f2cf530ac9562960ae5a3cbc6e511a009377 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java
|
|
@@ -70,6 +70,7 @@ public class DetectorRailBlock extends BaseRailBlock {
|
|
|
|
private void checkPressed(Level world, BlockPos pos, BlockState state) {
|
|
if (this.canSurvive(state, world, pos)) {
|
|
+ if (state.getBlock() != this) { return; } // Paper - not our block, don't do anything
|
|
boolean flag = (Boolean) state.getValue(DetectorRailBlock.POWERED);
|
|
boolean flag1 = false;
|
|
List<AbstractMinecart> list = this.getInteractingMinecartOfType(world, pos, AbstractMinecart.class, (entity) -> {
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/RailState.java b/src/main/java/net/minecraft/world/level/block/RailState.java
|
|
index a205e04bce8706302e4a077646749d05dee98251..2a642275522c1d718dd6052f5ac942579cc31e9e 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/RailState.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/RailState.java
|
|
@@ -17,6 +17,12 @@ public class RailState {
|
|
private final boolean isStraight;
|
|
private final List<BlockPos> connections = Lists.newArrayList();
|
|
|
|
+ // Paper start - prevent desync
|
|
+ public boolean isValid() {
|
|
+ return this.level.getBlockState(this.pos).getBlock() == this.state.getBlock();
|
|
+ }
|
|
+ // Paper end - prevent desync
|
|
+
|
|
public RailState(Level world, BlockPos pos, BlockState state) {
|
|
this.level = world;
|
|
this.pos = pos;
|
|
@@ -143,6 +149,11 @@ public class RailState {
|
|
}
|
|
|
|
private void connectTo(RailState placementHelper) {
|
|
+ // Paper start - prevent desync
|
|
+ if (!this.isValid() || !placementHelper.isValid()) {
|
|
+ return;
|
|
+ }
|
|
+ // Paper end - prevent desync
|
|
this.connections.add(placementHelper.pos);
|
|
BlockPos blockPos = this.pos.north();
|
|
BlockPos blockPos2 = this.pos.south();
|
|
@@ -333,10 +344,15 @@ public class RailState {
|
|
this.state = this.state.setValue(this.block.getShapeProperty(), railShape2);
|
|
if (forceUpdate || this.level.getBlockState(this.pos) != this.state) {
|
|
this.level.setBlock(this.pos, this.state, 3);
|
|
+ // Paper start - prevent desync
|
|
+ if (!this.isValid()) {
|
|
+ return this;
|
|
+ }
|
|
+ // Paper end - prevent desync
|
|
|
|
for(int i = 0; i < this.connections.size(); ++i) {
|
|
RailState railState = this.getRail(this.connections.get(i));
|
|
- if (railState != null) {
|
|
+ if (railState != null && railState.isValid()) { // Paper - prevent desync
|
|
railState.removeSoftConnections();
|
|
if (railState.canConnectTo(this)) {
|
|
railState.connectTo(this);
|
|
@@ -349,6 +365,6 @@ public class RailState {
|
|
}
|
|
|
|
public BlockState getState() {
|
|
- return this.state;
|
|
+ return this.level.getBlockState(this.pos); // Paper - prevent desync
|
|
}
|
|
}
|