穿透物品实体 No-Clip Item
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | gadomancy:EntityPermItem |
| 注册位置 | common/registration/RegisteredEntities.java:21 |
| 继承 | thaumcraft.common.entities.EntityPermanentItem(EntityPermNoClipItem.java:20) |
| 追踪距离 | 32 |
| 更新频率 | 40 |
| 发送速度更新 | 否(false) |
| Datawatcher 数量 | 2 |
| 客户端渲染 | RenderSpecialItem(ClientProxy.java:219) |
功能
这不是投掷物,而是**「物品主人」(item master)实体**——让 灵气塔 与 知识之书 能把物品送入机器内部、再原样取回,而不需要真的把物品丢进方块里。
它实现了 IItemMasterTile 接口(EntityPermNoClipItem.java:153)作为与主人方块通信的契约:
| 接口方法 | 作用 |
|---|---|
canStillHoldItem() |
主人方块是否仍能持有该物品 |
informMaster() |
通知主人方块 |
informItemRemoval() |
物品被移除时通知主人 |
已注册为主人的方块(实现 IItemMasterTile 的 Tile):
| 主人方块 | 位置 |
|---|---|
TileAuraPylon |
TileAuraPylon.java:40 |
TileKnowledgeBook |
TileKnowledgeBook.java:47 |
固定坐标机制
实体记录两套坐标:
| 字段 | 含义 |
|---|---|
masterX/Y/Z |
主人方块坐标 |
fixPosX/Y/Z |
实体的固定位置 |
两者都通过 Datawatcher 同步,坐标用 Float.floatToIntBits 编码(EntityPermNoClipItem.java 构造函数)。源码注释说明 fixPos* 初始值 -1「永远不会真的取到这些值,因为塔的坐标永远不是 .0」。
移除事件处理
EventHandlerEntityServer 监听实体移除事件,检测 instanceof EntityPermNoClipItem 后回调主人方块的 informItemRemoval()(EventHandlerEntityServer.java:94-99)。
数值
| 数值名 | 值 |
|---|---|
| 追踪距离 | 32 |
| 更新频率 | 40 tick |
| 发送速度更新 | 否 |
| Datawatcher 数量 | 2 |
| Datawatcher 类型 | 均为类型 6(addObjectByDataType(..., 6),entityInit()) |
| 已注册主人方块数 | 2 |
交互
| 触发 | 行为 |
|---|---|
| 主人方块请求持有物品 | 生成实体并固定在机器内部坐标 |
| 玩家取回物品 | 实体交还 ItemStack |
| 实体被移除 | 回调 informItemRemoval() |