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 无人调用,见全局符号。