红石模式
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 方块行为设置(每个 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 网络事件切换模式(不是直接改字段):
- 客户端点击 GUI 的
GuiIconButton(ID 0,图标为红石物品,位于xSize/2 + 10,ySize/2 + 7,20 × 20) GuiGTSU.actionPerformed调用IC2.network.get().initiateClientTileEntityEvent(container.base, 0)- 服务端
TileEntityGTSU.onNetworkEvent(player, 0)执行mRedstoneMode++;若>= redstoneModes(7)则回绕为 0 - 通过
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)) — 与红石模式无关,始终反映电量比例 |
⚠️ 源码层面的两个限制
- 方块永不输出红石弱充能:
GTSUBlock.isProvidingWeakPower调用isEmittingRedstone(), 而TileEntityGTSU.isEmittingRedstone()的实现是return false;(硬编码)。 所以canProvidePower()虽然返回true,实际弱充能恒为 0。 模式的触发结果只反映在内部mIsEmittingRedstone字段(用于setActive与notifyBlocksOfNeighborChange), 而setActive的结果只写入 NBT 的active键。要读取电量请用比较器(hasComparatorInputOverride为 true)。 - 模式 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 上色),
但模组内没有任何位置调用它。本模组不注册任何聊天指令。
相关条目
- GTSU 能量储存单元 - 模式所在方块,含
getOfferedEnergy与 GUI 布局 - GTSU 储存单元物品形态 - 放置后保留电量的物品形态