配置项
ConfigurationHandler 在 preInit 阶段加载,配置文件位于 <config>/signposts/settings.cfg。全部 3 个选项都是 int,且通过静态字段缓存(不热重载)。
加载流程
File configDir = new File(event.getModConfigurationDirectory() + File.separator + ID);
configDir.mkdirs();
ConfigurationHandler.init(new File(configDir.getAbsolutePath(), "settings.cfg"));
ID = "signposts",所以配置目录为 config/signposts/,文件为 settings.cfg。
全部选项
| 选项 | 分类 | 类型 | 默认值 | 范围 | 源码注释/作用 |
|---|---|---|---|---|---|
distancePerPayment |
Payment |
int | 10000 | 1 ~ Integer.MAX_VALUE |
1 点饱食度(饥饿条半根鸡腿)能移动的距离 |
maximumPayment |
Payment |
int | 10 | 0 ~ 20 | 每次传送的最高扣饱食量,0 = 传送免费 |
markerMaxUsage |
Marker |
int | 5 | -1 ~ 20 | 一个标记能用几次;-1 = 无限,0 = 禁用标记 |
配置文件中两个分类各带一条自定义注释:Payment = “Payments for traveling”,Marker = “Marker settings”。
各选项的读取点
| 选项 | 被谁读取 | 影响 |
|---|---|---|
distancePerPayment |
PaymentHandler.pay() |
饱食度扣费的平方距离除数 |
maximumPayment |
PaymentHandler.pay() |
扣费上限(Math.min 的第二个参数) |
markerMaxUsage |
SignPostMarkerItem 构造器、SignPostMarkerItem.getDamage()、SignPostsMod.addJumpTarget() |
标记最大耐久、耐久读数、刻写扣耐久 |
markerMaxUsage 被读取三处,行为各不相同:
- 构造器:
if (maxDamage != -1) setMaxDamage(maxDamage);—— 注意构造器只执行一次,改配置后重进游戏才会生效。 getDamage(ItemStack):if (getMarkerMaxUsage() == -1) return 0;—— 每次调用都重读。addJumpTarget():if (maxItemUsages != -1) { damageItem(1, player); ... }—— 每次刻写都重读。
实现与注释不一致之处
| 项 | 注释宣称 | 代码实际 |
|---|---|---|
maximumPayment = 0 |
传送免费 | 一致。Math.min(floor(distance / 10000), 0) = 0,addStats(0, 0.0F) 无事发生 |
markerMaxUsage = -1 |
无限 | 一致。maxDamage 保持 0 且 getDamage() 恒返回 0,物品无耐久条 |
markerMaxUsage = 0 |
「禁用标记」 | 不一致。addJumpTarget 判定条件是 != -1,0 通过判定后 damageItem 无法推进耐久(maxDamage 为 0),而模组自身的 getItemDamage() == getMaxDamage() 即 0 == 0 成立,立刻 destroyCurrentEquippedItem()。结果是每刻写一个路牌就消耗掉整个标记 |
maximumPayment 上限 20 |
20 | getInt(..., 0, 20, ...) 强制 0~20;20 正好是饱食度满值 |
无热重载
3 个值都存进 private static int 字段,只在 init(File) 中赋值一次。源码中没有 Configuration 的 load() 重读调用、没有 FML 配置事件监听,因此改完 settings.cfg 必须重启服务端/客户端。