From 7ece81435700128f22aa2764edc620826d95b941 Mon Sep 17 00:00:00 2001 From: EoD <293499+EoD@users.noreply.github.com> Date: Sat, 26 Apr 2025 16:39:04 +0000 Subject: [PATCH] fix advancement json restore Previously, the json was written too late and never reloaded. This commit moves the advancement restoration from the PlayerLoggedInEvent to the earlier onDatapackSyncEvent. At the same time, it forces a reload of the json files, making sure the client is informed about the update advancements. --- .../fubuki/playersync/sync/VanillaSync.java | 84 +++++++++++++++---- 1 file changed, 66 insertions(+), 18 deletions(-) diff --git a/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java b/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java index b71116f..2598880 100644 --- a/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java +++ b/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java @@ -5,6 +5,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerAdvancements; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.effect.MobEffect; @@ -14,6 +15,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.WorldData; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.OnDatapackSyncEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.server.ServerStoppedEvent; @@ -44,6 +46,70 @@ public class VanillaSync { static ExecutorService executorService = Executors.newCachedThreadPool(new PSThreadPoolFactory("PlayerSync")); + @SubscribeEvent + public static void onDataPackSyncEvent(OnDatapackSyncEvent event) throws SQLException, IOException { + final ServerPlayer serverPlayer = event.getPlayer(); + if (serverPlayer == null) { + PlayerSync.LOGGER.debug("No player joining"); + return; + } + + final String player_uuid = serverPlayer.getUUID().toString(); + PlayerSync.LOGGER.info("Player entity joining level " + player_uuid); + + JDBCsetUp.QueryResult advancementsQuery = JDBCsetUp + .executeQuery("SELECT advancements FROM player_data WHERE uuid='" + player_uuid + "'"); + ResultSet advancementsResultSet = advancementsQuery.resultSet(); + + if (!advancementsResultSet.next()) { + PlayerSync.LOGGER.debug("No advancements found for player " + player_uuid); + advancementsResultSet.close(); + return; + } + + // Restore Advancements + File gameDir = Objects.requireNonNull(serverPlayer.getServer()).getServerDirectory(); + + final MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + if (server != null && server.isDedicatedServer()) { + PlayerSync.LOGGER.debug("Attempting to write dedicated server advancement file"); + File advancements = new File(gameDir, + getSyncWorldForServer() + "/advancements" + "/" + player_uuid + ".json"); + byte[] bytes = advancementsResultSet.getString("advancements").getBytes(); + advancementsResultSet.close(); + + // only create advancements file if at least "{}" has been stored in the field + if (bytes.length < 2) { + PlayerSync.LOGGER.debug("Skip writing advancements for player " + player_uuid); + return; + } + + if (!advancements.exists()) { + advancements.createNewFile(); + PlayerSync.LOGGER.info("Creating new advancement file for player " + player_uuid); + } + PlayerSync.LOGGER.debug("Writing advancement file " + advancements.toPath() + " for player " + player_uuid); + PlayerSync.LOGGER.trace("Writing advancement file for player " + player_uuid + ": " + + new String(bytes, StandardCharsets.UTF_8)); + Files.write(advancements.toPath(), bytes); + + // reload the json files on the server after updating them + PlayerAdvancements playeradvancements = serverPlayer.getAdvancements(); + playeradvancements.reload(server.getAdvancements()); + + } else { + PlayerSync.LOGGER.debug("Writing non-dedicated server advancement files"); + File[] files = scanAdvancementsFile(player_uuid, gameDir); + for (File file : files) { + if (file == null) + continue; + byte[] bytes = advancementsResultSet.getString("advancements").getBytes(); + Files.write(file.toPath(), bytes); + } + advancementsResultSet.close(); + } + } + public static void doPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) throws SQLException, CommandSyntaxException, IOException { String player_uuid = event.getEntity().getUUID().toString(); PlayerSync.LOGGER.info("Starting synchronization for player " + player_uuid); @@ -139,24 +205,6 @@ public class VanillaSync { } } } - - // Restore Advancements - File gameDir = Objects.requireNonNull(serverPlayer.getServer()).getServerDirectory(); - if (Dist.CLIENT.isDedicatedServer()){ - File advancements = new File(gameDir, getSyncWorldForServer() + "/advancements" + "/" + player_uuid + ".json"); - if (!advancements.exists()) { - advancements.createNewFile(); - } - byte[] bytes = rs2.getString("advancements").getBytes(); - Files.write(advancements.toPath(), bytes); - } else { - File[] files = scanAdvancementsFile(player_uuid, gameDir); - for (File file : files) { - if (file == null) continue; - byte[] bytes = rs2.getString("advancements").getBytes(); - Files.write(file.toPath(), bytes); - } - } } // Mod support