feat: 新增 StarlightSkin 客户端 Mod,让正版客户端显示皮肤站皮肤
- TextureUrlCheckerMixin: 放行 skin.starlight.cool 域名(必需) - YggdrasilMinecraftSessionServiceMixin: 用皮肤站公钥验签,INVALID 改 SIGNED - GameProfileSignatureTrust: 内置公钥 + 运行时从皮肤站拉取兜底 - Minecraft 26.1.2 / Fabric / Java 25
This commit is contained in:
commit
0c34fd8806
16 files changed
+840
No files matched your search
@@ -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` 并重新构建。
|
||||
Reference in new issue
Block a user