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());
        }
    }
}

行为细节

  1. 皮肤选择:getDefaultSkin(entity.getPersistentID()) —— 根据巨人自己的 UUID 哈希选择皮肤
  2. 手臂模型同步:若巨人模型实现 INewBipedModel(即 mixin 已升级到 64x),则调用 ssb$setSlim(skin.isSlim()) 让模型切换 wide/slim
  3. 资源替换: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 异常

相关条目