方块物品形态
本 mod 的 5 个方块对应 4 个 ItemBlock 类(items/blocks/,共 5 个文件 + 1 个接口 lib/blocks/IBlockWithMetadata.java)。它们负责 subtype 名、tooltip 与放置朝向 NBT。
| 方块 | ItemBlock 类 | subtype 名数组 |
|---|---|---|
redstoneMachine(4 meta) |
RedstoneMachineItem |
{"drawbridge", "firestarter", "advdrawbridge", "extdrawbridge"} |
signalBus |
SignalBusItem |
{"signalbus"} |
signalTerminal |
SignalTerminalItem |
— |
meshFilter(5 meta) |
ItemBlockWithMetadata(泛型,走 IBlockWithMetadata) |
由方块 getUnlocalizedNameByMetadata 提供 |
dynamo |
默认 ItemBlock |
— |
命名空间不一致
| 类 | getUnlocalizedName 前缀 |
派生 key |
|---|---|---|
RedstoneMachineItem |
block. |
block.drawbridge / block.firestarter / block.advdrawbridge / block.extdrawbridge |
SignalBusItem |
tile. |
tile.signalbus |
ItemBlockWithMetadata |
委托方块 | 方块自定 |
SignalTerminalItem |
未覆写 | 用方块的 tile.signalTerminal |
SignalBusItem 用 tile. 而 RedstoneMachineItem 用 block.,两者在 Minecraft 惯例中分属「方块名」与「创造标签名」两套 key,同仓不一致。
RedstoneMachineItem tooltip
addInformation(items/blocks/RedstoneMachineItem.java:32-82)按 meta 分支:
| meta | tooltip 内容 |
|---|---|
| 1(Igniter) | 无任何 tooltip(if (meta != 1) 直接跳过) |
| 0 / 3(Drawbridge / Long) | tooltip.drawbridge.inventory(槽 0 内容名)+ tooltip.drawbridge.amount(数量) |
| 2(Advanced) | 循环 Slot1–Slot16,各输出 tooltip.drawbridge.slot<i>: <物品名> |
| 0 / 2 / 3 共用 | tooltip.drawbridge.camoflauge(暗绿色 §2 前缀)+ tooltip.drawbridge.direction(+ 方向字符串) |
| 无 NBT 且 meta ≠ 1 | tooltip.drawbridge.default |
NBT 键:Contents(槽 0)、Slot1–Slot16(Advanced)、Camoflauge(注意拼写)、Placement(byte)。
数值
| 数值 | 值 |
|---|---|
| ItemBlock 类数 | 4 |
| subtype 数组 | RedstoneMachineItem 4 项 / SignalBusItem 1 项 |
RedstoneMachineItem.getMaxDamage |
0(永不损坏) |
SignalBusItem.maxStackSize |
64 |
SignalBusItem.setHasSubtypes |
false |
ItemBlockWithMetadata.setHasSubtypes |
true |
| tooltip lang 键 | 9 个(tooltip.drawbridge.* + tooltip.*.direction.*) |
| NBT 键 | Contents、Slot1–Slot16、Camoflauge、Placement |
getMetadata(int meta) |
全部直接 return meta(不做任何范围校验) |
源码缺陷
- 方向字符串与实际逻辑不一致(
items/blocks/RedstoneMachineItem.java:84-90):if (key == 0) return "...direction.up"; // logic 0 = 上 ✓ if (key == 1) return "...direction.right"; // logic 1 = 下 ✗ if (key == 2) return "...direction.down"; // logic 2 = 北 ✗ return "...direction.left"; // logic 3/4/5 ✗
DrawbridgeLogic.setDirection的实际映射是0=上 / 1=下 / 2=北 / 3=南 / 4=西 / 5=东(6 值)。tooltip 只认 4 值且从 1 开始就全部错位 —— 玩家看到 “right” 实际朝下、看到 “down” 实际朝北。DrawbridgeGui只有 5 个按钮(缺东)说明作者心中是 4 向模型,但DrawbridgeLogic实现的是 6 向。这是本 mod 最容易让玩家困惑的不一致。 ItemBlockWithMetadata.getUnlocalizedName的<=off-by-one(:31):itemstack.getItemDamage() <= ourBlockMeta.getItemCount()。若getItemCount()返回的是「合法 metadata 上界」,则==上界时才取 subtype 名;实际语义取决于方块如何实现getItemCount()。MeshFilter 的getItemCount()未在本条目确认,易出边界问题。getMetadata(int meta)全部无条件return meta:4 个 ItemBlock 都如此,意味着任何超出 subtype 范围的 damage 都会被原样写入世界(如 meta 8 的 redstoneMachine),而RedstoneMachine.getGui/createNewTileEntity的 switch 落到default后行为未定义。SignalBusItem.getUnlocalizedName的 clamp 是正确的(:36,clamp_int(damage, 0, blockType.length - 1)),但因setHasSubtypes(false)使 damage 恒为 0,该方法实际是多余代码。SignalBusItem.func_150936_a有注释掉的原实现(:51-52):当前实现拆成if (super || _canPlaceItemBlockOnSide) return true; return false;,与注释掉的单行版本语义相同,属重构残留。SignalBusItem.onItemUse手写 6 分支坐标偏移(:62-83):case 0: tmpY += -1(下移一格)等,与 ForgeEnumFacing语义重复且方向编号靠手写映射,易错。同一方法内紧接着还有第二个switch (side)计算tside,两个 switch 分离可读性差。SignalBusItem构造器里this.maxStackSize = 64是默认值:直接写死 64 而非setMaxStackSize,setHasSubtypes(false)同理 —— 未用 Forge 推荐写法(1.7.10 下可用)。SignalTerminalItem未覆写getUnlocalizedName也不提供 subtype 名:与SignalBusItem风格不一致,且其onItemUse(含canPlaceBlockAt的 6 面实心方块检查)实际写在方块而非物品上(见 Signal Terminal)。
相关条目
- Drawbridge -
RedstoneMachineItem的 meta 0 - Long Drawbridge -
RedstoneMachineItem的 meta 3(extdrawbridge) - Signal Bus -
SignalBusItem - Signal Terminal -
SignalTerminalItem - Mesh Filter -
ItemBlockWithMetadata的唯一用户 - Drawbridge GUI -
PlacementNBT 的写入方