The six 4096x4096 faces were 110 MB, about 90% of every mod jar
(121.7 MB per Minecraft version). That exceeded the 100 MB upload limit
in front of git.selimaj.dev, made every download huge, and cost ~400 MB
of GPU memory on the title screen. At 2048x2048 they're 33.5 MB (jar
~45 MB, ~100 MB GPU memory) and still sharp on 1440p/4K screens.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Stop sending the Minecraft access token to the Saturn server. The
connect loop now:
1. fetches GET /versions and compares this client's mod version:
supported -> connect; deprecated -> warn, connect; neither -> warn,
don't connect (warnings are shown once per status change)
2. requests auth_challenge with the username to get a server id
3. calls Mojang's session `join` with the access token and server id
(the token only goes to Mojang); a refused token gives up
4. requests auth_verify, which the server confirms with `hasJoined`
Add SaturnProvider.getModVersion() and showWarning() for the version
check and its toast.
Refs saturnclientmc/saturnclient#7
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Move to session-java 0.2.0 (Gitea package registry) and rework
ServiceClient around a single connect loop:
- Reconnect with exponential backoff (1 s -> 60 s) when the connection
drops, e.g. on every server redeploy; give up only when retrying cannot
help (no Minecraft session, or the server rejects the token)
- Publish the session only after authentication succeeds, and replace
(rather than append to) owned cosmetics and clear cached players on
reconnect
- Time out every request after 10 s and connecting after 10 s, so a lost
response can no longer hang the player-lookup worker forever
- Register onClientStopping once, and keep a local session reference in
request callbacks
- Allow -Dsaturn.serverUri to point the client at a local server
Refs saturnclientmc/saturnclient#4, saturnclientmc/saturnclient#5
Co-Authored-By: Claude Opus 5.5 <[email protected]>
SaturnPlayer stored non-Saturn players as null, which looked the same as
"not fetched yet", so every render re-queued them and flooded the server
with get_player requests. Remember negative lookups and re-check them
after 60 s, retry failed lookups after 5 s, queue each player at most
once, skip lookups while disconnected, and replace the hand-rolled worker
thread with a single-thread executor.
getPlayer now returns null only when the server says the player isn't on
Saturn and throws on failure, so failures are retried instead of cached.
Make state shared between network callbacks and the render thread safe:
ConcurrentHashMap for players, CopyOnWriteArrayList for owned cosmetics,
volatile session/uuid and cosmetic fields, and run emote notifications
on the client thread.
Refs saturnclientmc/saturnclient#2, saturnclientmc/saturnclient#6
Co-Authored-By: Claude Opus 5.5 <[email protected]>