Скачать демки к статье

Overbounces

ENG

Овербаунс, баунс, ob - всё это названия одного и того же бага физики q3.
Некоторые товарищи ещё называют его "прыжками от пола".
Надо признать, в какой-то степени они правы=)

Этот баг происходит, если при падении на твёрдую поверхность за 0.000026 - 0.249965u до неё сервер в очередной раз берёт снимок состояния игрока для обсчёта физики (данные получены мной методом научного тыка, поэтому за их большую точность не ручаюсь=).
При таком раскладе сервер думает, что вы уже находитесь на земле, но в то же время вы имеете отрицательную скорость по оси Z.
Серверу ничего не остаётся делать, как перенаправить эту отрицательную скорость в вектор с положительным значением - вверх, по диагонали или по горизонтали.

Если вам не по душе всякие баги - ставим df_ob_killOBs 1 и овербаунсов как не бывало.
Ну а если же вам нравится добывать ups'ы, то давайте разбираться дальше.



Очевидно, что каждый раз считать на калькуляторе, каким образом вы упадёте, проблематично.
Поэтому для этих целей в дефраге есть ob-детектор. Представляет он из себя группу статсов, показывающих, случится ли ob при определённых ваших действиях, включается примерно следующим образом:
df_chs1_Draw 1
df_chs1_Info1 55 - все виды ловли ob, кроме кваженого оружия
df_chs1_Info1 56 - абсолютно все виды
df_ob_Fast 1 - на слабых машинах немного повысит фпс, т.к. в этом случае используется упрощённый алгоритм обсчёта (может иногда не видеть некоторые ob!)

Ob-детектор показывает нам, что надо сделать, чтобы овербаунс произошёл:
G (go) - идти на поверхность, на которую вы смотрите
J (jump) - прыгнуть на неё
B (below) - поверхность, над которой вы находитесь, даст ob при данном методе падения (горит, даже если взгляд не направлен на эту поверхность).
Варианты ловли ob с использованием оружия (такие овербаунсы называют wob - weapon ob):
r или p - соответственно выстрел рокетом или плазмой под себя
R или P - рокетджамп или плазмаджамп
Qr, Qp, QR и QP - варианты для кваженого оружия.
Если какая-то из этих букв мигает, это значит, что с помощью оружия надо набрать нетипичную для данного оружия высоту (см. статью о рокете); обычно меньше или больше в пределах юнита.
Комбинации с рокетом могут заменяться бфг и гранатами, т.к. их сплеш аналогичен по эффекту.

И перед всеми этими вариантами (G, B, J, r, p, R, P, Qr, Qp, QR, QP) может загораться буква S (Sticky).
Это означает, что, перед тем как поймать ob с помощью указанного детектором способа, надо забраться на sticky высоту. Это высота, на которой игрок может находиться в зависшем состоянии над землёй и колеблется она примерно от 0.040 до 0.249 юнита. Такой баг происходит по той же причине, что и сами ob, т.е. потому, что движок думает, что вы находитесь на земле; поэтому можно ходить по ровной поверхности, сохраняя sticky высоту.
Набрать же её можно рядом способов:
Постреляв плазмой или рокетом в пол под углом
Сойдя со ступеньки или наклонной плоскости
После об
После выхода из телепорта
При определённой высоте расположения респауна на карте тоже возможен набор sticky высоты. При расстоянии 8u от пола такой об не ловится ни оффлайн, ни онлайн.
В итоге детектор должен показать букву B или (при высотах менее 0.145u) p - при взгляде на поверхность, на которой вы находитесь.


Также для ловли ob есть удобные примочки df_ob_OffsetStartPosZ и df_ob_OffsetStopPosZ - в них указывается отступ по высоте для отображения овербаунсов.
Иногда поверхность, от которой требуется поймать ob, недоступна для взгляда, например, находится выше вас; в этом случае можно использовать данный приём.
Или вы знаете высоту, которую даёт трикс, а в ob-детекторе такого нет.
Удобно установить значения этих переменных так, чтобы детектор показывал ob от требуемой поверхности при взгляде на ту, с которой мы его ловим.

Также могут быть полезны статсы 300-170, показывающие расстояния до ближайших обов в юнитах; первая цифра - при смещении стартовой позиции вверх, вторая - вниз.



Это всё были способы ловли ob, которые напрямую может предсказать детектор.
Есть же и такие, о которых мы узнаем только тогда, когда совершим какие-либо действия и увидим на детекторе надписи B или G.

Например, можно поймать ob от джамппада - это зачастую возможно.
Фокус в том, что триггер jp срабатывает только тогда, когда вы уже оказались внутри него; предшествующее же перемещение считается так, будто jp нету.
Следовательно, возможно получить скорость от jp, находясь в любой из координат внутри него. Можно даже коснуться платформы, находящейся под ним.
Всё зависит от способа попадания на пад - можно зайти на него, прыгнуть, упасть после rj, попрыгать на нём и т.д. - вариантов много.
Что касается наклонных падов, то тут надо иметь в виду зависимость также и от горизонтальной скорости попадания на них, например, зашли вы на него, забежали или пришли в присевшем состоянии.

Почти всегда можно поймать ob от наклонной поверхности - дискретности перемещений по ней нету (по меркам q3, конечно=). Надо просто перемещаться по ней, поглядывая на детектор.

Можно получать ob после другого овербаунса.

Иногда получается найти об, который происходит при падении в жидкость; непростая задача, т.к. такие овербаунсы не видны с ob-детектором (кроме случая, когда слой жидкости очень тонкий).

Есть способ поймать ob, сделав вид, что зашагиваешь на край платформы. Для этого надо встать на самый её край, при помощи +strafe и движения мыши соскользнуть, а затем слегка зацепиться за край. В результате падение начнётся с 0ups по z на 18 юнитов ниже уровня платформы. Следовательно, для поиска таких обов удобно использовать df_ob_OffsetStartPosZ -18.
Описанная техника не является единственной; необходимые критерии - 0ups по горизонтали и нахождение в буферной зоне стены, т.е. на расстоянии меньше 0.125u.

Почти всегда можно найти ob, который получается при выстреле из какой-нибудь пушки под углом в пол или стену (часто здесь мешает большая дискретность сплеша и зависимость высоты от позиции).

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

Можно ловить и рендомные (случайные) овербаунсы - простор здесь широк, но надёжности никакой нет (хотя бывают исключения).
Например, ударившись о потолок с определённой силой или сделав rj с задержкой между прыжком и выстрелом.
Ну или просто передвигаясь с помощью оружия заметить горящую букву B или G (удобно ловить такие ob при вертикальном pc; главное здесь - реакция - вовремя отпустить кнопку выстрела).

В мультиплеерных триксах для получения необычных стартовых позиций можно использовать товарищей, запрыгнув на них. Отступ в данном случае будет равен 56.125u.

Другой любопытный момент, позволяющий ловить необычные ob, заключается в том, что после падения с высоты с нулевой горизонтальной скоростью игрок будет иметь положительную скорость по вертикали, находясь на земле (пока не сдвинется с места).
Для высоты 166u (падение с -498ups) и более получим 1ups, 1489u - 2ups, 4153u - 3ups и так далее.
Прыгнув из такого состояния, получим самый обычный прыжок; в случае же отстрелов оружием или rj без задержки данная техника сработает.
Также необязательно падать с 0ups, если отстрел производится точно в момент приземления.



Итак, со способами ловли овербаунсов разобрались; теперь самое важное - как их исполнять.
Всего существует четыре основных вида ob, два из них являются главными и наиболее часто используемыми.
С них и начнём.


VOB (vertical overbounce) - название говорит за себя - этот ob подбрасывает нас на высоту, чуть меньшую той, с которой мы упали (если точнее - высоту, соответствующую скорости, с которой мы упали, ведь ob можно поймать и разгоняясь с помощью оружия вниз).
Почему чуть меньшую? Из-за ошибок округления. Например, для ob-высоты в 554u ошибок набралось на 0.49u.
Именно поэтому при легитимных настройках можно делать повторные овербаунсы от одной и той же плоскости только для пары небольших ob высот.

Главное условие получения вертикального овербаунса - скорость по XY (т.е. горизонтальная, которую показывает спидометр) в момент падения должна быть равна нулю. Также нельзя жать клавиши передвижения и прыжок во время такого ob.
Способов получить нулевую горизонтальную скорость существует не так уж и много.
Самый простой - упасть в угол.
Можно одно из направлений скорости сохранять равным нулю, а другое обнулить, прижавшись в стенке (в случае с G овербаунсом надо иметь в виду, что при отклонении вашего взгляда от оси игры более чем на 1.115 градуса вы будете набирать наземную скорость уже по двум осям, а этого нам не надо).
При столкновении со стенкой на скорости от 500ups по оси, перпендикулярной ей, движок выдаёт 1 и более ups в противоположном направлении; понятно, что эту скорость тоже надо обнулить, прижимаясь клавишами движения к стене.
Можно использовать и наружный угол для получения 0ups. Для этого сначала одну ось обнуляем об стену, а ко второй прижимаемся, используя знание о том, что при aircontrol на скорости до 320ups и отклонением не более 11,2 градуса от оси скорость по другой оси не набирается, а координата меняется. Таким образом преодолеваем 0,125u, необходимые, чтобы прижаться ко второй стенке, имея 0ups вдоль неё. Есть и вариант без преодоления буферных 0,125u; техника внешне идентична, существенный момент - во время соприкосновения с углом надо жать кнопку движения. В таком случае игрок зацепится за стену, хотя по логике должен был бы пролететь мимо неё. Такой эффект исходит из условия нахождения на расстоянии менее 0,125u от стены и уменьшения этой величины.
И самый виртуозный способ - самому выровняться в воздухе до нуля. В таком случае получившийся VOB называется UOB (ultimate overbounce) или midair ob. В этом нелёгком деле вам может помочь нажатие клавиш для более медленных передвижений, чем бег, ваша реакция и хороший клавесин=)


HOB (horisontal overbounce) - в этом случае скорость преобразуется в горизонтальную (на самом деле при любом hob'е набирается некоторая высота, но в большинстве случаев она незначительна).
Для того чтобы получить hob, надо, в отличие от vob'а иметь горизонтальную скорость при падении, причём больше, чем 3-5 ups.
Направлять бОльшую часть этой скорости надо в ту сторону, в которую вы планируете передвигаться с помощью hob'а.
В момент приземления надо нажать прыжок - не раньше, т.к. тогда вы просто прыгнете, и ненамного позже, т.к. потеряется много скорости; можно вместо прыжка сделать rj или pj.
Иногда при падении ничего нажимать не надо - в том случае, если вам необходимо соскользнуть с края платформы.

Интересное применение в плане hob'ов нашли sob'ы (sticky overbounce); если вы находитесь на sticky высоте не менее 0.145u относительно пола, то вы имеете J-ob от текущей поверхности. Можно сделать хоб=) После хорошего cj получается набрать около 50 дополнительных ups.

Кстати, от горизонтальной скорости приземления зависит то, сколько вы сможете набрать скорости на hob'е. Чем она больше, тем меньшая часть вертикальной скорости преобразуется в горизонтальную. Например, sob после второго прыжка даст уже около 20-30 ups.

Можно делать hob на наклонных поверхностях.
Обычно это рендомные ob, но иногда можно найти стабильно работающий вариант; для этого имеет смысл поставить df_ob_AllSlopes 1 - команда включает детектирование овербаунсов для наклонных поверхностей.
У этого типа ob есть любопытная особенность, проявляющаяся, если такой баунс не сделать, т.е. нажать прыжок до попадания на наклонную поверхность. В этом случае физика ведёт себя эксцентрично - горизонтальная скорость после прыжка не меняется, т.е. рампа срабатывает как обычный ненаклонный пол. Это может дать преимущество, а может быть и не выгодно - в зависимости от того, что пытаемся сделать: пропрыгать по рампе, теряя скорость, или же набрать её от наклонной. Такое поведение является слабо контролируемым со стороны игрока, т.е. рендомным; хорошо предотвращать его возможность при маппинге с помощью текстуры common/noob, как и другие рендомные обы.


DOB (diagonal overbounce) - при этом ob часть скорости распределяется на вертикальную и горизонтальную составляющие, т.е. мы летим по диагонали.
Происходит такой ob, если скорость в момент падения уменьшается и равна примерно 30ups.
Чтобы получить dob, надо сбросить скорость в полёте до 30-50ups и перед самым приземлением нажать кнопку движения в сторону её уменьшения.
От скорости в момент падения будет зависеть то, в каком направлении и под каким углом вас отбросит: при 30ups и меньше - в сторону нажатия (и чем меньше скорость, тем более пологий угол), а при 31 и более ups - в сторону, противоположную нажатию (чем больше, тем горизонтальней угол).
Небольшое отклонение направления взгляда от игровых осей даст значительную боковую скорость.
Откуда берётся пороговое значение 30-31ups: тяга на земле 26u/s2+трение 5u/s2, т.е. в результате касания земли получаем скорость около 0ups и нажатую кнопку движения. Если вместо бега использовать для DOB ходьбу или приседание, то пороговые значения будут другими.


ZWOB (zero weird overbounce) - в отличие от диагонального ob, вертикальная скорость здесь распределяется на вертикальную и горизонтальную составляющие пропорционально (по теореме Пифагора).
Чтобы получить такой овербаунс, надо падать с горизонтальной скоростью 0ups, а в момент соприкосновения с землёй нажать кнопку движения; отбросит этот ob в сторону нажатия.
Это получается очень редко, но есть и намного более простой способ: сэмулировать нажатие клавиши движения так, чтобы скорость не набиралась, с помощью кнопки +strafe и движения мышкой.
При таком способе довольно легко регулировать распределение скорости на вертикаль и горизонталь, т.к. это распределение очень дискретно.
Чувствительность мыши с +strafe регулируется переменными m_forward и m_side, их дефолтные значения плохо подходят для стабильного получения нужного угла звоба.
Звобы могут быть использованы для ловли других обов, т.к. дают большую гамму стартовых высот. Например, на дф-мапах часто есть возможность набрать sticky высоту; сделав звоб с её помощью, можно добыть какой-нибудь полезный ob, например необходимый для выполнения срезки. Величина sticky высоты позволяет варьировать получаемые высоты звобов, а диапазон наиболее пологих звобов имеет небольшую девиацию по высоте; так что есть значительный шанс поймать нужный ob.

Интересный вид zwob'ов - swob (Slippy weird overbounce); хотя, если говорить точнее, это способ их выполнения: надо упасть на поверхность, покрытую "льдом" (текстурой slick), со скоростью 1-5ups (жать при этом ничего не надо).
Любопытная особенность звобов на слике при исполнении с +strafe: дискретность углов отбрасывания намного меньше; дело в меньшей в 10 раз по сравнению с обычной землёй тяге.



Демки (в этой статье я решил поместить их в конце, чтобы не создавать путаницу).
07-01_ztn3t1_2xob_wob_ceilinghob.dm_68 - ловля ob с наклонной, двойной ob, wob, ob от потолка.
07-02_q3dm6_multiobs.dm_68 - ловля ob после ob.
07-03_q3dm6_sobng_randwob_goob_wobnceilingob.dm_68 - sob, рендомный от rj с задержкой и т.д.
07-04_q3dm17_wob_ramp2rg.dm_68 - ob от выстрела плазмой.
07-05_q3dm17_anglewob2skull.dm_68 - wob методом угла, ob со способом попадания на пад.
07-06_q3dm6_randwob_b2rhob.dm_68 - ловля ob при pc.
07-07_q3dm6_stairswob_ceilinghob.dm_68 - wob при помощи ступеньки, за ним ob от потолка.
07-08_q3dm12_waterOB.dm_68 - ловля vob в воде.
07-09_q3dm6_stepup_ob.dm_68 - ловля ob цеплянием за край.
09-10_q3dm18_afterfall_r_ob.dm_68 - ловля ob при помощи падения.
07-11_q3dm6_uob.dm_68 - vob с выравниванием в воздухе до нуля.
07-12_q3dm6_outer_corner_vob.dm_68 - получение 0ups на внешнем угле.
07-13_q3dm6_dobnvobs.dm_68 - диагональный ob и базовые vob с выравниванием от стенки и угла.
07-14_q3dm17_zwob2skull.dm_68 - zwob с ловлей от наклонного jp.
07-15_q3dm6_zwob.dm_68 - zwob + рокет.
07-16-q3dm6_ob_after_zwob.dm_68 - ловля ob после звоба.
07-17_tr1ckhouse-beta3_swob.dm_68 - swob.


Как вы могли видеть, овербаунсы отлично сочетаются с любым видом оружия и поэтому часто используются на дф-мапах.
Иногда незапланированные ob дают на этих картах приличный выигрыш по времени, а порой и вовсе разрушают идею мапы и уменьшают результат в несколько раз.
Вообще, с помощью различных овербаунсов исполняется добрая половина (если не больше) всех триксов.
Доказательством тому может служить даже тот факт, что, как я ни старался отбирать демки для предыдущих статей без ob, туда всё равно просочились три с ними=)