节点扫描

手持泰阿数量仪或佩带「秩序/熵」透镜,右键一个节点方块,把它记进节点存档。

触发条件

实现在 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)。

相关条目