跨服设置
云公会跨服只需要一个 MySQL(或 MariaDB)数据库,不需要 Redis,也不需要在代理端(BungeeCord / Velocity)安装任何插件。 所有子服连同一个数据库后:
- 同一个公会在每个子服都一样:成员、资金、等级、职位、增益、同盟、战争;
- 公会频道与同盟频道跨服互通,申请、邀请、升级、公告等通知在任何子服都收得到;
- 几个子服同时存钱、提领、加人、升级,也不会多扣、超员或升两级;
- 公会仓库每一页全服只有一个人能打开;
- 成员可以跨服回到据点。
设置步骤
- 建一个 MySQL 数据库,例如
cloudguild(字符集utf8mb4),准备好每个子服都连得到的账号。 - 每个子服的
plugins/CloudGuild/config.yml填同样的数据库,sync.server-name填这个子服在代理端的名称:
database:
type: mysql
host: 192.168.1.10
port: 3306
database: cloudguild
username: cloudguild
password: '你的密码'
table-prefix: 'cg_' # 所有子服要一样
sync:
enabled: auto
server-name: 'lobby' # 每个子服不同:lobby、survival、skyblock…
interval-ticks: 20
- 重启每个子服(数据库与跨服设定
/cg admin reload不会生效)。控制台会显示:
[CloudGuild] 資料庫已連線:MySQL 192.168.1.10:3306/cloudguild
[CloudGuild] 跨服同步已開啟(子服:lobby,每 20 tick 讀取其他子服的變動)
- 每个子服的
config.yml、messages.yml、buffs.yml、tasks.yml、shop.yml、menus/是各自一份,职位、等级、增益、任务、商品请保持一致(复制到每个子服),否则不同子服会对同一个公会套用不同的规则。
server-name 要填、要不同、要和代理端一致
- 要和代理端一致:跨服回据点时,云公会用代理端的
Connect把玩家送到据点所在子服的名称。 - 要不同:每个子服用它认出「自己发出的变动」。两个子服同名时,会互相忽略对方的变动(聊天、成员变动都收不到)。
- 留空:自动产生代号
auto-xxxxxxxx,存在plugins/CloudGuild/server-id.txt,资料同步照常,但其他子服的成员不能跨服回到这个子服的据点。把整 个plugins/CloudGuild/复制到新子服时,记得删掉server-id.txt,否则两个子服会用同一个代号。
表格前缀要一样
table-prefix 不同的子服之间互相看不到公会(它们用的是不同的表格)。
已经在单服用 SQLite 一段时间了?先用 /cg admin migrate sqlite 把资料搬进 MySQL,见 从 SQLite 搬到 MySQL。
怎么同步
每个变动在发生的子服立刻处理,同时写进数据库的事件表;其他子服每 interval-ticks(默认 20 tick = 1 秒)读取一次比上次新的事件,做同样的处理:
| 事件 | 其他子服的处理 |
|---|---|
| 公会资料变动(资金、等级、名称、设定……) | 重新载入那个公会,刷新正在看菜单 / 云界面的成员 |
| 成员变动(加入、离开、职位、贡献) | 重新载入那位成员(在线时)与公会,更新增益与菜单 |
| 解散 | 移除公会,在线的原成员恢复成没有公会 |
| 提示消息 | 发给对应的在线成员(全公 会 / 有某项职位权限的成员 / 某一位玩家) |
| 公会 / 同盟聊天 | 发给自己子服上的成员与监听中的管理员 |
| 同盟、增益、战争、公告 | 重新载入对应的资料 |
| 全服公告 | 建立、解散、升级、公会战公告 |
- 只读比上次新的事件,查询很轻;每次会往回多看几笔并去重,避免 MySQL 晚提交的事件被漏掉。
- 玩家不在线时变动不会漏:上线时直接从数据库读最新资料。另外每 60 秒整批刷新一次公会缓存(例如其他子服在线结算累积的活跃)。
- 事件表只保留最近 1 小时,自动清理。
调小 interval-ticks 聊天与通知更快,但每个子服的查询次数也更多;默认 1 秒对大部分服务器都很合适。
只执行一次的操作
多个子服同时在跑,下面这些由第一个抢到的子服执行,其他子服不会重复:
| 操作 | 怎么保证 |
|---|---|
| 每日结算(维护费、活跃衰减、银行记录清理) | 数据库里记一笔「今天已结算」,只有第一个写入成功的子服执行 |
| 任务完成与奖励 | 「标记已完成」的条件更新只会让一个子服成功 |
| 公会战开战与结算公告、发奖励 | 「准备中 → 开战」「开战 → 结束」的条件更新只会让一个子服成功 |
| 每日签到 | 同一个玩家同一天只会成功一次 |
| 审核申请 | 两位管理同时审核同一份申请,只有一位拿得到 |
其他跨服行为
| 项目 | 跨服时 |
|---|---|
| 资金、人数、职位人数、商店购买 | 全部是数据库的条件更新或事务,几个子服同时操作也只会有正确的结果 |
| 在线活跃结算 | 每个子服只算自己子服上的在线成员,不会重复 |
| 任务进度 | 所有子服推进同一份进度(每 5 秒写入一次) |
| 公会战击杀 | 任何子服上的击杀都算分 |
| 邀请、申请 | 可以邀请只在别的子服上线过的玩家;审核通知发给所有子服上有权限的成员 |
| 公会仓库 | 每页一把全服共用的锁,见 公会仓库 |
| 回据点 | 据点在别的子服时,通过代理端把玩家送过去,见 跨服回据点 |
| 监听公会频道 | 每个子服各自开关 |
| 增益 | 每个子服给自己子服上的成员套用 |
%cloudguild_online%、成员列表的「在线」 | 只算这个子服的在线成员 |
| 邀请菜单 | 只列出这个子服上的玩家;其他子服的玩家用 /cg invite <玩家> |
| 设定文件 | 每个子服各自一份,需要自己复制 |