油液检测

基本信息

属性 值
浸没枚举 OilTweakEventHandler.InOil:NONE / HALF / FULL
判定方法 getInOil(Entity)(包围盒扫描)、isOil(Block)(Forge 流体注册表)
总开关 BuildCraftConfig#isOilDense()
开关来源 不读自己的配置,而是转发 BuildCraft Energy 的 BuildCraftEnergy.isOilDense

浸没等级三态

值 含义 halfOfFull()
NONE 包围盒内无油 false
HALF 触到油,但头顶所在格不是油 true
FULL 整个包围盒都在油中 true

halfOfFull() 定义为 this != NONE,即 HALF 与 FULL 都被视为"在油中"。

FULL 的判定(OilTweakEventHandler.java:60-61):

return maxY == minY || isOil(entity.worldObj.getBlock(x, maxY, z)) ? InOil.FULL : InOil.HALF;

两个条件命中任一即为 FULL:

  1. maxY == minY——实体只占一格高(整只浸没),此时不需要再查头顶;
  2. 头顶那一格((x, maxY, z))也是油。

包围盒扫描

getInOil 从 entity.boundingBox 的 min/max 各加/减 0.001D 后 floor_double (注释 // Taken from Entity class,沿用原版碰撞箱的取整方式), 再三重循环遍历,先 worldObj.checkChunksExist(...) 确认区块已加载。

任意一格是油就立即返回,不统计油量——所以"一格油"和"全身油" 在检测阶段无法区分,差异只由上面的 FULL 判定补出。

什么算"油"

private boolean isOil(Block block) {
    if (block == null || block == Blocks.air) return false;
    Fluid fluid = FluidRegistry.lookupFluidForBlock(block);
    return fluid != null && FluidRegistry.isFluidRegistered(fluid)
        && fluid.getName() != null && fluid.getName().equalsIgnoreCase("oil");
}

判定依据是流体名 equalsIgnoreCase("oil"),而不是某个具体 mod 的油。 因此 BuildCraft 的油、Ender IO 的油等任何名字就是 “oil” 的方块都算; 但名字不同油的变体(crude oil、heavy oil 之类)不算。

changelog.md 1.0.1 写的 “Now works with any kind of oil” 准确含义是 “不再绑定 BuildCraft 的油实现”,而非"识别所有油系流体"。

总开关来自 BuildCraft Energy

本 mod 没有自己的配置文件。 BuildCraftConfig 只有两个方法:

public boolean isOilDense() {
    return Mods.isBCEnergyLoaded && isOilDense_BC();
}

@Optional.Method(modid = Mods.BuildCraftEnergy)
private boolean isOilDense_BC() {
    return BuildCraftEnergy.isOilDense;
}

isOilDense_BC 带 @Optional.Method(modid = "BuildCraft|Energy"), 硬引用 BuildCraftEnergy 类;isOilDense() 先用 Mods.isBCEnergyLoaded 短路,保证类未加载时不会触发 NoClassDefFoundError。

BuildCraft Energy 不存在时,isOilDense() 恒为 false, 本 mod 的 5 个事件处理器全部在第一行就 return,等于完全不生效。

源码中的类名与包路径有历史错位:配置类在 buildcraft.oiltweak.integration.simplyjetpacks.BuildCraftConfig, 而它与 BuildCraft 毫无关系(详见 Simply Jetpacks 集成)。

@Mod 依赖全是软依赖

dependencies = "after:BuildCraft|Core@[6.4.1,);after:Forge@[10.13.2.1236,);after:BuildCraft|Energy@[6.4.1,);"
    + "after:EnderIO@[1.7.10_2.2.7,);after:simplyjetpacks"

全部是 after:,没有任何 required-after:——所以缺任何一个 mod 都不会阻止本 mod 加载, 但缺 BuildCraft Energy 会让它静默失效(见上)。 EnderIO 与 simplyjetpacks 只出现在这串依赖里,源码中无对应类引用; BuildCraft|Core 也没有任何源码引用。

相关条目