盖板系统
概述
盖板(Cover)是 GT5-Unofficial 附着在机器表面上的功能模块,全仓共 65 个类 / 8057 行代码(gregtech/common/covers/),覆盖自动化搬运、机器控制、探测监控、无线通信、装饰伪装五大类功能。
代码基线:GT5U 5.09.54.183(Minecraft 1.7.10)。
[!WARNING] 本版本不存在
CoverFilter/PileFilter/SortationFilter/TagFilter等多类型过滤器框架,也不存在 Muffler、Optical Emitter/Receiver 等盖板。过滤器是「单槽位 + 谓词」模型,详见下文。
盖板与电缆:两层不同的东西
盖板容易被和电缆混淆,但它们是完全独立的两个系统层:
| 维度 | 盖板 Cover | 电缆 MTECable |
|---|---|---|
| 基类 | Cover |
MetaPipeEntity → BaseMetaPipeEntity |
| 数量 | 每面 1 个(6 bit 掩码 validCoversMask) |
每面可多条,按 mThickNess 决定并排数 |
| 作用 | 自动化 / 信号 / 装饰 | EU 输运与配电 |
| 关键字段 | coverID + NBT |
mThickNess、mCableLossPerMeter、mAmperage、mVoltage、mCanShock |
盖板分类
| 家族 | 代表类 | 行为 |
|---|---|---|
| 传送带 | CoverConveyor |
物品自动进出,14 个电压等级 |
| 机械臂 | CoverArm |
按指定槽位号搬运物品,5 个等级 |
| 过滤器 | CoverItemFilter / CoverFluidfilter |
白/黑名单拦截 |
| 流体搬运 | CoverFluidRegulator / CoverFluidLimiter / CoverPump / CoverDrain / CoverSteamRegulator / CoverSteamValve |
定量流体搬运 |
| 机器控制 | CoverControlsWork / CoverShutter |
开关机器、阻断交互 |
| 探测监控 | CoverDoesWork / CoverItemMeter / CoverLiquidMeter / CoverEUMeter / CoverPlayerDetector / CoverNeedMaintainance |
输出红石信号 |
| 通信无线 | CoverRedstoneWirelessBase 族 / CoverWirelessController / CoverEnergyWireless |
跨区块跨维度信号与供能 |
| 装饰伪装 | CoverDecorative(含 Cover_Screen)/ CoverFacadeBase |
纯外观或 CTM 伪装 |
| 能源环境 | CoverSolarPanel / CoverVent |
发电、冷却、加速 |
物品过滤器(单槽位模型)
只有 1 个槽位,只能放 1 个物品模板(CoverItemFilter.java:40):
ItemStackHandler filter = new LimitingItemStackHandler(1, 1);
两个注册物品:ItemFilter_Export(导出)与 ItemFilter_Import(导入)。它们是两个独立物品,不是同一盖板的两个模式。
白/黑名单的命名陷阱
源码里的 mWhitelist 变量是反的,注释直言:
/** This variable is extremely confusing... mWhitelist == false means whitelist mode */
private boolean mWhitelist;
玩家实际看到的由 getFilterType() 决定:mWhitelist ? BLACKLIST : WHITELIST。默认 false = 白名单。
配置方式
- 手持物品右键封面 → 设为模板;空手右键清空
- 螺丝刀点击 → 切换白/黑名单
- 硬上限:每次执行最多 64 组,且
getMinimumTickRate()=1(每 tick 一次)
流体过滤器(8 种模式)
配置压在一个 byte 的低 3 位,由三个正交维度编码(CoverFluidfilter.java:38-46):
| 值 | 含义 |
|---|---|
| 0 | 输入=仅该流体,输出=禁止 |
| 1 | 输入=非该流体,输出=禁止 |
| 2 | 输入=仅该流体,输出=任意 |
| 3 | 输入=非该流体,输出=任意 |
| 4 | 输入=禁止,输出=仅该流体 |
| 5 | 输入=禁止,输出=非该流体 |
| 6 | 输入=任意,输出=仅该流体 |
| 7 | 输入=任意,输出=非该流体 |
bit0 = 白/黑名单,bit1 = BlockMode,bit2 = 输入/输出方向。
Tick 速率与调节
驱动循环在 CoverableTileEntity.tickCoverAtSide(),所有机器共享同一全局 tick 计数器(MinecraftServer.getServer().getTickCounter())。
实际周期 = getMinimumTickRate() + tickRateAddition,其中:
MAX_TICK_RATE_ADDITION = 1200(60 秒),钳制在[0, 1200]- 调节步长:当前 20 tick 时为 20,<20 时为 5,>20 时为 20
- 用锤类工具调节,潜行点击反向
allowsTickRateAddition()返回false的盖板禁止调节(CoverChest、CoverEnergyWireless)
各盖板基础 tick:Conveyor LV/MV=100、HV=20、EV=4、IV+=1;Arm LV=400、MV=100、HV=20、EV=4、IV=1;CoverNeedMaintainance 60;CoverPlayerDetector 20;CoverVent 100。
传送带速率表
CoverConveyor 构造参数为 (tickRate, maxStacks, itemsPerStack):
| 等级 | tick | stacks/次 | items/stack | items/秒 |
|---|---|---|---|---|
| LV | 100 | 1 | 16 | 3.2 |
| MV | 100 | 1 | 64 | 12.8 |
| HV | 20 | 1 | 64 | 64 |
| EV | 4 | 1 | 64 | 320 |
| IV | 1 | 1 | 64 | 1,280 |
| LuV | 1 | 4 | 64 | 5,120 |
| ZPM | 1 | 16 | 64 | 20,480 |
| UV | 1 | 16 | 256 | 81,920 |
| UHV | 1 | 16 | 1024 | 327,680 |
| UEV | 1 | 16 | 4096 | — |
| UIV | 1 | 16 | 16384 | — |
| UMV | 1 | 16 | 65536 | — |
| UXV | 1 | 16 | 262144 | — |
| MAX | 1 | 16 | Integer.MAX_VALUE |
无实际上限 |
MAX 级的 Integer.MAX_VALUE 被直接传入、没有任何硬性钳制。
方向与条件(12 种状态)
CoverIOBase 用 coverData 位域表达:coverData % 6 的 0-1 = ALWAYS,2-3 = CONDITIONAL,4-5 = INVERTED;>= 6 叠加 BlockMode.ALLOW。螺丝刀点击循环切换。
CONDITIONAL/INVERTED 仅当宿主实现 IMachineProgress 时才检查 isAllowedToWork()。
能量:盖板几乎不耗电
没有任何盖板实现能量扣除。 唯一的「消耗」:
CoverPlayerDetector:若机器存有 ≥20 EU,每 tick 扣除 20 EU,把探测半径从 8 扩到 32(CoverPlayerDetector.java:57-62)。无电则回落半径 8。
CoverEnergyWireless 是供能而非耗能:
每操作传输能量 = 2 × 电压 × 间隔 tick
间隔 = 100L × 20L = 2000 tick = 100 秒
14 个电压等级(LV…MAX),getMinimumTickRate()=20,但实际只在 aTimer % 2000 == 0 拉取,且会先检查储能是否已满。
值得注意的特殊盖板
CoverChest 箱子盖 — 每槽硬性只能放 1 个
stackSizeLimit = 1 硬编码(CoverChest.java:32)。三级槽位数 9 / 12 / 15。getMinimumTickRate() 为 firstTick ? 1 : 0——只在读档后首 tick 跑一次做槽位迁移。移除外壳会散落全部物品。
CoverSolarPanel 太阳能板 — 效率可累积,需水桶清洗
coverNum(效率 0-100)每 24000 tick(24 分钟)尝试 +1。发电量 = (100 - coverNum) × 电压 / 100,仅在白天且不下雨时注入。
- 下雨时
coverNum被钳到 30 - 雷暴时钳到 20
- 玩家用水桶右键可清除积累的污垢(水桶换成空桶)
11 个等级:1 / 8 / 32 / 128 / 512 / 2048 / 8192 / 32768 / 131072 / 524288。
CoverVent 反应堆通风盖 — 会真正改变机器行为
① 把机器内 ic2hotcoolant 转成冷却液;② 调用 coverable.increaseProgress(mEfficiency) 直接加速机器进度——但要求前方方块无碰撞箱(即能直视天空/空气)。
冷却概率:
| 环境 | 钻石 | 金·超频 | 基础 |
|---|---|---|---|
| 水中 | 100% | 50% | 25% |
| 空气中 | 25% | 12.5% | 0% |
CoverPlayerDetector 玩家侦测器
3 种模式:ANY_PLAYER / 别人 / 自己(coverData 1=别人、2=自己)。注意它只遍历 EntityPlayerMP,客户端假玩家不计入。
CoverNeedMaintainance 维护侦测 — 14 态
前 10 态是「问题数阈值」,后 4 态是转子寿命预测:
- 态 10:转子耐久 ≥ 80% 即报警
- 态 11/12/13:按公式预测
mExpectedDamage = round(min(EUt/damageFactorLow, EUt^damageFactorHigh)) - 判为转子的条件是
itemDamage >= 170 && <= 176
输出同时写到 coverSide 与其对面。
CoverShutter — 4 态但两套语义
态 0-1 按机器 isAllowedToWork() 开关;态 2-3 变成纯粹的方向性闸门:态 2 = 只允许「出」,态 3 = 只允许「入」。
CoverControlsWork 机器控制器 — 含「安全模式」
RedstoneCondition 3 态 × 安全模式(coverData > 2)。安全模式会捕获 machine.wasShutdown() && getLastShutDownReason().wasCritical() 并永久自锁到 DISABLED,需手动复位。
CoverFluidRegulator 流体调节器
getMaxSpeed() = mTransferRate × tickRate
TICK_RATE_MIN = 1 / TICK_RATE_MAX = 2048
螺丝刀调速步长 16(潜行 256),右半面加、左半面减。速度符号决定方向:speed >= 0 = EXPORT。14 个等级从 LV 的 32 到 MAX 的 268435456。
CoverMetricsTransmitter — 做成盖板只为限流
源码注释直言:「The only reason this is a cover is to artificially limit the number of total machines that transmit this data, for performance reasons.」用随机 UUID 作频率,跨维度传给 Nuclear Control。
放置规则
- 任意 6 面均可,没有 1x1 限制,单个机器最多 6 个盖板
- 多方块控制器禁止正面盖板(
MTEMultiBlockBase.allowCoverOnSide()),侧面/背面允许 - 放置:潜行 + 手持盖板右键
- 移除:潜行 + 撬棍右键
- 替换:未实现直接覆盖——已有盖板的面会被守卫拦截,必须先拆再装
- 配置 GUI:空手潜行右键
- 原始方块(非 MTE)默认不允许盖板,只有
CoverNone、装饰盖板、CoverChest_*三级放开
玩家如何规划
- 物流瓶颈优先升级传送带等级:LV 到 IV 之间速率差 400 倍,但成本差距远小于吞吐收益。
- 过滤器只有 1 个槽位,复杂的物料筛选需要多个过滤器盖板或改用多方块机器的输入总线。
- 别用太阳能板当主电源:默认会缓慢累积污垢导致效率下降,必须定期用水桶清洗。
CoverVent加速需要开放天空,盖在墙里的反应堆通风盖不会加速。- 多方块正面不能放盖板,需要在正面交互时留空。