MixinIconConnectedTexture

基本信息

属性 值
类名 com.gtnewhorizons.angelicacompat.mixins.late.client.extrautils.MixinIconConnectedTexture
目标类 com.rwtema.extrautils.block.IconConnectedTexture
Mixin 阶段 LATE(mixins.angelicacompat.late.json)
Mixin 启用条件 PatchesConfig.patchExtraUtils == true
Mixin 注入方法 7 个 @Overwrite:setType、getMinU、getMaxU、getMinV、getMaxV、getIconName、getIconWidth、getIconHeight
启用版本 Minecraft 1.7.10(仅客户端)

功能

Extra Utilities 的 IconConnectedTexture 把"当前选中的纹理索引"保存在一个实例字段 n 上,所有纹理查询方法都读取 n。Angelica 的 Sodium 多线程 ISBRT 路径会把同一个 IconConnectedTexture 实例并发访问——n 字段被多个 worker thread 同时读写,产生交错渲染结果(纹理闪烁/错位)。

本 Mixin 将 n 字段替换为 ThreadLocal<Integer> newN,每个线程持有独立的当前索引:

@Unique
private ThreadLocal<Integer> newN = ThreadLocal.withInitial(() -> 0);

@Overwrite(remap = false)
public void setType(int i) {
    this.newN.set(i);
}

@Overwrite
public float getMinU() { return this.icons[newN.get()].getMinU(); }
// ... 其它 6 个 getter 同样改造 ...

实现要点

  • @Overwrite 直接整体替换目标方法,@author Cleptomania,@reason Support thread-safety for connected textures。
  • @SideOnly(Side.CLIENT) 注解保留原方法的 getIconWidth/getIconHeight 注解。
  • @Shadow(remap = false) public IIcon[] icons:复用原字段。

第三方 mod 集成

仅针对 com.rwtema.extrautils.block.IconConnectedTexture (Extra Utilities)。

相关条目