Twilight Forest 巨人兼容(Twilight Forest Giant Compat)
基本信息
| 属性 |
值 |
| 类型 |
客户端 Late Mixin |
| 实现类 |
roadhog360.simpleskinbackport.mixins.late.twilightforest.MixinRenderTFGiant |
| 目标类 |
twilightforest.client.renderer.entity.RenderTFGiant |
| 适用端 |
客户端(MixinEnvironment.Side.CLIENT) |
| 启用条件 |
TwilightForest 已加载 + ConfigModCompat.TFgiantSkinSet != null |
功能
替换 Twilight Forest 巨人(TF Giant)的默认皮肤。原版行为下,巨人会复制客户端玩家的皮肤(通过 Utils.rendererCopiesPlayerSkin(render) 判断)。本 mixin 让巨人按自己的 UUID 哈希从 ConfigModCompat.TFgiantSkinSet 中抽取独立皮肤。
启用条件(SimpleSkinBackportLateMixins)
@Override
public List<String> getMixins(Set<String> loadedMods) {
List<String> mixins = new ArrayList<>();
if (SIDE == MixinEnvironment.Side.CLIENT) {
if (loadedMods.contains("TwilightForest")) {
if (ConfigModCompat.TFgiantSkinSet != null) {
mixins.add("twilightforest.MixinRenderTFGiant");
}
}
if (loadedMods.contains("Botania")) {
mixins.add("botania.MixinClientProxy");
mixins.add("botania.MixinRenderTileSkullOverride");
}
}
return mixins;
}
只有当用户配置 TwilightForest:giantSkinSet 不是 NONE 时才注入 mixin。
Mixin 实现
@Mixin(RenderTFGiant.class)
public abstract class MixinRenderTFGiant extends RenderBiped {
@Inject(method = "getEntityTexture", at = @At(value = "HEAD"), cancellable = true)
private void overrideSkinAndSetResourceLocation(Entity par1Entity, CallbackInfoReturnable<ResourceLocation> cir) {
PlayerSkin skin = ConfigModCompat.TFgiantSkinSet.getDefaultSkin(par1Entity.getPersistentID());
if (this.modelBipedMain instanceof INewBipedModel model) {
model.ssb$setSlim(skin.isSlim());
cir.setReturnValue(skin.getResource());
}
}
}
行为细节
- 皮肤选择:
getDefaultSkin(entity.getPersistentID()) —— 根据巨人自己的 UUID 哈希选择皮肤
- 手臂模型同步:若巨人模型实现
INewBipedModel(即 mixin 已升级到 64x),则调用 ssb$setSlim(skin.isSlim()) 让模型切换 wide/slim
- 资源替换:
cir.setReturnValue(skin.getResource()) 用 mod 内置的皮肤纹理(18 个默认皮肤之一)替换原版返回的玩家皮肤
数值
| 数值 |
值 |
来源 |
| 巨人可用的皮肤集合 |
STEVE_ONLY(1)、STEVE_ALEX(2)、ALL_DEFAULTS(18) |
ConfigModCompat.TFgiantSkinSet 的合法值 |
| 皮肤选择公式 |
getDefaultSkin(uuid.hashCode()) → getEntryFromIndex |
DefaultPlayerSkin.Set |
| 巨人 UV 升级 |
通过 MixinRenderingRegistry.setup64xModels(rendererCopiesPlayerSkin 检测) |
Utils.rendererCopiesPlayerSkin |
关联机制
| 步骤 |
位置 |
触发条件 |
| 1. 配置读取 |
ConfigModCompat.syncConfigOptions |
客户端启动 |
| 2. Mixin 注入 |
SimpleSkinBackportLateMixins.getMixins |
loadedMods 包含 "TwilightForest" + TFgiantSkinSet != null |
| 3. 模型升级 |
MixinRenderingRegistry.setup64xModels |
RendererCopiesPlayerSkin(renderer) || EntityPlayer |
| 4. 皮肤重定向 |
MixinRenderTFGiant.overrideSkinAndSetResourceLocation |
每次巨人渲染 |
第三方 mod 集成
- Twilight Forest(必需):被 mixin 的类
twilightforest.client.renderer.entity.RenderTFGiant
- SmartRender(可选):若安装,
MixinModelBiped.ssb$setSlim 内调用 SmartRenderCompat.updateSmartRenderFields 同步 displayList
- OptiFine(可选):兼容,通过
Utils.createDisplaylistFor(renderer) 中 renderer.displayList = 0 规避 OptiFine 的 0-list 异常
相关条目