Obsidian Chest(黑曜石箱子)

基本信息

属性 值
注册名 IronChest:BlockIronChest @ metadata 6
metadata 来源 IronChestType.OBSIDIAN.ordinal()
显示名 tile.ironchest:OBSIDIAN.name = Obsidian Chest
枚举常量 OBSIDIAN
TileEntity cpw.mods.ironchest.TileEntityObsidianChest(唯一实现 super(IronChestType.OBSIDIAN))
硬度 3.0F(与其他变体完全相同,不因黑曜石材质而变硬)
爆炸抗性 是(resistance = 1)→ getExplosionResistance() 返回 10000.0F
容量 108(size = 108)
槽位形状 108 / 12 = 9 行 × 12 列
物品栏堆叠上限 64
GUI 尺寸 238 × 256(GUIChest.GUI.OBSIDIAN),贴图 ironchest:textures/gui/diamondcontainer.png(借用钻石箱子的)
箱子等级 tier = 5
材质 obsidian(由 translateOreName 特判为 Blocks.obsidian 而非矿石字典名)
物品过滤 无
是否配置可关 否(isEnabled() 恒 true)
特殊 tooltip Inventory 12*9 - 108 Slots §4Blast Proof(全 mod 唯一带红色抗爆标记的箱子)

抗爆的表达方式

resistance 是 IronChestType 构造函数的最后一个参数,取值 0 或 1,不是爆炸抗性数值本身:

// IronChestType.java:298
public boolean isExplosionResistant() {
    return this.resistance >= 1;
}
// BlockIronChest.java:235 —— 唯一的爆炸抗性出口
public float getExplosionResistance(Entity e, World world, int x, int y, int z,
        double ex, double ey, double ez) {
    TileEntity te = world.getTileEntity(x, y, z);
    if (te instanceof TileEntityIronChest
            && ((TileEntityIronChest) te).getType().isExplosionResistant()) {
        return 10000f;
    }
    return super.getExplosionResistance(e, world, x, y, z, ex, ey, ez);
}

全仓库没有任何 setResistance() 调用(grep -rn "setResistance" java/ 零命中)。抗爆完全靠上面这个 getExplosionResistance 覆写,按 TileEntity 的类型(不是按方块 metadata)判定。因此:

抗爆(resistance >= 1) 不抗爆(resistance = 0)
Obsidian Chest(本页,108 格) 其余 9 个真实变体
Netherite Chest(135 格) 包括同样 108 格的钻石箱与水晶箱

抗爆箱子仍然会被镐挖掉(硬度 3.0F 不变),只是 TNT / 苦力怕爆炸无法摧毁(10000.0F 远超 TNT 最大爆炸能量 7.0)。

resistance 的第二重用途:配方过滤

resistance 还在配方生成里当过滤器用,这是它最容易被忽略的功能。getRegistredChestsByTier(parentMaterial, tier, resistance) 要求候选箱子满足 typ.resistance >= resistance:

// 生成直做配方时传入 resistance - 1,允许同 tier 的非抗爆箱子作为中心
Object[] curTiers = getRegistredChestsByTier(typ, typ.tier, typ.resistance - 1);
// 生成升级配方时传入 resistance,只允许抗爆等级不低于自己的前一级
Object[] prevTiers = getRegistredChestsByTier(typ, typ.tier - 1, typ.resistance);
Object[] prevPrevTiers = getRegistredChestsByTier(typ, typ.tier - 2, typ.resistance);

对黑曜石箱子(resistance = 1)的实际影响:

  • recipeDirect 用 resistance - 1 = 0 → tier 5 的 3 个箱子(钻石 resistance 0、水晶 0、黑曜石 1)全部符合 resistance >= 0,跳过自身后得到 2 条配方。
  • 它没有 recipeUpgradeOneTier,所以升级路径上不受此过滤影响。

对下界合金箱子(resistance = 1、tier = 6、recipeDirect = null)则是硬过滤:getRegistredChestsByTier(NETHERITE, 5, 1) 只返回 resistance >= 1 的 tier 5 箱子,即只有黑曜石箱子。这就是"抗爆箱子只能由抗爆箱子升级而来"这条规则的实现。

配方

字段 值 实际生成的配方
recipeDirect "mmmmPmmmm" → mmm/mPm/mmm 8 黑曜石围 1 钻石箱子 / 8 黑曜石围 1 水晶箱子(2 条)
recipeUpgradeOneTier null 无
recipeUpgradeTwoTiers null 无

'm' 在这里是 Blocks.obsidian(translateOreName 对 obsidian / dirt 做特判,其余材质名原样作为矿石字典字符串使用)。'O' 键也固定是 Blocks.obsidian。

升级关系

来源:

来源 形态
Diamond to Obsidian Chest Upgrade mmm/mGm/mmm
配方 recipeDirect 8 黑曜石围钻石箱子 或 8 黑曜石围水晶箱子

去向(2 个,是全局容量跃升的关键节点):

升级器 目标 配方 说明
Obsidian to Netherite Chest Upgrade Netherite Chest(108 → 135) OOO/msm/OOO 抗爆箱子只能由抗爆箱子升级而来(见上)
Obsidian to Dark Steel Chest Upgrade Dark Steel Chest(108 → 135) OOO/msm/OOO 玄钢箱子非抗爆,所以这一路放弃了抗爆特性

从黑曜石箱子升级容量 108 → 135,不会掉出物品(applyUpgradeItem 的 newSize = 135 > 108)。

存档兼容

IronChest.missingMapping 有一对互斥的旧名重映射,取决于 DARKSTEEL / NETHERITE 谁开启:

条件 旧存档名 重映射到
DARKSTEEL.isEnabled() IronChest:obsidianNetheriteUpgrade diamondDarkSteelUpgrade
NETHERITE.isEnabled() IronChest:diamondDarkSteelUpgrade obsidianNetheriteUpgrade

ENABLE_DARK_STEEL_CHESTS 默认 = isGTNHLoaded(GTNH 上 true),ENABLE_NETHERITE_CHESTS 默认 = !isGTNHLoaded,所以 GTNH 上走"obsidianNetheriteUpgrade → diamondDarkSteelUpgrade"这一支。

NBT 字段

Items(TAG_Compound 列表,每项含 Slot byte)、facing(byte)。TileEntityObsidianChest 无覆写。

渲染

事项 值
方块图标 ironchest:obsidian_top / obsidian_front / obsidian_side
模型贴图 ironchest:textures/model/obsidianchest.png
GUI 贴图 ironchest:textures/gui/diamondcontainer.png(借用)
透明内容显示 否

相关条目