Hooks

基本信息

属性 值
类名 com.gtnewhorizons.neid.Hooks
角色 ASM transformer 反向回调的静态桥接方法(ASM 调用方为 Underground Biomes 的 BiomeUndergroundDecorator)
注解 @SuppressWarnings("unused") 表明方法只通过 ASM 注入被调用

方法

getBlockId(ExtendedBlockStorage ebs, int x, int y, int z) → int

public static int getBlockId(final ExtendedBlockStorage ebs, final int x, final int y, final int z) {
    return ((IExtendedBlockStorageMixin) ebs).getBlock16BArray()[y << 8 | z << 4 | x] & 0xFFFF;
}
  • 调用方(注入点):UndergroundBiomesBiomeUndergroundDecorator ASM transformer,匹配原版字节码中对 ExtendedBlockStorage.getBlockLSBArray() 的 INVOKEVIRTUAL 调用并替换。
  • 平铺索引:y << 8 | z << 4 | x —— 与 MixinExtendedBlockStorage.getBlockId / setBlockId 完全一致,把三维坐标扁平化为单 short 数组下标。
  • 结果类型:& 0xFFFF 把 short 符号位转为无符号 16 位整数(即使最高位为 1 也能返回正整数)。

触发链

UndergroundBiomes.BiomeUndergroundDecorator.replaceChunkOres_*
    ↓ (ASM 替换 INVOKEVIRTUAL getBlockLSBArray → ILOAD 9/18/10 + INVOKESTATIC Hooks.getBlockId)
Hooks.getBlockId(ebs, x, y, z)
    ↓ (转 IExtendedBlockStorageMixin 拿 block16BArray)
MixinExtendedBlockStorage.block16BArray[y << 8 | z << 4 | x] & 0xFFFF

相关条目

  • UndergroundBiomesBiomeUndergroundDecorator ASM - 唯一注入调用点
  • MixinExtendedBlockStorage - 实现 IExtendedBlockStorageMixin.getBlock16BArray
  • IExtendedBlockStorageMixin - 接口定义