Ender Tank
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | enderstorage:enderChest |
| metadata | 1(高 4 位表示种类,低 12 位表示频率三元色) |
| TileEntity | codechicken.enderstorage.storage.liquid.TileEnderTank |
| 硬度 | 20 |
| 爆炸抗性 | 100 |
| 容量 | EnderStorage.enderTankSize * 1000 mB(默认 256000 mB = 256 buckets) |
| 流体接口 | IFluidHandler(Forge 流体 API) |
| 渲染类型 | -1(TESR 自定义渲染) |
| 类别 | BlockContainer(带方块实体) |
注:源码侧 Ender Tank 与 Ender Chest 共用同一个注册块
BlockEnderStorage(注册名enderChest),通过metadata切换两个 TileEntity;本页对应metadata=1的 Ender Tank 分支。
功能
Ender Tank 是 EnderStorage 的液体分支方块。和 Ender Chest 一样以 (owner, freq, "liquid") 三元组标识,同组所有 Ender Tank 共享同一份流体库存。Ender Tank 复用了 Ender Chest 的三色频率机制:
- 频率值由三个 4-bit 染料颜色分量编码(高/中/低)。
owner="global"+ 频率值 0 = 默认公共库存。- 频率变更后调用
tile.setFreq,触发reloadStorage()切换EnderLiquidStorage实例。
摆放要求
- 硬度 20,挖掘需要石镐或更高。
- 朝向(rotation 0–3)由
TileEnderTank.onPlaced根据entity.rotationYaw计算,扳手类工具rotateBlock可切换 4 个方向。 - 实际碰撞与渲染子立方体由
addTraceableCuboids给出:主方块 (subHit=0)、三个染料按钮 (subHit=1..3,复用selection_button经过Scale + Translation)、压力阀盖 (subHit=4)。 - 压力表(
PressureState)根据rotation选择quarterRotations[rotation ^ 2]应用到子立方体上。
染料面板(subHit 1–3)
与 Ender Chest 行为一致:BlockEnderStorage.onBlockActivated 在 subHit 1–3 时检测手持物品的染料颜色 → 修改 freq 对应分量 → 触发 setFreq 重载 EnderLiquidStorage。消耗规则同上:
Items.dye或 OreDictionary 注册的dyeBlack/dyeRed/… → 扣 1。EnderStorageDyeTool→ 调用expendToolUse()。- 创造模式不消耗。
锁扣(subHit 4)
| 操作 | 行为 |
|---|---|
| 潜行 + 点击(owner 非 global) | 把 owner 重置为 "global",返回 1 个 personalItem(默认钻石) |
| 手持 personalItem + 点击 | 当 owner 为 "global" 时把 owner 设置为玩家名,消耗 1 个 personalItem |
| 右键点击(activate subHit=4) | 切换 pressure_state.invert_redstone 标志,并写入 NBT;不会发送红石信号 |
注意:Tank 上的 subHit 4 在
BlockEnderStorage.onBlockActivated是 owner/lock 路径,但在TileEnderTank.activate(player, subHit=4)中则变为"反相红石信号"按钮。两者优先级由方块activate的返回值控制——BlockEnderStorage.onBlockActivated在命中 subHit 1–3 染色路径后会return tile.activate(...),所以染色与 owner 调整由方块优先响应,只有非染料/无 personalItem 的右键点击 subHit 4才会落到TileEnderTank.activate的反相逻辑。
数值
| 数值 | 值 |
|---|---|
| 流体容量 | EnderStorage.enderTankSize * 1000 mB(默认 256000 mB) |
| 频率范围 | 0–4095(与 Ender Chest 共用 12-bit) |
| 红石信号 | 接受外部红石输入;可被玩家手动反相 |
| 默认 owner | "global" |
| 出口压力(自动) | 100 mB/tick(ejectLiquid 内 drain(null, 100, false)) |
流体交互(IFCI + 普通容器)
右键点击时 TileEnderTank.activate 按以下优先级执行流体交换:
IFluidContainerItem(如 GT 单元、各 mod 的 IFCI 桶/瓶):handleIFCI- 单元格
cell.stackSize > 1时复制stackSize=1的目标格进行模拟,剩余的留在原栈。 - 单元格 → Tank:模拟
drain(target, wantMove, false),验证可能后真实排空单元格 →fill(null, drained, true);若来自堆叠拆分,会把已消耗的 1 格剩余返还给玩家。 - Tank → 单元格:模拟
cont.fill(target, ...),然后drain(null, canFill, true),剩余返回 Tank;创造模式下仅改 Tank、不改物品。
- 单元格
FluidContainerRegistry普通流体容器(水桶、各类 mod 桶/瓶):handleFCFullToEmpty:识别FluidContainerRegistry.getFluidForFilledItem,取出满容器 →fill(null, offered, true)→ 返还空容器。创造模式仅改 Tank。handleFCEmptyToFull:从 Tank 内取unitmB(来自fillFluidContainer预览)→drain(null, unit, true)→ 返还满容器。
- 创造模式优先规则:所有路径对创造模式玩家只改 Tank,不消耗/给予物品。
完成后调用 syncInv(player)(MP 下 detectAndSendChanges + sendContainerToPlayer)立即同步客户端 UI。
红石 / 比较器 / 自动输出
| 触发 | 行为 |
|---|---|
isBlockIndirectlyGettingPowered(x, y, z) != invert_redstone |
PressureState.a_pressure=true → 客户端播放表针旋转动画(approachLinear / approachExp),服务端尝试向外输出液体 |
客户端 a_rotate |
用 MathHelper.approachExp(a_rotate, approachRotate(), 0.5, 20) 收敛到 -90° 或 +90° |
ejectLiquid()(服务端每 tick) |
遍历 ForgeDirection.VALID_DIRECTIONS 找到 IFluidHandler,先模拟 drain(null, 100, false) 取得 liquid,调用 c.fill(opposite, liquid, true),按 qty > 0 真实排空 |
| 比较器 | tank.amount * 14 / capacity + (amount > 0 ? 1 : 0)(满度 0–15) |
canConnectRedstone 始终返回 true(TileEnderTank.redstoneInteraction());hasComparatorInputOverride=true。
流体亮度
getLightValue 使用 FluidUtils.getLuminosity(liquid, amount/16D),因此装入发光流体(lava、glowstone 等)后方块会按流体亮度发光。
合成(无 dreamcraft 时由 addNormalRecipies 注册)
bWb
OCO
bpb
b = Items.blaze_rodp = Items.ender_pearlO = Blocks.obsidianC = Items.cauldronW = Blocks.wool(meta 0–15,每个颜色对应一个频率三元组)- 输出:
enderstorage:enderChest,meta =1 << 12 | getFreqFromColours(i, i, i)
第三方 mod 集成
- CodeChickenCore(依赖):
codechicken.core.fluid.FluidUtils用于 IFCI 流体容量单位换算。 EnderStorageDyeTool(API):与 Ender Chest 共享同一套染料按钮逻辑。- FluidContainerRegistry(Forge):自动支持所有注册了 Forge 流体容器协议的 mod 桶/瓶。
IFluidContainerItem(Forge):自动支持所有实现 IFCI 接口的 mod 单元格/可堆叠流体物品。- NEI:
NEIEnderStorageConfig.registerStackStringifyHandler同样作用于 Ender Tank 物品形态(meta=1分支),让 NEI 区分频率/owner。 - DreamCraft:
EnderStorageRecipe.init()检测到Loader.isModLoaded("dreamcraft")时跳过内置合成。
相关条目
- Ender Chest - 同方块的物品分支(
metadata=0) - ItemEnderStorage - 该方块的 ItemBlock 形态
- EnderStorage API - 频率→颜色换算、Plugin 注册接口
- 配置项 -
enderTankSize等 - /enderstorage 命令 - OP 远程打开任意
(owner, freq, "item")库存