跳到主要内容

设置系统

Setting<T> 适合“每张地图一份”的规则配置,例如目标分数、回合时长和是否允许中途加入。它同时支持命令解析、JSON 保存与网络缓冲区同步。

private final Setting<Integer> targetScore =
addSetting("match", "targetScore", 5);
private final Setting<Integer> roundSeconds =
addSetting("match", "roundSeconds", 90);
private final Setting<Boolean> friendlyFire =
addSetting("combat", "friendlyFire", false);

分类用于配置 UI 分组;配置名应在同一地图内唯一且保持稳定。改名等同于配置格式变更。

支持类型​

BaseMap.addSetting 提供 int、long、float、double、byte、boolean 和 String 重载。其他类型使用 Codec:

private final Setting<MyRules> rules = addSetting(
new Setting<>("match", "rules", MyRules.CODEC, MyRules.DEFAULT));

核心 API:get()、set(T)、reset()、getDefaultValue()、codec()、getConfigName()、getCategory()、parse(String)、toJson()、fromJson()、readFromBuf()、writeToBuf()。

保存流程​

BaseMap.configToJson() 与 configFromJson() 统一处理 settings() 中的设置;loadConfig() 和 saveConfig() 负责地图配置文件。通常不需要为普通 Setting 另建 SaveHolder。

为数值设置增加业务范围验证。普通 Codec.INT 不限制业务范围;可以使用范围 Codec,但程序直接 set() 的值仍需要调用方约束。

int seconds = Mth.clamp(roundSeconds.get(), 10, 3600);

跨地图排行榜、赛季或账号数据不属于 Setting,应使用持久化系统。

复杂配置​

设置解析与生效时机进一步说明 Codec、命令解析器、程序赋值之间的区别,以及如何决定修改从下一轮还是下一场生效。