Skip to main content
Игры

Тики в демках CS2: перевод тика во время и demo_gototick

Тик демки, деленный на тикрейт, дает время. Ошибаются в другом: какой тикрейт, из какого счетчика взят номер и куда попадает demo_gototick.

Автор: 6 min read
Титульная карточка на темной сетке. Надзаголовок GAMING TOOLS, заголовок TICK TO TIME и строка: один и тот же тик - это два разных момента. На панели число 6400 над двумя ветками, одна заканчивается на 1:40, другая на 0:50.

Вам присылают тик. Это число вроде 61440, демка, к которой оно относится, идет сорок минут, и само по себе число не говорит, где в этих сорока минутах смотреть.

Вся арифметика - одно деление. Все, на что уходит время, находится до и после него.

Деление и число, которое нужно к нему принести

Тик - это шаг серверной симуляции, поэтому время, которое он обозначает, - это тик, деленный на количество таких шагов в секунду.

seconds = tick / tickrate

Тик 6400 в 64-тиковой демке - это 100 секунд, то есть 1:40 от начала файла. Тот же тик в 128-тиковой демке - это 50 секунд. В самом числе ничего не говорит, какой из вариантов ваш.

Число 6400 вверху расходится на две ветки. Левая ветка подписана 64 тика и заканчивается на 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

Переходите раньше намеренно

Тик, привязанный к событию, - это тик, на котором событие завершилось. Попадете ровно туда - и смотрите последствия: убийство уже произошло, игрок уже мертв, а все, что вы хотели понять про подход, осталось позади.

Горизонтальная временная шкала. Отметка с подписью тик события 6400 стоит ближе к правому краю. Вторая отметка на 320 тиков левее подписана переходить сюда, а промежуток между ними подписан пять секунд на 64 тиках.
Пять секунд запаса - это 320 тиков на 64 и 640 на 128. При вычитании тикрейт незаметно важен второй раз.

Поэтому сначала вычтите. Пяти секунд обычно хватает, чтобы увидеть ротацию, раскидку и дуэль, которые привели к этому числу. На 64 тиках это 320 тиков; на 128 - 640. Запас - это второе место, где важен тикрейт, и ошибку здесь поймать сложнее, потому что переход, который промахнулся на пять секунд, все равно попадает куда-то правдоподобно.

Один крайний случай стоит учесть: если вычесть запас из тика в самом начале демки, может получиться отрицательное число. Тика раньше нуля нет, поэтому ограничьте значение нулем, а не вставляйте отрицательное число в консоль.

Время от начала раунда - вот что стоит записывать

Абсолютные тики хороши для машины и плохи для человека. "Тик 61 440" при повторном прочтении ничего никому не скажет. "Девять секунд в 14-м раунде" поймет любой, включая вас через неделю.

В демках CS2 есть все нужное для перевода: парсеры отдают время начала раунда вместе с событиями раунда, оно берется из m_fRoundStartTime.3 Вычтите тик начала раунда из нужного тика, разделите на тикрейт, и получите позицию внутри раунда, а не внутри файла.

Храните оба. Абсолютный тик вы вставляете в консоль; время от начала раунда пишете в заметку. Калькулятор выводит второе, как только вы даете ему тик начала раунда, по той же причине.

Коротко

Три числа и одна команда, и только одно из них требует арифметики.

  1. Узнайте тикрейт из демки, а не по привычке.
  2. Убедитесь, что тик серверный, а не индекс кадра.
  3. Вычтите запас, но не ниже нуля.
  4. demo_gototick <tick> 0 1, с нулем.

Когда это войдет в привычку, разбор демок перестанет требовать ползунка перемотки. Если вы разбираете не только позиционку, но и войс, калькулятор войса закрывает вторую половину настройки, а гайд по демкам FACEIT объясняет, в каких демках голос вообще есть.

Источники

Каждое число в этой статье подтверждено источником ниже. Утверждения, которые не удалось подтвердить, убраны, а не смягчены.

  1. Рецензируемый источник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.

  2. Рецензируемый источник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.

  3. Рецензируемый источник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 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.

Новые инструменты на почту

Новые инструменты и иногда подробный разбор, примерно раз в месяц. Без спама, адрес никому не передаем, отписка в один клик.

Похожие статьи

Article title card. A loudspeaker icon with three arcs beside it, the innermost in amber, with the line: the file with the voice in it is the .dem.zst
Gaming Tools Guide

How to Hear Voice Comms in a FACEIT Demo (CS2)

FACEIT records both teams' voice, but only in one of the two demos a match leaves you. Which file to open, the three FACEIT commands, and the slot bitmask.

Article title card. Two columns of five dots either side of a dashed dividing line, the left column amber and the right grey, with the line: the server decides who was recorded
Gaming Tools

How to Hear the Enemy Team's Voice in a CS2 Demo

Whether you can hear the enemy in a CS2 demo depends on what the server recorded, not on your console. Which demos carry it, and the mask for one side.

Article title card. A loudspeaker icon struck through by a thick amber line, with the line: the demo has no voice in it
Gaming Tools

Why You Can't Hear Voice in Your CS2 Demo (Fixes)

Can't hear voice comms in a CS2 or FACEIT demo? The real causes - no voice in MM/Premier demos, unset tv_listen_voice_indices, reset commands - and fixes.