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.
This commit is contained in:
EoD 2025-04-26 16:39:04 +00:00
parent 37d0eb2931
commit 7ece814357

View File

@ -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