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 |
| 透明内容显示 | 否 |
相关条目
- Iron Chest 方块 - metadata 与抗爆机制
- ItemIronChest - 物品形态
- 箱子类型开关 - 泥土箱子不受任何
enable*Chests开关影响(isEnabled()对它恒返回 true)