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