TCWarpHandler

基本信息

属性 值
类名 mytown.handlers.TCWarpHandler
文件 src/main/java/mytown/handlers/TCWarpHandler.java
启用版本 Minecraft 1.7.10

功能

Thaumcraft 传送(warp)系统的反射桥。让 MyTown2 的传送权限判定 能够与 Thaumcraft 的 warp 台账打通。

触发条件

在 Mod 入口 的 postInit 阶段,仅当检测到 Thaumcraft 时才执行:

if (Loader.isModLoaded("Thaumcraft")) TCWarpHandler.tcReflect();

即用 Loader.isModLoaded 做运行时软检测,而非 dependencies 声明 —— Thaumcraft 不在 Constants.DEPENDENCIES 中,缺失不会导致启动失败。

三个反射字段

tcReflect() 通过 Class.forName + 反射逐层取到 3 个 Map<String, Integer>:

静态字段 Thaumcraft 侧真实字段名 含义
warpNormal warpSticky(getDeclaredField) 常驻 warp
warpTemp warpTemp(getField) 临时 warp
warpPermanent warp(getField) 永久 warp

⚠️ 三个本地变量名与 Thaumcraft 侧字段名全部不一致: warpNormal ← warpSticky、warpPermanent ← warp。 照着本地变量名去 Thaumcraft 源码里搜字段会搜不到。

⚠️ 另外 warpNormal 用 getDeclaredField(可取非 public), 另两个用 getField(只取 public)。精度不同是有意为之。

实现要点

⚠️ 注意 warpNormal 实际取自字段名 warpSticky (源码里 getDeclaredField("warpSticky") 赋给了 warpNormal)。 字段名与本地变量名不一致,不要照抄 warpNormal 去 Thaumcraft 源码里搜。

⚠️ 整个方法标注 @SuppressWarnings("unchecked") 并直接强转 (Map<String, Integer>),没有泛型擦除保护。 Thaumcraft 改字段类型时会在运行期抛 ClassCastException。

⚠️ 全部走反射而非编译期依赖,因此没有对 Thaumcraft 版本的硬性要求, 但也没有兼容性检查 —— 字段名变化会静默失效或抛异常。

⚠️ 该 handler 不注册任何 Forge 事件,只在 postInit 被调用一次做初始化。

依赖

相关条目