Files
StarlightSkin/README.md
T
AxTps 0c34fd8806 feat: 新增 StarlightSkin 客户端 Mod,让正版客户端显示皮肤站皮肤
- TextureUrlCheckerMixin: 放行 skin.starlight.cool 域名(必需)
- YggdrasilMinecraftSessionServiceMixin: 用皮肤站公钥验签,INVALID 改 SIGNED
- GameProfileSignatureTrust: 内置公钥 + 运行时从皮肤站拉取兜底
- Minecraft 26.1.2 / Fabric / Java 25
2026-10-05 21:30:57 +08:00

1.8 KiB
Raw Blame History

StarlightSkin

让装了 authlib-injector(指向 StarLight 皮肤站)的 Minecraft 客户端能正常显示皮肤站的皮肤。

  • Minecraft 26.1.2 / Fabric
  • 纯客户端 Mod

原理

Minecraft 客户端对皮肤 URL 有硬编码的域名白名单:

// com.mojang.authlib.yggdrasil.TextureUrlChecker
private static final Set<String> ALLOWED_DOMAINS = Set.of("textures.minecraft.net");

皮肤站下发的皮肤 URL(https://skin.starlight.cool/yggdrasil/textures/...)域名不在白名单里, isAllowedTextureDomain 返回 false,unpackTextures 直接丢弃该皮肤并打印:

Textures payload url is invalid: https://skin.starlight.cool/yggdrasil/textures/xxx

结果就是所有皮肤站玩家的皮肤都显示成默认皮肤。

本 Mod 通过两个 Mixin 解决:

  1. TextureUrlCheckerMixin(必需) 注入 TextureUrlChecker.isAllowedTextureDomain,在默认判定为 false 时, 额外放行 skin.starlight.cool 域名。

  2. YggdrasilMinecraftSessionServiceMixin 皮肤站用自己私钥对 textures 属性签名,客户端默认不信任该公钥(SignatureState.INVALID)。 本 Mixin 在验签失败时,用皮肤站公钥(内置 / 运行时拉取)重新验签,通过则改为 SIGNED。

公钥

  • 内置兜底公钥(来自皮肤站 https://skin.starlight.cool/yggdrasil 的 signaturePublickey)
  • 启动时优先从皮肤站拉取,失败则用内置

构建

# 需要 Java 25
./gradlew build

产物:build/libs/starlight-skin-<version>.jar,放入 .minecraft/mods/。

已知约束

  • 皮肤站域名硬编码为 skin.starlight.cool(见 StarlightConstants)。 若换域名,需改 StarlightConstants.ALLOWED_SKIN_DOMAINS 并重新构建。