红石模式

基本信息

属性 值
类型 方块行为设置(每个 GTSU 方块实例独立保存,存入 NBT)
取值范围 mRedstoneMode 为 byte,redstoneModes = 7,即 0–6 共 7 种
存储 NBT 键 redstoneMode(byte)
修改方式 GUI 左上角红石按钮(GuiIconButton ID 0),无方块交互指令
模式名来源 IC2 本地化键 ic2.EUStorage.gui.mod.redstone<0..6>(GTSU 自身 lang 文件不含这些键)
生效对象 getOfferedEnergy() 的对外供电判定 + 比较器/红石行为

切换机制

ContainerGTSU 通过 IC2 网络事件切换模式(不是直接改字段):

  1. 客户端点击 GUI 的 GuiIconButton(ID 0,图标为红石物品,位于 xSize/2 + 10, ySize/2 + 7,20 × 20)
  2. GuiGTSU.actionPerformed 调用 IC2.network.get().initiateClientTileEntityEvent(container.base, 0)
  3. 服务端 TileEntityGTSU.onNetworkEvent(player, 0) 执行 mRedstoneMode++;若 >= redstoneModes(7)则回绕为 0
  4. 通过 IC2.platform.messagePlayer(player, getredstoneMode(), ...) 向玩家发送当前模式名

mRedstoneMode 与 mEnergy 都在 ContainerGTSU.getNetworkedFields() 中声明为网络同步字段。 onNetworkEvent 忽略传入的 event 参数,任何 event 值都会导致模式 +1。

7 种模式

模式 源码分支 触发条件(shouldEmitRedstone) 是否读取红石输入
0 无 case(默认 false) 永不触发 — 持续对外供电 否
1 case 1 mEnergy >= mMaxStorage - mOutput * 20(接近满仓时触发) 否
2 case 2 mEnergy > mOutput && mEnergy < mMaxStorage(半满区间) 否
3 case 3 (mEnergy > mOutput && mEnergy < mMaxStorage) || mEnergy < mOutput(除"刚好等于 mOutput"外的全部状态) 否
4 case 4 mEnergy < mOutput(电量不足一格输出量时触发) 否
5 无 case 恒不触发对外供电 — 仅当方块未被红石激活时才供电 是
6 无 case 恒不触发对外供电 — 仅当方块被红石激活且已满仓时才供电 是

模式 5 / 6 的红石输入在 updateEntity() 中采集:

if ((this.mRedstoneMode == 5) || (this.mRedstoneMode == 6)) {
    this.mHasRedstone = this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord);
}

getOfferedEnergy() 的完整判据:

if ((mEnergy >= mOutput)
    && ((mRedstoneMode != 5) || (!mHasRedstone))
    && ((mRedstoneMode != 6) || (!mHasRedstone) || (mEnergy >= mMaxStorage))) {
    return Math.min(mEnergy, mOutput);
}
return 0.0D;

模式逐项说明

模式 0 — 常开:默认模式,忽略红石输入,方块只要有电就持续对外供电(mEnergy >= mOutput)。 适合固定缓冲,不受外部红石控制。

模式 1 — 满仓预警:仅在"距满仓 ≤ mOutput * 20"时触发。 mOutput * 20 恰好是 1 秒(20 tick)的输出量,即"1 秒内灌满即预警"。 各阶阈值:Tier 1 为 2,560 EU、Tier 2 为 10,240 EU、…、Tier 8 为 41,943,040 EU。 适合驱动"即将满仓"的指示灯。

模式 2 — 区间放电:仅在 mOutput < mEnergy < mMaxStorage 时触发 — 满仓不触发、空仓不触发。 适合让指示器只在"正在用电"时亮起。

模式 3 — 反相放电:模式 2 的取反再加上低电平段,即除了"恰好 mEnergy == mOutput"这一瞬间外全部触发。 实用价值有限,属于早期实验性枚举值。

模式 4 — 低电平告警:仅在 mEnergy < mOutput(连一次输出都发不出)时触发 — 欠压告警。 适合接到机器的"缺电"指示上。

模式 5 — 充电使能(红石关断):被红石激活时完全停止对外供电,撤掉红石即恢复。 这是最常用的模式:红石信号一到就切断输出,可把 GTSU 当作"红石控制的 EU 闸门"。

模式 6 — 放电使能(红石开关闭满仓):被红石激活时只有满仓(mEnergy >= mMaxStorage)才供电,未满仓则不供电。 适合"充到满才允许放电"的受控释放。

数值

数值 值
模式总数 7(0–6)
回绕条件 mRedstoneMode >= 7 → 0
红石去抖计数 mRedstoneUpdateInhibit 初值 5,每次状态不一致递减,归零后允许更新
isProvidingWeakPower 返回值 isEmittingRedstone() ? 15 : 0,但 isEmittingRedstone() 硬编码返回 false
比较器输出 round(map(mEnergy, mMaxStorage, 15.0)) — 与红石模式无关,始终反映电量比例

⚠️ 源码层面的两个限制

  1. 方块永不输出红石弱充能:GTSUBlock.isProvidingWeakPower 调用 isEmittingRedstone(), 而 TileEntityGTSU.isEmittingRedstone() 的实现是 return false;(硬编码)。 所以 canProvidePower() 虽然返回 true,实际弱充能恒为 0。 模式的触发结果只反映在内部 mIsEmittingRedstone 字段(用于 setActive 与 notifyBlocksOfNeighborChange), 而 setActive 的结果只写入 NBT 的 active 键。要读取电量请用比较器(hasComparatorInputOverride 为 true)。
  2. 模式 5/6 的去抖不对称:shouldEmitRedstone() 的去抖逻辑在 case 1–4 之外对模式 0/5/6 只会走到 (mIsEmittingRedstone == shouldEmitRedstone) 分支,对这三种恒定值的模式不产生实际延迟。

关于聊天反馈

切换模式后模组通过 IC2 platform.messagePlayer 向玩家发送模式名。 GTSU 自带的 helper/PlayerChatHelper 是一个静态的聊天着色工具 (SendInfo/SendWarn/SendError/SendNeutral/SendNotifyPositive/SendNotifyNormal/SendNotifyWarning, 接受 ICommandSender 或 EntityPlayer,用 EnumChatFormatting 上色), 但模组内没有任何位置调用它。本模组不注册任何聊天指令。

相关条目