ThE 与 Golem 的集成

基本信息

属性 值
挂钩核心类 thaumicenergistics.common.integration.tc.GolemHooks(约 570+ 行)
处理器实现 thaumicenergistics.common.entities.WirelessGolemHandler(IGolemHookHandler)
同步注册表 thaumicenergistics.common.integration.tc.GolemSyncRegistry(IGolemHookSyncRegistry)
傀儡核心枚举 thaumicenergistics.common.integration.tc.GolemCoreType(12 个核心)
处理器注册时机 ThaumicEnergistics.load() → ThEApi.instance().interact().registerGolemHookHandler(WirelessGolemHandler.getInstance())(ThaumicEnergistics.java:135)

功能

ThE 通过5 个 Mixin + 一个自建挂钩层接入 Thaumcraft 4 的傀儡系统,使傀儡能够携带 Wireless Golem Backpack 接入 AE2 网络,并驱动 Thaumium Gear Box 等机器。

5 个 Mixin(全部位于 mixins/late/thaumcraft/)

Mixin 类 目标类 作用
MixinEntityGolemBase thaumcraft.api.entites 系 EntityGolemBase 傀儡实体初始化/tick/NBT/渲染的挂钩点
MixinItemGolemBell ItemGolemBell 挂钟点击(下达指令)的挂钩点
MixinItemGolemPlacer ItemGolemPlacer 傀儡生成器的挂钩点
MixinRenderGolemBase RenderGolemBase 客户端渲染挂钩点
MixinAspect Aspect 记录要素的归属 mod(见 AE 要素赋予)

MixinAspect 的注入点非常精确(MixinAspect.java:15-25):

@Inject(
    method = "<init>(Ljava/lang/String;I[Lthaumcraft/api/aspects/Aspect;Lnet/minecraft/util/ResourceLocation;I)V",
    at = @At(value = "INVOKE",
             target = "Ljava/util/LinkedHashMap;put(...)Ljava/lang/Object;",
             remap = false, shift = At.Shift.AFTER))
private void injectInit(CallbackInfo ci) {
    AspectHooks.hook_AspectInit((Aspect) (Object) this);
}

即在 Aspect 构造器把自身放入静态 LinkedHashMap 之后立即回调 ThE。

Mixin 配置:src/main/resources/mixins.thaumicenergistics.late.json(package = thaumicenergistics.mixins.late,minVersion = 0.8.5-GTNH,compatibilityLevel = JAVA_8)与 mixins.thaumicenergistics.json。二者都设 "required": true。

GolemHooks 暴露的 11 个挂钩点

GolemHooks 是一个静态门面,把 ThA 傀儡系统的各个时机转给注册的 IGolemHookHandler:

挂钩方法 行
hook_Bell_OnLeftClickGolem :165
hook_CustomInteraction :193
hook_EntityInit :272
hook_onEntityUpdate :318
hook_Placer_SpawnGolem :415
hook_ReadEntityFromNBT :446
hook_RenderGolem :479
hook_SetupGolem :499
hook_WriteEntityToNBT :545
registerHandler(IGolemHookHandler) :566

IGolemHookHandler 接口本身有 16 个方法(含 DummyHookHandler 空实现的全部方法,GolemHooks.java:33-96),未实现的方法默认无操作。

WirelessGolemHandler:背包的实际实现

WirelessGolemHandler 是 ThE 唯一注册的 IGolemHookHandler(:33),单例通过 getInstance() 获取(:125)。

双端数据结构:

内部类 内容
WirelessClientData(:41-51) isInRange、pearlRotation、BackpackSkins skin(默认 Thaumium)
WirelessServerData(:54-64) encryptionKey(final)、tickCounter、isInRange、ItemStack facade、BackpackSkins skin

NBT 键(:72):wifiBackpackKey(网络加密密钥)、facade(外贴面)。

同步标志位(:77 起):用 Character 作为单字符同步标志,源码中定义 SYNCFLAG_HAS_WIFI_IN_RANGE = 'i'。

GolemSyncRegistry 为这套同步提供底层设施(GolemSyncRegistry.java):

方法 行 作用
registerSyncChar(handler, c) :173 为处理器分配一个同步字符
updateSyncChar(handler, id, c) :193 更新某处理器的同步字符
readFromString(data) :123 从字符串反序列化出一组处理器
copyDefaults(defaults) :55 复制默认映射
getSyncCharOrDefault(id, defaultChar) :65 带默认值的读取
hasChanged() :74 脏检查
mappingsToString() :83 序列化为字符串

这解释了傀儡升级/技能为何能被 ThE 追加而不破坏 ThA 自己的数据格式 —— ThE 用「单字符标识 + 默认值回退」的方式追加到 ThA 既有字符串中。

傀儡核心类型覆盖

GolemCoreType 枚举出 ThA 的 12 个傀儡核心,并按 coreID 建立查表数组(GolemCoreType.java:7-48):

ID 核心 ID 核心
0 Fill 6 Essentia
1 Empty 7 Lumber
2 Gather 8 Use
3 Harvest 9 Butcher
4 Guard 10 Sorting
5 Liquid 11 Fish

getCoreByID(byte) 做越界检查并返回 null(:45-50);WirelessGolemHandler 用它读取 golem.getCore()(:164)以判断当前核心类型,从而决定背包行为。

GolemUpgradeTypes 是对应的升级枚举(:5-50),同样按 upgradeID 建表并提供 getUpgradeByID(byte)。

数值

数值名 值 来源
Mixin 数量 5 mixins/late/thaumcraft/ 目录(Aspect + 4 个 Golem 相关)
GolemHooks 挂钩点 11 个 hook_* + 1 个 registerHandler GolemHooks.java:165-566
IGolemHookHandler 方法数 16 DummyHookHandler(GolemHooks.java:33-96)
注册的 IGolemHookHandler 实现数 1(WirelessGolemHandler) ThaumicEnergistics.java:135
傀儡核心类型数 12 GolemCoreType 枚举(:7-20)
傀儡升级类型数 源码为枚举,条目数见 GolemUpgradeTypes.java:5-16 —
背包皮肤数 10 BackpackSkins(ItemGolemWirelessBackpack.java:30-41)
客户端数据字段 3(isInRange、pearlRotation、skin) WirelessClientData(:41-45)
服务端数据字段 5(encryptionKey、tickCounter、isInRange、facade、skin) WirelessServerData(:54-60)
GolemSyncRegistry 公共方法 8 GolemSyncRegistry.java:55-193

交互

触发 行为
傀儡生成(hook_Placer_SpawnGolem) 若携带无线背包则初始化 WirelessServerData(含加密密钥)
傀儡 tick(hook_onEntityUpdate) 更新 tickCounter、检测是否在 AE 网络范围内(isInRange)、推进 pearlRotation
点击傀儡铃(hook_Bell_OnLeftClickGolem) 通过 bellLeftClicked 把铃指令转交 ThE 处理器(WirelessGolemHandler.java:322)
玩家交互(hook_CustomInteraction) canHandleInteraction 决定 ThE 是否接管该次交互
读/写 NBT wifiBackpackKey 与 facade 随傀儡存档持久化
客户端渲染(hook_RenderGolem) 按 WirelessClientData.skin 渲染 10 种背包皮肤之一;needsRenderer() 决定是否需要自定义渲染
换核心 GolemCoreType.getCoreByID(golem.getCore()) 读取新核心类型(ID 6 = Essentia)
同步变更 GolemSyncRegistry 分配的单字符标志随 ThA 同步字符串传输,两端各自解析

合成配方

Wireless Golem Backpack 的奥术合成配方为:

TIT
NWN
FCF

T=ThaumiumIngot,I=MEInterfacePart,N=Nitor,W=WirelessReceiver,F=FluixCrystal,C=MECharger;需要要素 AIR 6 + FIRE 4 + ORDER 3(FeatureGolemBackpack.java:49-56)。

Thaumium Gear Box 的配方是熔炉熔炼 Iron Gear Box,需要要素 METAL 16 + MAGIC 16(FeatureGearbox.java:92-97)—— 无需任何 AE2 或 ThE 机器即可制作,是傀儡自动化的低门槛入口。

相关条目