Dirt Chest 9000(泥箱子 9000)

基本信息

属性 值
注册名 IronChest:BlockIronChest @ metadata 7
metadata 来源 IronChestType.DIRTCHEST9000.ordinal()
显示名 tile.ironchest:DIRTCHEST9000.name = DirtChest 9000!(zh_CN:泥箱子9000!)
枚举常量 DIRTCHEST9000
TileEntity cpw.mods.ironchest.TileEntityDirtChest(唯一有实质覆写的 TileEntity)
硬度 3.0F(与其他变体相同)
爆炸抗性 否(resistance = 0)
容量 1(size = 1)——全 mod 最小
槽位形状 1 / 1 = 1 行 × 1 列
物品栏堆叠上限 64
GUI 尺寸 184 × 184(GUIChest.GUI.DIRTCHEST9000),贴图 ironchest:textures/gui/dirtcontainer.png
箱子等级 tier = -1(不参与升级链)
材质 dirt(translateOreName 特判为 Blocks.dirt)
物品过滤 itemFilter = Item.getItemFromBlock(Blocks.dirt) ——只能放泥土
特殊 tooltip Stores up to ONE stack of dirt! Revolutionary technology!

唯一有物品过滤的箱子

IronChestType 的 12 个常量里,只有 DIRTCHEST9000 传了 itemFilter 参数(Blocks.dirt 的 Item),且它只改用 13 参数的那个构造函数重载:

DIRTCHEST9000(1, 1, -1, "Dirt Chest 9000", "dirtchest.png", 7, Arrays.asList("dirt"),
        TileEntityDirtChest.class,
        Item.getItemFromBlock(Blocks.dirt),   // ← 唯一带 itemFilter 的常量
        "mmmmCmmmm", null, null, 0);

过滤逻辑在三处生效(acceptsStack:itemFilter == null || itemstack == null || itemstack.getItem() == itemFilter):

位置 效果
TileEntityIronChest.isItemValidForSlot(i, itemstack) 自动化/漏斗存入校验
ValidatingSlot.isItemValid GUI 里不能把非泥土拖进这唯一一格
ContainerIronChest.transferStackInSlot 从背包搬入时若 !type.acceptsStack(itemstack1) 直接 return null(Shift 拖入被拒)

注意 acceptsStack 允许 itemstack == null(清空格子总是允许)。

说明书:唯一的功能

TileEntityDirtChest 的静态初始化构造一本写好的书(Items.written_book)作为出厂附件:

NBT 键 值
author "cpw"(NBTTagString)
title 本地化键 book.ironchest:dirtchest9000.title(“How to use your DirtChest 9000!”)
pages NBTTagList of NBTTagString,本地化键 book.ironchest:dirtchest9000.page1 ~ page5(5 页)

插入时机:wasPlaced

@Override
public void wasPlaced(EntityLivingBase entityliving, ItemStack itemStack) {
    if (!(itemStack.hasTagCompound() && itemStack.getTagCompound().getBoolean("dirtchest"))) {
        setInventorySlotContents(0, dirtChest9000GuideBook.copy());
    }
}

wasPlaced 由 BlockIronChest.onBlockPlacedBy 调用。判断依据是放置时手里那个物品的 NBT 里有没有 dirtchest 布尔标记。这个标记由 IronChestType.adornItemDrop 打在箱子掉落物上:

public void adornItemDrop(ItemStack item) {
    if (this == DIRTCHEST9000) {
        item.setTagInfo("dirtchest", new NBTTagByte((byte) 1));
    }
}

getDrops 在返回掉落物前调它。于是形成这个闭环:

  • 第一次放置(物品 NBT 无 dirtchest)→ 说明书会被放进去
  • 破坏后重新放置(掉落物带 dirtchest)→ 说明书不会重复插入
  • 说明书被玩家取走后破坏再放 → 也不会再补(因为标记已在)

移除时机:removeAdornments

@Override
public void removeAdornments() {
    if (chestContents[0] != null && chestContents[0].isItemEqual(dirtChest9000GuideBook)) {
        chestContents[0] = null;
    }
}

BlockIronChest.breakBlock 先调 removeAdornments() 再散落内容。isItemEqual 比较物品类型、damage 与 NBT,所以玩家把说明书的 NBT 改过就不会被自动删除(会和泥土一起掉出来)。TileEntityIronChest.removeAdornments 基类是空实现——泥土箱子是唯一有覆写的。

配方

字段 值 实际生成的配方
recipeDirect "mmmmCmmmm" → mmm/mCm/mmm 8 泥土围 1 个原版木箱子('C' 键 = "chestWood";getRegistredChestsByTier(DIRTCHEST9000, -1, -1) 对 tier < 0 返回 new Object[0],走 curTiers.length > 1 的 false 分支即 else 分支)
recipeUpgradeOneTier null 无
recipeUpgradeTwoTiers null 无

泥土箱子没有任何升级器以它为来源或目标(ChestChangerType 中 DIRTCHEST9000 一次都没出现)。它是升级链的孤立端点。

GUI 特殊布局

ContainerIronChest.layoutContainer 有一处专门的分支:

if (type == IronChestType.DIRTCHEST9000) {
    addSlotToContainer(type.makeSlot(chestInventory, 0, 12 + 4 * 18, 8 + 2 * 18));  // 居中单格
} else { /* 常规 getRowCount() × getRowLength() 网格 */ }

单格被放在 3×3 网格正中央(x = 12 + 4*18 = 84,y = 8 + 2*18 = 44)。getNumColumns() 仍返回 getRowLength() = 1,@ChestContainer(isLargeChest = true) 仍然成立(InvTweaks 槽位优化照常工作)。

数值

数值 值
容量 1 格
每格最大堆叠 64(getInventoryStackLimit(),与所有变体相同)
可存物品 仅 minecraft:dirt
GUI 宽高 184 × 184(dirtcontainer.png)

NBT 字段

字段 类型 说明
Items NBTTagList 物品栏(本箱子最多 1 个元素),每项含 Slot(byte)
facing byte 朝向
id / x / y / z — 继承自 TileEntity

物品 NBT(非方块 NBT):dirtchest(NBTTagByte(1)),由 adornItemDrop 写在箱子掉落物上,用于避免说明书重复生成。

渲染

事项 值
方块图标 ironchest:dirtchest9000_top / dirtchest9000_front / dirtchest9000_side
模型贴图 ironchest:textures/model/dirtchest.png(注意枚举里 modelTexture 是 dirtchest.png,而图标前缀是枚举名小写 dirtchest9000,两者不一致)
GUI 贴图 ironchest:textures/gui/dirtcontainer.png
透明内容显示 否

相关条目