跳到主要内容

跨服设置

云公会跨服只需要一个 MySQL(或 MariaDB)数据库,不需要 Redis,也不需要在代理端(BungeeCord / Velocity)安装任何插件。 所有子服连同一个数据库后:

  • 同一个公会在每个子服都一样:成员、资金、等级、职位、增益、同盟、战争;
  • 公会频道与同盟频道跨服互通,申请、邀请、升级、公告等通知在任何子服都收得到;
  • 几个子服同时存钱、提领、加人、升级,也不会多扣、超员或升两级;
  • 公会仓库每一页全服只有一个人能打开;
  • 成员可以跨服回到据点。

设置步骤​

  1. 建一个 MySQL 数据库,例如 cloudguild(字符集 utf8mb4),准备好每个子服都连得到的账号。
  2. 每个子服的 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
  1. 重启每个子服(数据库与跨服设定 /cg admin reload 不会生效)。控制台会显示:
[CloudGuild] 資料庫已連線:MySQL 192.168.1.10:3306/cloudguild
[CloudGuild] 跨服同步已開啟(子服:lobby,每 20 tick 讀取其他子服的變動)
  1. 每个子服的 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 <玩家>
设定文件每个子服各自一份,需要自己复制