Files
RustNotMC/rsx-server-core/scripts/run-server.ps1
T
sasheg dev 68dfea27b5 Мир на сервере: чанки, генерация, сохранение и поток игрока
Сервер умел принимать игроков и не умел ничего, что можно увидеть. Мир
был не написан: ни чанков, ни генерации, ни сохранения, ни игровых
пакетов.

Сделано:

- Пакет world: ChunkPos, Chunk, Blocks (теперь в протоколе), WorldGenerator,
  ChunkStorage, World. Генерация чистая функция от зерна и координат, без
  java.util.Random и без общего состояния, потому что чанк может
  появиться через месяц после соседнего, на другой машине, и обязан
  совпасть с ним побайтово. Сохранение — файл на чанк, запись во временный
  файл и перенос, версия и контрольная сумма: половина записанного файла
  это мир, который молча испортился.
- Снимок чанка и запись блока теперь под одним замком. Раньше копия могла
  сняться посреди записи блока, и на диск уходила половина изменения.
- Player: позиция, вид, список отправленных чанков, проверка досягаемости
  блока. Клиент не может переписать блок, до которого не дотянулся.
- Сервер держит мир, крутит его по тику, выкидывает давно не тронутые
  чанки, шлет чанки вокруг игрока и рассылает изменения блоков и передвижения
  тем, кто их видит.
- Клиентский сетевой слой в игре еще не тронут: это следующий шаг.

Проверено: 45 тестов сервера. Из них 25 на мир (детерминизм, круг
сохранения, автосохранение, вытеснение, отказ битому файлу) и 9 сквозных
через настоящий сокет: игрок входит, получает 25 чанков, чанк совпадает с
террейном сервера, блок ломается и остаётся сломанным после перезапуска
сервера, два игрока видят друг друга.
2026-10-19 18:58:07 +03:00

62 lines
2.1 KiB
PowerShell

# Starts the server. Needs rsx-protocol and rsx-auth built first.
#
# ASCII only, for the same reason as the other scripts.
#
# run-server.ps1 [-Port 25565] [-Accounts path] [-Capacity 200] [-World path]
param(
[int]$Port = 25565,
[string]$Accounts = '',
[int]$Capacity = 200,
[string]$Name = 'RustNotMC',
[string]$Motd = 'a survival game',
[string]$Register = '',
[string]$Password = '',
[string]$World = '',
[long]$Seed = 0
)
$ErrorActionPreference = 'Stop'
$Repo = Split-Path -Parent $PSScriptRoot
if (-not $Repo) { $Repo = $PSCommandPath | Split-Path -Parent | Split-Path -Parent }
$Workspace = Split-Path -Parent $Repo
$Protocol = Join-Path $Workspace 'rsx-protocol\build\classes'
$Auth = Join-Path $Workspace 'rsx-auth\build\classes'
$Server = Join-Path $Repo 'build\classes'
foreach ($dep in @($Protocol, $Auth, $Server)) {
if (-not (Test-Path $dep)) {
Write-Host " Missing: $dep" -ForegroundColor Red
Write-Host ' Build rsx-protocol, rsx-auth and rsx-server-core first.' -ForegroundColor Red
exit 1
}
}
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 `
--accounts $Accounts --register $Register --password $Password
exit $LASTEXITCODE
}
Write-Host ' rsx-protocol ' -NoNewline
Write-Host (Split-Path -Leaf $Protocol) -ForegroundColor DarkGray
Write-Host ' rsx-auth ' -NoNewline
Write-Host (Split-Path -Leaf $Auth) -ForegroundColor DarkGray
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 `
--world $World --seed $Seed
exit $LASTEXITCODE