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。

相关条目