-
Notifications
You must be signed in to change notification settings - Fork 2
Wireless Energy Monitor_CN
无线能量监视器是一台 LV 等级的单方块机器,实时显示无线电网能量状态(每 5 秒采样一次)。它是一台纯信息设备,不消耗也不产生能量,仅用于电网监控与红石逻辑输出。
- 等级:LV(Tier 1,外壳贴图 MACHINE_CASINGS[1])
- 纯信息设备:不消耗也不产生能量
- 实时显示电网容量、平均 EU/t、实时 EU/t
- 具备高级红石控制(5 模式 + 3 锚定模式)
- 支持连接 Nuclear Control 2 工业信息屏
- 正面贴图动态切换:根据红石输出叠加 ON/OFF 贴图
- 禁用物品栏:纯展示设备,无物品交互
在工作台中按以下 3×3 矩阵合成无线能量监视器:
| 槽位 | 第 1 列 | 第 2 列 | 第 3 列 |
|---|---|---|---|
| 第 1 行 | LV 接收器 | 钢板 | LV 接收器 |
| 第 2 行 | LV 接收器 | LV 机械外壳 | LV 接收器 |
| 第 3 行 | 钢螺丝 | 钢板 | 钢螺丝 |
| 材料 | 数量 | 来源 |
|---|---|---|
| LV 接收器 (Sensor_LV) | 4 | GT 工作台合成 |
| 钢板 (plateSteel) | 2 | GT 板材成型 |
| LV 机械外壳 (Hull_LV) | 1 | GT 工作台合成 |
| 钢螺丝 (screwSteel) | 2 | GT 螺丝成型 |
**GUI 尺寸:**346 × 181 像素。GUI 基于 ModularUI 2 框架,采用 Flow 列布局,共 10 行(含标题行),从上到下依次排列:
| 行号 | 内容 | 控件类型 |
|---|---|---|
| 1 | 标题行(显示模式切换按钮) | 文本 + ButtonWidget |
| 2 | 模式文本(当前显示模式说明) | 纯文本 |
| 3 | 电网容量 + 锚定模式 1 切换按钮 | 文本 + ButtonWidget |
| 4 | 电网状态 + 锚定模式 2 切换按钮 | 文本 + ButtonWidget |
| 5 | 实时电网状态 + 锚定模式 3 切换按钮 | 文本 + ButtonWidget |
| 6 | 红石模式 + 切换按钮 | 文本 + ButtonWidget |
| 7 | 红石输出状态 | 纯文本 |
| 8 | 红石模式说明 | 纯文本 |
| 9 | 参数 1 输入框 + 4 个调整按钮 | ScientificTextFieldWidget + 4 ButtonWidget |
| 10 | 参数 2 输入框 + 4 个调整按钮 | ScientificTextFieldWidget + 4 ButtonWidget |
参数 1 / 参数 2 输入框尺寸为 200 × 17 像素,使用 ScientificTextFieldWidget(继承 TextFieldWidget)。在科学计数模式下,失焦后自动格式化为 1.5E6 形式;用户可输入 1E6、1.5E5 等科学计数法字符串(由 EvalEx 解析),或输入常规数值(失焦后自动转换)。实际值以 long 存储于 LongSyncValue,科学计数法仅用于显示。
每个参数行右侧有 4 个调整按钮,动态步长基于参数最高位:
| 按钮 | 符号 | 行为 |
|---|---|---|
| 减最高位 | - | 从参数最高位减 1 |
| 加最高位 | + | 从参数最高位加 1 |
| 乘 10 | × | 参数 ×10 |
| 除 10 | ÷ | 参数 ÷10 |
监视器支持 3 种显示模式,通过 GUI 标题行按钮切换:
| 模式值 | 名称 | 显示示例 |
|---|---|---|
| 0 | 常规计数 | 1,234,567 EU |
| 1 | 科学计数 | 1.23×10^6 EU |
| 2 | 千位计数 | 1.23M EU |
精度差异:
ScientificTextFieldWidget的科学计数用 3 位小数(%.3f,如 1.234×10^6),用于输入框内部数值格式化(保留更高精度便于用户编辑);FormatUtil.formatScientific用 2 位小数(%.2f,如 1.23×10^6),用于 GUI 显示文本。
锚定模式决定红石判定基于哪个数值。可通过 GUI 中 3 个切换按钮(电网容量 / 电网状态 / 实时电网状态行)切换,setAnchorMode 钳制到 [0, 2]:
| 模式值 | 锚定对象 | 数据类型 | 取值方式 |
|---|---|---|---|
| 0 | 电网电量 | BigInteger |
WirelessNetworkManager.getUserEU(UUID) 直接读取 |
| 1 | 平均 EU/t | double → long |
Math.round(euPerTick) 四舍五入(300s 窗口首末两点斜率) |
| 2 | 实时 EU/t | double → long |
Math.round(realtimeEuPerTick) 四舍五入(最近 2 个样本斜率) |
**说明:**红石判定基于锚定值。切换锚定模式可让红石以电网容量或 EU/t 状态为指标,适用于不同场景(如"电量低于阈值时报警" vs "EU/t 长期负值时报警")。
监视器支持 5 种红石输出模式,通过 GUI 红石模式按钮切换。输出强度为 15(满强)或 0,红石检测间隔 2 ticks(0.1 秒),独立时间戳 lastRedstoneCheckTick,保证红石快速响应。
| 模式值 | 名称 | 行为 |
|---|---|---|
| 0 | 关闭 | 不输出红石信号 |
| 1 | 高电平 | 锚定值 > 参数 1 时输出 15 |
| 2 | 低电平 | 锚定值 < 参数 1 时输出 15 |
| 3 | 正向滞后 | 锚定值 > 参数 1 时输出 15;必须 < 参数 2 才取消输出 |
| 4 | 反向滞后 | 锚定值 < 参数 2 时输出 15;必须 > 参数 1 才取消输出 |
- 参数 1 / 参数 2 允许为负数
- 输出通过
getGeneralRS(ForgeDirection)实现,allowGeneralRedstoneOutput返回 true - 状态变化时调用
setOutputRedstoneSignal更新 6 面 +notifyBlocksOfNeighborChange通知周围 - 滞后模式(3/4)共享同一滞后状态机:
getGeneralRS与updateRedstoneOutput使用一致逻辑
| 参数 | 数值 | 说明 |
|---|---|---|
| 采样间隔 | 100 ticks(5 秒) | UI 显示与 EU/t 计算频率 |
| 窗口时长 | 300 秒 | 61 点 FIFO(1 首检 + 60 次间隔检测) |
| 红石检测间隔 | 2 ticks(0.1 秒) | 独立时间戳,保证快速响应 |
| 重载延迟 | 600 ticks(30 秒) | 长时重载后的红石缓冲期 |
| BigDecimal 精度 | 6 位小数,HALF_UP | EU/t 斜率计算的精确除法 |
| 数据集容量 | 61 | EUDataSet.CAPACITY 常量 |
| 长期静默阈值 | 6000 ticks(300 秒) | LONG_SILENT_THRESHOLD_TICKS |
电网状态显示采用四分支逻辑(与便携 HUD 共享):
| 条件 | 显示文本 | 颜色 |
|---|---|---|
| dataSet.size() < 2 | 暂无变化 / 计算中 | 默认色 |
| eut == 0(首末两点 EU 完全相等) | 0 EU/t(静默) | 灰色 §7 |
| 0 < | eut | < 1 |
| eut | >= 1 |
当电网静默(所有采样值相同)持续 ≥ 300 秒时:
- 状态标签从"静默"切换为"长期静默"(颜色变为深灰 §8)
- 数据集压缩为 2 个数据点(首末),节省内存
-
longTermSilentNBT 标志持久化 - 下次采样若数值不同,保留末位点作为新数据集起点(size=2,立即可计算 eut)
当 redstoneReloadDelay > 0(长时卸载重载后的 30 秒红石延迟期)时,电网状态显示"重载计算中 - 红石逻辑维持"(红色 §c),优先级高于正常计算结果。此期间红石逻辑维持不变,避免误切换。
监视器同时计算两种 EU/t:
| 类型 | 计算方法 | 样本范围 | 特点 |
|---|---|---|---|
| 平均 EU/t | EUDataSet.calculateEUT() |
首末两点(300s 窗口) | 反映长期趋势,稳定 |
| 实时 EU/t | EUDataSet.calculateRecentEUT() |
最近 2 个样本(5s) | 反映瞬时变化,灵敏 |
两者均基于斜率法 (newest.value - oldest.value) / (newest.tick - oldest.tick),使用 BigDecimal 精确除法(6 位小数,HALF_UP),避免 BigInteger 转 double 的大数精度损失。
EU/t 会转换为 GT 风格的功率等级显示,格式为 XA TIER,例如 2A HV(2 安培 高压)。系统自动升档使电流 ≤ 4A:
ULV(8) / LV(32) / MV(128) / HV(512) / EV(2048) / IV(8192) /
LuV(32768) / ZPM(131072) / UV(524288) / UHV(2097152) / ... / MAX(2147483647)
MTEWirelessEnergyMonitor 实现了 Nuclear Control 2 的 IMetricsExporter 接口,可作为 NC2 传感器卡的信息源:
-
getInfoData():返回 4 条信息:
- 标题(监视器名称)
- 当前能量(电网容量)
- 平均 EU/t 状态
- 实时 EU/t 状态
- reportMetrics():支持跨维度监测,NC2 信息屏可远程读取监视器数据
- 可作为 NC2 工业信息屏的传感器卡信息源
监视器针对短时与长时重载采用不同策略,确保红石输出与数据连续性:
- 数据集保留,计算直接续传
- 斜率误差 ≤ 3.3%(可接受)
- 无红石缓冲
- 数据集清空,触发冷启动
- 启用 30 秒红石缓冲(
redstoneReloadDelay = 600 ticks)维持红石输出 - 延迟期内跳过
updateRedstoneOutput,依赖mSidedRedstone[]持久化持续输出缓存信号 - 延迟期结束后恢复正常计算与红石判定
**gap 检测:**onPostTick 开头(
dataSet.isEmpty()短路之前)执行:lastCheckTick > 0 && gap > 200L(>10 秒)触发长时重载分支。
监视器所有关键状态均持久化到 NBT,退出重进后从 NBT 恢复:
| 键 | 类型 | 含义 |
|---|---|---|
| displayMode | int | 显示模式(0=常规,1=科学,2=千位) |
| ownerUUID | String | 拥有者玩家 UUID |
| euPerTick | double | 平均 EU/t 计算状态 |
| measurementHistory | Compound | 测量历史(EUDataSet 序列化,含 count + m{i}(tick + value) + longTermSilent) |
| redstoneMode | int | 红石模式(0-4) |
| anchorMode | int | 锚定模式(0=电网电量,1=平均 EU/t,2=实时 EU/t) |
| param1Value | String | 参数 1(BigInteger 字符串) |
| param2Value | String | 参数 2(BigInteger 字符串) |
| redstoneOutput | boolean | 红石输出状态 |
| lastRedstoneCheckTick | long | 红石检测独立时间戳 |
| lastCheckTick | long | UI / EU/t 检测时间戳 |
| realtimeEuPerTick | double | 实时 EU/t 计算状态 |
| longTermSilent | byte | 长期静默标志(嵌入 measurementHistory Compound) |
**加载行为:**加载时
redstoneOutput会根据当前电网能量与参数重新计算(采用滞后逻辑:加载时视为未输出状态,首次updateRedstoneOutput重新计算),并触发issueTextureUpdate刷新贴图。