让多个 Minecraft 服务器共享同一套 CustomCrops 季节状态
- 以一个服务器和世界作为季节状态的唯一权威来源。
- 使用世界完整游戏时间与可配置的季节时长自动轮换春、夏、秋、冬。
- 将状态原子写入共享文件,降低读取到半写入文件的风险。
- 非权威服务器只读取共享状态,不会自行推进季节。
- 提供
/seasonsync get和/seasonsync set <spring|summer|autumn|winter|disable>管理命令。
- Java 21
- Paper 1.21(或兼容的服务端)
- 已安装 CustomCrops;插件会在启动时将自己注册为它的季节提供者。
- 所有参与同步的服务端均可访问的共享目录,例如网络共享卷。
- 将构建产物
SeasonSync-<version>.jar和 CustomCrops 放入每个服务端的plugins/目录。 - 首次启动后编辑
plugins/SeasonSync/config.yml。 - 每个服务端必须使用相同的
shared-state-file,但server-id必须唯一。 - 只在一个服务端上将
server-id设为authoritative-server;该服务端的authoritative-world必须已加载。
默认配置:
server-id: spawn
authoritative-server: spawn
authoritative-world: world
shared-state-file: ../shared/season-sync.properties
season-duration-days: 216
initial-season: SPRING
refresh-seconds: 30字段说明:
| 字段 | 说明 |
|---|---|
server-id |
当前服务端的唯一标识。 |
authoritative-server |
负责计算与写入季节状态的服务端标识。 |
authoritative-world |
权威服务端中用于计算游戏时间的世界名称。 |
shared-state-file |
所有服务端均能读写的同一个状态文件路径。相对路径以服务端世界目录为基准。 |
season-duration-days |
每个季节持续的 Minecraft 天数,最小值为 1。 |
initial-season |
权威状态文件首次创建前使用的季节。 |
refresh-seconds |
非权威服务端读取状态、权威服务端检查季节变化的间隔(秒)。 |
| 命令 | 作用 | 权限 |
|---|---|---|
/seasonsync get |
查看当前共享季节和周期。 | seasonsync.admin |
/seasonsync set <season> |
在权威服务端手动设置季节。 | seasonsync.admin |
<season> 可为 spring、summer、autumn、winter 或 disable。默认情况下 seasonsync.admin 仅授予 OP。
项目使用 Gradle Wrapper 和 Java 21。Windows 上执行:
.\gradlew.bat clean test shadowJarLinux/macOS 上执行:
chmod +x gradlew
./gradlew clean test shadowJar构建后的插件位于 build/libs/。默认版本为 1.0.0;可在构建时传入 pluginVersion 覆盖它:
./gradlew clean test shadowJar -PpluginVersion=2.0.0GitHub Actions 只会在推送格式为 vX.0.0 的大版本标签时构建和发布,例如 v2.0.0。普通提交、分支推送、v1.1.0 等次版本标签和 v1.0.1 等修订版本标签不会触发该工作流。
确认工作区内容正确并已推送后,运行:
git tag v2.0.0
git push origin v2.0.0工作流会使用 Java 21 执行测试和 Shadow JAR 构建,上传 build/libs/*.jar 作为 Actions artifact,然后创建同名 GitHub Release、上传 JAR 附件并自动生成 Release Notes。