运行时兼容层(compat/ 41 个文件)

概览

属性 值
路径 src/main/java/com/gtnewhorizons/angelica/compat/
文件数 41
结构 顶层 4 + 16 个子包
调用时机 ClientProxy.java:134 ModStatus.preInit()

这是运行时(Java 层)的第三方 mod 兼容,与 CompatHandlers 的 ASM 字节码层兼容、以及 mixin 的编译期注入兼容是三套独立机制。

顶层 4 个

文件 作用
ModStatus.java 集中探测 20+ 个 mod 是否加载
DriverCompatabilityCheck.java 驱动兼容性检查
GTNHLibCompat.java gtnhlib 对接
ExtendedBlockStorageExt.java 扩展区块存储

ModStatus:20 个加载标志

ModStatus.java 在 preInit()(:37)里逐个探测,产出 20 个 public static boolean:

标志 行 探测方式
isBackhandLoaded :27 BackhandReflectionCompat.isBackhandLoaded()(反射,非 Loader)
isBetterCrashesLoaded :16 Loader.isModLoaded("bettercrashes")
isNEIDLoaded :17 Loader.isModLoaded("neid")
isNEIDMetadataExtended :18 派生标志
isEIDLoaded :19 Loader.isModLoaded("endlessids")
isMetadataExtended :20 派生标志
isLotrLoaded :21 Loader.isModLoaded("lotr")
isChunkAPILoaded :22 Loader.isModLoaded("chunkapi")
isEIDBiomeLoaded :23 —
isXaerosMinimapLoaded :24 Loader.isModLoaded("XaeroMinimap")(大写 X)
isHoloInventoryLoaded :25 Loader.isModLoaded("holoinventory")
isBattlegearLoaded :26 —
isBackhandLoaded :27 见上
isThaumcraftLoaded :28 —
isThaumicHorizonsLoaded :29 —
isBaublesLoaded :30 —
isCosmeticArmorReworkedLoaded :31 —
isFluidLoggedLoaded :32 —
isCubicChunksLoaded :33 —
isBOPLoaded :34 —
isEtFuturumLoaded :35 —

Logger 名为 "ModCompat"(:14),与 modid angelica / Logger 名 "Angelica" 都不同。

modid 大小写的又一次实证

Loader.isModLoaded("XaeroMinimap") 用的是大写 X,而 TargetedMod 里没有 Xaeros 的独立项(只有 narrowXaeros 配置开关,见 AngelicaModulesConfig)。同一类需求在不同文件里用了不同的大小写风格,说明 Xaeros 的 modid 实际写法需要以本处 Loader.isModLoaded 的实参为准。

16 个子包

子包 文件数 目标
mojang 16 不是第三方 mod —— 见下
bop 3 Biomes O’ Plenty(BopFogBlend、FogBiomeCache、FogColourGrid)
etfuturum 2 Et Futurum(EndFlashCompat、EtFuturumCompat)
iris 2 BiomeCategoryCache、ModdedBiomeDetector
thaumcraft 2 Tc4JarMeshes、ThaumometerScreen
toremove 2 MatrixStack、VertexConsumer
backhand / battlegear2 / bettercrashes / cubicchunks / draconicevolution / dragonapi / endlessids / galaxyspace / holoinventory / lotr 各 1 见下表

单文件子包(10 个):

子包 类
backhand BackhandReflectionCompat
battlegear2 Battlegear2Compat
bettercrashes BetterCrashesCompat
cubicchunks CubicChunksAPI
draconicevolution PlacedItemRenderCompat
dragonapi DragonAPICompat
endlessids EndlessIDsCompat
galaxyspace GalaxySpaceClouds
holoinventory HoloInventoryReflectionCompat
lotr LOTRCompat

mojang 子包:不是 mod 兼容

mojang/ 的 16 个文件不是对第三方 mod 的兼容,而是对 Mojang 自己的现代版代码的 1.7.10 移植:

类 对应现代版
Camera / ChunkPos / ChunkSectionPos 1.13+ 的相机与坐标类
ChunkOcclusionData / ChunkOcclusionDataBuilder 1.17+ 的遮挡剔除数据结构
NativeImage 1.13+ 的原生图像
CompatMathHelper 数学工具
RenderLayer / Drawable / Element / ParentElement 渲染层接口族
InteractionHand 1.9+ 的手部枚举
GameModeUtil / Constants / ByteBufferBackedInputStream / AutoClosableAbstractTexture 工具类

统计第三方 mod 兼容时不应把 mojang/ 计入 —— 它是内置的「1.7.10 → 现代版 API」垫片。CompatMathHelper 被 Proxy 的 F3 改写逻辑使用(:355-357 的 CompatMathHelper.clampHeight(bY))。

三套兼容机制对照

机制 位置 目标 mod 数 手段
运行时(本条目) compat/ 约 17(不含 mojang) Java 反射 / 直接调用 / 条件分支
ASM loading/fml/compat/ 5(CompatHandlers) 字节码改写
Mixin mixins/early + late/client 28(TargetedMod) 编译期注入

同一 mod 常同时出现在多处:extrautils 在三套机制里都有;backhand 在 compat/backhand 与 TargetedMod 里都有。

Proxy 中的直接消费

消费点 条件
ClientProxy.java:134 无条件 ModStatus.preInit()
ClientProxy.java:183-185 isBetterCrashesLoaded → BetterCrashesCompat.init()
ClientProxy.java:218-227 isLotrLoaded && CompatConfig.fixLotr → 反射替换 LOTR 三个缓存为 ConcurrentHashMap
ClientProxy.java:228-230 isBOPLoaded → 取 BOPCBlocks.newBopGrass

相关条目