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:
parent
37d0eb2931
commit
7ece814357
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user