From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite 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 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 cache = Maps.newHashMap(); + public final Map 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 } }