TCNodeTracker
[!INFO] Git Commit:
070c022| Updated: 2026-08-02
GTNH 1.7.10 上的 Thaumcraft 节点坐标追踪器。用泰阿数量仪或秩序/熵透镜右键一个节点方块, mod 就把这个节点的坐标、侧重点、类型记进存档;之后可以在自带列表界面里查、可以标一个屏幕指引箭头、 也可以让它们作为图层出现在 Navigator(JourneyMap / Xaero World Map)上。
⚠️ 不是研究可视化 mod。名字里的 “node” 指的是 Thaumcraft 世界里的节点方块
(实现 thaumcraft.api.nodes.INode 接口的 TileEntity),不是研究树/研究图里的图节点。
本 mod 没有任何研究图数据结构、图遍历算法或研究页渲染。
⚠️ 纯客户端 mod。三个 @Mod.EventHandler 全部标注 @SideOnly(Side.CLIENT)
(TCNodeTracker.java:56、:68、:77),全部逻辑跑在客户端,isRemote 为假时所有事件处理器直接 return。
| 项目 | 值 |
|---|---|
| modid | tcnodetracker(Constants.MODID) |
| 显示名 | TC Node Tracker(Constants.MODNAME) |
@Mod 类 |
com.dyonovan.tcnodetracker.TCNodeTracker(不等于 modid) |
| 根包 | com.dyonovan.tcnodetracker |
| 数据文件夹名 | TCNodeTracker(Constants.MODFOLDER,驼峰,与 modid 不同) |
| 源 commit | 070c022(2026-08-02T15:03:56+02:00) |
| Minecraft | 1.7.10 / Forge 10.13.4.1614 |
| 源文件数 | 24 个 Java 文件 |
| 依赖 | required-after:gtnhlib@[0.9.57,);required-after:Thaumcraft;after:navigator |
| 网络通道 | 无 |
| 存档路径 | <游戏目录>/TCNodeTracker/<worldDir>/nodes.json |
navigator 是 after 软依赖:不装 Navigator 本 mod 照常工作,只是失去地图图层。
热键(2)
| 热键 | 默认按键 | 说明 |
|---|---|---|
| 节点列表 | I | 打开主界面,并顺带切换 Navigator 节点图层 |
| 切换节点图层 | 未绑定(KEY_NONE) |
⚠️ 声明了但全仓库无任何 .isPressed() 调用,绑定后不会生效 |
游戏设定(6)
| 条目 | 内容 |
|---|---|
| 节点扫描 | 右键记录节点的完整判定链、INode 接口读取、节点类型/修饰符 |
| 节点存档 | nodes.json 的路径、目录迁移、JSON 结构、Instant 向后兼容、删世界联动 |
| 节点列表界面 | 维度选择、6 侧重点筛选、7 种排序、Mark/Del 按钮、tooltip |
| 屏幕指引箭头 | HUD 方向箭头的渲染条件、方位角算法、贴图与变换 |
| 配置项 | 全部 4 个 .cfg 选项的类型、默认值、取值范围与写回时机 |
| Navigator 地图图层整合 | 图层管理器、64 位稳定 ID、JourneyMap/Xaero 图标与 tooltip |
数据流
玩家持 泰阿数量仪 / 戴 LensOrderEntropy 头饰
└─ 右键方块 → RightClickEvent.playerRightClick
├─ 门槛:未取消 + isRemote + RIGHT_CLICK_BLOCK + TileEntity instanceof INode + aspectList 非空
├─ 读 INode.getAspects()/getNodeType()/getNodeModifier()
├─ 按 (x,y,z,dim) 查重 → 命中就更新,否则新增
├─ JsonUtils.writeJson() → <游戏目录>/TCNodeTracker/<worldDir>/nodes.json
└─ ThaumcraftNodeLayerManager.forceRefresh()(仅 Navigator 加载时)
按 I
└─ KeyInputEvent.onKeyInput
├─ displayGuiScreen(new GuiMain()) → 列表界面
└─ ThaumcraftNodeButtonManager.toggle() → 切换 Navigator 图层
GuiMain 内 Mark
├─ doGui = true + xMarker/yMarker/zMarker = 节点坐标
├─ Navigator: setActiveWaypoint(color 0xFFFFFF)
└─ 关界面 → GuiPointer 在 RenderGameOverlayEvent.EXPERIENCE 层画箭头
Navigator 地图上点节点
├─ JM/Xaero WaypointManager.updateActiveWaypoint → 反向同步 xMarker/yMarker/zMarker
├─ toLong() = X(26bit)<<38 | Z(26bit)<<12 | Y(12bit) 作为稳定 ID
└─ 按 Navigator 操作键 → deleteNodeInternal → removeIf + writeJson
节点类型与状态
src/main/resources/assets/tcnodetracker/lang/en_US.lang 里的全部相关键:
nodetype.* |
en_US | nodemod.* |
en_US | |
|---|---|---|---|---|
NORMAL |
Normal | BRIGHT |
Bright | |
UNSTABLE |
Unstable | PALE |
Pale | |
DARK |
Sinister | FADING |
Fading | |
PURE |
Pure | BLANK |
(无键,哨兵值) | |
TAINTED |
Tainted | |||
HUNGRY |
Hungry |
DARK 的显示名是 Sinister(泰阿自己的命名,不是 “Dark”)。BLANK 表示 getNodeModifier() 返回 null。
主侧重点常量
Constants.java:10-15 定义 6 个主侧重点 tag,是筛选与排序的全部维度:
| 常量 | tag | 常量 | tag | |
|---|---|---|---|---|
AIR |
aer |
ORDER |
ordo |
|
EARTH |
terra |
ENTROPY |
perditio |
|
FIRE |
ignis |
WATER |
aqua |
存档里可以有任意侧重点,命中这 6 个的进独立字段做排序,其余归入 compound(只在 tooltip 里列出)。
配色常量(Constants.java:17-19):WHITE = 0xFFFFFF、RED = 0xCA1E04、GREEN = 0x26AA30。
本 mod 没有的内容
以下 11 个维度经源码检索确认完全没有,因此不建目录、不建条目。
证据均来自 /Users/evlos/a/mirror/TCNodeTracker(commit 070c022)的 src/main/java:
方块 / 物品 / 实体 / TileEntity
$ grep -rnE "registerBlock|registerItem|registerTileEntity|registerEntity|registerModEntity|registerDimension|registerWorldGenerator|registerWorldProvider" .
(无输出)
$ grep -rnE "extends Block\b|extends Item\b|extends Entity\b|extends TileEntity\b|new Block[ (]|new Item[ (]" .
(无输出)
全 mod 注册 0 个游戏内容。 没有方块、物品、实体,也没有自己的 TileEntity。
RightClickEvent 里的 TileEntity i = ...getTileEntity(...) 是读泰阿自己的节点方块,
instanceof INode 只是类型判断,本 mod 从不实现该接口、也从不生成这种方块。
多方块结构 / 世界生成
$ grep -rnE "IMultiblock|IGenerator|BiomeGen" .
(无输出)
IMultiblock 和 IGenerator 这两个接口在本仓库根本不存在(别被别处的同名设计误导)。
指令(命令)
$ grep -rnE "ICommand|addChatCommand|CommandBase|ICommandSender|ServerCommand" .
(无输出)
没有任何指令,因此不存在指令名、参数或权限等级。PlayerInteractEvent 的处理只改本地内存与本地文件。
网络消息
$ grep -rnE "IMessage|SimpleNetworkWrapper|registerMessage|ClientReceivedPacketEvent|sendToServer|sendTo\(" .
(无输出)
没有任何自定义封包。 @Mod 上写了 acceptableRemoteVersions = "*"(TCNodeTracker.java:42),
但那是「不限制远端客户端版本」的兼容声明,不代表本 mod 发包 —— 所有处理器都是 @SideOnly(Side.CLIENT)。
唯一的 FMLNetworkEvent 用法是 ClientConnectedToServerEvent(events/ClientConnectionEvent.java:22),
那只是 FML 提供的进出服通知,不是本 mod 的消息通道。
附魔 / 药水效果 / 成就 / 群系 / 结构
$ grep -rnE "Enchantment|EnchantmentHelper|PotionEffect|BiomeGen|Achievement" .
(无输出)
(Potion\b 也没有单独命中。)这 5 个维度全部为零。
维度(Dimension)
$ grep -rnE "registerDimension|registerWorldProvider" .
(无输出)
不注册任何新维度。 WorldProvider 的唯一命中是 GuiMain.java:16 的 import 与
GuiMain.java:71 的一行 DimensionManager.getProvider(i) —— 那是读已有维度来列名字,
catch (Throwable t) 兜底回落成纯数字字符串。
研究图 / 研究可视化
$ grep -rnE "ResearchItem|ResearchCategory|thaumcraft.api.research|PlayerKnowledge" .
(无输出)
没有任何研究相关 API 调用。 本 mod 与研究系统零交互,它只知道「某个坐标上有个装着若干侧重点的 INode」。
因此也没有「研究图数据结构」「图的构建与遍历算法」「节点之间的边」这些概念。
未使用的热键
toggleNodeLayer 是例外中的例外 —— 它声明并注册了,但没有任何代码读它:
$ grep -rn "toggleNodeLayer" .
./com/dyonovan/tcnodetracker/bindings/KeyBindings.java:17: public static final KeyBinding toggleNodeLayer = new KeyBinding(
./com/dyonovan/tcnodetracker/bindings/KeyBindings.java:26: ClientRegistry.registerKeyBinding(toggleNodeLayer);
详见切换节点图层。
资源文件
src/main/resources 下只有 11 个文件:3 个语言文件(en_US / es_ES / zh_CN)、
7 张 GUI 贴图(arrow / arrow2 / node_icon / node_marked / node_unmarked / nodes / small_arrows)、
1 个 mcmod.info。没有配方、没有模型、没有 loot table、没有世界生成配置、没有 mixin。
mcmod.info 的 description 原文是 Tracks scanned nodes for Thaumcraft。