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 注册)

bWb
OCO
bpb
  • 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 自带配方。

相关条目