Railcraft 集成
PluginRailcraft 覆盖 Railcraft 的机器、轨道与机车:多方块成型状态、锅炉与引擎的温度/产能、机器储液罐、电力充能度、水塔集水速率,以及蒸汽 / 电力机车的对应信息。它是本 mod 中注册开关最多、逻辑最复杂的插件。
基本信息
| 属性 | 值 |
|---|---|
| 插件类 | tterrag.wailaplugins.plugins.PluginRailcraft |
| 目标 mod | Railcraft(modid Railcraft) |
@Plugin 注解 |
只写 deps = "Railcraft",name 为空、order 未设置(均取默认) |
| 插件名来源 | name 为空 → 取第一个依赖 modid 对应的 ModContainer.getName(),即 Railcraft 的模组显示名(不是 modid) |
| 注册类型 | Body + NBT provider(方块)+ Body + NBT provider(实体),并实现 IWailaEntityProvider |
| 默认启用 | 是([plugins] 段与 WAILA [modules] 段默认均为 true) |
| 关键行为 | postLoad() 把 WAILA 自带 Railcraft 插件的 TileTankBase body provider 移除 |
注册明细
| 目标 | 类型 | 目标类 |
|---|---|---|
| 方块 Body | Body provider | TileMachineBase、TileTrack |
| 方块 NBT | NBT provider | TileEngineSteam、IElectricGrid、TileTrack、TileMultiBlock |
| 实体 Body | Entity body provider | EntityLocomotive |
| 实体 NBT | Entity NBT provider | EntityLocomotive |
注意 Body 与 NBT 的注册集合并不相同:TileMultiBlock 只注册了 NBT provider(TileMachineBase 是它的父类,故方块提示栏仍能命中),而 IElectricGrid / TileEngineSteam 只注册 NBT。
postLoad:顶掉 WAILA 自带的 Railcraft 插件
public void postLoad() {
ModuleRegistrar.instance().bodyBlockProviders.remove(TileTankBase.class);
}
本插件在所有插件 load() 之后、加载完成阶段执行,把 WAILA 自带 Railcraft 插件为 TileTankBase 注册的 body provider 从 ModuleRegistrar 中移除。这样机器储液罐信息只由本插件输出一份,避免与 WAILA 内置实现重复或冲突。
WAILA 元数据键(NBT)
| NBT 键 | 类型 | 来源 | 含义 |
|---|---|---|---|
tankFluid |
NBTTagCompound | TileTankBase.getTank().getInfo() |
机器储液罐信息,内含 fluid 与 capacity |
heat |
float | ITemperature.getTemperature();机车取 boiler.getHeat() |
当前温度 |
maxHeat |
float | TileEngineSteamHobby.boiler.getMaxHeat();机车取 boiler.getMaxHeat() |
最高温度 |
currentOutput |
float | TileEngine.currentOutput |
当前产能 |
energyStored |
int | TileEngine.getEnergy() |
储存的 RF |
charge |
double | IElectricGrid.getChargeHandler().getCharge();电力轨道取 TrackElectric;电力机车取 EntityLocomotiveElectric |
充能度(单位 c) |
多方块主控替换:若 te instanceof TileMultiBlock 且 getMasterBlock() != null,先把 te 换成主控方块再取数据。储液罐的特殊之处在于:仅当 te instanceof TileTankBase && !(te instanceof IFluidHandler) 时才由本插件写 tankFluid——即那些不实现 IFluidHandler 的储罐机器由本插件接管,实现了该接口的则交给通用流体插件,详见 Forge 流体桥接(IFluidHandler)。
addHeatTooltip / 通用流体行的 fluid 键与 capacity 键格式与 IFluidHandler 插件共用同一套读写方法。
显示内容
| 开关 | 适用对象 | 显示 | 附加条件 |
|---|---|---|---|
multiblocks |
TileMultiBlock |
已成型: Yes/No |
由 isStructureValid() 决定 |
heat |
TileEngineSteamHobby、TileBoilerFirebox、TileBoilerTank |
温度: N / N °C |
两个值分别取 heat、maxHeat,四舍五入为整数 |
engines |
TileEngine |
能量存储: <energy> / <tile.maxEnergy()> RF + 产能: N RF/t |
产能由 currentOutput 四舍五入 |
waterTankRate |
TileTankWater |
见下节 | 额外要求 isStructureValid() |
charge |
任何 NBT 含 charge 的方块 / 电力机车 |
已充能: <数值>c,或斜体 手持电表 |
见"电表门槛" |
locomotives |
实体:电力机车 / 蒸汽机车 | 电力机车显示充能度;蒸汽机车显示温度 | getWailaBody 中以 locomotives 为总闸 |
| — | 任何 NBT 含 tankFluid 的方块 |
储液罐行(流体名 + 数量 / 容量) | 无开关门控,见下方提示 |
getWailaOverride、getWailaHead、getWailaTail 三个实体回调均直接返回 null,本插件只往实体提示栏正文追加内容。
水塔集水速率(waterTankRate)
由文件内的辅助类 WaterTankRateCalculator 计算,只对成型中的 TileTankWater 生效。四个分量:
| 分量 | 算法 | 常量 |
|---|---|---|
humidityRate(湿度) |
10F * world.getBiomeGenForCoords(x, z).rainfall |
BASE_HUMIDITY_RATE = 10F |
insideRate(室内) |
以主控方块为中心 3×3 范围取 y+3 高度,任一格 canBlockSeeTheSky 为真则 1.0F,否则 0.5F |
INSIDE_RATE = 0.5F |
snowingOrRainingRate(雨雪) |
不下雨或处于室内时为 1.0F;否则群系 getEnableSnow() 为真取 0.5F,取假取 3.0F |
SNOW_RATE = 0.5F / RAIN_RATE = 3.0F |
rate(合成) |
max(floor_float(湿度 * 室内 * 雨雪), 1.0F) |
下限 ONE = 1.0F |
换算为升/秒:rate * RATE_TICK_RATIO * 20,其中 RATE_TICK_RATIO = 0.125F。
显示行按条件追加:先输出当前速率(含 L/s 换算)与群系湿度;若正在下雨或下雪则追加对应速率行;若处于室内(insideRate == 0.5)再追加"看不到天空"的速率行。语言键:wp.hud.msg.currentRate / biomeHumidityRate / rainingRate / snowingRate / cantSeeTheSkyRate。
电表门槛
addChargeTooltip 决定玩家能否看到充能数值:
boolean hasMeter = !WPConfigHandler.meterInHand
|| (current != null && ItemUtil.stacksEqual(current, ItemElectricMeter.getItem()));
railcraft.meterInHand = true(默认)且主手不是ItemElectricMeter→ 只显示斜体手持电表,不泄露数值railcraft.meterInHand = false或主手是电表 → 显示已充能: <数值>c
数值用 DecimalFormat("#.##") 格式化(最多两位小数)并加 c 后缀。注意:这个门槛读的是本 mod 自己 wailaplugins.cfg 的 [railcraft] 段选项,而不是 charge 这个 WAILA 功能开关——即使 charge 打开,电表门槛依然生效。
配置开关
注册了 8 个功能开关,全部默认值 true。因 name 为空,getPluginName 返回第一个依赖 modid Railcraft,语言键前缀为 wp.config.Railcraft.*:
| 开关 | 语言键 | 含义 | 是否真正被读取 |
|---|---|---|---|
multiblocks |
wp.config.Railcraft.multiblocks |
显示多方块成型状态 | 是 |
heat |
wp.config.Railcraft.heat |
显示热量信息 | 是 |
tanks |
wp.config.Railcraft.tanks |
显示机器流体信息 | 否,见下 |
energy |
wp.config.Railcraft.energy |
显示 RF 能量 | 否,见下 |
engines |
wp.config.Railcraft.engines |
显示引擎信息 | 是 |
charge |
wp.config.Railcraft.charge |
显示充能 | 是 |
locomotives |
wp.config.Railcraft.locomotives |
显示机车信息 | 是 |
waterTankRate |
(无语言键) | 水塔集水速率 | 是 |
源码提示(两个注册但未使用的开关):
getBody中getConfig(...)只以multiblocks、heat、engines、waterTankRate、charge五个键被调用(getWailaBody再加locomotives)。tanks与energy虽然被addConfig注册进 WAILA 配置并因此会显示为复选框,但源码中没有任何地方读取它们:
- 储液罐行的条件是
tag.hasKey(TANK_FLUID),不含getConfig("tanks")门控,所以关掉tanks不会隐藏机器流体行;- 引擎的能量行由
engines开关统管,关掉energy不会有任何效果。另注
waterTankRate在语言文件中没有对应的wp.config.Railcraft.waterTankRate条目,其复选框标签会回退为原始键。关闭这两个无效开关不会产生实际效果。
本插件另有插件级总开关(键为解析出的插件名),以及 railcraft.meterInHand(默认 true)这个 wailaplugins.cfg 选项。
相关条目
- 插件 API 与生命周期 -
postLoad()阶段与name推导规则 - WAILA 模块开关 - 全部插件的总开关与功能开关总表
- 配置系统 -
meterInHand的默认值与语义 - Forge 流体桥接(IFluidHandler) - 本插件复用其静态方法并让渡部分储罐