🔄 AdventureResourceSync

AdventureResourceSync 将群组服各子服的 CraftEngine 资源合并为统一资源包,由 Hub 分发配置、重建、托管并通知玩家下载;Velocity 端可阻止未加载最新版资源包的玩家进入业务服。

🧬

结构化合并

汇总多子服 resources 与 YAML,二进制冲突可按最新文件处理。

📤

反向分发

将统一资源和 commands.yml 等文件同步回全部节点。

🌐

内置托管

Hub 通过 HTTP 提供 latest.zip,并向在线玩家重新发送。

🚧

代理门禁

未完成最新版资源包加载时,只允许停留或返回 Lobby。

版本1.1.0
模块Bukkit + Velocity
服务端Paper 1.21,Java 21
主要目标CraftEngine 群组服资源统一

📥 双端安装

  1. 在登录服/Lobby 安装 Bukkit 模块,并配置 role: hub
  2. 在其他子服安装同一 Bukkit 模块,配置 role: node 与唯一 server-id
  3. 在 Velocity 安装代理模块。
  4. 确保 Hub 能通过文件系统访问每个子服 CraftEngine 目录。
  5. 配置共享目录、HTTP 公网地址、端口和 Velocity 的 Lobby 名称。
⚠️ server-id 必须一致

Bukkit 的 server-id 必须与 Velocity 服务器名相同,否则定向下发和加载状态同步会失效。

🧩 Hub / Node 架构

角色职责
Hub合并、分发、重建、发布、HTTP 托管、通常负责玩家首次下发
Node提供本服资源源文件、接收统一资源和配置、执行 CraftEngine 重载
Velocity读取共享加载状态,拦截未加载玩家向业务服转移
共享目录保存统一版本、信号与跨端状态

一键 deploy

指定节点资源 → Hub 合并 → 分发所有节点 → 重建 → 发布 latest.zip → 更新版本

Hub 通常是 master,分发时自动排除自己的资源源目录,避免反复自合并。

🧬 合并资源

merge:
  structured-yaml:
    enabled: true
  binary-files:
    strategy: newest-file
  • 结构化 YAML 合并按键组合配置,降低简单覆盖造成的丢项。
  • 资源目录从指定服务器或全部服务器读取。
  • 二进制重名时默认选择修改时间最新的文件。
  • /ars merge <server|all> 只执行合并,不分发与重建。
💡 冲突治理

不同子服不应定义同名但含义不同的模型、贴图或命名空间;自动策略无法判断业务语义。

📤 分发配置

hub:
  distribute:
    enabled: true
    sync-resources: true
    sync-files:
      - "commands.yml"
node:
  sync-resources: true
  sync-files:
    - "commands.yml"

分发把 Hub 生成的统一 resources 以及白名单配置文件复制到每个节点的 CraftEngine 目录。节点收到信号后可执行配置的重载命令。

⚠️ 只同步明确文件

不要把包含本服端口、数据库或世界差异的配置加入 sync-files;统一文件必须在所有子服语义一致。

🏗️ 重建与发布

rebuild:
  watch-signal: true
  signal-check-seconds: 5
  commands:
    - "ce reload"
    - "ce upload"
  publish-delay-ticks: 120
  generated-pack: "./plugins/CraftEngine/generated/resource_pack.zip"
  1. Hub 或节点执行 CraftEngine reload。
  2. Hub 运行 upload/生成资源包。
  3. 等待生成完成后读取 configured generated-pack。
  4. 复制为 HTTP 服务使用的最新包并更新版本。
  5. 共享信号通知其他节点刷新。

🌐 资源包下发

resource-pack:
  public-url: "https://资源包域名/latest.zip"
  bind-host: "0.0.0.0"
  bind-port: 8225
  required: true
  send-delay-ticks: 40
node:
  send-on-join: false
  • Hub 内置 HTTP 服务监听 bind-host/bind-port。
  • public-url 必须是玩家客户端可访问的完整地址。
  • required: true 会把拒绝资源包视为无法继续游戏。
  • /ars send <server|all> 让指定服在线玩家立即下载最新版。
  • 节点默认不在入服时重复发送,通常由 Hub 统一下发。

🚧 Velocity 门禁

lobby-server: "lobby"
shared-dir: ".../cache/AdventureResourceSync"
block-transfer-if-not-loaded: true
message: "§c你还没有加载最新服务器资源包,请先回到登录服完成加载。"

Bukkit 在所有服务器监听资源包状态,并把玩家已加载的版本写入共享状态。Velocity 在玩家尝试切换服务器时比对最新版:

  • 已加载最新版:允许前往业务服。
  • 未加载或版本过期:阻止转移并提示返回/停留 Lobby。
  • 重新下发成功后,节点也会更新状态以解除门禁。

⚙️ 配置参考

字段说明
rolehubnode
server-id与 Velocity 服务器名一致
hub.craftengine-dir统一资源包 master 目录
hub.shared-dir版本与信号共享目录
hub.servers服务器 ID 到 CraftEngine 目录映射
node.reload.commands同步后执行的命令
resource-pack.public-url玩家访问的 URL
resource-pack.bind-port内置 HTTP 监听端口
🚨 路径必须按实际环境修改

默认配置包含示例服务器绝对路径和地址,不能直接复制到其他机器。

⌨️ 命令与权限

根命令 /ars,别名 /advsync/arsync;全部需要 adventureresourcesync.admin(OP)。

命令作用
/ars status角色、server-id、版本、共享目录和托管信息
/ars deploy <server|all>合并→分发→重建→发布
/ars merge <server|all>仅合并
/ars distribute仅分发到节点
/ars rebuild执行重建命令
/ars publish发布已生成资源包
/ars send <server|all>向在线玩家下发
/ars push节点推送本服资源
/ars reload重载设置

deploy、merge、distribute、rebuild、publish 只能在 Hub 执行。

📋 推荐运维流程

  1. 在目标节点完成 CraftEngine 内容修改并本地验证。
  2. 备份 Hub 统一资源目录和上一个 latest.zip。
  3. 执行 /ars deploy <节点>
  4. 检查 Hub 日志中的合并冲突、生成命令和发布版本。
  5. 先对测试玩家执行 /ars send lobby
  6. 确认资源包加载成功及 Velocity 门禁解除。
  7. 再执行 /ars send all
💡 可回滚设计

长期保留至少一个上一版本资源包及其统一资源源目录;发生贴图/模型异常时能快速恢复。

🧰 故障排查

HTTP 资源包无法下载

  • 检查 8225 端口、防火墙、反向代理和 public-url。
  • 在玩家网络侧访问 latest.zip,而不是只在服务器本机测试。
  • 确认 generated-pack 已生成并被 publish 复制。

节点未更新

  • 检查 Hub 对节点目录的文件权限和路径。
  • 确认 sync-resources、sync-files 与 reload.enabled。
  • 检查共享目录和 signal watcher。

玩家一直被门禁拦截

  • Bukkit server-id 与 Velocity 名称是否一致。
  • 两端 shared-dir 是否指向同一位置。
  • 玩家加载状态对应的版本是否为最新发布版本。