RedLogic 集成

PluginRedLogic 为 RedLogic(RedLogic 的门电路与导线)提供三类信息:世界内门上四面的浮空文字与矩形高亮 overlay、门电路的运行参数、红合金导线的红石信号强度。

源码注释标明该插件改编自 WAILA 自身的 RedPower 插件:@author ProfMobius, ported and adapted to RedLogic by tterrag。

基本信息

属性 值
插件类 tterrag.wailaplugins.plugins.PluginRedLogic
目标 mod RedLogic(modid RedLogic)
@Plugin 注解 只写 deps = "RedLogic",name 为空、order 未设置(均取默认)
插件名来源 name 为空 → 取第一个依赖 modid 对应的 ModContainer.getName(),即 RedLogic 的模组显示名(不是 modid)
注册类型 Body + NBT provider(GateTile、WireTile)+ Block decorator(GateBlock)
默认启用 是([plugins] 段与 WAILA [modules] 段默认均为 true)
挂钩的 API mods.immibis.redlogic.gates.*、mods.immibis.redlogic.wires.*

注册明细

目标类 注册方式
mods.immibis.redlogic.gates.GateBlock registrar.registerDecorator(this, GateBlock.class) —— 本插件实现 IWailaBlockDecorator
mods.immibis.redlogic.gates.GateTile Body + NBT provider
mods.immibis.redlogic.wires.WireTile Body + NBT provider

WAILA 元数据键(NBT)

getNBTData 只做一件事:te.writeToNBT(tag),即把门 / 导线自身的 NBT 原样交给 WAILA。因此提示栏读取的键由 RedLogic 自己写入,来源如下:

NBT 键 类型 用途
side int 门的朝向(ForgeDirection.getOrientation)
front int 门的正面偏移量
type int EnumGates.VALUES 的序号,即门类型
gateSettings short 门的子状态 / 设置(state)
flipped boolean 门是否被翻转
logic NBTTagCompound 门逻辑数据,由 GateLogic.read() 读回
type(导线) byte EnumWireType.VALUES 序号;用 getByte 读取

功能一:门上四面的世界内 overlay

由 decorateBlock 实现,受 overlay 开关控制,是本插件视觉上最重的部分。

朝向换算:先把 front 归一到 0~3 并按 ForgeDirection 顺序(而非圆周顺序)重排:

  • UP / DOWN:front -= 2
  • NORTH / SOUTH:front >= 2 时 front -= 2
  • EAST / WEST:front = (front + 2) % 4
  • 随后 0→2、1→0、2→1、3→3 重映射
  • WEST / NORTH / UP 方向再互换 3 与 1

取 I/O 文字:IOARRAY 是一张 32 行的 4 元素表,按门类型序号索引出四个面的 I/O 名字。若 gateSettings != 0,先在 IOARRAYALTER 中按子 ID 查覆盖表(每行首元素是该门的 subID,其后是各子状态对应的 4 个索引),命中则用覆盖表,否则用 IOARRAY。IONAMES 索引表为:

""、IN、OUT、SWAP、IN_A、IN_B、LOCK、IO、POS、NEG、BUS、A、B、UNLOCK、COMPARE、SUBTRACT

绘制:文字按 front 旋转,再在 flipped 为真时交换与正面垂直的两个面。随后按 6 个 ForgeDirection 分支,用 UIHelper.drawFloatingText 在方块四个面对应的世界坐标画浮空文字,并画 8 条半透明白色矩形(RGBA 255,255,255,150)标出四面位置;上下方向用 drawRectangle,东西方向用 drawRectangleEW。

功能二:门电路参数

受 data 开关控制,仅对 GateTile 生效。流程是 type.createLogic() → logic.configure(state) → logic.read(tag.getCompoundTag("logic")),用重建出的逻辑对象而不是裸读 NBT。

条件 显示 数据来源
逻辑实现 GateLogic.Flippable Flipped: Yes/No NBT flipped
逻辑实现 TimedGateLogic Interval: x.xxs(两位小数) getInterval() / 20
门类型 Repeater Delay: N 红石 tick DELAYS[state],数组为 {1, 2, 4, 8, 16, 32, 64, 128}
门类型 Timer Time: x.xx (intervalTicks - ticksLeft) / 20
门类型 Counter 空行 + Count / Max Count / Increment / Decrement GateCounter.Logic 的 value / max / incr / decr
门类型 Comparator Mode: Subtract 或 Mode: Compare state == 1 取 subtract,否则取 comparat

源码提示:compare 模式调用的语言键是 comparat(源码原文),而语言文件里定义的是 wp.hud.msg.compare。这处键名不匹配会导致该模式的标签回退显示原始键。属源码既有现象,此处如实记录。

Timer / Repeater / Comparator / Counter 四行均带 break,不会互相串行;Comparator 缺少 break 会继续落进 default(空操作),因此实际行为无差别。

功能三:红合金导线强度

受 strength 开关控制,仅对 WireTile 生效:

  • 导线类型取 EnumWireType.VALUES[tag.getByte("type")]
  • 仅当类型为 RED_ALLOY 时输出 Strength: N,数值取 ((RedAlloyTile) tile).getRedstoneSignalStrength()
  • 其他导线类型不输出任何行

配置开关

3 个功能开关全部通过 addConfig(key) 注册,默认值均为 true。因为 @Plugin.name 为空,getPluginName 返回第一个依赖 modid RedLogic,所以语言键前缀是 wp.config.RedLogic.*,WAILA 配置中分组名也是 RedLogic:

开关 语言键 含义
overlay wp.config.RedLogic.overlay 显示门的四向 overlay
data wp.config.RedLogic.data 显示门电路参数
strength wp.config.RedLogic.strength 显示导线信号强度

另有一个插件级总开关,键为解析出的插件名(RedLogic 的模组显示名),由 enabled() 读取。

相关条目