diff --git a/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java b/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java index 7782b95..905eaa9 100644 --- a/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java +++ b/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java @@ -1003,7 +1003,8 @@ public class VanillaSync { if (deadPlayerWhileLogging.remove(player_uuid)) { PlayerSync.LOGGER.warn("A dead or dying player was kicked, uuid: {}", player_uuid); try { - JDBCsetUp.executePreparedUpdate("UPDATE player_data SET online=0 WHERE uuid=?", player_uuid); + JDBCsetUp.executePreparedUpdate("UPDATE player_data SET online=0 WHERE uuid=? AND last_server=?", + player_uuid, JdbcConfig.SERVER_ID.get()); } catch (SQLException e) { PlayerSync.LOGGER.error("Error marking dead player offline: {}", player_uuid, e); } @@ -1015,7 +1016,8 @@ public class VanillaSync { if (syncNotCompletedPlayer.remove(player_uuid)) { PlayerSync.LOGGER.warn("Player {} logged out with uncompleted sync. Data won't be saved for safety.", player_uuid); try { - JDBCsetUp.executePreparedUpdate("UPDATE player_data SET online=0 WHERE uuid=?", player_uuid); + JDBCsetUp.executePreparedUpdate("UPDATE player_data SET online=0 WHERE uuid=? AND last_server=?", + player_uuid, JdbcConfig.SERVER_ID.get()); } catch (SQLException e) { PlayerSync.LOGGER.error("Error marking unsynced player offline: {}", player_uuid, e); } diff --git a/src/main/java/vip/fubuki/playersync/sync/addons/ModCompatSync.java b/src/main/java/vip/fubuki/playersync/sync/addons/ModCompatSync.java index 56298b2..47c5908 100644 --- a/src/main/java/vip/fubuki/playersync/sync/addons/ModCompatSync.java +++ b/src/main/java/vip/fubuki/playersync/sync/addons/ModCompatSync.java @@ -487,7 +487,10 @@ public class ModCompatSync { } } } - return flatMap.isEmpty() ? null : flatMap.toString(); + // FIX ANTI-DUPLICATION: Return "{}" for empty slots, NOT null. + // Null causes writeModSnapshot to SKIP the write, keeping stale data in DB. + // "{}" is written to DB, and on restore applyAccessoriesFromData clears slots. + return flatMap.toString(); } catch (Exception e) { PlayerSync.LOGGER.error("Error snapshotting Accessories for player {}", player.getUUID(), e); return null; @@ -511,7 +514,10 @@ public class ModCompatSync { flatMap.put(i, VanillaSync.getNbtForStorage(stack)); } } - return flatMap.isEmpty() ? null : flatMap.toString(); + // FIX ANTI-DUPLICATION: Return "{}" for empty slots, NOT null. + // Null causes writeModSnapshot to SKIP the write, keeping stale data in DB. + // "{}" is written to DB, and on restore applyCosmeticArmorFromData clears slots. + return flatMap.toString(); } catch (Exception e) { PlayerSync.LOGGER.error("Error snapshotting CosmeticArmor for player {}", player.getUUID(), e); return null;