Ears

基本信息

pl.asie.foamfix.repack.com.unascribed.ears.Ears —— 重打包(repack) 的 Ears(自定义玩家模型/皮肤)支持,提供 Minecraft 1.8+ 皮肤格式支持。

⚠️ @Mod 注解被注释掉

// @Mod(modid="ears", name="Ears", version="@VERSION@", useMetadata=true)
public class Ears { ... }

这是故意的 —— Ears 不是独立 mod,而是被 FoamFix 内嵌的一组类。 若保留 @Mod,FML 会把它当成第二个 mod 加载,与 FoamFix 冲突。

集成机制(双重)

1. applyEarsPatch() 探测

BugfixModClassTransformer.applyEarsPatch()(第 184 行):

  1. 仅当 settings.mc18SkinSupport 为真才继续;
  2. Class.forName("com.unascribed.ears.Ears") —— 抛异常(未安装独立 Ears) 则 applyEarsPatch = true;
  3. 再探测 api.player.render.RenderPlayerAPI —— 若存在(说明装了别的兼容 API) 则回退 applyEarsPatch = false。

即:只有在没有独立 Ears、也没有 RenderPlayerAPI 时才启用内置补丁, 避免与用户自己装的 Ears 重复。

2. 反射调用 onPreInit

FoamFixMod.preinit 客户端分支:

Class c = Class.forName("pl.asie.foamfix.repack.com.unascribed.ears.Ears");
Object o = c.newInstance();
c.getMethod("onPreInit", FMLPreInitializationEvent.class).invoke(o, evt);

catch (Throwable t) { t.printStackTrace(); // pass } —— 吞掉所有异常。

amendPlayerRenderer:64×64 皮肤改造

ModelBiped model = new ModelBiped(0, 0, 64, 64);
ReflectionHelper.setPrivateValue(RendererLivingEntity.class, rp, model,
                                 "field_77045_g", "mainModel");

用 64×64 的 ModelBiped 替换原 64×32 模型,通过反射写私有字段 mainModel(SRG field_77045_g,双名参数),实现 slim/fat 手臂共存。

静态状态

字段 类型 说明
earsSkinFeatures Map<ITextureObject, EarsFeatures> WeakHashMap —— 纹理对象回收即清理
layer / slimLeftArm / slimRightArm / fatLeftArm / fatRightArm — 渲染层与手臂模型

代码规模

pl/asie/foamfix/repack/com/unascribed/ears/ 共 80 个 java 文件 (占全仓 122 文件的约 2/3),是 FoamFix 中体量最大的子系统。

相关条目

源码

  • src/main/java/pl/asie/foamfix/repack/com/unascribed/ears/Ears.java