From 5e8e004ef6579ded7a88045847207165d842463e Mon Sep 17 00:00:00 2001 From: Kam Date: Wed, 5 Nov 2025 17:23:21 -0500 Subject: [PATCH] Scope sync cache rebuild to server load --- .../npcs/controllers/SyncController.java | 85 +++++++++++++------ src/main/java/noppes/npcs/CustomNpcs.java | 2 +- 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/src/main/java/kamkeel/npcs/controllers/SyncController.java b/src/main/java/kamkeel/npcs/controllers/SyncController.java index 9e960fc1e..7876b71d9 100644 --- a/src/main/java/kamkeel/npcs/controllers/SyncController.java +++ b/src/main/java/kamkeel/npcs/controllers/SyncController.java @@ -53,6 +53,23 @@ public class SyncController { public static boolean DEBUG_SYNC_LOGGING = false; + private static final SyncController SERVER = new SyncController(); + + private final EnumMap cacheEntries = new EnumMap<>(EnumSyncType.class); + private final ConcurrentHashMap playerSyncState = new ConcurrentHashMap<>(); + + private SyncController() { + registerCache(EnumSyncType.FACTION, SyncController::factionsNBT); + registerCache(EnumSyncType.DIALOG_CATEGORY, SyncController::dialogCategoriesNBT); + registerCache(EnumSyncType.QUEST_CATEGORY, SyncController::questCategoriesNBT); + registerCache(EnumSyncType.WORKBENCH_RECIPES, SyncController::workbenchNBT); + registerCache(EnumSyncType.CARPENTRY_RECIPES, SyncController::carpentryNBT); + registerCache(EnumSyncType.ANVIL_RECIPES, SyncController::anvilNBT); + registerCache(EnumSyncType.CUSTOM_EFFECTS, SyncController::customEffectsNBT); + registerCache(EnumSyncType.MAGIC, SyncController::magicsNBT); + registerCache(EnumSyncType.MAGIC_CYCLE, SyncController::magicCyclesNBT); + } + private static void debug(String message, Object... args) { if (DEBUG_SYNC_LOGGING) { System.out.println("[SyncController] " + String.format(message, args)); @@ -71,39 +88,51 @@ public class SyncController { EnumSyncType.MAGIC_CYCLE }; - private static final EnumMap CACHE_ENTRIES = new EnumMap<>(EnumSyncType.class); - private static final ConcurrentHashMap PLAYER_SYNC_STATE = new ConcurrentHashMap<>(); + public static void load() { + SERVER.loadInternal(); + } - static { - registerCache(EnumSyncType.FACTION, SyncController::factionsNBT); - registerCache(EnumSyncType.DIALOG_CATEGORY, SyncController::dialogCategoriesNBT); - registerCache(EnumSyncType.QUEST_CATEGORY, SyncController::questCategoriesNBT); - registerCache(EnumSyncType.WORKBENCH_RECIPES, SyncController::workbenchNBT); - registerCache(EnumSyncType.CARPENTRY_RECIPES, SyncController::carpentryNBT); - registerCache(EnumSyncType.ANVIL_RECIPES, SyncController::anvilNBT); - registerCache(EnumSyncType.CUSTOM_EFFECTS, SyncController::customEffectsNBT); - registerCache(EnumSyncType.MAGIC, SyncController::magicsNBT); - registerCache(EnumSyncType.MAGIC_CYCLE, SyncController::magicCyclesNBT); + @Deprecated + public static void rebuildAllCaches() { + load(); } public static void resetServerState() { - for (SyncCacheEntry entry : CACHE_ENTRIES.values()) { + SERVER.resetState(); + } + + private void loadInternal() { + resetState(); + rebuildAllCachesInternal(); + } + + private void resetState() { + for (SyncCacheEntry entry : cacheEntries.values()) { if (entry != null) { entry.reset(); } } - PLAYER_SYNC_STATE.clear(); + playerSyncState.clear(); + } + + private void rebuildAllCachesInternal() { + for (EnumSyncType type : EnumSyncType.values()) { + SyncCacheEntry entry = cacheEntries.get(type); + if (entry != null) { + entry.getPayload(type); + } + } } public static void syncPlayer(EntityPlayerMP player) { - syncPlayer(player, true); + SERVER.syncPlayerInternal(player, true); } - private static void syncPlayer(EntityPlayerMP player, boolean includePostPackets) { - PlayerSyncState state = PLAYER_SYNC_STATE.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); + private void syncPlayerInternal(EntityPlayerMP player, boolean includePostPackets) { + PlayerSyncState state = playerSyncState.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); for (EnumSyncType type : LOGIN_SYNC_TYPES) { - SyncCacheEntry entry = CACHE_ENTRIES.get(type); + SyncCacheEntry entry = cacheEntries.get(type); if (entry == null) { continue; } @@ -132,7 +161,7 @@ public class SyncController { } public static void beginLogin(EntityPlayerMP player) { - PLAYER_SYNC_STATE.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); + SERVER.playerSyncState.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); PacketHandler.Instance.sendToPlayer( new LoginPacket(getServerCacheKey(), getServerRevisionSnapshot()), player @@ -146,7 +175,7 @@ public class SyncController { Map clientRevisions ) { String currentServerKey = getServerCacheKey(); - PlayerSyncState state = PLAYER_SYNC_STATE.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); + PlayerSyncState state = SERVER.playerSyncState.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); if (!currentServerKey.equals(serverKey)) { state.reset(); @@ -184,7 +213,7 @@ public class SyncController { private static EnumMap getServerRevisionSnapshot() { EnumMap snapshot = new EnumMap<>(EnumSyncType.class); for (EnumSyncType type : LOGIN_SYNC_TYPES) { - SyncCacheEntry entry = CACHE_ENTRIES.get(type); + SyncCacheEntry entry = SERVER.cacheEntries.get(type); if (entry != null) { snapshot.put(type, entry.getRevisionValue()); } @@ -208,7 +237,7 @@ public class SyncController { } public static int getCurrentRevision(EnumSyncType type) { - SyncCacheEntry entry = CACHE_ENTRIES.get(type); + SyncCacheEntry entry = SERVER.cacheEntries.get(type); return entry == null ? -1 : entry.getRevisionValue(); } @@ -800,12 +829,12 @@ public class SyncController { } } - private static void registerCache(EnumSyncType type, Supplier supplier) { - CACHE_ENTRIES.put(type, new SyncCacheEntry(type, supplier)); + private void registerCache(EnumSyncType type, Supplier supplier) { + cacheEntries.put(type, new SyncCacheEntry(type, supplier)); } private static CachedSyncPayload rebuildNow(EnumSyncType type) { - SyncCacheEntry entry = CACHE_ENTRIES.get(type); + SyncCacheEntry entry = SERVER.cacheEntries.get(type); if (entry == null) { return null; } @@ -817,7 +846,7 @@ public class SyncController { EnumSet targets = getInvalidationTargets(type); EnumMap revisions = new EnumMap<>(EnumSyncType.class); for (EnumSyncType target : targets) { - SyncCacheEntry entry = CACHE_ENTRIES.get(target); + SyncCacheEntry entry = SERVER.cacheEntries.get(target); if (entry != null) { int newRevision = entry.invalidate(); revisions.put(target, newRevision); @@ -857,7 +886,7 @@ public class SyncController { if (revision < 0) { return; } - for (PlayerSyncState state : PLAYER_SYNC_STATE.values()) { + for (PlayerSyncState state : SERVER.playerSyncState.values()) { state.updateRevision(type, revision); } } @@ -866,7 +895,7 @@ public class SyncController { if (revisions.isEmpty()) { return; } - for (PlayerSyncState state : PLAYER_SYNC_STATE.values()) { + for (PlayerSyncState state : SERVER.playerSyncState.values()) { for (Map.Entry entry : revisions.entrySet()) { state.updateRevision(entry.getKey(), entry.getValue()); } diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index a8504edbe..b4ec0a43c 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -304,7 +304,6 @@ public class CustomNpcs { //Loading items in the about to start event was corrupting items with a damage value @EventHandler public void started(FMLServerStartedEvent event) { - SyncController.resetServerState(); RecipeController.Instance.load(); new BankController(); DialogController.Instance.load(); @@ -312,6 +311,7 @@ public class CustomNpcs { ScriptController.HasStart = true; ServerCloneController.Instance = new ServerCloneController(); ServerTagMapController.Instance = new ServerTagMapController(); + SyncController.load(); }