配置项

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 必须重启服务端/客户端。

相关条目