From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite Date: Fri, 18 Nov 2022 08:37:19 -0600 Subject: [PATCH] Shared DataStorage for maps diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java index 4532f3a0d74feae0a1249b53e1bfbc18a8808b32..2df8d02d7151d3483587c22f70dea1439d439553 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java @@ -364,6 +364,7 @@ public class WorldConfiguration extends ConfigurationPart { public class Maps extends ConfigurationPart { public int itemFrameCursorLimit = 128; public int itemFrameCursorUpdateInterval = 10; + public String sharedDataFolder; // Slice } public Fixes fixes; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java index 274a8deb22d0d6d07d1e6278935000756ae37ac5..79f85a4d93b837e4b7f2e62f599359bf939ddc90 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -229,6 +229,8 @@ public class ServerLevel extends Level implements WorldGenLevel { return thr; } + private @Nullable DimensionDataStorage sharedDataStorage; // Slice + @Override public LevelChunk getChunkIfLoaded(int x, int z) { // Paper - this was added in world too but keeping here for NMS ABI return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper } @@ -606,6 +608,15 @@ public class ServerLevel extends Level implements WorldGenLevel { this.chunkTaskScheduler = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler(this, io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.workerThreads); // Paper - rewrite chunk system this.entityLookup = new io.papermc.paper.chunk.system.entity.EntityLookup(this, new EntityCallbacks()); // Paper - rewrite chunk system + + // Slice start + String sharedDataFolder = paperConfig().maps.sharedDataFolder; + if (sharedDataFolder != null) { + java.io.File sharedDir = new java.io.File(sharedDataFolder); + sharedDir.mkdirs(); + this.sharedDataStorage = new DimensionDataStorage(sharedDir, datafixer); + } + // Slice end } public void setWeatherParameters(int clearDuration, int rainDuration, boolean raining, boolean thundering) { @@ -1337,6 +1348,7 @@ public class ServerLevel extends Level implements WorldGenLevel { }// Paper // Paper - rewrite chunk system - entity saving moved into ChunkHolder + if (sharedDataStorage != null) sharedDataStorage.save(); } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system // CraftBukkit start - moved from MinecraftServer.saveChunks @@ -1918,11 +1930,17 @@ public class ServerLevel extends Level implements WorldGenLevel { return this.getChunkSource().getDataStorage(); } + // Slice start + public DimensionDataStorage getMapDataStorage() { + return sharedDataStorage != null ? sharedDataStorage : this.getChunkSource().getDataStorage(); + } + // Slice end + @Nullable @Override public MapItemSavedData getMapData(String id) { // CraftBukkit start - return (MapItemSavedData) this.getServer().overworld().getDataStorage().get((nbttagcompound) -> { + return (MapItemSavedData) getMapDataStorage().get((nbttagcompound) -> { // Slice // We only get here when the data file exists, but is not a valid map MapItemSavedData newMap = MapItemSavedData.load(nbttagcompound); newMap.id = id; @@ -1936,12 +1954,22 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void setMapData(String id, MapItemSavedData state) { state.id = id; // CraftBukkit - this.getServer().overworld().getDataStorage().set(id, state); + getMapDataStorage().set(id, state); // Slice } @Override public int getFreeMapId() { - return ((MapIndex) this.getServer().overworld().getDataStorage().computeIfAbsent(MapIndex::load, MapIndex::new, "idcounts")).getFreeAuxValueForMap(); + // Slice start + DimensionDataStorage storage = getMapDataStorage(); + MapIndex mapIndex = storage.readSavedData(MapIndex::load, "idcounts"); + if (mapIndex == null) { + mapIndex = new MapIndex(); + } + int newId = mapIndex.getFreeAuxValueForMap(); + storage.set("idcounts", mapIndex); + storage.save(); + return newId; + // Slice end } // Paper start - helper function for configurable spawn radius diff --git a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java index 2da78bc43af715fe399eac1d83b3bf6e8fb8afac..3a8d2344b8e3485c9d4a7abb1b22e853b710ef4e 100644 --- a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java +++ b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java @@ -58,7 +58,7 @@ public class DimensionDataStorage { } @Nullable - private T readSavedData(Function readFunction, String id) { + public T readSavedData(Function readFunction, String id) { // Slice private -> public try { File file = this.getDataFile(id); if (file.exists()) {