配置文件(supersolarpanel.cfg)
ConfigLoader 是本 mod 唯一的游戏设定来源,全部 16 个选项都在这里。配置在 preInit 阶段一次性读入静态字段,随后被四个面板的 TileEntity 构造器读取。
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 配置文件(Forge Configuration,非指令) |
| 文件 | 由 event.getSuggestedConfigurationFile() 决定;按 Forge 惯例为 config/supersolarpanel.cfg(modid supersolarpanel) |
| 分类 | 全部 16 项都在 general 段下,无分组 |
| 加载时机 | MainSSP.preInit → new ConfigLoader(event) → cfg.run(),在 config.load() 后写入静态字段,finally 中 config.save() |
| 异常处理 | 整个读取包在 try/catch 中,异常被包装为 RuntimeException 重新抛出(会导致加载失败),但 config.save() 仍在 finally 中执行 |
关键约束:所有 16 个字段都是 public static int(32 位有符号)。 这直接限制了容量上限——见下方「数值溢出」。
完整选项表
光谱太阳能板
| 配置键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
SpectralSPGenDay |
int | 8192 | 白天发电率(EU/t)— 改变输出 |
SpectralSPGenNight |
int | 0 | 夜间发电率(EU/t)— 改变输出 |
SpectralSPOutput |
int | 8192 | 输出上限(EU/t)— 改变输出 |
SpectralSPStorage |
int | 81,920,000 | 内储能(EU)— 仅改容量 |
奇异太阳能板
| 配置键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
SingularSPGenDay |
int | 32768 | 白天发电率(EU/t)— 改变输出 |
SingularSPGenNight |
int | 0 | 夜间发电率(EU/t)— 改变输出 |
SingularSPOutput |
int | 32768 | 输出上限(EU/t)— 改变输出 |
SingularSPStorage |
int | 327,680,000 | 内储能(EU)— 仅改容量 |
光吸收太阳能板
| 配置键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
AdminPanelGenDay |
int | 131072 | 白天发电率(EU/t)— 改变输出 |
AdminPanelGenNight |
int | 0 | 夜间发电率(EU/t)— 改变输出 |
AdminPanelOutput |
int | 131072 | 输出上限(EU/t)— 改变输出 |
AdminPanelStorage |
int | 1,310,720,000 | 内储能(EU)— 仅改容量 |
注意本组四个键的命名风格与其它三组不同:
AdminPanelGenDay/AdminPanelGenNight用了大写P,而其它三组是小写SPGenDay/SPGenNight(SpectralSPGenDay、SingularSPGenDay、PhotonicPanelGenDay)。AdminPanelStorage与AdminPanelOutput则是全组统一大写P。改配置文件时必须照抄原键名。
光子太阳能板
| 配置键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
PhotonicPanelGenDay |
int | 524288 | 白天发电率(EU/t)— 改变输出 |
PhotonicPanelGenNight |
int | 0 | 夜间发电率(EU/t)— 改变输出 |
PhotonicPanelOutput |
int | 524288 | 输出上限(EU/t)— 改变输出 |
PhotonicPanelStorage |
int | 2,000,000,000 | 内储能(EU)— 仅改容量 |
哪些选项会改变输出
- 12 个选项改变输出:
GenDay/GenNight/Output,每个面板 3 个。 - 4 个选项只改容量:
Storage,每个面板 1 个。 - 没有任何选项改变行为的其它方面:无难度/规则开关、无日出日落时间、无高度阈值、无损坏率、无红石开关。
数值溢出(重要限制)
ConfigLoader 全部字段为 int,而 Config.get(...).getInt(...) 读入的也是 int。Integer.MAX_VALUE = 2,147,483,647:
| 面板 | 输出 | 容量 | 容量/输出 | 满载续航 |
|---|---|---|---|---|
| 光谱 | 8192 | 81,920,000 | 10,000 tick = 500 秒 | 8 分 20 秒 |
| 奇异 | 32768 | 327,680,000 | 10,000 tick = 500 秒 | 8 分 20 秒 |
| 光吸收 | 131072 | 1,310,720,000 | 10,000 tick = 500 秒 | 8 分 20 秒 |
| 光子 | 524288 | 2,000,000,000 | 3,814.7 tick ≈ 190.7 秒 | 3 分 11 秒 |
前三级面板的容量恰好都是输出的 10000 倍(500 秒)。光子板若要维持同一比例需要 5,242,880,000,已超过 int 上限,因此默认容量被压到 2,000,000,000(约为 Integer.MAX_VALUE 的 93.1%),续航缩短到同级的 38%。
把任何 Storage 调高到 2,147,483,647 以上会溢出;调高 Output 则会让容量/输出比进一步偏离 10000 tick。
另一项关键行为:DreamCraft 下的配方抑制
MainSSP.PostInit 中全部 9 个配方都被包在:
if (!Loader.isModLoaded("dreamcraft")) { ... }
即只要 DreamCraft 已加载,本 mod 注册的 9 个配方一个都不会存在,玩家必须使用 DreamCraft 提供的替代配方。@Mod 注解的 dependencies 写的是 required-after:AdvancedSolarPanel; required-after:IC2; before:dreamcraft,与这一判断方向一致(顺序加载:Advanced Solar Panel → IC2 → 本 mod → DreamCraft)。
这意味着在本 mod 单独可玩(无 DreamCraft)时,配方齐全;整合包中装了 DreamCraft 时,本 mod 的面板与组件全部无法自制。
指令与权限
本 mod 不注册任何指令。 grep -rn "ICommand|CommandBase|addChatCommand" 在 src/main/java/ 下无匹配。ConfigLoader 也只提供读写配置文件的逻辑,不暴露 /ssp 之类的命令。