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 被调用一次做初始化。
依赖
- Thaumcraft - 运行时软依赖(已收录)
相关条目
- Mod 入口 -
postInit中的条件调用 - FlagType -
MAXWARP传送等级 flag - ProtectionManager -
checkWarpLevel - Config -
taintSpreadInTowns另一处 Thaumcraft 耦合