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 -= 2NORTH/SOUTH:front >= 2时front -= 2EAST/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() 读取。
相关条目
- 插件 API 与生命周期 -
name为空时插件名如何从依赖推导 - WAILA 模块开关 - 全部插件的总开关与功能开关总表
- 配置系统 - 本 mod 自己的
wailaplugins.cfg - Forge 流体桥接(IFluidHandler) - 同为接口/类挂钩的对照插件