默认皮肤集合枚举(DefaultPlayerSkin.Set)
基本信息
| 属性 | 值 |
|---|---|
| 类型 | Java 枚举 |
| 完整限定名 | roadhog360.simpleskinbackport.core.DefaultPlayerSkin.Set |
| 枚举值数量 | 3(不含 NONE 常量) |
| 文件位置 | core/DefaultPlayerSkin.java |
功能
DefaultPlayerSkin.Set 定义 SimpleSkinBackport 提供给"无自定义皮肤"玩家使用的默认皮肤集合。每个枚举值都封装了一个 PlayerSkin 列表 + 选择算法 + 描述文本。
枚举值对比
STEVE_ONLY
核心差异:仅有一个皮肤。
唯一皮肤:PlayerSkin(false, "steve") —— wide 臂 Steve。
选择逻辑:直接返回唯一皮肤,无 UUID 计算。
适用场景:服务器希望所有玩家统一外观、追求最经典观感、避免任何随机分布带来的混淆。
STEVE_ALEX
核心差异:双皮肤,按 UUID 哈希决定。
皮肤列表:STEVE(wide)、ALEX(slim)。
选择逻辑:index & 1 —— 即 UUID 哈希最低位为 1 时返回 Alex(slim),否则 Steve(wide)。这是 1.8~1.19.2 的官方选择算法。
适用场景:现代客户端(1.19.3+)的服务器希望下传至 1.7.10 时,玩家外观与最新版一致。
ALL_DEFAULTS
核心差异:18 个皮肤(9 名字 × slim/wide),1.19.3+ 风格。
皮肤列表:依次为 alex/ari/efe/kai/makena/noor/steve/sunny/zuri 的 slim 版本(索引 0~8)+ 同样 9 个名字的 wide 版本(索引 9~17)。
选择逻辑:Math.floorMod(index, 18) —— Math.floorMod 确保负数索引也能正确取余(与 1.19.3+ 一致)。
适用场景:服务器希望最大化玩家多样性,或迁移自现代版 Minecraft。
枚举字段对比
| 字段 | STEVE_ONLY |
STEVE_ALEX |
ALL_DEFAULTS |
|---|---|---|---|
skins.size() |
1 | 2 | 18 |
getEntryFromIndex 分支 |
size == 1 直接返回 |
size == 2 取 index & 1 |
size > 2 取 floorMod(index, size) |
描述(getDescription()) |
“The only default skin will be Steve, the tried-and-true classic player model. His arms will always be wide.” | “The default skins will either be wide-armed Steve or slim-armed Alex, as it was in 1.8 to 1.19.2.” | “Steve, Alex, and all of the new 1.19.3 default skins will be assigned. They all can appear in slim or wide armed variants.” |
| 选 Slim 概率 | 0% | 50%(取决于 UUID 哈希) | 50%(9/18 = 50% slim/wide 各半,但集合内 slim/wide 各 9 个) |
静态字段
| 字段 | 类型 | 含义 |
|---|---|---|
DEFAULT_SKINS |
PlayerSkin[18] |
所有默认皮肤的扁平数组,索引 0~8 = slim、9~17 = wide |
ALEX |
PlayerSkin(slim) |
DEFAULT_SKINS[0],方便引用 |
STEVE |
PlayerSkin(wide) |
DEFAULT_SKINS[15],方便引用 |
NULL_UUID |
UUID |
UUID.randomUUID(),当传入的 UUID 为 null 时使用,避免 NullPointerException |
NONE |
String |
字面常量 "NONE",仅在 ConfigModCompat.TFgiantSkinSet 中作为"不启用"标记使用 |
静态方法
Set valueOfOrNull(String value)
| 属性 | 值 |
|---|---|
| 返回值 | 匹配 name() 的枚举值;找不到时返回 null |
与标准 valueOf 的差异 |
标准 valueOf 找不到时抛 IllegalArgumentException;此方法返回 null |
用途:ConfigModCompat 使用此方法读取配置 —— 用户配置项允许 "NONE" 字符串(表示不开启 mixin),这并非枚举值,因此 valueOf 会抛异常,必须用 valueOfOrNull。
默认皮肤数组 DEFAULT_SKINS 索引表
| 索引 | slim/wide | 名字 |
|---|---|---|
| 0 | slim | alex |
| 1 | slim | ari |
| 2 | slim | efe |
| 3 | slim | kai |
| 4 | slim | makena |
| 5 | slim | noor |
| 6 | slim | steve |
| 7 | slim | sunny |
| 8 | slim | zuri |
| 9 | wide | alex |
| 10 | wide | ari |
| 11 | wide | efe |
| 12 | wide | kai |
| 13 | wide | makena |
| 14 | wide | noor |
| 15 | wide | steve |
| 16 | wide | sunny |
| 17 | wide | zuri |
资源位置
每个 PlayerSkin 的 getResource() 延迟构造 ResourceLocation:
<domain>/textures/entity/player/<slim? "slim" : "wide">/<skinName>.png
mod 内置的资源(src/main/resources/assets/minecraft/textures/entity/player/{slim,wide}/*.png)覆盖了所有 18 个组合。
第三方 mod 集成
无直接依赖。DefaultPlayerSkin 是 mod 内部 API,通过 ConfigMain.defaultSkinSet 与 ConfigModCompat.TFgiantSkinSet 被消费。