quake3live/svdemo.txt
serge_shubin 7b942c77cf Server-side demo recording and playback (netdemo) — unified
Complete netdemo feature as a single commit on implant2:

Recording:
- svdemo_record/svdemo_stop commands
- Delta-compressed entity states and player states
- Server command capture (chat, prints)
- Configstring change tracking
- Keyframes at configurable interval for seeking
- Auto-record on map load (svdemo_autorecord)
- Auto-stop on map change, clean shutdown handling

Playback:
- svdemo_play loads map, spectator auto-connects
- Free camera with client-owned PmoveSingle (real-time, works paused)
- Player follow mode with full HUD
- Scoreboard with recorded player scores
- svdemo_pause with frozen trajectories and smooth unpause
- svdemo_seek (fast, keyframe-accurate) and svdemo_seekexact (precise)
- Seeking works from paused state
- SNAPFLAG_RESET_ENTITIES for clean map_restart and seek transitions
- Proper session/cvar/configstring handling across transitions
- svdemo_pauseEmpty waits for spectator before starting

Engine changes:
- usercmd_t: optional origin field for client-owned PVS
- msg.c: serialize optional usercmd origin
- cl_parse.c: SERVERCOUNT time delta reset for seek/unpause
- CG_SETCLIENTORIGIN trap for cgame-to-engine origin communication

cgame changes:
- Client-owned spectator camera (svDemoCameraPs)
- CS_SVDEMO configstring detection
- SNAPFLAG_RESET_ENTITIES entity interpolation reset
- Backwards time handling for seeking
- Local entity cleanup on seek
- Pause detection from frozen snapshot time
- Suppress connection interrupted during demo playback

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 00:54:32 +08:00

196 lines
9.2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

===========================================================================
Серверные демо-записи (SVDEMO)
Руководство пользователя
===========================================================================
ОПИСАНИЕ
--------
Система серверных демо-записей позволяет записывать полное состояние
игрового сервера (все сущности, все игроки) и воспроизводить запись
с возможностью свободного перемещения камеры или просмотра от первого
лица любого игрока.
В отличие от обычных клиентских демо (запись только того, что видит
один игрок), серверная запись содержит полную картину матча.
КОНСОЛЬНЫЕ КОМАНДЫ
------------------
Запись:
svdemo_record <имя>
Начать запись серверного демо. Файл сохраняется в
svdemos/<имя>.svdm внутри игровой директории.
svdemo_stop
Остановить текущую запись или воспроизведение.
При остановке воспроизведения происходит отключение от сервера.
Воспроизведение:
svdemo_play <имя>
Воспроизвести серверное демо. Загружает карту из записи,
подключает зрителя автоматически. Можно вызывать из меню,
из игры или во время просмотра другого демо.
svdemo_pause
Пауза / продолжение воспроизведения. Во время паузы камера
свободно перемещается, сущности заморожены.
На экране отображается "Playback Paused".
svdemo_seek <секунды>
Перемотка относительно текущей позиции. Положительное значение --
вперёд, отрицательное -- назад.
Перемещает к ближайшему ключевому кадру (точность ±5 сек).
Работает в паузе.
Пример: svdemo_seek -10 (назад на 10 секунд)
svdemo_seekexact <секунды>
Точная перемотка. Находит ближайший ключевой кадр, затем
прочитывает кадры до целевого времени. Точность до одного
серверного кадра (50 мс при sv_fps 20). Может занять долю
секунды на длинных перемотках. Работает в паузе.
Пример: svdemo_seekexact -10 (назад ровно на 10 секунд)
НАСТРОЙКИ (CVARS)
-----------------
svdemo_autorecord <0|1> (по умолчанию: 0)
Автоматическая запись демо при каждой загрузке карты.
Файлы именуются автоматически: <карта>_ГГГГММДД_ЧЧММСС.svdm
Пример: q3dm6_20260323_141530.svdm
svdemo_pauseEmpty <0|1> (по умолчанию: 1)
Пауза воспроизведения, когда нет подключённых зрителей.
Демо начинается с первого кадра при подключении зрителя.
svdemo_keyframeInterval <секунды> (по умолчанию: 5, 0 = выкл.)
Интервал ключевых кадров. Ключевые кадры позволяют перематывать
запись. Чем меньше интервал, тем точнее перемотка командой
svdemo_seek, но немного больше размер файла. Первый кадр
записи всегда является ключевым.
Все настройки сохраняются в конфигурации (CVAR_ARCHIVE).
ЗАПИСЬ
------
1. Запустите сервер и начните игру как обычно:
devmap q3dm6
2. Начните запись:
svdemo_record mymatch
3. Играйте. Все действия всех игроков записываются.
4. Остановите запись:
svdemo_stop
Запись также автоматически останавливается при:
- Смене карты (map, devmap, nextmap по таймлимиту/фраглимиту)
- Выключении сервера
Перезапуск карты (map_restart) НЕ прерывает запись.
ВОСПРОИЗВЕДЕНИЕ
---------------
1. Запустите воспроизведение:
svdemo_play mymatch
2. Карта загрузится автоматически. Вы подключитесь как зритель
со свободной камерой (полёт по карте).
3. Управление зрителем:
- Свободная камера: перемещайтесь как обычный спектатор
- Следование за игроком: нажмите MOUSE1 (ATTACK) для входа
в режим следования и переключения между игроками
- Выход из следования: team spectator (можно забиндить)
4. В режиме следования вы видите игру от первого лица выбранного
игрока с полным HUD: здоровье, броня, боеприпасы, оружие.
5. Табло (TAB) показывает счёт записанных игроков.
6. Управление воспроизведением:
- svdemo_pause -- пауза/продолжение
- svdemo_seek -10 -- быстрая перемотка назад на 10 сек
- svdemo_seek 30 -- быстрая перемотка вперёд на 30 сек
- svdemo_seekexact -10 -- точная перемотка назад на 10 сек
- svdemo_stop -- остановка и выход
7. Воспроизведение останавливается автоматически при
достижении конца записи.
ФОРМАТ ФАЙЛА
-------------
Расширение: .svdm
Директория: svdemos/
Файл содержит:
- Заголовок: название карты, настройки сервера, конфигстроки
(имена игроков, модели, настройки игры)
- Покадровые данные: дельта-сжатые состояния сущностей и игроков,
серверные команды (чат, принты), изменения конфигстрок
- Ключевые кадры с индексом в конце файла
Дельта-кодирование обеспечивает компактный размер файла.
Типичный 10-минутный матч с 10 ботами занимает ~8 МБ.
Одна запись = одна карта. При смене карты запись останавливается.
ОГРАНИЧЕНИЯ
-----------
- Если в записанной игре было 64 игрока (MAX_CLIENTS), один
из них не будет виден при воспроизведении (его слот занят зрителем).
- Воспроизведение требует наличия тех же pk3-файлов (карты, модели),
что использовались при записи.
- Демо несовместимы между разными версиями движка, если изменился
формат сетевых структур.
- При перемотке могут кратковременно отображаться визуальные артефакты
(частицы, вспышки) от локальных эффектов.
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
---------------------
Автоматическая запись всех матчей:
set svdemo_autorecord 1
devmap q3dm17
(все матчи на этом сервере будут записываться автоматически)
Запись конкретного матча:
devmap q3tourney2
svdemo_record duel_finals
(играть...)
svdemo_stop
Просмотр записи:
svdemo_play duel_finals
Просмотр с перемоткой:
svdemo_play duel_finals
(подождать 30 секунд)
svdemo_seekexact -20 (вернуться на 20 секунд назад)
svdemo_pause (поставить на паузу)
svdemo_seek -5 (ещё назад на 5 секунд, в паузе)
svdemo_pause (продолжить)
===========================================================================