配置系统总览
基本信息
| 属性 | 值 |
|---|---|
| 配置框架 | GTNHLib(com.gtnewhorizon.gtnhlib.config.Config 注解) |
| 配置加载时机 | FML 构造阶段,由自定义 IFMLLoadingPlugin + IEarlyMixinLoader 完成 |
| 加载器 | com.fouristhenumber.utilitiesinexcess.mixins.UIEMixinLoader(UIEMixinLoader.java:21) |
| 显式注册的顶层配置类 | 6 个(UIEMixinLoader.java:26-31) |
| 实际配置文件 | GTNHLib 按 category 生成,见下表 |
@Mod 声明依赖 |
required-after:gtnhlib@[0.11.23,) |
| FML 容器 modid(coremod) | 无(getModContainerClass() 返回 null,UIEMixinLoader.java:43-45) |
功能
本模组不使用 Forge 原生 Configuration,而是把 GTNHLib 的配置系统挂进 FML 构造阶段。UIEMixinLoader 实现 IFMLLoadingPlugin, IEarlyMixinLoader,在 getASMAPI() 中先注册 6 个顶层配置类(UIEMixinLoader.java:24-31),源码注释写明 “Register config here because then it’s available during mixins.”(:24)。
这 6 个显式注册的类是:
ConfigurationManager.registerConfig(ItemConfig.class); // :26
ConfigurationManager.registerConfig(BlockConfig.class); // :27
ConfigurationManager.registerConfig(GeneratorConfig.class); // :28
ConfigurationManager.registerConfig(DimensionConfig.class); // :29
ConfigurationManager.registerConfig(OtherConfig.class); // :30
ConfigurationManager.registerConfig(RecipeConfig.class); // :31
getModContainerClass() 返回 null(UIEMixinLoader.java:43-45)——本模组没有 FML coremod / 容器 modid,不会以 core mod 身份出现在模组列表中。同理 getASMTransformerClass()、getSetupClass()、getAccessTransformerClass() 也全部返回 null(:38-58)。
UIEMixinLoader 中的 addRequiredMod 调用全部被注释掉,TargetedMod.ANGELICA 因此没有任何 Mixin 使用——已定义但未接线的目标模组(见兼容模组)。
数值 — 配置类清单
配置代码分布在四个包下,共 24 个 Java 文件。绝大多数类采用自实例化单例模式:@Config.Ignore public static final XxxConfig INSTANCE = new XxxConfig();(如 UnderWorldConfig.java:9-10),由首次静态访问触发。
| 包 | 文件数 | 类 |
|---|---|---|
config/ |
2 | OtherConfig(category other)、RecipeConfig |
config/blocks/ |
7 | BlockConfig、ColoredBlocksConfig*、CursedEarthConfig、EnderLotusConfig、FilingCabinetsConfig*、GeneratorConfig、VoidQuarryConfig |
config/items/ |
6 | ItemConfig、InversionConfig、WateringCanConfig、BuildersWandsConfig*、ChunchunmaruConfig、FireBatteryConfig |
config/items/invertedtools/ |
7 | InvertedTools(容器类,持有其余 6 个的 INSTANCE 引用)、AntiGravityShovelConfig、ErasurePickaxeConfig、LiminalSwordConfig、RecallShearsConfig、RetrogradeHoeConfig、SatingAxeConfig |
config/dimensions/ |
3 | DimensionConfig、EndOfTimeConfig(category dimensions.end_of_time)、UnderWorldConfig(category dimensions.under_world) |
* = 缺少类级 @Config(modid = …, category = …) 注解。
InvertedTools 不是配置基类,而是 6 个工具配置的容器:public final LiminalSwordConfig liminalSwordConfig = LiminalSwordConfig.INSTANCE;(InvertedTools.java:14),其自身带 category items.inverted_tools。
@Config(modid = UtilitiesInExcess.MODID, category = …) 的 category 命名空间在维度配置中采用两级形式(dimensions.under_world、dimensions.end_of_time,见 UnderWorldConfig.java:6、EndOfTimeConfig.java:6),在反转工具中采用三级形式(items.inverted_tools.sating_axe,见 SatingAxeConfig.java:6)。
结构性观察(不作缺陷断言):在 24 个配置文件中,ColoredBlocksConfig、FilingCabinetsConfig、BuildersWandsConfig 三个类没有类级 @Config 注解(其余 21 个都有),且三个类都不在 ConfigurationManager.registerConfig 的 6 个之列。它们的字段仍各自带有 @Config.Default* / @Config.Name / @Config.RangeInt 注解,且其 INSTANCE 单例确实被 ModBlocks / ModItems 的注册门表达式实际引用(例如 ColoredBlocksConfig.INSTANCE.enablePaintRoller),因此功能上取值有效。本仓中没有测试、提交信息或注释能确定这是否是有意为之,故此处只陈述可核实的事实,不推断其意图。
默认启用统计(跨验证):对 ModBlocks 101 个与 ModItems 32 个注册项逐条解析其注册门表达式,并把每个标识符回溯到配置类中对应字段的 @Config.DefaultBoolean 值——
| 结果 | ModBlocks | ModItems |
|---|---|---|
配置开关直接控制且默认 true |
100 | 32 |
默认 false |
0 | 0 |
| 非纯配置布尔门 | 1(LAPIS_AETHERIUS_DYEABLE,需 EndlessIDs) |
0 |
即默认配置下 101 个方块与 32 个物品全部注册(除需 EndlessIDs 的染色版 Lapis Aetherius)。
RecipeConfig 含 72 个配方开关,全部默认 true,且这 72 个在 RecipeLoader.java 中全部被引用(无死开关)。唯一的例外是真绿幕配方——它不受任何开关控制(RecipeLoader.java:539-549)。
数值 — 主要数值配置项
以下是从各配置类中逐条抄录并核实的数值型默认值:
| 配置项 | 默认值 | 位置 |
|---|---|---|
smartPumpEnergyStorage |
10000 | BlockConfig.java:165 |
smartPumpEnergyUsePerBlock |
100 | BlockConfig.java:171 |
smartPumpStallCooldown |
200 | BlockConfig.java:177 |
cursedEarthSpawnRate |
40 | CursedEarthConfig.java:37 |
blessedEarthSpawnRate |
40 | CursedEarthConfig.java:42 |
cursedEarthSpreads |
true | CursedEarthConfig.java:28 |
volatileReaction |
true | CursedEarthConfig.java:32 |
enableBlessedEarthBurn |
false | CursedEarthConfig.java:24 |
underWorldDimensionId |
10 | UnderWorldConfig.java:21 |
endOfTimeDimensionId |
11 | EndOfTimeConfig.java:21 |
filingCabinets.upgradeCapacity |
4096 | FilingCabinetsConfig.java:20 |
filingCabinets.upgradeCountMax |
14 | FilingCabinetsConfig.java:28 |
buildersWandBuildLimit |
9 | BuildersWandsConfig.java:19 |
superBuildersWandBuildLimit |
49 | BuildersWandsConfig.java:30 |
buildersWandCreativeBuildLimit |
200 | BuildersWandsConfig.java:36 |
damageTrowelWithBuildersWand |
100 | BuildersWandsConfig.java:41 |
TNTGeneratorExplosions |
true | GeneratorConfig.java:231 |
invertedBlockDoesXRay |
见配置 | BlockConfig.java:207 |
pacifistsBenchInNonPeaceful |
见配置 | BlockConfig.java:183 |
发电机的 12 组容量 / 燃料 / 产出参数见 发电机家族 的数值表;文件柜三档的 numSlots / numItems 见 文件柜。
VoidQuarryConfig 的 22 个数值字段的具体默认值本条目无法核实——本条目只确认了字段名与数量,未逐一抄录。可在 虚空采掘场 页看到同样的说明。
交互
| 阶段 | 行为 |
|---|---|
| 构造阶段 | UIEMixinLoader.setupMixinEnvironment() 加载全部配置类 |
preInit |
各 config 类读入;方块 / 物品按开关注册;ModBiomes.init()(空方法) |
preInit 末尾 |
RecipeLoader.loadAllRecipes() 注册 147 条配方(CommonProxy.java:136) |
| 运行时 | 方块按开关条件决定是否 isEnabled();配置改动需重启生效 |
File system 上的访问转换器(AT)位于 src/main/resources/META-INF/utilitiesinexcess_at.cfg,包含 3 条条目(EntityLivingBase.field_70718_bc、InventoryCrafting.field_70465_c、EntityLiving.field_70728_aV)——这是访问转换器文件,与本模组配置的运行期开关无关,名字相似容易混淆。