From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: hayanesuru Date: Fri, 28 Mar 2025 21:19:19 +0800 Subject: [PATCH] Async playerdata saving diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index f2d87c12dd19210ce7e2147fada5c10191008632..f64844fb39cd02d8645491a8b482b21643334500 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -813,6 +813,17 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa * @param compoundTag */ private void save(CompoundTag compoundTag) { + // Leaf start + synchronized (server.console.playerDataStorage) { + while (server.console.playerDataStorage.saving.contains(getUniqueId().toString())) { + try { + Thread.sleep(1L); + } catch (InterruptedException ignored) { + } + } + server.console.playerDataStorage.saving.add(getUniqueId().toString()); + } + // Leaf end File playerDir = server.console.playerDataStorage.getPlayerDir(); try { File tempFile = File.createTempFile(this.getUniqueId()+"-", ".dat", playerDir); @@ -822,6 +833,12 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa net.minecraft.Util.safeReplaceFile(playerDataFile.toPath(), tempFile.toPath(), playerDataFileOld.toPath()); } catch (java.io.IOException e) { e.printStackTrace(); + // Leaf start + } finally { + synchronized (server.console.playerDataStorage) { + server.console.playerDataStorage.saving.remove(getUniqueId().toString()); + } + // Leaf end } } // Purpur end - OfflinePlayer API