Skip to content

Custom achievement progress is never persisted to disk (never written to advancements JSON) #227

Description

@Tot0le

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions