升级:水晶>玄钢(Crystal to Dark Steel Chest Upgrade)
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | IronChest:crystalDarkSteelUpgrade(GameRegistry.registerItem(item, "crystalDarkSteelUpgrade")) |
| 源码枚举常量 | ChestChangerType.CRYSTALDARKSTEEL |
| 物品类 | cpw.mods.ironchest.ItemChestChanger(全部 17 个升级器共用一个类,仅 type 字段不同) |
| 未本地化名 | item.ironchest:CRYSTALDARKSTEEL.name |
| 本地化名(zh_CN) | 升级:水晶>玄钢 |
| 枚举内描述名 | Crystal to Dark Steel Chest Upgrade |
| 物品图标 | ironchest:crystalDarkSteelUpgrade → assets/ironchest/textures/items/crystalDarkSteelUpgrade.png |
| 最大堆叠 | 1(setMaxStackSize(1)) |
| 耐久 | 无(未调用 setMaxDamage) |
| 附魔适用 | 无(Item 基类默认) |
| 创造栏 | CreativeTabs.tabMisc |
| 来源 | CRYSTAL → 水晶箱子 |
| 来源是否可被关闭 | 恒 true(isEnabled() 无该类型分支) |
| 目标 | DARKSTEEL → 玄钢箱子 |
| 目标是否可被关闭 | 受配置控制:enableDarkSteelChests |
| 容量变化 | 27 格(108 格 → 135 格) |
功能
一次性把已放置的水晶箱子就地升级成玄钢箱子:升级成功后 stack.stackSize = 0 消耗物品,箱子方块本身被替换(world.setBlock),物品栏内容原样搬运,装不下的部分散落在地上。
它不是合成用的中间物品,只有右键已放置的方块才会触发。
合成配方
符号含义(ChestChangerType.addRecipes):
| 符号 | 含义 |
|---|---|
m |
目标箱子的材质:矿石字典 ingotDarkSteel |
s |
来源箱子的材质:矿石字典 blockGlass |
G |
Blocks.glass(原版玻璃方块) |
O |
Blocks.obsidian(原版黑曜石方块) |
OOO
msm
OOO
产物 1 个。addRecipes() 用 source.getMatList() × target.getMatList() 双层循环,因此本配方实际注册 1 条(1 种来源材质 × 1 种目标材质),任一条都能做出来。
[!NOTE] 配方只在未加载 GTNH 时生成(
ChestChangerType.generateRecipes()开头即if (IronChest.isGTNHLoaded) return;)。在 GTNH 上本升级器没有合成配方,只能由其他配方链产出。
使用方式
| 使用方式 | 触发条件 | 使用效果 | 条件/限制 |
|---|---|---|---|
右键点击方块(onItemUseFirst) |
目标方块是 source 对应的箱子 |
就地升级为 target 箱子 |
箱子必须没人在开(numUsingPlayers > 0 或原版 numPlayersUsing > 0 时返回 false);成功才消耗物品 |
| 快捷栏右键 | 无目标方块 | 无效果(未覆写 onRightClick) |
— |
| 装备 / 穿戴 | — | 不适用 | — |
[!IMPORTANT]
getTargetChestOrdinal(int sourceOrdinal)的实现就是return type.getTarget();—— 完全忽略传入的sourceOrdinal。目标 metadata 只由ChestChangerType.target.ordinal()决定,箱子类型不由右键对象校验之外的东西决定。
升级时发生了什么
ItemChestChanger.onItemUseFirst + TileEntityIronChest.applyUpgradeItem 的完整流程:
world.isRemote→ 直接return false(只在服务端执行)。- 目标 TE 是
TileEntityIronChest→ 调applyUpgradeItem():numUsingPlayers > 0则拒绝;canUpgrade(this.getType())(只比对source)不匹配则拒绝。 - 目标 TE 是原版
TileEntityChest→ 额外检查tec.numPlayersUsing > 0与canUpgrade(IronChestType.WOOD)。 IronChestType.makeEntity(target.ordinal())反射建新 TE(不是new),目标 metadata 必须是isValidForCreativeMode()的合法值。System.arraycopy搬运min(新容量, 旧容量)个格子。dropContent(新容量, 旧TE, world, x, y, z)把装不下的剩余物品散落(Y 坐标+1,避免卡在原方块内)。- 继承
facing;目标透明时重算sortTopStacks();ticksSinceSync = -1强制重发描述包。 world.setTileEntity+world.setBlockMetadataWithNotify(target.ordinal(), 3)。stack.stackSize = 0,return true。
本升级器容量变化 27 格(108 → 135):新容量更大,不会掉出任何物品
NBT 字段
| 位置 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 升级器物品 | 无 | — | ItemChestChanger 不写也不读任何 NBT,无 setTagInfo / addInformation |
| 被升级的箱子 | Items |
NBTTagList |
物品栏,随 applyUpgradeItem 搬到新 TE;每个元素含 Slot byte |
| 被升级的箱子 | facing |
byte | 朝向,升级时原样继承 |
| 被升级的箱子 | dirtchest |
NBTTagByte(1) |
仅泥土箱子的掉落物上有此标记(由 adornItemDrop 写),与升级器无关 |
升级器物品永远不带 NBT。
相关条目
- 来源:
CRYSTAL→ 水晶箱子 - 目标:
DARKSTEEL→ 玄钢箱子 - Iron Chest 方块 -
applyUpgradeItem的宿主方块与 metadata 机制 - ItemIronChest - 箱子在物品栏中的形态
- 升级黑名单 -
blocklistUpgrades可按SOURCE:TARGET禁止本升级器