Archipelago
Archipelago 是 realm 服务,它会将附近的玩家分组到各个岛屿中,在他们移动时重新分配,并提供连接到实际后端所需的信息,而该后端会中继他们的消息。
要使用该服务,客户端必须连接到其 realm 的 Archipelago websocket 端点并进行身份验证以开始会话。然后,它们可以开始发送位置更新并接收岛屿分配(参见 客户端生命周期).
与 Archipelago 服务交换的所有消息都使用 protocol buffers 编码,如 Decentraland 中所定义的 协议仓库.
连接
首先,客户端必须建立一个安全的 websocket 连接(wss:)到 realm 的 /archipelago/ws 端点。
一旦连接成功,客户端会有一个由 realm 策略定义的时间窗口(默认 60 秒)来发送认证流程中的每条消息, 身份验证 。
虽然较大的 realm 运行 Archipelago 服务,但较小的 realm 可能会为所有玩家提供固定的后端连接字符串。如果存在该 URI,可在 realm 的 comms.fixedAdapter 属性中找到,位于 realm 的 /about.
在这些情况下,动态岛屿分配将不可用,并且 realm 的 RPC 接口不应被用于该目的。
身份验证
在连接到 Archipelago 后,客户端必须先向服务请求并签署一个挑战,以验证其身份。
客户端发送的第一条消息是一个 ChallengeRequestMessage ,其中包含其 Ethereum 地址(即其公钥)。它们将收到一个 ChallengeResponseMessage ,其中包含一个随机生成的待签名字符串,并且必须使用 SignedChallengeMessage.
该 SignedChallengeMessage ,其中携带一个 JSON 序列化的 认证链 ,该认证链以提供的地址开头,以挑战签名结束。
如果服务成功验证了签名,客户端就会通过身份验证,并将收到一个 WelcomeMessage.
Unexpected error with integration mermaid: Integration is not installed on this space
发送心跳
在会话期间,客户端必须定期发送一个 Heartbeat 消息,以保持 Archipelago 更新必要的信息,从而发放岛屿分配。
如果客户端停止发送 Heartbeat 消息,Archipelago(取决于其当前策略)可能会关闭连接。
获取岛屿分配
第一次心跳后不久,Archipelago 会向客户端发送其第一条 IslandChangedMessage.
主要字段是 conn_str,可用于初始化传输并连接到该岛。其值通常如下所示:
第一个 : 前面的标签是传输类型,其余部分是该传输的专用 URI。它可以包含预授权令牌或其他参数。
在会话期间,Archipelago 可能会因多种原因在任何时候发送新的分配:
位置变化:客户端报告其正在远离岛屿中的其他人。
岛屿请求:客户端请求被分配到某个特定岛屿。
Archipelago 策略:服务决定创建或拆分岛屿,以更好地平衡人数。
客户端必须监听这些分配,按指示关闭并打开传输连接,并在需要时更改所使用的传输类型。
客户端消息
ChallengeRequestMessage ↗ 源码
由客户端作为会话的第一条消息发送,用于开始身份验证流程。
address
字符串
用户的地址。
该 address 该字段必须从 认证链 将要展示的首个私钥派生出来。
SignedChallengeMessage ↗ 源码
由客户端在收到一个 ChallengeResponseMessage后发送,以完成身份验证流程。
中的第一个键 认证链 必须对应于原始 ChallengeRequestMessage.
Heartbeat ↗ 源码
由客户端按固定间隔发送(通常每秒一次),用于向 Archipelago 更新其位置和/或请求岛屿分配。
position
位置
客户端在世界地图中的 3D 位置
desired_room
字符串?
客户端希望被分配到的岛屿 ID
第一条 Heartbeat 消息会很快跟随一个 IslandChangedMessage 来自 Archipelago 的消息。然而,后续更新与岛屿分配无关。客户端不应指望 Heartbeat 会得到响应。
当包含 desired_room 参数时,服务将尝试满足该请求,但不能保证会重新分配到该岛。这取决于 Archipelago 的策略(例如对岛屿人数的限制)。
服务器消息
ChallengeResponseMessage ↗ 源码
由 Archipelago 作为对一个 ChallengeRequestMessage
already_connected
布尔值
是否已存在该用户密钥的连接
WelcomeMessage ↗ 源码
由 Archipelago 在身份验证成功后发送。
peer_id
字符串
已通过身份验证的客户端的唯一标识符(通常是其地址)
IslandChangedMessage ↗ 源码
由 Archipelago 在客户端被(重新)分配到某个岛屿时发送。
描述。
island_id
字符串
新岛屿的 ID
from_island_id
字符串?
旧岛屿的 ID,如果这是一次重新分配
peers
map<string, Position>
描述。
收到一个 IslandChangedMessage 的客户端应结束与岛屿后端的连接,并连接到 conn_str.
该 peers 字段中包含该岛屿内所有 peer 的当前身份和位置,以便客户端填充其初始集合。在此之后,它们应依赖通过岛屿 传输 接收的消息来获取位置更新。
KickedMessage ↗ 源码
由 Archipelago 在关闭连接之前发送。
reason
KickedReason
Archipelago 关闭连接的原因
该 reason 字段的标准值有:
KR_NEW_SESSION:另一个连接使用相同的密钥完成了身份验证。
JoinIslandMessage ↗ 源码
由 Archipelago 在某个 peer 被分配到客户端的岛屿时发送。
island_id
字符串
该岛屿的标识符
peer_id
字符串
该 peer 的唯一标识符(通常是其地址)
该 island_id 字段将与客户端当前的分配相匹配。
LeftIslandMessage ↗ 源码
由 Archipelago 在某个 peer 从客户端的岛屿中移除时发送。
island_id
字符串
该岛屿的标识符
peer_id
字符串
该 peer 的唯一标识符(通常是其地址)
该 island_id 字段将与客户端当前的分配相匹配。
最后更新于