Custom Confluence achievements (the "achievements" category with Terraria-style challenge frame, e.g. confluence:achievements/dye_hard) are never actually written to the player's world/advancements/.json file, even when granted successfully and even with no relog involved.
Steps to reproduce
On a running server, grant a Confluence achievement to an online player: /advancement grant only confluence:achievements/dye_hard
Server confirms: Granted the advancement [Dye Hard] to and the toast displays in-game.
Force a save without disconnecting: /save-all → confirms Saved the game.
Inspect the player's advancement file on disk: cat world/advancements/.json | grep dye_hard → no match, even though grep -c confluence shows hundreds of unrelated confluence:recipes/* entries in the same file.
Reconnecting the player causes any manually-granted Confluence achievements to disappear from the in-game achievement screen (only the vanilla "spawn" advancement persists).
What I found while investigating
Decompiling PlayerAdvancementsMixin.class, there's a skipConfluence(boolean original, AdvancementHolder holder) method injected via @ModifyExpressionValue on the AdvancementProgress.hasProgress() check inside what appears to be PlayerAdvancements#asData() (the vanilla serialization method). It checks AchievementOffsetLoader.getDisplayOffset().containsKey(holder.id()) — which looks like it's meant to exclude Confluence's custom achievements from vanilla's hasProgress()-based save filter.
If this is intentional (because Confluence tracks progress through its own system, similar to Terraria's achievement screen), then whatever custom persistence mechanism is supposed to store that progress doesn't appear to actually save it anywhere I could find in world/ (checked world/data/*.dat, world/advancements/, world/playerdata/) — the achievement is granted, displayed, then lost on the very next login even without any account/UUID change involved.
Environment
- Confluence 1.2.4 (also tested with Otherworld 1.2.4-260226 bundling it)
- NeoForge, Minecraft 1.21.1
- Behavior confirmed identical across multiple premium players on a dedicated server; not tied to any specific auth mod.
Custom Confluence achievements (the "achievements" category with Terraria-style challenge frame, e.g. confluence:achievements/dye_hard) are never actually written to the player's world/advancements/.json file, even when granted successfully and even with no relog involved.
Steps to reproduce
On a running server, grant a Confluence achievement to an online player: /advancement grant only confluence:achievements/dye_hard
Server confirms: Granted the advancement [Dye Hard] to and the toast displays in-game.
Force a save without disconnecting: /save-all → confirms Saved the game.
Inspect the player's advancement file on disk: cat world/advancements/.json | grep dye_hard → no match, even though grep -c confluence shows hundreds of unrelated confluence:recipes/* entries in the same file.
Reconnecting the player causes any manually-granted Confluence achievements to disappear from the in-game achievement screen (only the vanilla "spawn" advancement persists).
What I found while investigating
Decompiling PlayerAdvancementsMixin.class, there's a skipConfluence(boolean original, AdvancementHolder holder) method injected via @ModifyExpressionValue on the AdvancementProgress.hasProgress() check inside what appears to be PlayerAdvancements#asData() (the vanilla serialization method). It checks AchievementOffsetLoader.getDisplayOffset().containsKey(holder.id()) — which looks like it's meant to exclude Confluence's custom achievements from vanilla's hasProgress()-based save filter.
If this is intentional (because Confluence tracks progress through its own system, similar to Terraria's achievement screen), then whatever custom persistence mechanism is supposed to store that progress doesn't appear to actually save it anywhere I could find in world/ (checked world/data/*.dat, world/advancements/, world/playerdata/) — the achievement is granted, displayed, then lost on the very next login even without any account/UUID change involved.
Environment