IC2 集成

基本信息

属性 值
脚本类数量 19(mods/ic2/,全部 @ModOnly("IC2"))
括号处理器 1(IC2BracketHandler,<ic2-item:...>)
类型扩展 2(minecraft.item.IItemStack、minetweaker.item.IIngredient 的追加部分)
@ZenMethod 总数 54
门控方式 @ModOnly("IC2") —— 逐类检查 loadedMods.contains("IC2")
依赖声明 compileOnly("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev")(dependencies.gradle:4)
注册路径 由 MineTweakerRegistry 构建期扫描自动注册,不走 ClassRegistry

IC2 在 dependencies.gradle 里是 compileOnly,因此不是硬前置:未装 IC2 时这 19 个类不会进入脚本命名空间,@ModOnly 门控保证不会 NoClassDefFoundError。

14 台机器

mods/ic2/machines/,每类一个 @ZenClass("mods.ic2.<Name>") + 若干 @ZenMethod:

脚本类 文件 @ZenMethod 数
mods.ic2.Macerator machines/Macerator.java:24 2
mods.ic2.Compressor machines/Compressor.java 2
mods.ic2.Extractor machines/Extractor.java 2
mods.ic2.FluidHeatGenerator machines/FluidHeatGenerator.java 2
mods.ic2.OreWasher machines/OreWasher.java 2
mods.ic2.Recycler machines/Recycler.java 2
mods.ic2.SemiFluidGenerator machines/SemiFluidGenerator.java 2
mods.ic2.BlockCutter machines/BlockCutter.java 2
mods.ic2.BlastFurnace machines/BlastFurnace.java:29 2
mods.ic2.Canner machines/Canner.java 4
mods.ic2.ThermalCentrifuge machines/ThermalCentrifuge.java 3
mods.ic2.MetalFormer machines/MetalFormer.java 6
mods.ic2.MatterAmplifier machines/MatterAmplifier.java 1
mods.ic2.ScrapBox machines/ScrapBox.java 1

机器合计 33 个 @ZenMethod。典型形态(Macerator.java:36-37、:58-59):

@ZenMethod
public static void addRecipe(@NotNull IItemStack output, @NotNull IIngredient ingredient)

@ZenMethod
public static IItemStack getOutput(@NotNull IItemStack input)

即「加配方」+「反查产物」成对出现。BlastFurnace 额外有 addRecipe 与 getInput(:41、:63 两处 @ZenMethod)。

作物系统

mods/ic2/crops/,4 个脚本类:

脚本类 文件 说明
mods.ic2.CropsConfig crops/CropsConfig.java:20 作物 API 主入口
mods.ic2.Crop crops/Crop.java:17 单个作物的包装
mods.ic2.SyntheticCrop crops/SyntheticCrop.java:33 脚本创建的作物
mods.ic2.GrowthRequirements crops/GrowthRequirements.java:16 生长条件

CropsConfig 暴露 6 个 @ZenMethod + 1 个 @ZenGetter:

方法 签名 源码行
addBiomeNutrientBonus (String biomeType, int nutrientBonus) CropsConfig.java:165
addBiomeHumidityBonus (String biomeType, int humidityBonus) CropsConfig.java:179
newCrop (String cropName, String cropOwner) → SyntheticCrop CropsConfig.java:196
registerCrop (CropCard c) CropsConfig.java:204
getCrop (String owner, String name) → Crop CropsConfig.java:230
getCrop (IItemStack seed) → Crop CropsConfig.java:241
crops @ZenGetter("crops") → List<Crop>,全部已注册作物 CropsConfig.java:251

IC2 各文件 @ZenMethod 分布

mods/ic2/ 合计 51 个,mods/nei/ 3 个,全 mods/ 共 54 个:

文件 @ZenMethod
ic2/IC2ExplosionWhitelist.java 3
ic2/crops/CropsConfig.java 6
ic2/crops/Crop.java 2
ic2/crops/SyntheticCrop.java 2
ic2/expand/IngredientExpansion.java 3
ic2/expand/ItemExpansion.java 2
ic2/machines/ 14 个文件 33

未暴露的方法

CropsConfig.registerBaseSeed(IItemStack, CropCard, int, int, int, int)(CropsConfig.java)没有 @ZenMethod,只有一段完整 javadoc 描述 6 个参数(种子 / 作物 / 初始尺寸 / 初始生长 / 初始产出 / 初始抗性)。它注册了内部动作类 RegisterBaseSeedAction(会调 Crops.instance.registerBaseSeed(...)),但脚本调不到。这是接口里逐个决定是否暴露的又一例。

缺陷:无效 biome 类型不会走警告分支

两个 addBiome*Bonus 方法的守卫是:

if (BiomeDictionary.Type.valueOf(biomeType) == null) {
    MineTweakerAPI.logWarning("invalid biome type: " + biomeType);
} else if (nutrientBonus < -10 || nutrientBonus > 10) { ... }

BiomeDictionary.Type 是枚举,Enum.valueOf 对未知名称**抛 IllegalArgumentException**而非返回 null,所以 == null 分支不可达。传入拼错的 biome 类型会抛异常而不是记录警告。数值越界检查(-10 ~ +10)是有效的,会正常 logWarning 并跳过注册。

爆炸白名单

mods.ic2.IC2ExplosionWhitelist(IC2ExplosionWhitelist.java:26)标注 @ZenClass("mods.ic2.ExplosionWhitelist") + @ModOnly("IC2"),用于把物品/方块加入 IC2 爆炸免疫名单。

括号与扩展

项 内容
IC2BracketHandler @BracketHandler + @ModOnly("IC2")(IC2BracketHandler.java:33-35),提供 <ic2-item:Name[:meta]> 语法,详见括号语法
ItemExpansion @ZenExpansion("minecraft.item.IItemStack") + @ModOnly("IC2")(ItemExpansion.java:21-22),为原生 ItemStack 补 IC2 专有成员(getChargeLevel() 等)
IngredientExpansion @ZenExpansion("minetweaker.item.IIngredient") + @ModOnly("IC2")(IngredientExpansion.java:21),向已存在的 IIngredient 扩展追加成员

IngredientExpansion 依赖扩展的累加语义:它与 3 个无门控的 api/ 扩展共用同一个扩展名,由 GlobalRegistry.registerExpansion 合并(GlobalRegistry.java:62-77),未装 IC2 时只是少贡献一部分,不影响其余 3 个。

内部动作

mods/ic2/IC2RecipeInput.java 与 MachineAddRecipeAction.java 是配方添加的内部载体,实现 IUndoableAction 以便 /mt 重载时回滚。IRecipeRemover(minetweaker/IRecipeRemover.java)接口在本仓零调用方 —— registerRemover 无人调用,见全局符号。

相关条目

  • NEI 集成 - 另一个 @ModOnly 门控的模组支持
  • 括号语法 - <ic2-item:...> 的完整规则
  • 类注册机制 - 19 个类如何被自动发现(含 5 个失效的 ClassRegistry 常量)