geforkt von Mirrors/Paper
afbaa18bf6
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 Bukkit Changes: c9b35cdb PR-684: Make PotionEffectType implement Keyed CraftBukkit Changes: c86a3f7a PR-959: Fix World#refreshChunk af8a8b70 PR-962: Make PotionEffectType implement Keyed Spigot Changes: 7514aa37 SPIGOT-6806: Add setting to disable new chunks generation under existing chunks
58 Zeilen
3.6 KiB
Diff
58 Zeilen
3.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Fri, 27 Dec 2019 09:42:26 -0800
|
|
Subject: [PATCH] Guard against serializing mismatching chunk coordinate
|
|
|
|
Should help if something dumb happens
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
|
|
index b44d621fc8a5194622775b7903de083cca999022..9a6f4c0bcfe8ce331ba7f6c92e527addcf65c911 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
|
|
@@ -75,6 +75,18 @@ public class ChunkSerializer {
|
|
|
|
public ChunkSerializer() {}
|
|
|
|
+ // Paper start - guard against serializing mismatching coordinates
|
|
+ // TODO Note: This needs to be re-checked each update
|
|
+ public static ChunkPos getChunkCoordinate(CompoundTag chunkData) {
|
|
+ final int dataVersion = ChunkStorage.getVersion(chunkData);
|
|
+ if (dataVersion < 2842) { // Level tag is removed after this version
|
|
+ final CompoundTag levelData = chunkData.getCompound("Level");
|
|
+ return new ChunkPos(levelData.getInt("xPos"), levelData.getInt("zPos"));
|
|
+ } else {
|
|
+ return new ChunkPos(chunkData.getInt("xPos"), chunkData.getInt("zPos"));
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
// Paper start
|
|
public static final class InProgressChunkHolder {
|
|
|
|
@@ -100,7 +112,7 @@ public class ChunkSerializer {
|
|
public static InProgressChunkHolder loadChunk(ServerLevel world, PoiManager poiStorage, ChunkPos chunkPos, CompoundTag nbt, boolean distinguish) {
|
|
java.util.ArrayDeque<Runnable> tasksToExecuteOnMain = new java.util.ArrayDeque<>();
|
|
// Paper end
|
|
- ChunkPos chunkcoordintpair1 = new ChunkPos(nbt.getInt("xPos"), nbt.getInt("zPos"));
|
|
+ ChunkPos chunkcoordintpair1 = new ChunkPos(nbt.getInt("xPos"), nbt.getInt("zPos")); // Paper - diff on change, see ChunkSerializer#getChunkCoordinate
|
|
|
|
if (!Objects.equals(chunkPos, chunkcoordintpair1)) {
|
|
ChunkSerializer.LOGGER.error("Chunk file at {} is in the wrong location; relocating. (Expected {}, got {})", chunkPos, chunkPos, chunkcoordintpair1);
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
|
|
index d7fab2fb61dc3de14e382bac6127db956605e7ad..b1b1fa19cfd533d5625a462af399c5fd055629b0 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
|
|
@@ -147,6 +147,13 @@ public class ChunkStorage implements AutoCloseable {
|
|
|
|
// Paper start - async chunk io
|
|
public void write(ChunkPos chunkPos, CompoundTag nbt) throws IOException {
|
|
+ // Paper start
|
|
+ if (!chunkPos.equals(ChunkSerializer.getChunkCoordinate(nbt))) {
|
|
+ String world = (this instanceof net.minecraft.server.level.ChunkMap) ? ((net.minecraft.server.level.ChunkMap)this).level.getWorld().getName() : null;
|
|
+ throw new IllegalArgumentException("Chunk coordinate and serialized data do not have matching coordinates, trying to serialize coordinate " + chunkPos.toString()
|
|
+ + " but compound says coordinate is " + ChunkSerializer.getChunkCoordinate(nbt).toString() + (world == null ? " for an unknown world" : (" for world: " + world)));
|
|
+ }
|
|
+ // Paper end
|
|
this.regionFileCache.write(chunkPos, nbt);
|
|
// Paper end - Async chunk loading
|
|
if (this.legacyStructureHandler != null) {
|