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 选项。

相关条目