Клиент говорит с сервером по нашему протоколу
Раньше клиент умел только показывать меню. Теперь он заходит на сервер,
получает наш мир и рисует его.
Как это устроено:
- Наш сетевой слой (net/rustnotmc/client/net) читает наш протокол и
переводит его пакеты в пакеты игры. Игра остаётся игрой: у неё есть
мир, игрок, сущности и рендер, и все они работают. Не переписывать их
ради того, чтобы нарисовать тот же мир иначе, незачем.
- Пакеты игры, которые не имеют соответствия у нас, не отправляются, а
наоборот: перемещение игрока и ломание блока переводятся в наши.
- Экран входа игры (GuiConnecting) заменён наш: он спрашивает у лаунчера,
кем пришёл игрок, и подставляет это в рукопожатие.
- Соединение качается из тика игры, а не из экрана. Рукопожатие, которое
зависит от того, что экран ещё на экране, ломается alt-tab'ом.
Вход теперь через лаунчер, а не внутри игры:
- Лаунчер уже умеет логинить игрока и отдаёт игре имя, uuid и токен
(--username, --uuid, --accessToken). Это та же роль, что у Yggdrasil в
ванилле, только лаунчер наш.
- Сервер спрашивает лаунчер, один из ли наш этот игрок, и заодно получает
бан-лист. Токен используется один раз и не хранится.
- Свои аккаунты сервера, когда настроен лаунчер, закрыты: сервер с двумя
дверями не имеет дверей. Открыть их можно флагом, но намеренно.
- Если игру запустили без лаунчера, экран всё равно спрашивает имя и
пароль: это путь для своего сервера и для разработки.
Проверено живьём: клиент вошёл по токену лаунчера, сервер спросил
лаунчер, лаунчер сказал "свой", игрок получил мир, 210 чанков пришли и
лежат на диске, рельеф нарисован.
Что чинилось по дороге:
- Minecraft.setIngameFocus() возвращал на главное меню, когда окно
получало фокус. Игрок как раз кликает в окно, чтобы напечатать пароль, и
экран входа исчезал в этот самый момент.
- Ответ лаунчера разбирается, а не ищется подстрокой: {"valid": true} и
{"valid":true} это один и тот же ответ, и сервер, который понимает
только второй, ломает работающий лаунчер.
This commit is contained in:
@@ -32,7 +32,14 @@ foreach ($j in (Get-ChildItem (Join-Path $Astral 'libraries') -Recurse -Filter '
|
||||
# from drifting apart.
|
||||
$Loader = Join-Path $Client 'dist\rsx-loader.jar'
|
||||
|
||||
$cp = @($good + $(if (Test-Path $Loader) { $Loader -replace '\\', '/' } else { $null })) -join ';'
|
||||
# The client speaks the server's own protocol, so the protocol and the account
|
||||
# code are compiled against as well. They are the same jars the game runs with.
|
||||
$Protocol = Join-Path $Root 'rsx-protocol\dist\rsx-protocol.jar'
|
||||
$Auth = Join-Path $Root 'rsx-auth\dist\rsx-auth.jar'
|
||||
|
||||
$cp = @($good + $(if (Test-Path $Loader) { $Loader -replace '\\', '/' } else { $null }) `
|
||||
+ $(if (Test-Path $Protocol) { $Protocol -replace '\\', '/' } else { $null }) `
|
||||
+ $(if (Test-Path $Auth) { $Auth -replace '\\', '/' } else { $null })) -join ';'
|
||||
$argf = Join-Path $Temp 'fork-build.txt'
|
||||
$errf = Join-Path $Temp 'fork-build-errors.txt'
|
||||
$sb = New-Object System.Text.StringBuilder
|
||||
|
||||
@@ -128,9 +128,14 @@ foreach ($j in (Get-ChildItem (Join-Path $Astral 'libraries') -Recurse -Filter '
|
||||
if ($ok) { $good.Add(($j.FullName -replace '\\', '/')) }
|
||||
}
|
||||
# The fork calls into the mod loader, so the loader has to be visible to javac
|
||||
# exactly as it is at runtime.
|
||||
# exactly as it is at runtime. The protocol and the account code are compiled
|
||||
# against too: the client speaks the server's protocol, not the vanilla one.
|
||||
$Loader = Join-Path $Client 'dist\rsx-loader.jar'
|
||||
$cp = @($good + $(if (Test-Path $Loader) { $Loader -replace '\\', '/' } else { $null })) -join ';'
|
||||
$Protocol = Join-Path $Root 'rsx-protocol\dist\rsx-protocol.jar'
|
||||
$Auth = Join-Path $Root 'rsx-auth\dist\rsx-auth.jar'
|
||||
$cp = @($good + $(if (Test-Path $Loader) { $Loader -replace '\\', '/' } else { $null }) `
|
||||
+ $(if (Test-Path $Protocol) { $Protocol -replace '\\', '/' } else { $null }) `
|
||||
+ $(if (Test-Path $Auth) { $Auth -replace '\\', '/' } else { $null })) -join ';'
|
||||
$sb = New-Object System.Text.StringBuilder
|
||||
foreach ($a in @('-nowarn', '-proc:none', '-encoding', 'UTF-8', '--release', '17', '-d', ($Out -replace '\\', '/'))) { [void]$sb.AppendLine($a) }
|
||||
[void]$sb.AppendLine('-cp'); [void]$sb.AppendLine('"' + $cp + '"')
|
||||
|
||||
Reference in New Issue
Block a user