跳到主要内容

设置系统

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 提供 intlongfloatdoublebytebooleanString 重载。其他类型使用 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、命令解析器、程序赋值之间的区别,以及如何决定修改从下一轮还是下一场生效。