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) |
执行流程
- 取出 NBT 中的 Aspect;若为
null则原样返回物品,不消耗。 Thaumcraft.proxy.playerKnowledge.addAspectPool(player.getCommandSenderName(), aspect, (short) 1)。ResearchManager.scheduleSave(player)安排异步保存。- 若是
EntityPlayerMP且不是FakePlayer,向该玩家发送 Thaumcraft 自带的 aspect pool 同步包(见下)。 - 非创造模式扣除 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)) |
目的:让客户端立刻刷新玩家的元素槽与研究进度,不必等下一次服务器同步。