Последовательность подключения RobustToolbox
Это полная последовательность шагов, которые выполняются при подключении клиента в RobustToolbox (и в некоторой степени в Space Station 14). Это невероятно запутанная и беспорядочная система, развивавшаяся годами и имеющая множество движущихся частей и наборов состояний. Уф.
Базовый обзор
sequenceDiagram
participant C as Клиент
participant S as Сервер
C->>S: Попытка подключения Lidgren
S->>C: Одобрение подключения Lidgren
rect
Note over C,S: Начальное рукопожатие
C->>S: MsgLoginStart
Note left of S: Сервер решает, аутентифицировать или нет
opt Аутентификация
S->>C: MsgEncryptionRequest
create participant A as Сервер аутентификации
C->>A: POST /api/session/join
C->>S: MsgEncryptionResponse
%% Я бы использовал <<->>, но в моём Trilium пока нет Mermaid v11.0.0.
destroy A
S->A: GET /api/session/hasJoined
end
Note over S: Возникает событие Connecting,<br/>контент может отклонить подключение при желании
S->>C: MsgLoginSuccess
Note over C,S: Обе стороны включают шифрование при необходимости
Note over C,S: Обе стороны создают NetChannel
end
S->>C: MsgStringTableEntries
rect
Note over C,S: Рукопожатие сериализатора
S->>C: MsgMapStrServerHandshake
C->>S: MsgMapStrClientHandshake
opt Клиенту нужны строки
S->>C: MsgMapStrStrings
C->>S: MsgMapStrClientHandshake
end
end
Note over S,C: Событие NetManager.Connected<br/>Сообщения, не относящиеся к рукопожатию, теперь разрешены
C-->>S: MsgConVars
C-->>S: MsgConCmdReg
par PlayerManager.NewSession
Note over S: Создаётся серверная сессия игрока,<br/>PlayerStatusChanged запускается впервые
S->>C: MsgSyncTimeBase
Note over S: NetConfigurationManager.SyncConnectingClient
S->>C: MsgConVars
Note over C: Создаётся клиентская сессия игрока
C->>S: MsgPlayerListReq
and UploadedContentManager
loop Отправка загруженных ресурсов
S->>C: NetworkResourceUploadMessage
end
loop Отправка загруженных прототипов
S->>C: GamePrototypeLoadMessage
end
end
Note over S: Сессия игрока устанавливается в Connected
S->>C: MsgPlayerList<br/>Содержит статус Connected
Note over C: Сессия игрока устанавливается в Connected
Note over S: Контент устанавливает клиентскую сессию в InGame
S->>C: Начинается отправка игровых состояний
Note over C: Сессия игрока устанавливается в InGame