油液检测
基本信息
| 属性 | 值 |
|---|---|
| 浸没枚举 | 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:
maxY == minY——实体只占一格高(整只浸没),此时不需要再查头顶;- 头顶那一格(
(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 也没有任何源码引用。
相关条目
- 油中移动阻尼 - 浸没等级如何转成位移与步高改动
- 交互限制 - 浸没等级如何转成右键/挖掘/传送限制
- 黑名单 API - 右键规则 B
- Simply Jetpacks 集成 -
BuildCraftConfig名字的由来