客户端贴图钩子(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 + 服务接口回调,二者互不干扰。