Если сервер проверяет попадание только по «текущей позиции на сервере», результат расходится с тем, что игрок видел на своём экране.
Почему Противник на экране игрока стоит там, где был примерно 0,2 с назад (при пинге 150 ms и интерполяции 100 ms) → Следствие Сервер проверяет по текущей позиции, и там, куда целился игрок, цели уже нет → На экране Точно попал, а промах. По движущейся цели приходится стрелять с упреждением
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: проверять попадание, отмотав время назад к моменту, который видел атакующий (компенсация задержки), или перейти на выбор цели (таб-таргет). Клиент: при атаке отправлять момент, который видел игрок (серверное время, на котором идёт интерполяция).
На графике
Высоко только у некоторых · точность по движущимся целям (по диапазонам пинга)
Где смотреть
Писать в лог проверок на сервере вместе время атаки, позицию цели на экране атакующего (значение от клиента), позицию цели на сервере, по которой шла проверка, и RTT атакующего. Если в development-сборке рисовать поверх экрана клиента позицию, которую сервер использовал для проверки, расхождение видно сразу
Подтверждает
В промахах разница двух позиций примерно равна скорости цели × (RTT атакующего + время интерполяции), и с ростом пинга падает точность только по движущимся целям
Опровергает
Если промахи бывают и по неподвижным целям, проблема в хитбоксах или проверке столкновений. Если отмотка времени есть, а расхождение остаётся, проверить, правильно ли клиент сообщает серверу время интерполяции
Peeking into VALORANT's NetcodeRiot Games Сервер отматывает время назад к состоянию игры, которое видел игрок в момент выстрела, и проверяет попадание. Клиент вместе с выстрелом отправляет время симуляции, которое он видел