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 按以下优先级执行流体交换:

  1. 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、不改物品。
  2. FluidContainerRegistry 普通流体容器(水桶、各类 mod 桶/瓶):
    • handleFCFullToEmpty:识别 FluidContainerRegistry.getFluidForFilledItem,取出满容器 → fill(null, offered, true) → 返还空容器。创造模式仅改 Tank。
    • handleFCEmptyToFull:从 Tank 内取 unit mB(来自 fillFluidContainer 预览)→ drain(null, unit, true) → 返还满容器。
  3. 创造模式优先规则:所有路径对创造模式玩家只改 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_rod
  • p = Items.ender_pearl
  • O = Blocks.obsidian
  • C = Items.cauldron
  • W = 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") 时跳过内置合成。

相关条目