IGT(appeng.integration.abstraction.IGT)
基本信息
| 属性 | 值 |
|---|---|
| 源码 | appeng/integration/abstraction/IGT.java |
| 接口声明 | 17 |
| 总行数 | 24 |
| 实现 | appeng/integration/modules/GT.java:11(implements IIntegrationModule, IGT) |
| 对应 modID | gregtech(IntegrationType.java:60) |
| 本 wiki 收录情况 | GregTech 未被本 wiki 收录 —— 写全名 GregTech |
3 个方法
| 方法 | 行号 | 类型依赖 | 语义 |
|---|---|---|---|
isGTMachine(TileEntity te) |
19 | 仅 MC | 是否是 GT 机器 |
getGTMachineHash(TileEntity te) |
21 | 仅 MC | 取机器标识 hash(用于缓存) |
removeColor(EntityPlayer player, int x, int y, int z, ForgeDirection side) |
23 | 仅 MC | 褪色 / 拆机 |
GT 是本移植版唯一用 @Integration 注解的目标
全仓库 @Integration 注解只有 2 处使用,且两处都是 GregTech:
| 位置 | 被注解的类 | 目标接口 |
|---|---|---|
appeng/tile/powersink/GTPowerSink.java:11 |
public abstract class GTPowerSink extends AERootPoweredTile |
gregtech.api.interfaces.tileentity.IEnergyConnected |
appeng/parts/layers/LayerIEnergyConnected.java:14 |
public class LayerIEnergyConnected extends LayerBase |
同上 |
// tile/powersink/GTPowerSink.java:11
@Integration.Interface(iname = IntegrationType.GT, iface = "gregtech.api.interfaces.tileentity.IEnergyConnected")
public abstract class GTPowerSink extends AERootPoweredTile implements IEnergyConnected {
机制:ASMIntegration.transform(transformer/asm/ASMIntegration.java:69)
在类加载期检查 @Integration.Interface / @Integration.InterfaceList /
@Integration.Method 三个注解:
| 注解 | 处理方法 | 行为 |
|---|---|---|
Integration.Interface |
stripInterface(:143) |
集成被禁 → classNode.interfaces.remove(...)(:173)从 implements 列表里抹掉 |
Integration.InterfaceList |
:111-117 |
同上,逐个处理 |
Integration.Method |
stripMethod(:191) |
集成被禁 → i.remove()(:213)删掉整个方法 |
判据都是 IntegrationRegistry.INSTANCE.isEnabled(type)(:165 / :205)。
这意味着 GT 不可用时,GregTech 相关的类能正常加载 ——
接口和方法在字节码层面已被剥离,运行时不会 NoClassDefFoundError。
这是本移植版处理可选依赖的唯一机制,且只用在 GT 上。
注入的东西
| 动作 | 位置 | 内容 |
|---|---|---|
| 版本排除 | GT.java:19-21 |
Loader.instance().getIndexedModList().get("gregtech").getVersion(),若版本串含 GT6-MC1710 → throw new ModNotInstalled("gregtech") |
| part layer | GT.java:35-37 |
appeng.parts.layers.LayerIEnergyConnected ← gregtech.api.interfaces.tileentity.IEnergyConnected |
| 空间搬运 | GT.java:43 |
movable().addHandler(new NBTSpatialHandler(IGregTechTileEntity.class)) |
| 注解剥离 | tile/powersink/GTPowerSink.java:11、parts/layers/LayerIEnergyConnected.java:14 |
见上 |
⚠️ GT.java:19 的 getIndexedModList().get("gregtech") 没有判空 ——
若 gregtech 完全没装,这里会 NullPointerException。但该行只在
PRE_INIT 通过(即 Loader.isModLoaded("gregtech") 为真)后才执行,
所以实际安全。
GT6 排除是真实逻辑,不是死代码
// integration/modules/GT.java:19-21
String ver = Loader.instance().getIndexedModList().get("gregtech").getVersion();
if (ver.contains("GT6-MC1710")) { throw new ModNotInstalled("gregtech"); }
GT6-MC1710 版本的 GregTech 被显式拒绝。
mod 没装时是否安全跳过
是,但路径与其它目标不同:先在 IntegrationNode 的
Loader.isModLoaded 被拦下(若完全没装),
若装了但是 GT6 则在 GT.init() 里抛 ModNotInstalled(GT.java:21)。
两者都被 IntegrationNode.java:102 的 catch (Throwable) 捕获 → FAILED。
GT 的 P2P 隧道(另一条独立路径)
parts/p2p/PartP2PGT5Power.java + PartType.P2PTunnelGT
(core/api/definitions/ApiParts.java:114)是 GT5 专用隧道,
与本接口无关(不走 abstraction/)。
对应条目:P2P 隧道(GT)、
AEFeature.P2PTunnelGregtech。