diff --git a/src/main/java/kamkeel/npcs/controllers/SyncController.java b/src/main/java/kamkeel/npcs/controllers/SyncController.java index 103674252..efc15640a 100644 --- a/src/main/java/kamkeel/npcs/controllers/SyncController.java +++ b/src/main/java/kamkeel/npcs/controllers/SyncController.java @@ -133,14 +133,26 @@ public class SyncController { public static void handleClientRevisionReport( EntityPlayerMP player, String serverKey, + String previousServerKey, Map clientRevisions ) { - if (!getServerCacheKey().equals(serverKey)) { + String currentServerKey = getServerCacheKey(); + PlayerSyncState state = PLAYER_SYNC_STATE.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); + + if (!currentServerKey.equals(serverKey)) { + state.reset(); syncPlayer(player); return; } - PlayerSyncState state = PLAYER_SYNC_STATE.computeIfAbsent(player.getUniqueID(), PlayerSyncState::new); + if (!currentServerKey.isEmpty()) { + if (previousServerKey == null || !currentServerKey.equals(previousServerKey)) { + state.reset(); + syncPlayer(player); + return; + } + } + state.applyHandshake(clientRevisions); syncPlayer(player); @@ -959,5 +971,9 @@ public class SyncController { revisions.putAll(incoming); } + private synchronized void reset() { + revisions.clear(); + } + } } diff --git a/src/main/java/kamkeel/npcs/network/packets/data/LoginPacket.java b/src/main/java/kamkeel/npcs/network/packets/data/LoginPacket.java index 48e682735..c341bd02e 100644 --- a/src/main/java/kamkeel/npcs/network/packets/data/LoginPacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/data/LoginPacket.java @@ -78,6 +78,7 @@ public final class LoginPacket extends AbstractPacket { PacketClient.sendClient(new SyncRevisionInfoPacket( serverKey, + ClientCacheHandler.getLastServerKey(), ClientCacheHandler.getCachedRevisionsForServer(serverKey) )); } diff --git a/src/main/java/kamkeel/npcs/network/packets/player/SyncRevisionInfoPacket.java b/src/main/java/kamkeel/npcs/network/packets/player/SyncRevisionInfoPacket.java index 7d64f2cf4..769b086b7 100644 --- a/src/main/java/kamkeel/npcs/network/packets/player/SyncRevisionInfoPacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/player/SyncRevisionInfoPacket.java @@ -22,15 +22,19 @@ public class SyncRevisionInfoPacket extends AbstractPacket { public static final String packetName = "Player|SyncRevisionInfo"; private String serverKey = ""; + private String previousServerKey = ""; private final EnumMap revisions = new EnumMap<>(EnumSyncType.class); public SyncRevisionInfoPacket() { } - public SyncRevisionInfoPacket(String serverKey, EnumMap revisions) { + public SyncRevisionInfoPacket(String serverKey, String previousServerKey, EnumMap revisions) { if (serverKey != null) { this.serverKey = serverKey; } + if (previousServerKey != null) { + this.previousServerKey = previousServerKey; + } if (revisions != null) { this.revisions.putAll(revisions); } @@ -50,6 +54,7 @@ public class SyncRevisionInfoPacket extends AbstractPacket { @SideOnly(Side.CLIENT) public void sendData(ByteBuf out) throws IOException { ByteBufUtils.writeString(out, serverKey); + ByteBufUtils.writeString(out, previousServerKey); out.writeShort(revisions.size()); for (Map.Entry entry : revisions.entrySet()) { out.writeInt(entry.getKey().ordinal()); @@ -64,6 +69,7 @@ public class SyncRevisionInfoPacket extends AbstractPacket { } String incomingServerKey = ByteBufUtils.readString(in); + String incomingPreviousKey = ByteBufUtils.readString(in); int revisionCount = in.readUnsignedShort(); EnumMap incomingRevisions = new EnumMap<>(EnumSyncType.class); for (int i = 0; i < revisionCount; i++) { @@ -72,6 +78,6 @@ public class SyncRevisionInfoPacket extends AbstractPacket { incomingRevisions.put(type, revision); } - SyncController.handleClientRevisionReport((EntityPlayerMP) player, incomingServerKey, incomingRevisions); + SyncController.handleClientRevisionReport((EntityPlayerMP) player, incomingServerKey, incomingPreviousKey, incomingRevisions); } } diff --git a/src/main/java/noppes/npcs/client/ClientCacheHandler.java b/src/main/java/noppes/npcs/client/ClientCacheHandler.java index b90e24e69..2c6a368c2 100644 --- a/src/main/java/noppes/npcs/client/ClientCacheHandler.java +++ b/src/main/java/noppes/npcs/client/ClientCacheHandler.java @@ -31,6 +31,7 @@ public class ClientCacheHandler { public static HashMap playerAnimations = new HashMap<>(); private static String activeServerKey = ""; + private static String lastServerKey = ""; private static final Map> clientRevisionCache = new HashMap<>(); public static Party party; @@ -40,9 +41,13 @@ public class ClientCacheHandler { public static void setActiveServer(String serverKey, EnumMap serverRevisions) { String normalizedKey = serverKey == null ? "" : serverKey; + String previousKey = activeServerKey == null ? "" : activeServerKey; + lastServerKey = previousKey; + if (!normalizedKey.equals(activeServerKey)) { clientRevisionCache.clear(); } + activeServerKey = normalizedKey; if (activeServerKey.isEmpty()) { @@ -58,6 +63,10 @@ public class ClientCacheHandler { } } + public static String getLastServerKey() { + return lastServerKey == null ? "" : lastServerKey; + } + public static EnumMap getCachedRevisionsForServer(String serverKey) { String key = serverKey == null ? "" : serverKey; if (key.isEmpty()) {