Тики в демках CS2: перевод тика во время и demo_gototick
Тик демки, деленный на тикрейт, дает время. Ошибаются в другом: какой тикрейт, из какого счетчика взят номер и куда попадает demo_gototick.
Вам присылают тик. Это число вроде 61440, демка, к которой оно относится, идет сорок минут, и само по себе число не говорит, где в этих сорока минутах смотреть.
Вся арифметика - одно деление. Все, на что уходит время, находится до и после него.
Деление и число, которое нужно к нему принести
Тик - это шаг серверной симуляции, поэтому время, которое он обозначает, - это тик, деленный на количество таких шагов в секунду.
seconds = tick / tickrate
Тик 6400 в 64-тиковой демке - это 100 секунд, то есть 1:40 от начала файла. Тот же тик в 128-тиковой демке - это 50 секунд. В самом числе ничего не говорит, какой из вариантов ваш.
Именно поэтому голый тик плохо вставлять в чат. Он точный и при этом неполный, а недостающую половину люди додумывают сами.
Тикрейт принадлежит демке, а не игре
Официальные серверы матчмейкинга и Premier от Valve работают на 64 тиках, поэтому большинство демок, скачанных из самой игры, 64-тиковые. Демки времен CS:GO и ряд сторонних и лиговых серверов - 128. Оба вида до сих пор лежат у людей в папках и до сих пор кидаются ссылками в тредах.
Поэтому парсеры демок не зашивают тикрейт жестко. demoinfocs читает тикрейт из сообщения CSVCMsg_ServerInfo и только если его нет, берет значение из заголовка демки.2 Тикрейт - это факт о записи, и достают его из записи.
Если вы работаете с файлом, а не с постом на форуме, прочитайте тикрейт из файла, а не угадывайте. Если с постом на форуме - спросите, какой он был. Калькулятор тиков делает тикрейт видимым полем ввода именно поэтому: правильного значения по умолчанию нет, есть только распространенное.
Тик и кадр - это разные счетчики
Эту ловушку стоит знать, потому что оба числа большие, в разговоре оба называют тиками, и ни одно не выглядит неправильным.
Серверный тик - это шаг симуляции, на котором шел матч. Именно его принимает demo_gototick, и именно им помечены данные событий.
Кадр - это индекс записанного кадра внутри файла демки. В документации парсеров он называется "demo-tick", и demoinfocs прямо объясняет, зачем нужно это различие: счетчик кадров отделен как раз потому, что у демок часто другой тикрейт, чем у игры.2
Поэтому число, взятое из парсера, полезно, только когда вы знаете, какое из двух это. В формате демок CS2 серверный тик хранится как net_tick, а парсеры отдают его как потиковое поле game_time.3 Если же число взято из индекса кадра, перевод по серверному тикрейту дает метку времени, которая уверенно неправильная, причем в каждой демке на разную величину.
demo_gototick и аргумент, которого никто не ждет
Откройте консоль во время воспроизведения демки, и переход - это одна строка:
demo_gototick 6400
Valve документирует полную форму как demo_gototick <tick> [relative] [pause].1 Аргумент relative, равный 1, делает число смещением от того места, где вы уже находитесь. Аргумент pause, равный 1, останавливает воспроизведение сразу по прибытии.
Подвох в позициях. Чтобы перейти на абсолютный тик и встать на паузу, средний аргумент пропустить нельзя:
demo_gototick 6400 0 1
Этот 0 не для красоты. Это флаг relative, явно выключенный, чтобы флаг паузы попал в третью позицию, а не во вторую. Напишите demo_gototick 6400 1 в расчете на паузу, и вместо этого вы попросите переход на 6400 тиков вперед от текущей позиции, что в длинной демке дает правдоподобный результат совсем в другом месте.
На той же странице описан demo_timescale <scale> для скорости воспроизведения, и он хорошо сочетается с паузой по прибытии: встали на паузе, затем прогоняете нужный кусок на пониженной скорости.1
Переходите раньше намеренно
Тик, привязанный к событию, - это тик, на котором событие завершилось. Попадете ровно туда - и смотрите последствия: убийство уже произошло, игрок уже мертв, а все, что вы хотели понять про подход, осталось позади.
Поэтому сначала вычтите. Пяти секунд обычно хватает, чтобы увидеть ротацию, раскидку и дуэль, которые привели к этому числу. На 64 тиках это 320 тиков; на 128 - 640. Запас - это второе место, где важен тикрейт, и ошибку здесь поймать сложнее, потому что переход, который промахнулся на пять секунд, все равно попадает куда-то правдоподобно.
Один крайний случай стоит учесть: если вычесть запас из тика в самом начале демки, может получиться отрицательное число. Тика раньше нуля нет, поэтому ограничьте значение нулем, а не вставляйте отрицательное число в консоль.
Время от начала раунда - вот что стоит записывать
Абсолютные тики хороши для машины и плохи для человека. "Тик 61 440" при повторном прочтении ничего никому не скажет. "Девять секунд в 14-м раунде" поймет любой, включая вас через неделю.
В демках CS2 есть все нужное для перевода: парсеры отдают время начала раунда вместе с событиями раунда, оно берется из m_fRoundStartTime.3 Вычтите тик начала раунда из нужного тика, разделите на тикрейт, и получите позицию внутри раунда, а не внутри файла.
Храните оба. Абсолютный тик вы вставляете в консоль; время от начала раунда пишете в заметку. Калькулятор выводит второе, как только вы даете ему тик начала раунда, по той же причине.
Коротко
Три числа и одна команда, и только одно из них требует арифметики.
- Узнайте тикрейт из демки, а не по привычке.
- Убедитесь, что тик серверный, а не индекс кадра.
- Вычтите запас, но не ниже нуля.
demo_gototick <tick> 0 1, с нулем.
Когда это войдет в привычку, разбор демок перестанет требовать ползунка перемотки. Если вы разбираете не только позиционку, но и войс, калькулятор войса закрывает вторую половину настройки, а гайд по демкам FACEIT объясняет, в каких демках голос вообще есть.
Источники
Каждое число в этой статье подтверждено источником ниже. Утверждения, которые не удалось подтвердить, убраны, а не смягчены.
- Рецензируемый источникValve Developer Community
The demo_gototick <tick> [relative] [pause] signature and the meaning of each argument, the existence of demo_timescale, and that demo files use timestamps called ticks to mark single frames within the playback.
- Рецензируемый источникmarkus-wa
That the current frame is called the demo-tick because demos often have a different tick-rate than the game, and that the parser reads tick rate from CSVCMsg_ServerInfo with the demo header only as a fallback.
- Рецензируемый источникLaihoE
That CS2 demos are tick-indexed and expose game_time as net_tick and round_start_time as m_fRoundStartTime, alongside sub-tick fields carried on user commands.
Темы
- CS2
- Demos
- Console Commands
- Ticks
Инструменты из статьи
- CS2 Demo Tick Calculator - Convert a CS2 demo tick to a timestamp and back, and copy the demo_gototick command that jumps there.
- Калькулятор войса для демок CS2 - Слушайте нужных игроков в демке CS2 или FACEIT - загрузите демку, игроки подставятся сами, а вы получите команды tv_listen_voice_indices.
- SteamID Converter - Convert between SteamID64, STEAM_0:Y:Z, SteamID3 [U:1:W], account ID and profile URL.
Новые инструменты на почту
Новые инструменты и иногда подробный разбор, примерно раз в месяц. Без спама, адрес никому не передаем, отписка в один клик.