73 lines
3.3 KiB
Diff
73 lines
3.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cryptite <cryptite@gmail.com>
|
|
Date: Mon, 26 Jun 2023 16:45:00 -0500
|
|
Subject: [PATCH] Save DimensionDataStorage async
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
index ad868de68ecc5eee9701f8fe3d48e9fb3ed422d8..ef2d88765dbcc36ca3a1f36101e389799241bcde 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -2142,8 +2142,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
if (existing == null && !storage.cache.containsKey(id)) {
|
|
final net.minecraft.world.level.saveddata.SavedData.Factory<MapItemSavedData> factory = MapItemSavedData.factory();
|
|
final MapItemSavedData map = storage.readSavedData(factory.deserializer(), factory.type(), id);
|
|
- storage.cache.put(id, map);
|
|
if (map != null) {
|
|
+ storage.cache.put(id, map);
|
|
map.id = id;
|
|
new MapInitializeEvent(map.mapView).callEvent();
|
|
return map;
|
|
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 d051e8c1db6b5c42b8df0be54d9d48ba0e7b0077..f90f7fc66396091bdeb98bc3271b68bca693ee15 100644
|
|
--- a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java
|
|
+++ b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java
|
|
@@ -9,6 +9,8 @@ import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.io.PushbackInputStream;
|
|
import java.util.Map;
|
|
+import java.util.concurrent.CompletableFuture;
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.function.Function;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.SharedConstants;
|
|
@@ -18,11 +20,12 @@ import net.minecraft.nbt.NbtIo;
|
|
import net.minecraft.nbt.NbtUtils;
|
|
import net.minecraft.util.datafix.DataFixTypes;
|
|
import net.minecraft.world.level.saveddata.SavedData;
|
|
+import org.bukkit.Bukkit;
|
|
import org.slf4j.Logger;
|
|
|
|
public class DimensionDataStorage {
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
- public final Map<String, SavedData> cache = Maps.newHashMap();
|
|
+ public final Map<String, SavedData> cache = new ConcurrentHashMap<>();
|
|
private final DataFixer fixerUpper;
|
|
private final File dataFolder;
|
|
|
|
@@ -51,7 +54,7 @@ public class DimensionDataStorage {
|
|
SavedData savedData = this.cache.get(id);
|
|
if (savedData == null && !this.cache.containsKey(id)) {
|
|
savedData = this.readSavedData(type.deserializer(), type.type(), id);
|
|
- this.cache.put(id, savedData);
|
|
+ if (savedData != null) this.cache.put(id, savedData);
|
|
}
|
|
|
|
return (T)savedData;
|
|
@@ -119,11 +122,12 @@ public class DimensionDataStorage {
|
|
}
|
|
|
|
public void save() {
|
|
- this.cache.forEach((id, state) -> {
|
|
+ // Slice start - run async
|
|
+ CompletableFuture.runAsync(() -> this.cache.forEach((id, state) -> {
|
|
if (state != null) {
|
|
state.save(this.getDataFile(id));
|
|
}
|
|
-
|
|
- });
|
|
+ }));
|
|
+ // Slice end
|
|
}
|
|
}
|