ItemIronChest(箱子物品形态)

基本信息

属性 值
源码类 cpw.mods.ironchest.ItemIronChest extends ItemBlock
注册名 IronChest:BlockIronChest(与方块同名,GameRegistry.registerBlock(ironChestBlock, ItemIronChest.class, "BlockIronChest"))
未本地化名 tile.ironchest:<TYPE>.name(TYPE = 枚举常量名,大写)
最大堆叠 64(Item 默认;方块物品不可堆叠时由原版处理)
耐久 0(setMaxDamage(0),无法损坏)
子类型 setHasSubtypes(true) —— 用 ItemStack 的 damage 值当 metadata
附魔适用 无(未覆写 getEnchantability)
创造栏 跟随方块的 CreativeTabs.tabDecorations
物品图标 由 IronChestType.getIcon(int side) 走 sideMapping = {0,0,2,1,2,2,2} 从 3 张方块图标里取

metadata 即箱子类型

ItemIronChest 不额外维护物品→类型的映射表,直接复用方块的 metadata 约定:

@Override
public int getMetadata(int i) {
    return IronChestType.validateMeta(i);
}

validateMeta 对越界或 size <= 0 的值回落到 0(铁箱子),因此:

  • damage 0~10 → 依次对应 11 种箱子(ordinal())
  • damage 11(WOOD)→ 被改写成 0
  • damage ≥ 12 → 被改写成 0

放置方块时原版会用 getMetadata(damage) 作为方块 metadata,于是放置出来的箱子类型永远与物品 damage 一致,且非法 damage 会静默变成铁箱子而不是崩溃。

显示名

@Override
public String getUnlocalizedName(ItemStack itemstack) {
    return "tile.ironchest:" + IronChestType.VALUES[itemstack.getItemDamage()].name();
}

这里用的是 getItemDamage() 而非 getMetadata()。若物品 damage 为 11 或更大,VALUES[damage] 会抛 ArrayIndexOutOfBoundsException——WOOD 的 ordinal() 恰好是 11。不过 WOOD 的 size = 0,validateMeta(11) = 0,所以正常流程里不会产生这种物品;这个越界只在被外部 mod 强行塞入非法 damage 的物品时可触发。

显示名本地化键与 assets/ironchest/lang/en_US.lang 一一对应:

damage 未本地化名 en_US zh_CN
0 tile.ironchest:IRON.name Iron Chest 铁箱子
1 tile.ironchest:GOLD.name Gold Chest 金箱子
2 tile.ironchest:DIAMOND.name Diamond Chest 钻石箱子
3 tile.ironchest:COPPER.name Copper Chest 铜箱子
4 tile.ironchest:STEEL.name Steel Chest 钢箱子
5 tile.ironchest:CRYSTAL.name Crystal Chest 水晶箱子
6 tile.ironchest:OBSIDIAN.name Obsidian Chest 黑曜石箱子
7 tile.ironchest:DIRTCHEST9000.name DirtChest 9000! 泥箱子9000!
8 tile.ironchest:NETHERITE.name Netherite Chest 下界合金箱子
9 tile.ironchest:DARKSTEEL.name Dark Steel Chest 玄钢箱子
10 tile.ironchest:SILVER.name Silver Chest 银箱子

方块自身的未本地化名是 tile.IronChest.name(setBlockName("IronChest")),en_US 里是 Chest;但 ItemIronChest.getUnlocalizedName 完全覆写了它,所以物品形态永远走 tile.ironchest:<TYPE>.name,不会显示成 Chest。

Tooltip

@Override
public void addInformation(ItemStack stack, EntityPlayer player, List<String> tooltip, boolean advanced) {
    tooltip.add(StatCollector.translateToLocal(getUnlocalizedName(stack) + ".tooltip"));
}

即每个类型都有一条 <未本地化名>.tooltip:

箱子 tooltip(en_US)
Copper Inventory 5*9 - 45 Slots
Iron Inventory 6*9 - 54 Slots
Steel Inventory 8*9 - 72 Slots
Silver Inventory 8*9 - 72 Slots
Gold Inventory 9*9 - 81 Slots
Diamond Inventory 12*9 - 108 Slots
Crystal Inventory 12*9 - 108 Slots
Obsidian Inventory 12*9 - 108 Slots §4Blast Proof
Netherite Inventory 15*9 - 135 Slots
Dark Steel Inventory 15*9 - 135 Slots
Dirt Chest 9000 Stores up to ONE stack of dirt! Revolutionary technology!

[!NOTE] 13 种 tooltip 全部在 zh_CN 语言文件里保持英文原文(未汉化)。这些 tooltip 里的行列数是硬编码文本,与实际 getRowCount() / getRowLength() 一致,但源码并未做一致性校验。

使用方式

使用方式 触发条件 使用效果 条件/限制
右键点击方块 目标位置可放置 由 ItemBlock 基类放置 IronChest:BlockIronChest @ getMetadata(damage) 箱子正上方有实心方块时打不开(BlockIronChest.onBlockActivated 的 isSideSolid 检查)
快捷栏右键 无目标 旋转箱子(BlockIronChest.rotateBlock 仅接受 UP / DOWN 轴) 只能绕竖直轴
装备 / 穿戴 — 不适用 —

ItemIronChest 没有覆写 onItemUse、onItemRightClick、onItemUseFirst、addInformation 之外的行为,物品逻辑完全继承 ItemBlock。

掉落与 adornment

箱子物品的 NBT 由方块侧的 BlockIronChest.getDrops 负责:

ItemStack stack = new ItemStack(this, 1, metadata);
IronChestType.VALUES[validateMeta(metadata)].adornItemDrop(stack);

adornItemDrop 只对 DIRTCHEST9000 打 dirtchest = NBTTagByte(1) 标记(详见 Dirt Chest 9000),其余 10 种箱子掉落的物品永远不带任何 NBT。

与升级器物品的区别

ItemIronChest(本页) ItemChestChanger
物品类 ItemIronChest ItemChestChanger
最大堆叠 64 1
数量 1 个(11 个 metadata 变体) 17 个独立注册物品
触发 放置方块 升级已放置的方块
NBT 仅泥土箱子掉落物带 dirtchest 永不带 NBT
创造栏 tabDecorations tabMisc

相关条目