第三方模组兼容
基本信息
| 属性 | 值 |
|---|---|
| 包 | com.gtnewhorizon.gtnhlib.compat(4 个类) |
| 源码 | src/main/java/com/gtnewhorizon/gtnhlib/compat/ |
| 覆盖的外部 mod | 3(Baubles、FalseTweaks、NotEnoughItems) |
| 硬依赖 | 0 —— 全部为反射或软检测 |
compat/Mods.java 只提供 mod 加载布尔常量,见 模组加载检测;本页覆盖另外 3 个实际兼容实现。
BaublesCompat
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizon.gtnhlib.compat.BaublesCompat(final,私有构造) |
| 反射目标 | baubles.api.BaublesApi#getBaubles(EntityPlayer) |
| 初始化 | 双重检查锁的懒加载 |
| 编译依赖 | 无 —— dependencies.gradle 中 Baubles 相关依赖全部被注释掉 |
类注释(BaublesCompat.java:7):
Reflection-based access to Baubles inventory (no hard dependency). Lazy-init with double-checked locking.
getBaubles(EntityPlayer) 的两级降级:
| 情况 | 返回 |
|---|---|
| Baubles 未加载 | null |
getBaubles 抛任何 Throwable |
null |
⚠️ 静默失败:两处 catch (Throwable t) 都不记日志(:22-25 与 :33-36),直接把 getBaublesMethod 置 null 或返回 null。这是有意设计(Baubles 是可选前置),但意味着 Baubles 装了却读不到饰品栏时,控制台没有任何线索 —— 只能确认 Class.forName("baubles.api.BaublesApi") 是否成功。
兼容 Baubles 与 Baubles-Expanded 两者:两者共用 Baubles modid(Mods.BAUBLES 注释),且 baubles.api.BaublesApi 路径相同。
FalseTweaks
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizon.gtnhlib.compat.FalseTweaks |
| 依赖 | com.falsepattern:falsetweaks-mc1.7.10:3.8.4:api(compileOnly) |
| 编译期导入 | com.falsepattern.falsetweaks.api.ThreadedChunkUpdates |
单一方法 doTessSafetyChecks(),处理两个 mod 同时注入 Tessellator 的冲突。源码注释(FalseTweaks.java:8-10):
When FalseTweaks is loaded, it may inject into the Tesselator to do its own threaded chunk building. If it’s doing that, disable our checks and let FT handle it.
public static boolean doTessSafetyChecks() {
return !ThreadedChunkUpdates.isEnabled();
}
FalseTweaks 开启线程化区块更新时返回 false,让 FT 负责,GTNHLib 不再重复做安全检查。
NotEnoughItemsVersionChecker
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizon.gtnhlib.compat.NotEnoughItemsVersionChecker |
| 订阅事件 | TickEvent.ClientTickEvent(@SubscribeEvent) |
| 最低 NEI 版本 | 2.7.8-GTNH |
| 绕过开关 | GTNHLibConfig.ignoreNEIVersion |
检查 NEI 是否支持 RenderTooltipEvents。该检查注册在客户端,由 ClientProxy.java:97 显式注册:
FMLCommonHandler.instance().bus().register(new NotEnoughItemsVersionChecker());
注册目标是 FML 事件总线(FMLCommonHandler.instance().bus()),而非 MinecraftForge.EVENT_BUS,也不依赖 自动事件总线 的 @EventBusSubscriber 机制 —— 类上确实没有该注解。
检查只跑一次 —— 进入世界(thePlayer != null)后立即 FMLCommonHandler.instance().bus().unregister(this)(:24),并在此之前返回,因此不会在主菜单反复触发。
版本比较用 ArtifactVersion.compareTo:
ArtifactVersion neiVersion = Loader.instance().getIndexedModList().get("NotEnoughItems").getProcessedVersion();
if (neiVersion.compareTo(new DefaultArtifactVersion("2.7.8-GTNH")) >= 0) {
return; // NEI is at least version 2.7.8-GTNH
}
NEI 版本过低时用 String.format(Locale.ROOT, ...) 输出警告,措辞为:
Installed NEI version is to old to support RenderTooltipEvents! This may cause problems. Installed NEI version: %s (2.7.8-GTNH and newer support RenderTooltipEvents)
注意原文有拼写错误 “is to old”,此处照录。
⚠️ 该检查用 Locale.ROOT 格式化警告文本,避免受系统默认 Locale 影响。
数值
| 数值名 | 值 |
|---|---|
compat 包类数 |
4 |
| 反射型兼容类 | 1(BaublesCompat) |
catch (Throwable) 静默块 |
2(均在 BaublesCompat) |
| 硬依赖的外部 mod | 0 |
compileOnly 兼容依赖 |
1(FalseTweaks 3.8.4) |
交互
| 外部 mod | GTNHLib 的应对 | 触发时机 |
|---|---|---|
| Baubles / Baubles-Expanded | 反射取饰品栏,失败返 null |
首次调用 getBaubles |
| FalseTweaks | 关闭自身 Tessellator 检查 | 每次调用 doTessSafetyChecks |
| NotEnoughItems | 客户端检查版本并警告 | 首次进入世界(若已注册) |
| MineFactory Reloaded | GTNHLib.isMFRLoaded 标志 |
preInit |
| CoFH Core | GTNHLib.isCoFHCoreLoaded 标志 |
preInit |
| ModularUI 2 | GTNHLib.isMui2Loaded,为 true 时初始化队伍 GUI |
preInit |
| Thaumcraft | ENHANCED_INFUSION_RECIPE mixin 依赖 |
LATE 阶段 |
| Biomes O’ Plenty | BIOMES_O_PLENTY_FLOWER_POT mixin 依赖 |
LATE 阶段 |
| LWJGL3ify | MULTI_RELEASE_JAR_FILTER 排除 |
EARLY 阶段 |
后 4 项的依赖声明见 Mixin 枚举。
相关条目
- 模组加载检测 -
Mods类的 4 个常量 - 离屏 Tessellator 捕获 - 与 FalseTweaks 冲突的渲染层
- Mixin 枚举 - 3 个
TargetMods目标依赖