节点扫描
手持泰阿数量仪或佩带「秩序/熵」透镜,右键一个节点方块,把它记进节点存档。
触发条件
实现在 src/main/java/com/dyonovan/tcnodetracker/events/RightClickEvent.java:26-93,
监听 PlayerInteractEvent。前 3 道门槛(:28-31):
if (event.isCanceled() || !event.entityPlayer.worldObj.isRemote
|| event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) {
return;
}
| 条件 | 含义 |
|---|---|
!event.isCanceled() |
事件未被其它 mod 取消 |
worldObj.isRemote |
只在客户端执行(本 mod 无服务端逻辑) |
action == RIGHT_CLICK_BLOCK |
必须是右键方块;右键空气、实体都不行 |
允许的道具(RightClickEvent.java:33-51)
canAddNode 由两条路径之一置位:
| 途径 | 判定 | 源码 |
|---|---|---|
| 手持 | 主手物品未本地化名 equalsIgnoreCase("item.ItemThaumometer") |
:39-40 |
| 头戴 | 头盔槽(armorItemInSlot(3))非空,且其 stackTagCompound 的 Lens 键 equalsIgnoreCase("LensOrderEntropy") |
:41-46 |
头盔分支只读 NBT 里的
Lens字符串,不检查物品类型。 判定失败时return,本 mod 不做任何事(不取消事件、不发消息)。
目标判定(RightClickEvent.java:53-58)
TileEntity i = event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z);
if (i instanceof INode) {
AspectList aspectList = ((INode) i).getAspects();
if (aspectList.size() == 0) return;
INode 是 Thaumcraft 的 API 接口 thaumcraft.api.nodes.INode。
本 mod 没有实现它,只对它做 instanceof 与读接口:
| 调用 | 用途 | 源码 |
|---|---|---|
getAspects() |
取出节点里装的侧重点,转成 tag → 数量 的 HashMap |
:57、:62-64 |
getNodeType() |
toString() 存进 type |
:66 |
getNodeModifier() |
toString() 存进 mod;为 null 时存字面量 BLANK |
:67-70 |
空节点(aspectList.size() == 0)会被跳过,不会写入存档。
写入逻辑:更新 or 新增
先按 (x, y, z, dim) 四元组在 TCNodeTracker.nodelist 里找(RightClickEvent.java:72-84):
| 情况 | 行为 |
|---|---|
| 找到同坐标记录 | 就地更新 aspect / type / mod / date,然后 JsonUtils.writeJson(),若 Navigator 加载则 forceRefresh(),return |
| 没找到 | nodelist.add(new NodeList(hm, dim, nodeType, nodeMod, event.x, event.y, event.z, Instant.now())),再 writeJson() + forceRefresh() |
所以对同一个节点反复扫描是幂等更新,不会产生重复记录。
节点的类型与状态
type 字段对应 Thaumcraft 节点类型,mod 对应节点修饰符。
src/main/resources/assets/tcnodetracker/lang/en_US.lang 里给出了全部本地化键与显示名:
节点类型(nodetype.<TYPE>.name)
| 键 | en_US 显示名 |
|---|---|
NORMAL |
Normal |
UNSTABLE |
Unstable |
DARK |
Sinister |
PURE |
Pure |
TAINTED |
Tainted |
HUNGRY |
Hungry |
⚠️ DARK 的显示名是 Sinister(不是 “Dark”),这是泰阿自己的命名,zh_CN 见对应语言文件。
节点修饰符(nodemod.<MOD>.name)
| 键 | en_US 显示名 |
|---|---|
BRIGHT |
Bright |
PALE |
Pale |
FADING |
Fading |
BLANK |
(无语言键) |
BLANK 是本 mod 的哨兵值,表示 getNodeModifier() 返回 null,即节点没有任何修饰符状态。
界面只在 mod != null && !mod.equals("BLANK") 时才显示这一行(gui/GuiMain.java:460)。
侧重点分类
主侧重点的 tag 常量定义在 lib/Constants.java:10-15:
| 常量 | tag | 元素 |
|---|---|---|
AIR |
aer |
气 |
EARTH |
terra |
地 |
FIRE |
ignis |
火 |
WATER |
aqua |
水 |
ORDER |
ordo |
秩序 |
ENTROPY |
perditio |
熵 |
GuiMain.getNodes(gui/GuiMain.java:315-354)把节点的 aspect map 拆成两类:
命中这 6 个 tag 的累加到对应字段,其余全部归入 compound(复合侧重点)。
compound 不参与任何排序,只在鼠标悬停「Type」列时以 tooltip 列出(gui/GuiMain.java:444-452)。
相关条目
- 节点存档 - 记录写到哪里、长什么样
- 节点列表界面 - 记录列表的排序与筛选逻辑
- Navigator 地图图层整合 -
forceRefresh()刷新的图层