方块物品形态

本 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(下移一格)等,与 Forge EnumFacing 语义重复且方向编号靠手写映射,易错。同一方法内紧接着还有第二个 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)。

相关条目