⚙️ 双层配置架构体系
Agrarian Reform 实现了双层配置体系,将全局 JSON 模板存储、游戏内实时游戏规则与模组作物的脏标记持久化完美结合。
🏗️ 架构设计概览
全局配置模板 (模式 v2)
config/agrarian-reform.json
│
▼ (服务端 / 集成世界启动)
动态游戏规则管理器
注册默认世界游戏规则并自动探测农作物
│
▼ (Runtime Administration)
MODMENU 与 YACL v3 三标签客户端 GUI <---> 游戏内 /gamerule 命令
│
▼ (世界卸载 / 保存事件自动保存)
THREAD-SAFE DIRTY-TRACKING PERSISTENCE1. 全局 JSON 配置模板 (config/agrarian-reform.json)
全局 JSON 文件存储生成新世界时应用的默认基准值。修改 config/agrarian-reform.json 会更新未来世界的初始设置,而不会影响已有世界的规则状态。
2. 实时世界游戏规则 (agrarian_reform:*)
活跃世界直接通过 Minecraft 原生游戏规则管理运行时设置。通过 ModMenu 界面或 /gamerule 所做的更改会立即在当前世界生效,无需重启服务器。
3. 线程安全脏标记持久化与模组移除韧性
- 异步保存节流:在游戏过程中发现新的模组作物时,
AgrarianConfig会自动将内存标记为dirty = true,而不会立即写入硬盘。仅在自然保存节点 (BEFORE_SAVE) 或服务器关闭 (SERVER_STOPPING) 时安全落盘。 - 模组卸载安全性:发现的作物以纯字符串键名(如
"farmersdelight:tomatoes")保存在配置中。若模组被卸载,这些条目安全静默存储,不会引发反序列化崩溃;日后重新安装模组时将自动恢复生效。
📜 默认 config/agrarian-reform.json (Schema v2)
json
{
"configVersion": 2,
"hydrationSourceRange": 8,
"hydrationFlowingRange": 4,
"pureWaterHydrationOnly": false,
"rainGrowthAcceleration": 1,
"growthBiodiversityBonus": true,
"totalTrampleImmunity": false,
"trampleImmunityPlayersOnly": false,
"alwaysWetFarmland": false,
"seedsGrowGrass": true,
"rightClickHarvest": true,
"universalBonemeal": true,
"globalGrowthMultiplier": 100,
"ambientCropRustle": true,
"ambientVitalityParticles": true,
"forcedCrops": [
"minecraft:wheat",
"minecraft:carrots",
"minecraft:potatoes",
"minecraft:beetroots"
],
"forcedGrowthMultipliers": {
"minecraft:wheat": 0,
"minecraft:carrots": 0,
"minecraft:potatoes": 0,
"minecraft:beetroots": 0
}
}🖥️ 可选客户端 GUI 集成 (ModMenu & YACL v3)
当客户端安装了 ModMenu 与 YetAnotherConfigLib v3 (YACL) 时,玩家可以打开交互式 3 标签图形配置屏幕:
- 常规选项标签页:灌溉半径滑块 ($0 \to 32$)、纯净水开关、雨露生长加速滑块 ($0 \to 10$)、生物多样性开关、播种育草、右键收获、全能骨粉及全局生长倍率。
- 沉浸与美学标签页:完全防踩踏保护、仅限玩家/驯服宠物开关、耕地永不干涸、作物沙沙音效及绿色活力粒子星光。
- 作物倍率标签页:动态生成所有已探测并注册的模组作物列表(按字母排序),提供整数输入框($-1 = \text{冻结}$, $0 = \text{继承全局}$, $\ge 100 = \text{自定义速度}$)。
java
public class ModMenuIntegration implements ModMenuApi {
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory() {
if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib")) {
return YaclScreenHelper::createScreen;
}
return parent -> null;
}
}🛡️ 专用服务端防崩溃保障:所有 YACL 屏幕类严格隔离在
YaclScreenHelper中并按条件实例化,确保专用服务端运行期间绝不加载客户端 GUI 字节码!
See also: 游戏规则 (GameRules) 参考, 作物注册表与通用作物, and 开发者环境与编译指南.
