Skip to content

Commit dfa3e44

Browse files
committed
Reorganize level storage layout to closer mirror 26.1 vanilla with CB per-level 'world container' behavior.
1 parent 546acb5 commit dfa3e44

File tree

7 files changed

+34
-44
lines changed

7 files changed

+34
-44
lines changed

paper-server/patches/features/0003-Entity-Activation-Range-2.0.patch

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,18 @@ index 0000000000000000000000000000000000000000..c18823746ab2edcab536cb1589b7720e
354354
+ }
355355
+}
356356
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
357-
index 0b064125d562bd0904321bdc4d4a243042a9bea8..c164f98c5b92e5f326a8f7b5e2840039257783d8 100644
357+
index 4f31c92c8c3b2757a4103a1b2a0ae158117eebd1..43c47bdd2fdb7731eec5301e20f923d0703a36fc 100644
358358
--- a/net/minecraft/server/level/ServerLevel.java
359359
+++ b/net/minecraft/server/level/ServerLevel.java
360-
@@ -590,6 +590,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
360+
@@ -591,6 +591,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
361361
profiler.pop();
362362
}
363363

364364
+ io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR
365365
this.entityTickList
366366
.forEach(
367367
entity -> {
368-
@@ -1063,12 +1064,15 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
368+
@@ -1064,12 +1065,15 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
369369
entity.totalEntityAge++; // Paper - age-like counter for all entities
370370
profiler.push(entity.typeHolder()::getRegisteredName);
371371
profiler.incrementCounter("tickNonPassenger");
@@ -382,7 +382,7 @@ index 0b064125d562bd0904321bdc4d4a243042a9bea8..c164f98c5b92e5f326a8f7b5e2840039
382382
}
383383
// Paper start - log detailed entity tick information
384384
} finally {
385-
@@ -1079,7 +1083,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
385+
@@ -1080,7 +1084,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
386386
// Paper end - log detailed entity tick information
387387
}
388388

@@ -391,7 +391,7 @@ index 0b064125d562bd0904321bdc4d4a243042a9bea8..c164f98c5b92e5f326a8f7b5e2840039
391391
if (entity.isRemoved() || entity.getVehicle() != vehicle) {
392392
entity.stopRiding();
393393
} else if (entity instanceof Player || this.entityTickList.contains(entity)) {
394-
@@ -1089,12 +1093,21 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
394+
@@ -1090,12 +1094,21 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
395395
ProfilerFiller profiler = Profiler.get();
396396
profiler.push(entity.typeHolder()::getRegisteredName);
397397
profiler.incrementCounter("tickPassenger");

paper-server/patches/features/0014-Add-Alternate-Current-redstone-implementation.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2326,18 +2326,18 @@ index 0000000000000000000000000000000000000000..298076a0db4e6ee6e4775ac43bf749d9
23262326
+ }
23272327
+}
23282328
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
2329-
index c164f98c5b92e5f326a8f7b5e2840039257783d8..34b41c2e16d4685a0d3547c4bd6a3cc9d47b7bfc 100644
2329+
index 43c47bdd2fdb7731eec5301e20f923d0703a36fc..75068c07d1892882a85e27e30da8ac9906cf16e7 100644
23302330
--- a/net/minecraft/server/level/ServerLevel.java
23312331
+++ b/net/minecraft/server/level/ServerLevel.java
2332-
@@ -231,6 +231,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
2332+
@@ -232,6 +232,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
23332333
public final net.minecraft.world.level.storage.LevelDataAndDimensions.WorldDataAndGenSettings worldDataAndGenSettings;
23342334
public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent
23352335
public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent
23362336
+ private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current)
23372337

23382338
@Override
23392339
public @Nullable LevelChunk getChunkIfLoaded(int x, int z) {
2340-
@@ -2426,6 +2427,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
2340+
@@ -2434,6 +2435,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
23412341
return this.debugSynchronizers;
23422342
}
23432343

paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@
332332
+ ) {
333333
+ final WorldOptions worldOptions = worldDataAndGenSettings.genSettings().options();
334334
+ final ResourceKey<Level> dimensionKey = ResourceKey.create(Registries.DIMENSION, loadingInfo.stemKey().identifier());
335-
+ final SavedDataStorage savedDataStorage = new SavedDataStorage(levelStorageAccess.getDimensionPath(dimensionKey).resolve("data"), this.getFixerUpper(), this.registryAccess());
335+
+ final SavedDataStorage savedDataStorage = new SavedDataStorage(levelStorageAccess.getLevelPath(LevelResource.DATA), this.getFixerUpper(), this.registryAccess());
336336
+ savedDataStorage.set(WorldGenSettings.TYPE, worldDataAndGenSettings.genSettings());
337337
long seed = worldOptions.seed();
338338
long biomeZoomSeed = BiomeManager.obfuscateSeed(seed);

paper-server/patches/sources/net/minecraft/server/level/ServerChunkCache.java.patch

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,6 @@
2222

2323
public ServerChunkCache(
2424
final ServerLevel level,
25-
@@ -87,6 +_,7 @@
26-
final boolean syncWrites,
27-
final ChunkStatusUpdateListener chunkStatusListener,
28-
final Supplier<SavedDataStorage> overworldDataStorage
29-
+ , final SavedDataStorage savedDataStorage // Paper - initialize savedDataStorage earlier
30-
) {
31-
this.level = level;
32-
this.mainThreadProcessor = new ServerChunkCache.MainThreadExecutor(level);
33-
@@ -99,7 +_,7 @@
34-
LOGGER.error("Failed to create dimension data storage directory", (Throwable)var14);
35-
}
36-
37-
- this.savedDataStorage = new SavedDataStorage(dataFolder, fixerUpper, level.registryAccess());
38-
+ this.savedDataStorage = savedDataStorage;
39-
this.ticketStorage = this.savedDataStorage.computeIfAbsent(TicketStorage.TYPE);
40-
this.chunkMap = new ChunkMap(
41-
level,
4225
@@ -122,6 +_,64 @@
4326
this.clearCache();
4427
}

paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99
private final EntityTickList entityTickList = new EntityTickList();
1010
private final ServerWaypointManager waypointManager;
1111
private EnvironmentAttributeSystem environmentAttributes;
12-
@@ -221,24 +_,181 @@
12+
@@ -221,24 +_,183 @@
1313
private final boolean tickTime;
1414
private final LevelDebugSynchronizers debugSynchronizers = new LevelDebugSynchronizers(this);
1515

1616
+ // CraftBukkit start
1717
+ public final LevelStorageSource.LevelStorageAccess levelStorageAccess;
1818
+ public final UUID uuid;
1919
+ public final net.minecraft.server.level.progress.LevelLoadListener levelLoadListener;
20+
+ private final SavedDataStorage savedDataStorage; // Paper - save per-world data in level storage
2021
+ private final net.minecraft.world.level.gamerules.GameRules gameRules;
2122
+ private final WeatherData weatherData;
2223
+ public final net.minecraft.world.level.timers.TimerQueue<net.minecraft.server.MinecraftServer> scheduledEvents;
@@ -161,6 +162,7 @@
161162
+ final GameRules gameRules = new GameRules(levelData.enabledFeatures(), savedDataStorage.computeIfAbsent(net.minecraft.world.level.gamerules.GameRuleMap.TYPE));
162163
+ this.gameRules = gameRules;
163164
+ super(levelData, dimension, server.registryAccess(), levelStem.type(), false, isDebug, biomeZoomSeed, server.getMaxChainedNeighborUpdates(), gen, biomeProvider, env, spigotConfig -> server.paperConfigurations.createWorldConfig(io.papermc.paper.configuration.PaperConfigurations.createWorldContextMap(levelStorage.levelDirectory.path(), levelData.getLevelName(), dimension.identifier(), spigotConfig, server.registryAccess(), gameRules))); // Paper - create paper world configs
165+
+ this.savedDataStorage = savedDataStorage; // Paper - save per-world data in level storage
164166
+ this.weatherData = savedDataStorage.computeIfAbsent(WeatherData.TYPE);
165167
+ this.weatherData.setLevel(this);
166168
+ this.levelStorageAccess = levelStorage;
@@ -193,7 +195,7 @@
193195
boolean syncWrites = server.forceSynchronousWrites();
194196
DataFixer fixerUpper = server.getFixerUpper();
195197
EntityPersistentStorage<Entity> entityStorage = new EntityStorage(
196-
@@ -260,16 +_,17 @@
198+
@@ -260,8 +_,8 @@
197199
server.getStructureManager(),
198200
executor,
199201
generator,
@@ -204,8 +206,7 @@
204206
syncWrites,
205207
this.entityManager::updateChunkStatus,
206208
() -> server.overworld().getDataStorage()
207-
+ , savedDataStorage // Paper - pass SavedDataStorage
208-
);
209+
@@ -269,7 +_,7 @@
209210
this.chunkSource.getGeneratorState().ensureStructuresGenerated();
210211
this.portalForcer = new PortalForcer(this);
211212
if (this.canHaveWeather()) {
@@ -552,7 +553,7 @@
552553
if (progressListener != null) {
553554
progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel"));
554555
}
555-
@@ -883,9 +_,15 @@
556+
@@ -883,9 +_,21 @@
556557
this.entityManager.autoSave();
557558
}
558559
}
@@ -564,7 +565,13 @@
564565
}
565566

566567
private void saveLevelData(final boolean sync) {
567-
+ // TODO - snapshot - save dragon fight?
568+
+ // Paper start - save per-world data in level storage
569+
+ if (sync) {
570+
+ this.savedDataStorage.saveAndJoin();
571+
+ } else {
572+
+ this.savedDataStorage.scheduleSave();
573+
+ }
574+
+ // Paper end - save per-world data in level storage
568575
SavedDataStorage savedDataStorage = this.getChunkSource().getDataStorage();
569576
if (sync) {
570577
savedDataStorage.saveAndJoin();
@@ -1058,6 +1065,14 @@
10581065
return this.entityManager.getEntityGetter();
10591066
}
10601067

1068+
@@ -1785,6 +_,7 @@
1069+
public void close() throws IOException {
1070+
super.close();
1071+
this.entityManager.close();
1072+
+ this.savedDataStorage.close(); // Paper - save per-world data in level storage
1073+
}
1074+
1075+
@Override
10611076
@@ -1841,8 +_,30 @@
10621077
}
10631078

paper-server/patches/sources/net/minecraft/world/level/storage/LevelStorageSource.java.patch

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,6 @@
88
return LevelDataAndDimensions.create(worldData, worldGenSettings, dimensions);
99
}
1010
}
11-
@@ -176,7 +_,7 @@
12-
public static <T extends SavedData> DataResult<T> readExistingSavedData(
13-
final LevelStorageSource.LevelStorageAccess access, final HolderLookup.Provider registryAccess, final SavedDataType<T> savedDataType
14-
) {
15-
- Path dataLocation = savedDataType.id().withSuffix(".dat").resolveAgainst(access.getLevelPath(LevelResource.DATA));
16-
+ Path dataLocation = savedDataType.id().withSuffix(".dat").resolveAgainst(access.getDimensionPath(null).resolve("data")); // CraftBukkit
17-
18-
CompoundTag fileContents;
19-
try {
2011
@@ -394,25 +_,39 @@
2112
return this.backupDir;
2213
}
@@ -84,7 +75,7 @@
8475

8576
public Path getDimensionPath(final ResourceKey<Level> name) {
8677
- return DimensionType.getStorageFolder(name, this.levelDirectory.path());
87-
+ return LevelStorageSource.getStorageFolder(this.levelDirectory.path(), this.dimensionType); // CraftBukkit
78+
+ return DimensionType.getStorageFolder(net.minecraft.core.registries.Registries.levelStemToLevel(this.dimensionType), this.levelDirectory.path()); // Paper
8879
}
8980

9081
private void checkLock() {

paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
import net.minecraft.world.level.saveddata.maps.MapId;
111111
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
112112
import net.minecraft.world.level.storage.LevelDataAndDimensions;
113+
import net.minecraft.world.level.storage.LevelResource;
113114
import net.minecraft.world.level.storage.LevelStorageSource;
114115
import net.minecraft.world.level.storage.PlayerDataStorage;
115116
import net.minecraft.world.level.storage.PrimaryLevelData;
@@ -1285,7 +1286,7 @@ public World createWorld(WorldCreator creator) {
12851286
dimensionKey = ResourceKey.create(Registries.DIMENSION, Identifier.fromNamespaceAndPath(creator.key().namespace(), creator.key().value()));
12861287
}
12871288

1288-
final SavedDataStorage savedDataStorage = new SavedDataStorage(levelStorageAccess.getDimensionPath(dimensionKey).resolve("data"), this.console.getFixerUpper(), this.console.registryAccess());
1289+
final SavedDataStorage savedDataStorage = new SavedDataStorage(levelStorageAccess.getLevelPath(LevelResource.DATA), this.console.getFixerUpper(), this.console.registryAccess());
12891290
savedDataStorage.set(WorldGenSettings.TYPE, worldDataAndGenSettings.genSettings());
12901291
List<CustomSpawner> list = ImmutableList.of(
12911292
new PhantomSpawner(), new PatrolSpawner(), new CatSpawner(), new VillageSiege(), new WanderingTraderSpawner(savedDataStorage)
@@ -2187,7 +2188,7 @@ public WorldMetadataStore getWorldMetadata() {
21872188

21882189
@Override
21892190
public File getWorldContainer() {
2190-
return this.getServer().storageSource.getDimensionPath(net.minecraft.world.level.Level.OVERWORLD).getParent().toFile();
2191+
return this.getServer().storageSource.getLevelDirectory().path().getParent().toFile();
21912192
}
21922193

21932194
@Override

0 commit comments

Comments
 (0)