Skip to content

Commit 572ef8f

Browse files
Doc94jpenilla
andauthored
Skip migration for deleted dimensions post first migration in server (#13874)
Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
1 parent 26a624b commit 572ef8f

3 files changed

Lines changed: 35 additions & 4 deletions

File tree

build-data/paper.at

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public net.minecraft.util.Util onThreadException(Ljava/lang/Thread;Ljava/lang/Th
9898
public net.minecraft.util.datafix.fixes.BlockStateData register(ILcom/mojang/serialization/Dynamic;[Lcom/mojang/serialization/Dynamic;)V
9999
public net.minecraft.util.datafix.fixes.ItemIdFix ITEM_NAMES
100100
public net.minecraft.util.datafix.fixes.ItemSpawnEggFix ID_TO_ENTITY
101+
public net.minecraft.util.filefix.FileFixerUpper FILE_FIXER_INTRODUCTION_VERSION
101102
public net.minecraft.world.BossEvent color
102103
public net.minecraft.world.BossEvent name
103104
public net.minecraft.world.BossEvent overlay

paper-server/src/main/java/io/papermc/paper/world/PaperWorldLoader.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import io.papermc.paper.world.saveddata.PaperWorldMetadata;
66
import io.papermc.paper.world.saveddata.PaperWorldPDC;
77
import java.io.IOException;
8+
import java.nio.file.Files;
89
import java.util.Locale;
910
import java.util.UUID;
11+
import net.minecraft.core.Registry;
1012
import net.minecraft.core.registries.Registries;
1113
import net.minecraft.resources.ResourceKey;
1214
import net.minecraft.server.Main;
@@ -118,15 +120,15 @@ public static LoadedWorldData loadWorldData(
118120
}
119121

120122
public void loadInitialWorlds() {
121-
final var levelStemRegistry = this.server.registryAccess().lookupOrThrow(Registries.LEVEL_STEM);
122-
final boolean hasWorldData = this.server.storageSource.hasWorldData();
123+
final Registry<LevelStem> levelStemRegistry = this.server.registryAccess().lookupOrThrow(Registries.LEVEL_STEM);
123124
final LevelStem overworldStem = requireNonNull(levelStemRegistry.getValue(LevelStem.OVERWORLD), "Overworld stem missing");
125+
final boolean hasWorldData = this.hasDimensionData(overworldStem);
124126
this.loadInitialWorld(overworldStem, hasWorldData);
125127
for (final LevelStem stem : levelStemRegistry) {
126128
if (stem == overworldStem) {
127129
continue;
128130
}
129-
this.loadInitialWorld(stem, hasWorldData);
131+
this.loadInitialWorld(stem, this.hasDimensionData(stem));
130132
}
131133

132134
// ((DedicatedServer) this.server).forceDifficulty();
@@ -164,6 +166,12 @@ private void loadInitialWorld(final LevelStem stem, final boolean hasWorldData)
164166
this.server.createLevel(stem, loading, worldDataAndGenSettings);
165167
}
166168

169+
private boolean hasDimensionData(final LevelStem stem) {
170+
final ResourceKey<LevelStem> stemKey = this.server.registryAccess().lookupOrThrow(Registries.LEVEL_STEM).getResourceKey(stem).orElseThrow();
171+
final ResourceKey<Level> dimensionKey = Registries.levelStemToLevel(stemKey);
172+
return Files.isDirectory(this.server.storageSource.getDimensionPath(dimensionKey));
173+
}
174+
167175
public static WorldGenSettings loadWorldGenSettings(
168176
final LevelStorageSource.LevelStorageAccess access, final net.minecraft.core.HolderLookup.Provider registryAccess, final ResourceKey<Level> dimension
169177
) {

paper-server/src/main/java/io/papermc/paper/world/migration/WorldFolderMigration.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
import java.nio.file.Files;
88
import java.nio.file.Path;
99
import net.minecraft.core.HolderLookup;
10+
import net.minecraft.nbt.CompoundTag;
11+
import net.minecraft.nbt.NbtAccounter;
12+
import net.minecraft.nbt.NbtIo;
13+
import net.minecraft.nbt.NbtUtils;
1014
import net.minecraft.resources.ResourceKey;
15+
import net.minecraft.util.filefix.FileFixerUpper;
1116
import net.minecraft.world.level.Level;
1217
import net.minecraft.world.level.dimension.LevelStem;
1318
import net.minecraft.world.level.levelgen.WorldGenSettings;
@@ -91,7 +96,24 @@ private static MigrationMode classifyStartupMigration(final WorldMigrationContex
9196
if (!context.rootAccess().getLevelId().equals(context.worldName()) && Files.isDirectory(context.rootAccess().parent().getLevelPath(context.worldName()))) {
9297
return MigrationMode.LEGACY_CRAFTBUKKIT_MIGRATION;
9398
}
94-
return hasCurrentPaperData(context.rootAccess(), context.dimensionKey()) ? MigrationMode.NO_OP : MigrationMode.VANILLA_MIGRATION;
99+
if (hasCurrentPaperData(context.rootAccess(), context.dimensionKey())) {
100+
return MigrationMode.NO_OP;
101+
}
102+
// the dimension was deleted
103+
if (!Files.isDirectory(context.rootAccess().getDimensionPath(context.dimensionKey()))) {
104+
try {
105+
final CompoundTag rawLevelData = NbtIo.readCompressed(
106+
context.rootAccess().getLevelDirectory().dataFile(), NbtAccounter.uncompressedQuota()
107+
);
108+
final int dataVersion = NbtUtils.getDataVersion(rawLevelData.getCompoundOrEmpty("Data"));
109+
if (dataVersion >= FileFixerUpper.FILE_FIXER_INTRODUCTION_VERSION) {
110+
return MigrationMode.NO_OP;
111+
}
112+
} catch (final IOException ex) {
113+
throw new RuntimeException("Failed to read level data for world migration classification", ex);
114+
}
115+
}
116+
return MigrationMode.VANILLA_MIGRATION;
95117
}
96118

97119
static boolean hasCurrentPaperData(final LevelStorageSource.LevelStorageAccess rootAccess, final ResourceKey<Level> dimensionKey) {

0 commit comments

Comments
 (0)