Aspect 研究点(右键消耗 Aspect 物品)

基本信息

属性 值
来源物品 aspectrecipeindex:aspect(见 Aspect 物品)
触发条件 手持该物品右键(Item.onItemRightClick)
执行侧 服务端(if (!world.isRemote))
效果 该玩家的 aspect pool 增加 1,并调度研究数据落盘
单次消耗 1 个物品(创造模式不消耗)

效果

右键一个带 Aspect NBT 的元素物品,会给使用它的玩家增加 1 点该元素的 aspect pool。Thaumcraft 的研究进度直接由 aspect pool 推导,所以这等价于"立刻拿到 1 点研究进度"。这一手法的用途是发现尚未解锁的元素:默认状态下元素物品无法在生存中取得,右键却能直接点亮它。

源码注释与 README 都明确:元素物品默认不可获得(除非作弊),但模组作者可以为它们添加真实配方。

数值

属性 值
aspect pool 增量 1
创造模式是否消耗 否(if (!player.capabilities.isCreativeMode) --item.stackSize;)
落盘时机 同一次右键内立即调用 ResearchManager.scheduleSave(player)

执行流程

  1. 取出 NBT 中的 Aspect;若为 null 则原样返回物品,不消耗。
  2. Thaumcraft.proxy.playerKnowledge.addAspectPool(player.getCommandSenderName(), aspect, (short) 1)。
  3. ResearchManager.scheduleSave(player) 安排异步保存。
  4. 若是 EntityPlayerMP 且不是 FakePlayer,向该玩家发送 Thaumcraft 自带的 aspect pool 同步包(见下)。
  5. 非创造模式扣除 1 个。

FakePlayer 被显式排除:自动化的右键(机器、管道、第三方 mod)不会凭空刷研究点。

网络同步

本模组没有自己的网络包。它复用了 Thaumcraft 的既有数据包:

项 值
包类 thaumcraft.common.lib.network.playerdata.PacketAspectPool
发送器 thaumcraft.common.lib.network.PacketHandler.INSTANCE
方向 服务端 → 客户端(单播给使用者)
触发时机 服务端处理右键,且 player instanceof EntityPlayerMP 且非 FakePlayer
载荷字段 1 String — 元素 tag(aspect.getTag())
载荷字段 2 short — 增量,固定为 1
载荷字段 3 short — 变更后的 aspect pool 总量(getAspectPoolFor(name, aspect))

目的:让客户端立刻刷新玩家的元素槽与研究进度,不必等下一次服务器同步。

相关条目