Counter-Strike

Counter-Strike

89 ratings
Подробнее о техниках Kreedz Jump
By piita 🍂
Изложенные далее измышления - пока что сырая, но не менее вкусная заготовка. На протяжении всей статьи имеются отсылки к этому коду[pastebin.com]
   
Award
Favorite
Favorited
Unfavorite
Часть 1
EdgeBug:

ㅤㅤЗаблуждение:
Вы можете сделать edgebug, упав на край чего-либо, а точнее полоску шириной в 4 юнита от края. Ключевой момент - это стрейфиться в направлении края. Чем больше скорость падения, тем больше шансов сделать edgebug.
ㅤㅤНа самом деле:
Возможность успешного выполнения edgebug'а по большей части зависит от вашей горизонтальной скорости и FPS. В конце каждого фрейма (в течение которого происходит движение игрока) движок проверяет вашу скорость падения и, если вы будете обнаружены на земле, вычисляет количество hp, которое вы должны потерять в соответствии с найденной скоростью. Стрейфиться в направлении края действительно нужно, однако объяснение здесь вот какое - вы должны коснуться края и отлететь от него в течение одного фрейма. Таким образом, когда запускается проверка на касание, вы должны оказаться в воздухе. Поэтому чем больше ваша горизонтальная скорость, тем больше шанс успешно выполненного edgebug'а.
ㅤㅤЗдесь[pastebin.com]в самом конце вы можете найти функцию void PM_CheckFalling(void). Как вы можете видеть, там ничего нет ни про 4 юнита, ни про зависимость вероятности edgebug'а от скорости падения.

JumpBug:

Всё что идёт в XJ учебнике после
"В попытке понять как работает jumpbug мы вынуждены покопаться в движке CS."
неверно вплоть до заметок spr1n'а.
ㅤㅤНа самом деле:
В попытке понять как работает jumpbug мы вынуждены покопаться в движке CS. Так же как и в случае с edgebug'ом, мы обманываем движок, находясь в воздухе как в начале, так и в конце фрейма. Jumpbug возможен по двум важным причинам. Во-первых, код unduck'а ( void PM_UnDuck(void) внутри PM_Duck() ) идёт до кода прыжка, так что если эти команды будут вызваны одновременно, unduck выполнится первым (смотреть PM_Duck() и PM_Jump() внутри void PM_PlayerMove(qboolean server) ). Вторая и не менее важная причина это проверка-телепорт-на-землю ( PM_CatagorizePosition() внутри PM_UnDuck() ). Позвольте объяснить что это такое. Пытались ли вы когда-нибудь забраться на лестницу, находясь при этом в сидячем положении и касаясь земли? Если да, то вы должны были заметить, что движок телепортирует вас обратно на землю. Причина в низкой скорости. Видите ли, в течение фрейма (когда выполняется движение) движок может несколько раз проверить, нет ли земли на расстоянии 2 юнита или ближе от ваших ног. И если окажется что она там есть - вас телепортирует вниз. Хорошая новость заключается в том, что такая же проверка выполняется каждый раз когда вы встаёте, то есть при вызове команды unduck. Теперь представим себе что вы падаете на огромной скорости, отпускаете duck, и вас тут же телепортирует на землю... Если при вы ещё и прыгнете, то ваша скорость окажется положительной (направленной вверх), и ваша "связь" с землёй пропадёт.

ㅤㅤОбъяснение у этого простое. Мы не касались земли когда фрейм начался, и мы всё ещё не касались её когда фрейм закончился. Плюс теперь нас посылает вверх, информация о скорости падения, какой бы она ни была, теряется. Однако, в отличие от bhop'а, наша горизонтальная скорость будет значительно меньше. Это происходит потому, что движок не позволяет нам достичь скорости, равной или большей чем weapon_max_speed*1.2 (weapon_max_speed - максимальная дефолтная скорость с оружием, например для пистолета/ножа это 250 юнитов в секунду) во время прыжка (при этом учёт скорости идёт по всем направлениям - x,y,z). Если мы превышаем это значение, наша скорость по всем трём осям будет умножена на ((weapon_max_speed*1.2)/current_3d_speed)*0.8 (current_3d_speed - модуль трёхмерного вектора скорости, в коде это void PM_PreventMegaBunnyJumping(void) внутри void PM_Jump(void) ). Тем не менее по высоте прыжок окажется таким же, как и обычный (то же касается модификатора скорости fuser2), так как после упомянутого вычисления происходит перезапись всех ранее полученных значений вертикальной скорости.

ㅤㅤТак что, если вкратце, то нужно одновременно отпустить duck и прыгнуть находясь на расстоянии 18-20 юнитов над землёй (а не 0-2 юнита, как думают многие, так как, после того как вы отпускаете duck, вы увеличиваетесь в росте на 18 юнитов вверх и вниз).

ㅤㅤМногие из вас думают, что jumpbug выполнить довольно сложно. Это действительно так, ведь он требует идеального тайминга, а также "удачи". Впрочем, это скорее техническая вероятность успешного выполнения. Она может быть вычислена как (2*100)/(frame_time*fall_speed) - именно столько процентов составляет вероятность сделать jumpbug с данными скоростью и FPS. frame_time здесь это 1/FPS.

HighJump:

ㅤㅤЗаблуждения:
Если вы бежите по направлению перпендикулярно к краю блока, то вы потеряетме 17 процентов от скорости!
Дистанция_от_края,_которая_не_даст_замедления = sin(Угол,_под_ которым_вы_начинаете_бежать)*13.6_юнитов
ㅤㅤНа самом деле:
Если вы двигаетесь в каком-либо направлении и остаётесь при этом на земле, движок производит простую проверку. Проверка эта по существу говорит движку, останетесь ли вы на земле на расстоянии 16 юнитов вперёд в том направлении, в котором вы двигаетесь в данный момент. Если да, то ничего не происходит - вот почему бег параллельно краю не даёт никакого эффекта. Но если расчёт покажет что при движении в том же направлении вы окажетесь через 16 юнитов в воздухе, то происходит проверка того, на какой при этом высоте вы будете над землёй. Если высота окажется равной 70 юнитов или больше при условии что вы не в присяде (и 52 если в присяде), то эффект edgefriction (от англ. "edge" - край, "friction" - трение) заменяет собой обычный эффект трения (смотреть void PM_Friction(void) ).

ㅤㅤЗачем же тогда нужно обычное трение... Ну, это просто. Если вы не нажимаете никаких клавиш движения во время движения по земле (скажем, бежали и вдруг отпустили все клавиши), то в конечном счёте вы замедлитесь и остановитесь. Это трение присутствует даже когда вы нажимаете клавиши движения, просто при этом ускорение оказывается сильнее него. Но ускорение не будет сильнее в случае edgefriction. Edgefriction делает всё то же, что и обычное трение, однако эффект умножается на число заданное кваром. Таким образом, если на сервере квар edgefriction равен 2 (дефолтное значение), вы начинаете замедляться при приближении к краю (смотреть всю ту же void PM_Friction(void) ). Когда квар равен 1, это то же, что обычное трение. Если 0 ... ну, тогда вы будете соскользнёте с края, хотите вы этого или нет (если конечно не нажмёте клавишу движения в противоположном направлении).

ㅤㅤИтак, если вы хотите избежать эффекта edgefriction в том месте, где вы находитесь, вы должны прыгать за 16 юнитов от края. Однако edgefriction вступает в силу до кода, меняющего ваше расположение (смотреть PM_Friction() в коде). Это значит, что у вас есть дополнительные speed*frame_time юнитов плюс к тем 16. Так что если у вас 100 fps (frame_time = 0.01) и вы бежите с ножом (скорость 250 юнитов в секунду) по направлению к краю, edgefriction замедлит вас где-то на 13.5-16 юнитах от края (зависит от того, когда закончился последний фрейм).
Часть 2
Countjump:

Всё становится ясно, если заглянуть в код:
PM_Duck:
0.4 секунды уходит чтобы присесть, если при этом вы находитесь на земле (можно видеть как "голова" опускается вниз). Если вы не на земле, то приседание происходит мгновенно.
PM_Unduck:
Поднимает вас на 18 юнитов вверх (без изменения вертикальной скорости) и проверяет, не застряли ли вы.
ㅤㅤИтак, принцип работы countjump'а:
При прокрутке скролла функция PM_Unduck (команда -duck) вызывается в следующем же за вызовом PM_Duck (команда +duck) фрейме. В сумме получается 2 фрейма - один для duck, другой для unduck. Вот почему даже при идеальном тайминге на gstraf'e мы получаем постоянное замедление - функция трения (PM_Friction) запускается во время первого (+duck) фрейма.

Bunnyhop:

Попытаюсь пояснить некоторые моменты касательно bhop'а.
  • Ограничение по скорости.

    ㅤㅤКак было сказано выше, движок не позволяет нам превысить при прыжке скорость weapon_max_speed*1.2 (учитываются все три оси x,y,z). При превышении это значения скорость умножится на ((weapon_max_speed*1.2)/current_3d_speed)*0.8 . Поэтому наш престрейф при bhop'е сбрасывается до значения, примерно равного (maxspeed*1.2)*0.8 .

    ㅤㅤНапример, если максимальная скорость с оружием 250, то престрейф ограничивается значением 250*1.2 = 300 . Если скорость при отталкивании окажется 300 и больше, то она сбросится до 300*0.8 = 240 .

    ㅤㅤТут стоит обратить внимание на то, что скорость по оси z также учитывается (смотреть PM_PreventMegaBunnyJumping ), так что замедление может сработать даже если горизонтальная (при занулённой z компоненте) скорость меньше 300, скажем 299.99993.

  • StandUp Bhop и эффект замедления.

    Заблуждение:
    Во время standup'а ты на самом деле не прыгаешь выше, просто происходит коллизия модельки. Центр остаётся на месте, но при этом он "размазан" на несколько юнитов вниз и вверх, так имеется возможность без столкновения запрыгивать на более высокие поверхности.
    ㅤㅤЕсли мы посмотрим в код, мы увидим параметр, который влияет на нашу вертикальную скорость, объявленный как fuser2. Он приравнивается 1315.78942.. на каждом сделанном нами удачном прыжке и уменьшается на значение FPS на каждом фрейме. Z-компонента скорости прыжка вычисляется следующим образом:

    velocity[2] = square_root( 2 * 800 * 45.0 ); , где 45 это высота прыжка.
    ㅤㅤИ если значение fuser2 больше чем ноль, то вертикальная скорость умножается на следующим способом вычисленный factor:

    factor = ( 100.0 - fuser2 * 0.001 * 19.0 ) * 0.01;
    velocity[2] = velocity[2] * factor;
    ㅤㅤПри выполнении standup bhop'а мы увеличиваем наше время пребывания в воздухе. Это означает что fuser2 успеет уменьшиться сильнее, чем при bhop'e без duck'а, следовательно factor становится выше и влияет на нашу вертикальную скорость меньше, делая наш прыжок выше.

  • Идеальный bunnyhop? Как?

    ㅤㅤНе важно как быстро вы крутите скролл, ключевой момент здесь это тайминг. Вам нужно всегда иметь при отталкивании престрейф меньший, чем максимально допустимое значение (довольно очевидно, не правда ли?).

    ㅤㅤЕсли вы ещё не прошлись по всему коду, то вы, вероятно, не заметили что fuser2 влияет ещё и на горизонтальную скорость, причём по тому же принципу (смотреть PM_Walkmove ).

    ㅤㅤЕсли мы прыгаем во второй после приземления фрейм, то вызывается PM_Friction, и скорость умножается на fuser2 по формулам того же вида, что и данные выше. Значения fuser2 и factor берутся из первого фрейма. Я сделал простой плагин для вычисления суммарного замедляющего фактора и получил следующий результат:

    speed_on_land*0.827 (примерно)
    ㅤㅤТаким образом, мой совет таков - пытайтесь контролировать вашу скорость и вы будете bunnyhop pro! :)
Ladder:

ㅤㅤНа лестнице тип нашего движения сменяется с MOVETYPE_WALK на MOVETYPE_FLY.

ㅤㅤПри нажатии кнопки прыжка скорость игрока устанавливается в 270 в направлении от лестницы.

ㅤㅤМаксимальная (горизонтальная и вертикальная) скорость на лестнице равна 200. Если максимальная скорость с оружием меньше 200, то скорость подъёма ограничивается ей. Этот предел умножается на 0.333 при нажатом duck'e.

ㅤㅤИтак:
максимальная горизонтальная скорость = 200 (66.6 в присяде)
максимальная вертикальная скорость = 200 (66.6 в присяде)
скорость при прыжке с лестницы = 270

ㅤㅤОднако мы можем удвоить нашу скорость подъёма/спуска совмещая вертикальную и горизонтальную скорости, что даёт нам 400 (133.2 в присяде) юнита в секунду.
ㅤㅤКак это делать:
Встаньте под углом 90 градусов к лестнице справа (слева) от неё и нажмите W и A (W и D).
Также вы можете дать себе хороший прирост скорости падения в 400 юнитов в секунду быстро слетев с лестницы.

Смотрите PM_LadderMove для получения более подробных сведений.




Спасибо кролику за данную статью и большое спасибо комьюнити KZRU, XJ, а также Juice`y
11 Comments
n.ev 24 Dec, 2020 @ 4:03am 
Nice:valentinos:
Stone 13 Nov, 2019 @ 3:50pm 
:like: Nice, don’t forget to drop a Like and Fav on my profile, have a nice day. :mind_rose:
ANTOSHIBA007 5 Feb, 2018 @ 5:53am 
1 вопрос у меня. Всё таки BunnyHop это баг движка? Или это задумка разработчиков?
ANTOSHIBA007 5 Feb, 2018 @ 5:52am 
Это очень интересно! Молодца! Жаль что в 2007 году я не находил такие гайды и объяснения)):gold_coin:
76561197963224198 25 Feb, 2017 @ 6:54am 
english tradiction !
Mountain Echo 16 Nov, 2016 @ 10:22am 
топ
asdasd 31 Oct, 2016 @ 7:24am 
топчик
✪FuDy/oNeSh0t✪ 10 Oct, 2016 @ 3:57am 
СЛОЖНА
Scherzo 7 Oct, 2016 @ 7:26pm 
.
North America Cheater 6 Oct, 2016 @ 9:48am 
ty