SuperAPI AI 工具集

authoritative-server

通用与其它

查看项目

更新于 10-15 20:35

技能介绍

用途:在 Decentraland 场景中构建权威多人玩法,由无头服务器控制游戏状态、校验变更并防止作弊。Decentraland 自动托管与部署该服务器。若只需基础 CRDT 多人同步(无服务器),应改用 multiplayer-sync 技能。

安装与启用:必须使用 npm install @dcl/sdk@auth-server 和 npm install @dcl/js-runtime@auth-server,标准 @dcl/sdk 不含权威服务器 API。scene.json 根部的 "authoritativeMultiplayer": true 用于启用无头服务器,但无需手动添加,构建与预览时会自动写入,规则是不要删除它。可选添加 logsPermissions 授权读取生产日志。预览会自动在后台启动本地服务器。

服务端/客户端分支:用 @dcl/sdk/network 的 isServer() 在单一代码库中分支。服务器无渲染运行,可通过 PlayerIdentityData 获取所有玩家位置。

同步组件与校验:自定义组件从服务器同步到所有客户端,始终用 validateBeforeChange() 防止客户端修改权威状态,并把它包在 isServer() 块内。校验回调收到 { entity, currentValue, newValue, senderAddress, createdBy },字段从 value.newValue.<field> 读取。常见模式包括仅服务器写入、校验值本身、邻近校验(防作弊)与仅管理员写入。

消息:用 registerMessages() 定义客户端与服务器通信,schema 用 Schemas.Map(...)。registerMessages() 与 engine.defineComponent() 必须在模块初始加载时运行,需静态导入而非 main() 内动态导入。客户端发送前须等待 isStateSyncronized() 返回 true。单条消息不得超过 13 KB,超出会被静默丢弃。MessageBus 仅客户端可用。

存储与环境变量:Storage 仅服务器可用,分场景级与玩家级,只接受字符串,写入有上限,不应每帧写入,需检查返回的 Promise<boolean>。EnvVar.get() 用于配置密钥与可调参数,仅存在于服务器。

限制:服务器仅在场景内有玩家时活跃,最后一名玩家离开后约两分钟关闭,下次访问冷启动约 15 秒。isStateSyncronized() 不是服务器就绪检查,应使用服务器心跳模式判断存活。本地预览会即时启动服务器,因此服务器就绪类缺陷容易漏到生产环境,需针对真实部署测试无玩家路径。