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 重建物品并写回 owner tag。
合成(无 dreamcraft 时由 addNormalRecipies 注册)
b = Items.blaze_rod
p = Items.ender_pearl
O = Blocks.obsidian
C = Blocks.chest
W = 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.onBlockActivated subHit 1–3 路径会优先调用 EnderStorageDyeTool.expendToolUse,所以可以做出"无限染料"的工具)。
- DreamCraft:
EnderStorageRecipe.init() 检测到 Loader.isModLoaded("dreamcraft") 时跳过 addNormalRecipies,沿用 GTNH 自带配方。
相关条目