Paper/patches/server/0386-Fix-some-rails-connecting-improperly.patch

85 lines
4.4 KiB
Diff
Raw Normal View History

2021-06-11 14:02:28 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
Rewrite chunk system (#8177) Patch documentation to come Issues with the old system that are fixed now: - World generation does not scale with cpu cores effectively. - Relies on the main thread for scheduling and maintaining chunk state, dropping chunk load/generate rates at lower tps. - Unreliable prioritisation of chunk gen/load calls that block the main thread. - Shutdown logic is utterly unreliable, as it has to wait for all chunks to unload - is it guaranteed that the chunk system is in a state on shutdown that it can reliably do this? Watchdog shutdown also typically failed due to thread checks, which is now resolved. - Saving of data is not unified (i.e can save chunk data without saving entity data, poses problems for desync if shutdown is really abnormal. - Entities are not loaded with chunks. This caused quite a bit of headache for Chunk#getEntities API, but now the new chunk system loads entities with chunks so that they are ready whenever the chunk loads in. Effectively brings the behavior back to 1.16 era, but still storing entities in their own separate regionfiles. The above list is not complete. The patch documentation will complete it. New chunk system hard relies on starlight and dataconverter, and most importantly the new concurrent utilities in ConcurrentUtil. Some of the old async chunk i/o interface (i.e the old file io thread reroutes _some_ calls to the new file io thread) is kept for plugin compat reasons. It will be removed in the next major version of minecraft. The old legacy chunk system patches have been moved to the removed folder in case we need them again.
2022-09-26 10:02:51 +02:00
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
2021-06-11 14:02:28 +02:00
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
2024-10-23 16:55:24 +02:00
index 4a5badc4bb1e2c29016735e9df93c7ac4d3f363d..f9a55f76fed8609bca167b2ea37464e8079de0c0 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/world/level/block/BaseRailBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/BaseRailBlock.java
2024-10-23 16:55:24 +02:00
@@ -71,6 +71,7 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl
2021-06-11 14:02:28 +02:00
state = this.updateDir(world, pos, state, true);
if (this.isStraight) {
2024-10-23 16:55:24 +02:00
world.neighborChanged(state, pos, this, null, notify);
+ state = world.getBlockState(pos); // Paper - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
}
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
2024-10-23 16:55:24 +02:00
index 3de30845aae143e5be5db921004142792522607d..1e2f56b5c40c3dc72bc38354160f8e7de1f4f5cf 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java
2024-10-23 16:55:24 +02:00
@@ -78,6 +78,7 @@ public class DetectorRailBlock extends BaseRailBlock {
2021-06-11 14:02:28 +02:00
private void checkPressed(Level world, BlockPos pos, BlockState state) {
if (this.canSurvive(state, world, pos)) {
+ if (state.getBlock() != this) { return; } // Paper - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
boolean flag = (Boolean) state.getValue(DetectorRailBlock.POWERED);
boolean flag1 = false;
2021-06-14 12:42:08 +02:00
List<AbstractMinecart> list = this.getInteractingMinecartOfType(world, pos, AbstractMinecart.class, (entity) -> {
2021-06-11 14:02:28 +02:00
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 6caafa73b03ed55c95303e49735eaf3dfd34903a..aa7ebaccad8dc555d9e1dee300e75fcd968a3608 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/world/level/block/RailState.java
+++ b/src/main/java/net/minecraft/world/level/block/RailState.java
2021-06-17 22:20:03 +02:00
@@ -17,6 +17,12 @@ public class RailState {
2021-06-11 14:02:28 +02:00
private final boolean isStraight;
private final List<BlockPos> connections = Lists.newArrayList();
+ // Paper start - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
+ public boolean isValid() {
2021-06-17 22:20:03 +02:00
+ return this.level.getBlockState(this.pos).getBlock() == this.state.getBlock();
2021-06-11 14:02:28 +02:00
+ }
+ // Paper end - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
+
public RailState(Level world, BlockPos pos, BlockState state) {
this.level = world;
this.pos = pos;
@@ -141,6 +147,11 @@ public class RailState {
2021-06-11 14:02:28 +02:00
}
private void connectTo(RailState placementHelper) {
+ // Paper start - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
+ if (!this.isValid() || !placementHelper.isValid()) {
+ return;
+ }
+ // Paper end - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
this.connections.add(placementHelper.pos);
2021-06-14 12:42:08 +02:00
BlockPos blockPos = this.pos.north();
BlockPos blockPos2 = this.pos.south();
@@ -331,10 +342,15 @@ public class RailState {
2021-06-14 12:42:08 +02:00
this.state = this.state.setValue(this.block.getShapeProperty(), railShape2);
2021-06-11 14:02:28 +02:00
if (forceUpdate || this.level.getBlockState(this.pos) != this.state) {
this.level.setBlock(this.pos, this.state, 3);
+ // Paper start - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
+ if (!this.isValid()) {
+ return this;
+ }
+ // Paper end - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
for (int i = 0; i < this.connections.size(); i++) {
2021-06-14 12:42:08 +02:00
RailState railState = this.getRail(this.connections.get(i));
- if (railState != null) {
+ if (railState != null && railState.isValid()) { // Paper - Fix some rails connecting improperly
2021-06-14 12:42:08 +02:00
railState.removeSoftConnections();
if (railState.canConnectTo(this)) {
railState.connectTo(this);
@@ -347,6 +363,6 @@ public class RailState {
2021-06-11 14:02:28 +02:00
}
public BlockState getState() {
- return this.state;
+ return this.level.getBlockState(this.pos); // Paper - Fix some rails connecting improperly
2021-06-11 14:02:28 +02:00
}
}