Мир на сервере: чанки, генерация, сохранение и поток игрока
Сервер умел принимать игроков и не умел ничего, что можно увидеть. Мир был не написан: ни чанков, ни генерации, ни сохранения, ни игровых пакетов. Сделано: - Пакет world: ChunkPos, Chunk, Blocks (теперь в протоколе), WorldGenerator, ChunkStorage, World. Генерация чистая функция от зерна и координат, без java.util.Random и без общего состояния, потому что чанк может появиться через месяц после соседнего, на другой машине, и обязан совпасть с ним побайтово. Сохранение — файл на чанк, запись во временный файл и перенос, версия и контрольная сумма: половина записанного файла это мир, который молча испортился. - Снимок чанка и запись блока теперь под одним замком. Раньше копия могла сняться посреди записи блока, и на диск уходила половина изменения. - Player: позиция, вид, список отправленных чанков, проверка досягаемости блока. Клиент не может переписать блок, до которого не дотянулся. - Сервер держит мир, крутит его по тику, выкидывает давно не тронутые чанки, шлет чанки вокруг игрока и рассылает изменения блоков и передвижения тем, кто их видит. - Клиентский сетевой слой в игре еще не тронут: это следующий шаг. Проверено: 45 тестов сервера. Из них 25 на мир (детерминизм, круг сохранения, автосохранение, вытеснение, отказ битому файлу) и 9 сквозных через настоящий сокет: игрок входит, получает 25 чанков, чанк совпадает с террейном сервера, блок ломается и остаётся сломанным после перезапуска сервера, два игрока видят друг друга.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# ASCII only, for the same reason as the other scripts.
|
||||
#
|
||||
# run-server.ps1 [-Port 25565] [-Accounts path] [-Capacity 200]
|
||||
# run-server.ps1 [-Port 25565] [-Accounts path] [-Capacity 200] [-World path]
|
||||
|
||||
param(
|
||||
[int]$Port = 25565,
|
||||
@@ -11,7 +11,9 @@ param(
|
||||
[string]$Name = 'RustNotMC',
|
||||
[string]$Motd = 'a survival game',
|
||||
[string]$Register = '',
|
||||
[string]$Password = ''
|
||||
[string]$Password = '',
|
||||
[string]$World = '',
|
||||
[long]$Seed = 0
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
@@ -32,6 +34,7 @@ foreach ($dep in @($Protocol, $Auth, $Server)) {
|
||||
}
|
||||
|
||||
if (-not $Accounts) { $Accounts = Join-Path $Repo 'accounts.txt' }
|
||||
if (-not $World) { $World = Join-Path $Repo 'world' }
|
||||
|
||||
if ($Register) {
|
||||
& java -cp "$Protocol;$Auth;$Server" net.rustnotmc.server.ServerMain `
|
||||
@@ -47,10 +50,13 @@ Write-Host ' rsx-server-core ' -NoNewline
|
||||
Write-Host (Split-Path -Leaf $Server) -ForegroundColor DarkGray
|
||||
Write-Host ''
|
||||
Write-Host " accounts : $Accounts"
|
||||
Write-Host " world : $World"
|
||||
Write-Host " seed : $Seed"
|
||||
Write-Host " port : $Port"
|
||||
Write-Host " capacity : $Capacity"
|
||||
Write-Host ''
|
||||
|
||||
& java -cp "$Protocol;$Auth;$Server" net.rustnotmc.server.ServerMain `
|
||||
--port $Port --accounts $Accounts --capacity $Capacity --name $Name --motd $Motd
|
||||
--port $Port --accounts $Accounts --capacity $Capacity --name $Name --motd $Motd `
|
||||
--world $World --seed $Seed
|
||||
exit $LASTEXITCODE
|
||||
@@ -44,11 +44,19 @@ $testFiles = @(Get-ChildItem (Join-Path $Repo 'src\test\java') -Recurse -Filter
|
||||
if ($LASTEXITCODE -ne 0) { Write-Host ' Test failed to compile.' -ForegroundColor Red; exit 1 }
|
||||
Say "compiled $($mainFiles.Count) main + $($testFiles.Count) test files"
|
||||
|
||||
& java -cp "$cp;$mainOut;$testOut" net.rustnotmc.server.ServerTest (Join-Path $Out 'selftest')
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host ''
|
||||
Write-Host ' SERVER TESTS FAILED' -ForegroundColor Red
|
||||
exit 1
|
||||
$suites = @(
|
||||
'net.rustnotmc.server.ServerTest',
|
||||
'net.rustnotmc.server.world.WorldTest',
|
||||
'net.rustnotmc.server.PlayTest'
|
||||
)
|
||||
foreach ($suite in $suites) {
|
||||
Say "running $suite"
|
||||
& java -cp "$cp;$mainOut;$testOut" $suite (Join-Path $Out 'selftest')
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host ''
|
||||
Write-Host " $suite FAILED" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ''
|
||||
|
||||
Reference in New Issue
Block a user