客户端贴图钩子(Hodgepodge)

[!INFO] Git Commit: 93da3e1 | Updated: 2026-10-01

本 mod 实现了 StructureLib 的 IStructureCompat 服务接口(见 mod 元信息),其中唯一的方法是 markTextureUsed(IIcon)。这个方法把 "某个贴图正在被多方块提示系统使用"的通知转发给 Hodgepodge。

接口契约

public class StructureCompat implements IStructureCompat {
    @Override
    public void markTextureUsed(IIcon o) {
        proxy.markTextureUsed(o);
    }
}

StructureCompat.java:73-76。StructureLib 在生成/移除提示方块的全息贴图时会回调此方法, 让贴图系统知道这些 IIcon 需要保持更新。

dependencies.gradle 中 Hodgepodge 是 compileOnly:

compileOnly("com.github.GTNewHorizons:Hodgepodge:2.6.98:dev") { transitive = false }

即 Hodgepodge 不是运行期依赖——未安装时本 mod 依然正常工作,只是 markTextureUsed 空转。

客户端实现

CommonProxy 的两个方法都是空实现(CommonProxy.java:9-11),因此服务器端完全无开销。 ClientProxy 覆写了两个方法。

preInit:版本探测

ArtifactVersion accepted = new DefaultArtifactVersion("hodgepodge", VersionRange.createFromVersionSpec("[2.0.0,3)"));
ModContainer mc = Loader.instance().getIndexedModList().get("hodgepodge");
if (mc != null) notifyHodgepodgeTextureUsed = accepted.containsVersion(mc.getProcessedVersion());

ClientProxy.java:22-26。仅当 Hodgepodge 的实际版本落在 [2.0.0, 3) 闭开区间内时才置位 notifyHodgepodgeTextureUsed。Hodgepodge 未安装(mc == null)时保持 false。

InvalidVersionSpecificationException 被包装成 RuntimeException 抛出 (ClientProxy.java:27-29)——版本区间是硬编码字面量,实际不会触发。

markTextureUsed:触发动画更新

if (notifyHodgepodgeTextureUsed) {
    if (o instanceof IPatchedTextureAtlasSprite) ((IPatchedTextureAtlasSprite) o).markNeedsAnimationUpdate();
}

ClientProxy.java:33-36。双层判断:先确认版本区间命中,再确认该 IIcon 确实是 Hodgepodge 打过补丁的 贴图精灵(com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite), 只有二者同时成立才调用 markNeedsAnimationUpdate()。

这解决的是提示方块全息图使用动画贴图时的表现问题:多方块提示会动态替换贴图, 若 Hodgepodge 不知道这些精灵正在被使用,动画会停在错误的帧上。

无独立语言文件

assets/structurecompat/lang/en_US.lang 中的 9 个键全部服务于 Railcraft 锅炉与 notBlock 元素(见 Railcraft 多方块结构)。本条目涉及的两条日志 (Listening on ... 式的版本探测)不产生任何游戏内文本——ClientProxy 里没有 addChatMessage 或 sendChatMessage 调用,因此不需要语言键。

与本 mod 其它部分的关系

这是本 mod 中唯一一个与 InventoryUtility / IMultiblockInfoContainer 无关的子系统, 也是唯一使用 ClientProxy 而非反射 compat 类的部分。其余 9 个 compat 全部通过 postInit 的反射实例化加载(见 compat 派发机制), 而 markTextureUsed 走的是 @SidedProxy + 服务接口回调,二者互不干扰。