From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Modrinth Enhanced Date: Tue, 15 Sep 2026 09:05:42 +0200 Subject: [PATCH] Show every player's skin on offline servers An offline-mode server sends profiles without textures, and the client asks nobody else, so everyone there is Steve. The Theseus agent now wraps authlib's texture lookups and, for a player the server sent nothing usable for, looks the skin up by name: first in a folder of skins put there by hand, then Ely.by, then Mojang, with capes from OptiFine. A profile that already carries textures is left alone, so an online-mode server's signed skins are never second-guessed. Answers are cached, also across runs, and the game is never kept waiting on the network for long. The folder is `player_skins` in the launcher directory: `.png` per player, `-slim.png` for slim arms, with `capes/` and `elytras/` inside. Settings > Features has the switch, on by default, and a button that opens the folder. The switch is a feature flag, so it needs no migration and does not sync to Modrinth. The agent code comes from Noctrinth (https://github.com/Everelsu/Noctrinth). --- .../ui/settings/display/FeaturesSettings.vue | 69 ++ .../src/composables/use-app-settings.ts | 1 + apps/app-frontend/src/helpers/utils.js | 4 + apps/app/build.rs | 1 + apps/app/src/api/utils.rs | 14 + .../modrinth/theseus/agent/TheseusAgent.java | 12 + .../modrinth/theseus/agent/skins/Http.java | 148 ++++ .../theseus/agent/skins/LocalSource.java | 97 +++ .../theseus/agent/skins/LocalTextures.java | 99 +++ .../theseus/agent/skins/MojangSource.java | 148 ++++ .../agent/skins/OptiFineCapeSource.java | 143 ++++ .../theseus/agent/skins/SkinHooks.java | 459 ++++++++++++ .../theseus/agent/skins/SkinSource.java | 706 ++++++++++++++++++ .../theseus/agent/skins/SkinSystemSource.java | 27 + .../SessionServiceTransformer.java | 258 +++++++ packages/app-lib/src/launcher/args.rs | 35 +- packages/app-lib/src/launcher/mod.rs | 23 + packages/app-lib/src/state/dirs.rs | 8 + .../src/state/dirs/move_app_directory.rs | 3 +- packages/app-lib/src/state/settings.rs | 1 + 20 files changed, 2254 insertions(+), 2 deletions(-) create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/Http.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/LocalSource.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/LocalTextures.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/MojangSource.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/OptiFineCapeSource.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/SkinHooks.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/SkinSource.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/skins/SkinSystemSource.java create mode 100644 packages/app-lib/java/src/main/java/com/modrinth/theseus/agent/transformers/SessionServiceTransformer.java diff --git a/apps/app-frontend/src/components/ui/settings/display/FeaturesSettings.vue b/apps/app-frontend/src/components/ui/settings/display/FeaturesSettings.vue index ae88550..9a9e8ef 100644 --- a/apps/app-frontend/src/components/ui/settings/display/FeaturesSettings.vue +++ b/apps/app-frontend/src/components/ui/settings/display/FeaturesSettings.vue @@ -1,5 +1,7 @@