力场控制器
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | malisisdoors:forcefieldItem |
| 显示名(en_US) | Forcefield Controller |
| 类 | net.malisis.doors.door.item.ForcefieldItem(继承 Item) |
| 注册方式 | GameRegistry.registerItem(Registers.java:451) |
| 创造标签 | Malisis' Doors(ForcefieldItem.java:43) |
| 耐久 | setMaxDamage(0),无耐久条(ForcefieldItem.java:44) |
| 能量 | 存于物品 NBT 键 energy,最大 2000 |
功能
力场控制器是两点框选工具:在世界里点击第一个角点,再点击第二个角点,即可在两个角点围成的矩形体积内生成整面 力场。
工作流程(ForcefieldItem.onItemUse,ForcefieldItem.java:117-156):
- 能量不足直接拒绝:
getEnergy(itemStack) < getMaxEnergy()即返回(ForcefieldItem.java:120)。注意这是要求满能量才能继续 - 未设起点 → 记录起点
setStartPosition(itemStack, pos, world.getTotalWorldTime())并返回(ForcefieldItem.java:125-128) - 已设起点 → 取当前点为终点,按 Y 排序保证 start 在下(
ForcefieldItem.java:132-136) getBoundingBox(start, pos)计算 AABB(ForcefieldItem.java:145,实现见ForcefieldItem.java:188-198)- 体积校验:若三轴厚度都小于 1 格则视为无效,清除起点返回(
ForcefieldItem.java:138-141) - 尺寸与能量校验:
getDoorSize(aabb) <= 0或能量不足则清除起点返回(ForcefieldItem.java:143-146) - 生成:
MultiBlock填充forcefieldDoor方块;仅当placeBlocks(true)成功才扣能量drainEnergy(itemStack, size * 20, ...)(ForcefieldItem.java:148-151) - 无论成败都清除起点(
ForcefieldItem.java:153)
起点坐标存于 NBT 的 x / y / z / time 四个键,isStartSet 即判断 hasKey("x")(ForcefieldItem.java:163-186)。doesSneakBypassUse 返回 true,使潜行时不触发方块交互(ForcefieldItem.java:159-161)。
物品图标状态
getIcon(ItemStack, int pass) 按状态返回 5 种贴图(ForcefieldItem.java:60-87):
| 图标 | 贴图名 | 条件 |
|---|---|---|
| 灰(禁用) | malisisdoors:forcefielditem_disabled |
能量 < 最大值 |
| 普通 | malisisdoors:forcefielditem |
已满能量但未设起点 |
| 黄 | malisisdoors:forcefielditem_yellow |
已设起点,但准星未指向方块 |
| 红 | malisisdoors:forcefielditem_red |
体积过小,或能量不足以覆盖当前框选范围 |
| 绿 | malisisdoors:forcefielditem_green |
框选合法且能量充足 |
数值
| 数值名 | 值 | 出处 |
|---|---|---|
| 最大能量 | 2000 | ForcefieldItem.java:107-109 |
| 单位体积耗能 | 20 能量/格 | ForcefieldItem.java:144、ForcefieldItem.java:150 |
| 理论最大力场体积 | 100 格(2000 ÷ 20) | 由上两行推算 |
| 能量下限钳制 | 0 | ForcefieldItem.java:98 |
getDoorSize(ForcefieldItem.java:200-208)返回 diffX × diffY × diffZ 的体积格数;其中 diffY == 1 且 diffX == 1 且 diffZ == 1(即水平方向为一条线)时返回 -1 拒绝——因此力场至少要在两个水平轴上有厚度。
拆除力场时 力场方块 会把控制器能量直接清零(
ForcefieldDoor.java:86-90),因此拆除是免费的,但已建成的力场不返还能量。
合成配方
(Registers.java:454-468)
ABA
CDC
AEA
| 字符 | 物品 |
|---|---|
A |
钻石 Items.diamond ×4 |
B |
黑曜石 Blocks.obsidian ×1 |
C |
红石中继器 Items.repeater ×2 |
D |
末影眼 Items.ender_eye ×1 |
E |
比较器 Items.comparator ×1 |
相关条目
- 力场 - 本物品所创建的方块与其开合行为