跳到正文
烈焰甘蔗Wiki

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]
}

后果:

  1. aCircuitData[1](0/1 模式开关)从不被夹取, 玩家可写入 0/1 之外的值;
  2. 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 分类)。

相关条目

源码

  • src/main/java/gregtech/common/redstonecircuits/(9 个 .java)
  • src/main/java/gregtech/api/util/CircuitryBehavior.java
  • src/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
浏览全部模组