113 lines
5.6 KiB
Diff
113 lines
5.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cryptite <cryptite@gmail.com>
|
|
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 extends SavedData> T readSavedData(Function<CompoundTag, T> readFunction, String id) {
|
|
+ public <T extends SavedData> T readSavedData(Function<CompoundTag, T> readFunction, String id) { // Slice private -> public
|
|
try {
|
|
File file = this.getDataFile(id);
|
|
if (file.exists()) {
|