升级:钻石>水晶(Diamond to Crystal Chest Upgrade)

基本信息

属性 值
注册名 IronChest:diamondCrystalUpgrade(GameRegistry.registerItem(item, "diamondCrystalUpgrade"))
源码枚举常量 ChestChangerType.DIAMONDCRYSTAL
物品类 cpw.mods.ironchest.ItemChestChanger(全部 17 个升级器共用一个类,仅 type 字段不同)
未本地化名 item.ironchest:DIAMONDCRYSTAL.name
本地化名(zh_CN) 升级:钻石>水晶
枚举内描述名 Diamond to Crystal Chest Upgrade
物品图标 ironchest:diamondCrystalUpgrade → assets/ironchest/textures/items/diamondCrystalUpgrade.png
最大堆叠 1(setMaxStackSize(1))
耐久 无(未调用 setMaxDamage)
附魔适用 无(Item 基类默认)
创造栏 CreativeTabs.tabMisc
来源 DIAMOND → 钻石箱子
来源是否可被关闭 恒 true(isEnabled() 无该类型分支)
目标 CRYSTAL → 水晶箱子
目标是否可被关闭 恒 true(isEnabled() 无该类型分支)
容量变化 0 格(108 格 → 108 格)

功能

一次性把已放置的钻石箱子就地升级成水晶箱子:升级成功后 stack.stackSize = 0 消耗物品,箱子方块本身被替换(world.setBlock),物品栏内容原样搬运,装不下的部分散落在地上。

它不是合成用的中间物品,只有右键已放置的方块才会触发。

合成配方

符号含义(ChestChangerType.addRecipes):

符号 含义
m 目标箱子的材质:矿石字典 blockGlass
s 来源箱子的材质:矿石字典 gemDiamond
G Blocks.glass(原版玻璃方块)
O Blocks.obsidian(原版黑曜石方块)
GGG
GOG
GGG

产物 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 的完整流程:

  1. world.isRemote → 直接 return false(只在服务端执行)。
  2. 目标 TE 是 TileEntityIronChest → 调 applyUpgradeItem():numUsingPlayers > 0 则拒绝;canUpgrade(this.getType())(只比对 source)不匹配则拒绝。
  3. 目标 TE 是原版 TileEntityChest → 额外检查 tec.numPlayersUsing > 0 与 canUpgrade(IronChestType.WOOD)。
  4. IronChestType.makeEntity(target.ordinal()) 反射建新 TE(不是 new),目标 metadata 必须是 isValidForCreativeMode() 的合法值。
  5. System.arraycopy 搬运 min(新容量, 旧容量) 个格子。
  6. dropContent(新容量, 旧TE, world, x, y, z) 把装不下的剩余物品散落(Y 坐标 +1,避免卡在原方块内)。
  7. 继承 facing;目标透明时重算 sortTopStacks();ticksSinceSync = -1 强制重发描述包。
  8. world.setTileEntity + world.setBlockMetadataWithNotify(target.ordinal(), 3)。
  9. stack.stackSize = 0,return true。

本升级器容量变化 0 格(108 → 108):新容量更大,不会掉出任何物品

NBT 字段

位置 字段 类型 说明
升级器物品 无 — ItemChestChanger 不写也不读任何 NBT,无 setTagInfo / addInformation
被升级的箱子 Items NBTTagList 物品栏,随 applyUpgradeItem 搬到新 TE;每个元素含 Slot byte
被升级的箱子 facing byte 朝向,升级时原样继承
被升级的箱子 dirtchest NBTTagByte(1) 仅泥土箱子的掉落物上有此标记(由 adornItemDrop 写),与升级器无关

升级器物品永远不带 NBT。

相关条目