Решил я поиграть в Counter-Strike: Source, дабы посмотреть и понять принцип работы самой игры и, по возможности, отыскать фишки, которые неплохо было бы знать при игре в Counter-Strike: Source. И привело это к тому, что я их нашел. Некоторые из них сложные, некоторые легкие, некоторые интересные, но большинство скучные =).
Ниже описаны три ситуации, которые я сейчас поясню.
Итак, для начала несколько определений:
CS:Source – Основы
Немного информации

Такая картина иногда видна в самой игре, зачастую приводя к недоумению игроков. 1 Ситуация «Слайдшоу из хитбоксов»: «Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага ,но при этом вы получаете повреждение.»
Объяснение:
0 миллисекунда (Сцена 1)
30 миллисекунд (Сцена 2)
60 миллисекунд (Сцена 3)
Давайте для наглядности рассмотрим такую визуальную схему

И вполне резонный вопрос возникает: как решать эту проблему? Движок Source делает следующее. А именно программа просчитывает траекторию выстрела Игрока 2 и переносит ее так, как будто он стрелял в реального Игрока 1, независимо от того, где последний находится сейчас.

На картинке: красный хитбокс показывает нам, где находился клиент, когда я стрелял по нему. Синий же показывает, где находился клиент на сервере, когда тот (сервер) получил информацию о моих выстрелах . Обратите внимание на красный цельный кубик в красном хитбоксе. Это то место, куда попал мой выстрел у меня на клиенте. Синий же кубик в синем хитбоксе – это же место положения попадания от моего выстрела, но с поправкой на мой пинг. Но не исключено, что траектория выстрела на мониторах других игроков так и осталась старой. Сбивает с толку!
Теперь рассмотрим Сцены с «коррекцией Пинга»
30 миллисекунд (Сцена 2)
60 миллисекунд (Сцена 3)
Игрок 2: Игрок 2 получает пакет с информацией о Сцене 1, видит Игрока 1, стреляет по нему. Но при получении информации о выстрелах, сервер делает коррекцию относительно пинга Игрока 2 и отнимает здоровье у Игрока 1, который в это время уже, как мы сказали, находится в укрытии. Игрок 1 в недоумении.
Теперь ситуация становится более справедливой, несмотря на то что, Игрок 1 находился уже в укрытии, Игрок 2, заметив его, выстрелил, тем самым сервер насчитал первому повреждения. Проблема только в том, что Первый игрок получает повреждения уже после того, как высунулся, то есть уже в укрытии и по этому скорее всего он напишет что-то знакомое всем типа «как меня достали эти лаги!» =). Итак, «корректировка лагов» заключается в том, что у Игрока 2 появляется возможность наносить повреждения Игроку 1 не обращая внимания на задержки между тем, пока движется Игрок 1 и тем пока его не заметит Игрок 2. Неплохое начало.
Другая польза от коррекции лагов заключается в том, что теперь вам не надо вести прицел за целью, чтобы попасть по ней, и когда два игрока встречаются нос к носу, то игрок с более низким пингом не получает приемуществ.
Взглянем на эти скриншоты (полученные благодаря sv_showimpacts 1). На них показана разница между позициями игрока на сервере (синий хитбокс) и на клиенте (красный), и траектория выстрела, которая показана красным и синим кубиком. Обратим внимание – сервер откорректировал траекторию выстрела относительно врага.
2 Ситуация «Что за бред! Я в него выпустил всю обойму!»:
«Вы выбегаете из-за угла на врага, высаживаете в него всю обойму и умираете. После чего открываете консоль и видите, что попали в него всего дважды, не смотря на то, что выпустили в него всю обойму в упор.»
Объяснение:
Такая ситуация происходит (аналогично первому примеру) из-за задержки между вещами, происходящими на сервере и вашим компьютером.
Главная вещь, которую следует понять, это то, что вещи, которые происходят на сервере, происходят раньше, чем у вас на компьютере – вашем клиенте. Для облегчения понимания ситуации, условимся, что на обоих клиентах лаги (пинг) одинаковые, так что не надо утруждаться и высчитывать коррекцию между двумя машинами.
Итак, когда Игрок 1 подходит к углу, то оба клиента (и Игрок 1 и Игрок 2) знают об этом, тут нет задержек, у обоих синхронизированная информация. Выходя, оба начинают стрелять. Теперь, из-за задержки (идет обмен информацией о выстрелах) каждому, чтобы увидеть другого стреляющего клиента, потребуется 60 миллисекунд (вспомните первую ситуацию, так же и для отсылки повреждений. Это значит, что за время пока дет обмен этой информацией, вы сможете выстрелять кучу патронов. И если Ваш оппонент начал стрелять на какую-то долю секунды раньше Вас (или даже если раньше, но он попал Вам, скажем, в голову), и Вы уже возможно мертвы, но Ваш клиент не знает еще пока об этом, ведь для этого надо 60 миллисекунд с момента как Вы увидели врага! В итоге сервер просто игнорирует все Ваши выстрелы, выпущенные до момента пока Вас не убили, и убивает Вас. А у Вас создается иллюзия, что Вы выпустили целую обойму, перед тем как Вас убили.
3 Ситуация «Холостой выстрел!»:
«Вы стреляетесь с врагом, попадаете - видите, что на его теле и вокруг есть кровь, но в итоге попадание не были зарегистрированы и враг не получил ни одного повреждения.»
Давайте теперь разберем, как сервер транслирует наш выстрел на новую траекторию с учетом корректировки. Как известно, сервер обрабатывает не только все объекты на карте, позиции моделей, но и так же анимацию моделей (бег, ходьба и проч.). Когда Вы стреляете, выстрел транслируется на сервере, тестируется на степень повреждения, независимо от того, в какой позе была модель. Потому что из-за задержек модель на сервере и модель на клиенте очень редко бывают в одинаковых позициях. Например, анимации очень редко бывают в одном кадре, и получается, что каждая поза в одно и тоже время находится в немного разных точках. Самая подвижная анимация это бег и стрейфы. Качание головы, рук и ног – все в движении. Получается, что если Вы стреляете в плечо, Ваш выстрел транслируется на сервер, где модель, в которую Вы выстреливали, может уже находиться в другой позе, например, голова повернута в другую сторону, нога перенесена и тд.
Взглянем на скриншот и посмотрим, и убедимся в том, что модели на сервере и на клиенте находятся и, правда, в различных позах.
Отметим, что разница между позициями ног на сервере и клиенте существенно велика (сервер – синий хитбокс, клиент - красный). Выстрел, который сделал игрок, отмечен красной буквой «А», он не будет зарегистрирован на сервере, так как там эта же нога находится в другом месте. Но игрок будет уверен, что попал по врагу.
А вот типичный пример, когда попадание не регистрируется сервером – я стреляю в край рюкзака (который естественно имеет разные положения как на сервере так и у меня на мониторе), и синий бокс оказался на стене позади, поскольку сервер не регистрировал ранение.
На 16 местном сервере получится следующее:
16х15=240 позиций моделей, которые надо обработать, просчитать и протестировать на попадания, все ли модели были в зонах попадания или нет, и зарегистрировать и отсечь попадания и промахи (в худшем случае).
Таким образом подобная задачу просто нереально просчитать.
Но не стоит забывать, что бывают и также обратные ситуации (вы промахиваетесь у себя на компьютере, но сервер засчитывает вам попадание), таким образом стрельба выравнивается.