From 8ddb9b77f554597d9cf543096825cba338b47bb1 Mon Sep 17 00:00:00 2001 From: Kam Date: Sun, 4 Jun 2023 22:27:25 -0400 Subject: [PATCH] PlayerData Live Cache for better server performance/load/save functionality --- .../controllers/PlayerDataController.java | 30 +++++++++++++++++-- .../npcs/controllers/data/PlayerData.java | 5 +++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/noppes/npcs/controllers/PlayerDataController.java b/src/main/java/noppes/npcs/controllers/PlayerDataController.java index 28204067c..1bb8c657b 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerDataController.java +++ b/src/main/java/noppes/npcs/controllers/PlayerDataController.java @@ -9,10 +9,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ResourceLocation; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; +import noppes.npcs.client.renderer.ImageData; +import noppes.npcs.config.ConfigClient; import noppes.npcs.config.ConfigMain; import noppes.npcs.controllers.data.*; +import noppes.npcs.util.CacheHashMap; import noppes.npcs.util.CustomNPCsThreader; import noppes.npcs.util.NBTJsonUtil; @@ -26,7 +30,8 @@ import static noppes.npcs.util.CustomNPCsThreader.playerDataThread; public class PlayerDataController { public static PlayerDataController instance; - public HashMap nameUUIDs; + public static HashMap nameUUIDs; + private static final CacheHashMap> playerDataCache = new CacheHashMap<>(60 * 60 * 1000); public PlayerDataController(){ instance = this; @@ -244,6 +249,21 @@ public class PlayerDataController { return new NBTTagCompound(); } + public static void putPlayerDataCache(final String uuid, final PlayerData playerCompound) { + synchronized (playerDataCache) { + playerDataCache.put(uuid, new CacheHashMap.CachedObject<>(playerCompound)); + } + } + + public static PlayerData getPlayerDataCache(final String uuid) { + synchronized (playerDataCache) { + if (!playerDataCache.containsKey(uuid)) { + return null; + } + return playerDataCache.get(uuid).getObject(); + } + } + public PlayerBankData getBankData(EntityPlayer player, int bankId) { Bank bank = BankController.getInstance().getBank(bankId); PlayerBankData data = getPlayerData(player).bankData; @@ -254,7 +274,13 @@ public class PlayerDataController { } public PlayerData getPlayerData(EntityPlayer player){ - PlayerData data = (PlayerData) player.getExtendedProperties("CustomNpcsData"); + PlayerData data = getPlayerDataCache(player.getUniqueID().toString()); + if(data != null){ + data.player = player; + return data; + } + + data = (PlayerData) player.getExtendedProperties("CustomNpcsData"); if(data == null){ player.registerExtendedProperties("CustomNpcsData", data = new PlayerData()); data.player = player; diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerData.java b/src/main/java/noppes/npcs/controllers/data/PlayerData.java index 8689c90c9..29e3546e3 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerData.java @@ -11,6 +11,7 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; import noppes.npcs.api.entity.ICustomNpc; import noppes.npcs.api.handler.*; +import noppes.npcs.client.renderer.ImageData; import noppes.npcs.config.ConfigMain; import noppes.npcs.constants.EnumRoleType; import noppes.npcs.controllers.PlayerDataController; @@ -20,6 +21,7 @@ import noppes.npcs.entity.data.DataSkinOverlays; import noppes.npcs.entity.data.DataTimers; import noppes.npcs.roles.RoleCompanion; import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.util.CacheHashMap; import noppes.npcs.util.CustomNPCsThreader; import noppes.npcs.util.NBTJsonUtil; @@ -217,6 +219,8 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { } else { filename = uuid + ".json"; } + PlayerDataController.instance.putPlayerMap(playername, uuid); + PlayerDataController.putPlayerDataCache(uuid, this); CustomNPCsThreader.playerDataThread.execute(() -> { try { File saveDir = PlayerDataController.instance.getSaveDir(); @@ -235,7 +239,6 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { LogWriter.except(e); } }); - PlayerDataController.instance.putPlayerMap(playername, uuid); } public void load() {