XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8

统一服务器联机

用户要求在现有 ServerInteractive 服务器上统一账号、存档、势力、商品与玩家会话。游戏版本仍为固定 E 盘 Odyssey 副本,哈希见 protocol.spec.yaml;官方服务器不作为失败回退。

实现中的边界:管理 API 继续仅监听本机;游戏入口单独使用 HTTPS 和固定服务器证书指纹。启动器负责认证、网络和有界队列,游戏的无网络 AppContainer 通过独立内存映射文件与启动器交换原生数据和包。服务端每个在线账号只允许一个有效游戏会话,角色、公共资源、物品与保存事务均从服务器工作区读取和提交。

实例匹配使用同一服务器的星系、飞行模式与参考帧,共享 Island/Wake 编号。原生 RPC 3 的第一个数组由 reader 0x626EA0/0x4C18CD0 确认为 U48 机器引用集合;原生 RPC 13/14 用于取得玩家连接信息。自己的机器信息在加入实例前即可取得,其他玩家仅对同实例已提交成员可见。原生 route 请求会收到可靠的逻辑 IPv4 更新,重传复用原响应。匹配、原生包转送和原生实体出现分别验证。

服务器接口:GET /game/health;POST /game/connect 使用独立服务器账号或仅限回环的本机访问凭据;POST /game/invoke 使用游戏会话 Bearer;POST /game/disconnect 释放会话。invoke 接收 GameLinkRequest:data 完成原生数据请求,exchange 批量交换原生包,members 查看已认证会话。数据包受原生 MTU、队列、发送者身份及实例路由授权约束,可靠批次提交后才公开实例成员。离开的玩家所遗留的重传会丢弃,其他玩家的服务器连接继续保留。

公共世界写入 Workspace/galaxy.json,与角色存档分开加锁和原子提交,旧离线运行时写入 state.json 不会覆盖它。服务器启动时从已知本地起点初始化公共星系;后续所有联机账号读取同一星系、势力及公共商品定义。管理 API 的 galaxy 和 galaxy/edit 支持版本检查、备份及命名空间限制,禁止把账号/会话文档发布为公共数据。非空势力文档保留完整内容,详细原生字段兼容性需客户端验证。

管理 API 仍仅绑定 127.0.0.1:48080,游戏 HTTPS 默认单独绑定 0.0.0.0:48081,由同一个 ServerInteractive 进程承载。TLS 私钥在服务器数据目录,Windows ACL 限于当前用户与 SYSTEM;游戏客户端固定该服务器证书 SHA-256,不修改全局证书信任。game-client.json 只含可分发的地址和指纹。其他电脑把地址中的 localhost 改为这台服务器可达的 IP 或域名,保留指纹;对应游戏版本及 E 盘副本限制仍适用。外网连接还需要可达的服务器地址与入站端口,当前未验证远端网络可达性。

./scripts/Deploy-Local.ps1 -EnableOnline 发布并启用联机入口;Start-Online.cmd 启动默认本机指挥官。管理端“服务器联机”可用账号密码登录指定服务器,启动票据只通过子进程标准输入传递;“公共世界数据”提供管理员编辑入口。游戏进程保持零网络能力,仅访问自己的桥接文件;它不读取服务器的密码、私钥或存档文件。

同一指挥官仍在本机离线进程中运行时,服务器拒绝其联机登录。切换模式前先保存并退出该离线进程,避免两个进程写入同一存档。

当前验证状态:751 项单元测试、22 项真实 HTTPS/HTTP 集成检查、81 项原生双客户端检查通过;此前的 126 项隐藏 WinUI 控件检查保留。原生测试使用两个独立账号、配置目录和无网络 AppContainer,在同一个私有 HTTPS 服务器上实际载入 Odyssey,核对原生物理更新访问过的完整 SideWinder Live 实体,分别验证双向前进和转向。

最终报告为 artifacts/native-online-regression-20261021-0549/native-online-validation.json。A/B 前进位移分别为 160.853/160.828 米,转向分别为 38.221/38.233 度;最终位置同步误差最大 0.06836 米,姿态误差小于 0.000004 度。双方保存返回主菜单再进入 Open Play,游戏 PID 保持不变,双方重新收到对方实体;重载位置与中央存档的误差小于 0.000001 米。

回归发现双方离开后复用已关闭实例会导致原生重连校验失败。服务器现在在最后一个已提交或待提交成员离开后回收空实例,重新进入时分配新的 Island/Wake;该修复已通过上述完整重进测试。加载器也验证远程调用完成标记、线程及子进程退出状态,隐藏双客户端实际初始化成功;此前是否由内存不足触发退出仍没有确证。

health 的 nativeMultiplayerValidated 现为 true,nativeMultiplayerValidationScope 为 pinned-odyssey-two-clients-loopback。这个状态仅代表上述固定版本、本机双客户端流程已验证;跨电脑连通性、断网恢复、战斗、NPC、跃迁及原版空间站交易未包含在本次通过范围。测试与 Win32 299 诊断步骤见 原生联机测试。