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 机器即可制作,是傀儡自动化的低门槛入口。
相关条目
- Wireless Golem Backpack - 本集成的核心物品
- Thaumium Gear Box - 允许傀儡驱动的方块
- Iron Gear Box - 禁止傀儡驱动的对位方块
- AE 要素赋予 - 同一 Mixin 体系下的另一个注入点
- ThE 与第三方模组的集成 - 傀儡之外的集成