feat: 新增 StarlightSkin 客户端 Mod,让正版客户端显示皮肤站皮肤

- TextureUrlCheckerMixin: 放行 skin.starlight.cool 域名(必需)
- YggdrasilMinecraftSessionServiceMixin: 用皮肤站公钥验签,INVALID 改 SIGNED
- GameProfileSignatureTrust: 内置公钥 + 运行时从皮肤站拉取兜底
- Minecraft 26.1.2 / Fabric / Java 25
This commit is contained in:
AxTps authored and Ap_Tx committed 2026-10-05 21:30:57 +08:00
commit 0c34fd8806
16 files changed
+840

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
# StarlightSkin
让装了 `authlib-injector`(指向 StarLight 皮肤站)的 Minecraft 客户端能正常显示皮肤站的皮肤。
- Minecraft 26.1.2 / Fabric
- 纯客户端 Mod
## 原理
Minecraft 客户端对皮肤 URL 有**硬编码的域名白名单**:
```java
// 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`)
- 启动时优先从皮肤站拉取,失败则用内置
## 构建
```bash
# 需要 Java 25
./gradlew build
```
产物:`build/libs/starlight-skin-<version>.jar`,放入 `.minecraft/mods/`。
## 已知约束
- 皮肤站域名硬编码为 `skin.starlight.cool`(见 `StarlightConstants`)。
若换域名,需改 `StarlightConstants.ALLOWED_SKIN_DOMAINS` 并重新构建。