Ender Chest
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | enderstorage:enderChest |
| metadata | 0(高 4 位表示种类,低 12 位表示频率三元色) |
| TileEntity | codechicken.enderstorage.storage.item.TileEnderChest |
| 硬度 | 20 |
| 爆炸抗性 | 100 |
| 类别 | BlockContainer(带方块实体) |
| 渲染类型 | -1(TESR 自定义渲染) |
| 光照 | 来自附属 EnderItemStorage(默认 0) |
| 对应物品 | ItemEnderStorage(enderstorage:enderChest,hasSubtypes=true) |
注:源码侧只有一个注册块
BlockEnderStorage(注册名enderChest),通过metadata切换两个 TileEntity;本页对应metadata=0的 Ender Chest 分支。
功能
Ender Chest 是 EnderStorage 的物品库存分支方块。每个 Ender Chest 由一个 12-bit 频率值(freq,0–4095)和一个 owner(用户名 / "global")共同标识。同 (owner, freq, "item") 组合的所有方块共享同一份物品库存,并通过网络在跨维度、跨服务器间自动同步。
- 频率值由三个 4-bit 染料颜色分量(红绿蓝风格)编码:高 4 位 / 中 4 位 / 低 4 位。
- 默认频率(频率值 0)下三个颜色分量都是白色(
0xF),所有玩家共享一个公共库存(owner="global")。 - 三色频率任意一个分量被修改,库存就会切到不同的"频道"。
摆放要求
- 硬度 20,挖掘需要石镐或更高。
- 放置朝向:基于放置者
rotationYaw计算 0–3 的 rotation,旋转通过rotateBlock(扳手类工具)可切换 4 个方向。 - 自身对碰撞箱做
0..1的全方块覆盖,但用RayTracer子立方体拾取按钮(三个染料按钮 + 一个 knob 锁扣)。
数值
| 数值 | 值 |
|---|---|
| 频率范围 | 0–4095(12-bit,3 × 4-bit 颜色分量) |
| 库存容量 | 由 storage-size 配置决定(0=3×3=9 / 1=3×9=27 / 2=6×9=54) |
| 物品堆叠上限 | 64(getInventoryStackLimit) |
| 染料颜色 | 16 种标准 Minecraft 染料(EnderStorageRecipe.oreDictionaryNames) |
| 默认 owner | "global"(共享) |
染料面板(subHit 1–3)
| subHit | 位置 | 行为 |
|---|---|---|
| 1 | 顶面左侧按钮 | 调整频率 freq 的高 4-bit 颜色分量(红) |
| 2 | 顶面中间按钮 | 调整频率 freq 的中 4-bit 颜色分量(绿) |
| 3 | 顶面右侧按钮 | 调整频率 freq 的低 4-bit 颜色分量(蓝) |
- 仅在玩家手持任意染料(
Items.dye、EnderStorageDyeTool、或 OreDictionary 注册为dyeBlack/dyeRed/… 的物品)时生效。 - 单击 → 替换该分量为对应染料颜色(
~dye & 0xF),并消耗 1 个染料或调用EnderStorageDyeTool.expendToolUse。 - 频率修改后调用
tile.setFreq,内部重新装载EnderItemStorage,已存放的物品继续可见(同一个(owner, freq)库存保留)。
锁扣(subHit 4)
| 操作 | 行为 | 消耗 |
|---|---|---|
| 潜行 + 点击 | 把当前方块 owner 重置为 "global"(公开化) |
返回 1 个 personalItem(默认 1 颗钻石;可通过 personalItemID 配置) |
| 手持 personalItem + 点击 | 当前 owner 为 "global" 时,把 owner 设置为玩家 getCommandSenderName()(私有化) |
消耗 1 个 personalItem |
- 私有的 Ender Chest 死亡/被破坏时也会按 owner 留出对应库存;破坏时通过
getDrops按freq | meta<<12重建物品并写回ownertag。
合成(无 dreamcraft 时由 addNormalRecipies 注册)
bWb
OCO
bpb
b = Items.blaze_rodp = Items.ender_pearlO = Blocks.obsidianC = Blocks.chestW = Blocks.wool(meta 0–15,每个颜色对应一个频率三元组)- 输出:
enderstorage:enderChest(meta 包含对应颜色分量计算的freq)
EnderStorageRecipe 还支持在工作台中以"已放置的 Ender Chest + 染料行/列"的形式合成直接改色的 Ender Chest。
红石 / 比较器
hasComparatorInputOverride=true,getComparatorInputOverride返回Container.calcRedstoneFromInventory(this)(按库存填充率输出 0–15)。canConnectRedstone委托给TileEnderChest.redstoneInteraction()→false(Ender Chest 不接受红石交互)。
库存生命周期
- 打开 GUI 时(玩家右键或服务端命令),
EnderItemStorage.openInventory()会把openCount++,并在第一个玩家打开时广播open=true给附近玩家,让箱子盖开启动画播放。 - 服务端
updateEntity每 20 tick 同步一次打开数与朝向;客户端通过BlockEvent 1收到c_numOpen后驱动lidAngle动画与开关音效。 - 频率变更后
tile.setFreq会markDirty+worldObj.markBlockForUpdate并重新装载EnderItemStorage。
第三方 mod 集成
- CodeChickenCore(依赖):
codechicken.enderstorage全代码依赖codechicken.lib(配置、向量、PacketCustom、RayTracer 等)。 - NEI:
internal.NEIEnderStorageConfig通过codechicken.nei.api.API.hideItem在disableVanillaEnderChest=true时隐藏原版Blocks.ender_chest,并注册StorageStackStringifyHandler区分频率/owner。 EnderStorageDyeTool(API):其他 mod 可让自己的工具实现getDye()+expendToolUse()来直接当作染料点击 Ender Chest/Tank 的颜色按钮(BlockEnderStorage.onBlockActivatedsubHit 1–3 路径会优先调用EnderStorageDyeTool.expendToolUse,所以可以做出"无限染料"的工具)。- DreamCraft:
EnderStorageRecipe.init()检测到Loader.isModLoaded("dreamcraft")时跳过addNormalRecipies,沿用 GTNH 自带配方。
相关条目
- Ender Tank - 同方块的液体分支(
metadata=1) - ItemEnderStorage - 该方块的 ItemBlock 形态
- Ender Pouch - 可随身打开同
(owner, freq)物品库存的物品 - EnderStorage API - 频率→颜色换算、Plugin 注册接口
- 配置项 -
disable-vanilla、anarchy-mode等