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。