GT5U 红石电路
基本信息
gregtech/common/redstonecircuits/ 下 9 个电路行为,
向 GregTechAPI.sCircuitryBehaviors(ConcurrentHashMap<Integer, CircuitryBehavior>)
注册,入口 gregtech/loaders/preload/LoaderCircuitBehaviors.java。
| 常量 | index | 类 | 名称(en_US) |
|---|---|---|---|
| — | 0 | CircuitTimer |
Timer |
| — | 1 | CircuitBasicLogic |
Basic Logic |
| — | 2 | CircuitRepeater |
(无独立名称,见下) |
| — | 3 | CircuitPulser |
(无独立名称) |
| — | 4 | CircuitRedstoneMeter |
(无独立名称) |
| — | 8 | CircuitRandomizer |
Randomizer |
| — | 16 | CircuitCombinationLock |
Combination Lock |
| — | 17 | CircuitBitAnd |
Hardcode Bit-AND |
| — | 18 | CircuitEquals |
Equals |
9 个电路 = 9 个不连续 index(5–7 与 9–15 空缺)——
index 是协议值,不是数组下标。
注册写法是 new CircuitXxx(<index>),index 由构造器参数传入
(CircuitryBehavior.java:30-31 内
GregTechAPI.sCircuitryBehaviors.put(aIndex, this)),
所以 index 写在 LoaderCircuitBehaviors 的调用处而不是类里
(LoaderCircuitBehaviors.java:20-30,按上表顺序声明)。
Basic Logic 的 7 种门(index 1)
CircuitBasicLogic 一个类覆盖 7 个门,靠 aCircuitData[0] 选择:
| op | 门 |
|---|---|
| 0 | OR |
| 1 | NOR |
| 2 | XOR |
| 3 | XNOR |
| 4 | AND |
| 5 | NAND |
| 6 | INVERT |
validateParameters 对全部 7 个 op 都做 aCircuitData[0] = min(max(0, x), 6) 夹取。
7 个门在 en_US.lang 里各有一条 data_description(bit_ 前缀的 7 条是
BIT_OR…BIT_INVERT,属于另一组)。
逐电路要点
| 类 | onTick 语义 | validateParameters 夹取 |
|---|---|---|
CircuitBasicLogic |
7 门二输入 | [0] ∈ 0..6 |
CircuitRepeater |
0→1 时长 aCircuitData[0] tick;1→0 时长 [1] tick |
[0]、[1] ≥ 1 |
CircuitPulser |
单 tick 脉冲,开 aCircuitData[0] 长度 |
[0] ≥ 1 |
CircuitRedstoneMeter |
强弱模拟:mStrength 0–15 |
— |
CircuitRandomizer |
随机开/关,概率受 mTickCounter 影响 |
— |
CircuitCombinationLock |
检查 8 个输入的组合是否匹配 aCircuitData |
— |
CircuitBitAnd |
(signal & this) != 0 |
[0]、[1] 为 byte 字段 |
CircuitEquals |
(aCircuitData[1] != 0) == (signal == aCircuitData[0]) |
[0] 夹到 0–15;[1] 未夹取(见下) |
CircuitTimer |
延迟+长度 | [0] 延迟、[1] 长度,均夹取到 ≥ 1 |
CircuitRandomizer 与 CircuitCombinationLock 是 9 个里没有独立
getName() 描述的两个(lang 里只有 combination_lock.name)。
⚠️ 源码缺陷:CircuitEquals 夹取写错下标
CircuitEquals.validateParameters(CircuitEquals.java:21-34)的
第 2、3 组判断读 aCircuitData[1],却把结果写进
aCircuitData[3]:
if (aCircuitData[0] < 0) aCircuitData[0] = 0; // 这组是正确的
if (aCircuitData[0] > 15) aCircuitData[0] = 15; // 这组是正确的
if (aCircuitData[1] < 0) {
aCircuitData[3] = 0; // ← 读 [1] 写 [3]
}
if (aCircuitData[1] > 1) {
aCircuitData[3] = 1; // ← 读 [1] 写 [3]
}
后果:
aCircuitData[1](0/1 模式开关)从不被夹取, 玩家可写入 0/1 之外的值;aCircuitData[3](4 槽电路的第 4 槽,本电路onTick不使用) 会被覆写成一个会自己跳变的值。
对照 CircuitEquals 的 onTick(:39):
((byte) (((aCircuitData[1] != 0) == (getStrongestRedstone(aRedstoneCircuitBlock) == aCircuitData[0])) ? 0 : 1))
即 [0] = 比较用的红石强度(0–15,已正确夹取)、
[1] = 0/1 模式(未夹取)。initParameters 只初始化
aCircuitData[0] = 0; aCircuitData[1] = 0;(:16-17),
[2]/[3] 未初始化。
getDataDescription(:56-59)只对 index 0/1 返回文案,
index ≥ 2 落入 default 分支。
存储位置
电路数据存在机器的 NBT 里,随机器存档;
CircuitryBehavior 提供 getData(), setData(byte[]), copy(CircuitryBehavior),
serializeItemData, validateParameters 五个操作。
作用域说明
本条目只覆盖 gregtech/common/redstonecircuits/ 这 9 个核心电路。
bartworks / tectech / kekztech 等 addon 各自向
sCircuitryBehaviors 注册的额外电路不在此列(本分类的
bartworks、tectech 等 addon 也各自另有独立 wiki 分类)。
相关条目
- Pollution System — 另一套逐区块 tick 系统
- GT Commands —
/gtp调试命令
源码
src/main/java/gregtech/common/redstonecircuits/(9 个.java)src/main/java/gregtech/api/util/CircuitryBehavior.javasrc/main/java/gregtech/loaders/preload/LoaderCircuitBehaviors.java- 注册表:
src/main/java/gregtech/api/GregTechAPI.java:92 - 复算:
grep -c 'new Circuit' src/main/java/gregtech/loaders/preload/LoaderCircuitBehaviors.java→ 9