Вопрос Как пофиксить ходьбу при антиаимах?

Начинающий
Статус
Оффлайн
Регистрация
24 Окт 2017
Сообщения
52
Реакции[?]
6
Поинты[?]
0
Приветствую всех.
У меня проблема при ходьбе с АА.
Дело в том, что направление моей ходьбы меняется в зависимости от моих анти аимов.
То есть если взять обычный баквард аа (pitch down, yaw 180), то при нажатии кнопки W (идти вперед) я иду назад.

Так вот, как я могу пофиксить направление моеего движения с антиаимами? Вот что у меня есть:


C++:
// функция CreateMove
vec3 old_angle = UserCmd->viewangles.ToVector();
    old_angle.ClampAngles();
    float oldForward = UserCmd->forwardmove;
    float oldSidemove = UserCmd->sidemove;
if (settings::antiaim) {
        vec3 aa_angle;
        /*aa_angle.x = 89.f;

        aa_angle.y = UserCmd->viewangles.y;
        aa_angle.y *= -1.f;

        aa_angle.z = 0.f;
        */

        aa_angle.x = 180.f; // знаю, что 180 нельзя, но ClampAngles всё фиксит
        aa_angle.y = UserCmd->viewangles.y;
        aa_angle.y += 180.f;
        aa_angle.z = UserCmd->viewangles.z;
        aa_angle.ClampAngles();
      
        UserCmd->viewangles = aa_angle.ToQAngle();
        CorrectMovement(old_angle.ToQAngle(), UserCmd, oldForward, oldSidemove);
    }
...
        CreateMove_orig(SampleTime, UserCmd);
return false;
C++:
#define M_PI        3.14159265358979323846
#define M_PI_F        ((float)(M_PI))
#define DEG2RAD( x  )  ( (float)(x) * (float)(M_PI_F / 180.f) )
void CorrectMovement(QAngle vOldAngles, CUserCmd* pCmd, float fOldForward, float fOldSidemove)
{
// По идее это должно фиксить ходьбу, но нет (
    // side/forward move correction
    float deltaView;
    float f1;
    float f2;

    if (vOldAngles.y < 0.f)
        f1 = 360.0f + vOldAngles.y;
    else
        f1 = vOldAngles.y;

    if (pCmd->viewangles.y < 0.0f)
        f2 = 360.0f + pCmd->viewangles.y;
    else
        f2 = pCmd->viewangles.y;

    if (f2 < f1)
        deltaView = abs(f2 - f1);
    else
        deltaView = 360.0f - abs(f1 - f2);

    deltaView = 360.0f - deltaView;

    pCmd->forwardmove = cos(DEG2RAD(deltaView)) * fOldForward + cos(DEG2RAD(deltaView + 90.f)) * fOldSidemove;
    pCmd->sidemove = sin(DEG2RAD(deltaView)) * fOldForward + sin(DEG2RAD(deltaView + 90.f)) * fOldSidemove;
}
Ну и конечно же ClampAngles

Код:
void vec3::ClampAngles()
{
    if (x > 89.0f)
        x = 89.0f;

    if (x < -89.0f)
        x = -89.0f;

    while (y > 180)
        y -= 360;

    while (y < -180)
        y += 360;

    z = 0;
}
Смотрел разные исходники читов, но не могу увидеть свою ошибку. Подскажите пожалуйста.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
направление моей ходьбы меняется в зависимости от моих анти аимов
Это абсолютно логично, ты идешь в ту сторону куда указывает твой REAL на сервере, и этот угол не совпадает с углом просмотра при аа.

pCmd->forwardmove = cos(DEG2RAD(deltaView)) * fOldForward + cos(DEG2RAD(deltaView + 90.f)) * fOldSidemove;
pCmd->sidemove = sin(DEG2RAD(deltaView)) * fOldForward + sin(DEG2RAD(deltaView + 90.f)) * fOldSidemove;
Это неверно, это должна быть обычная развернутая матрица вращения 2х2, fOldForward = y и fOldSidemove = x, у тебя все перепутано.
pCmd->forwardmove = cos(DEG2RAD(deltaView)) * fOldForward - sin(DEG2RAD(deltaView)) * fOldSidemove;
pCmd->sidemove = sin(DEG2RAD(deltaView)) * fOldForward + cos(DEG2RAD(deltaView)) * fOldSidemove;
 
Начинающий
Статус
Оффлайн
Регистрация
24 Окт 2017
Сообщения
52
Реакции[?]
6
Поинты[?]
0
Это абсолютно логично, ты идешь в ту сторону куда указывает твой REAL на сервере, и этот угол не совпадает с углом просмотра при аа.


Это неверно, это должна быть обычная развернутая матрица вращения 2х2, fOldForward = y и fOldSidemove = x, у тебя все перепутано.
pCmd->forwardmove = cos(DEG2RAD(deltaView)) * fOldForward - sin(DEG2RAD(deltaView)) * fOldSidemove;
pCmd->sidemove = sin(DEG2RAD(deltaView)) * fOldForward + cos(DEG2RAD(deltaView)) * fOldSidemove;
Поправленный вариант тоже не работает(

C++:
    vec3 old_angle = UserCmd->viewangles.ToVector();
    old_angle.ClampAngles();
    float oldForward = UserCmd->forwardmove;
    float oldSidemove = UserCmd->sidemove;

aa_angle.x = 180.f;
        aa_angle.y = UserCmd->viewangles.y;
        aa_angle.y += 180.f;
        aa_angle.z = UserCmd->viewangles.z;
        aa_angle.ClampAngles();

        UserCmd->viewangles = aa_angle.ToQAngle();
        CorrectMovement(old_angle.ToQAngle(), UserCmd, oldForward, oldSidemove);
C++:
void CorrectMovement(QAngle vOldAngles, CUserCmd* pCmd, float fOldForward, float fOldSidemove)
{
    // side/forward move correction
    float deltaView;
    float f1;
    float f2;

    if (vOldAngles.y < 0.f)
        f1 = 360.0f + vOldAngles.y;
    else
        f1 = vOldAngles.y;

    if (pCmd->viewangles.y < 0.0f)
        f2 = 360.0f + pCmd->viewangles.y;
    else
        f2 = pCmd->viewangles.y;

    if (f2 < f1)
        deltaView = abs(f2 - f1);
    else
        deltaView = 360.0f - abs(f1 - f2);

    deltaView = 360.0f - deltaView;
    
    //изменены только две последние строки
    /*
    pCmd->forwardmove = cos(DEG2RAD(deltaView)) * fOldForward + cos(DEG2RAD(deltaView + 90.f)) * fOldSidemove;
    pCmd->sidemove = sin(DEG2RAD(deltaView)) * fOldForward + sin(DEG2RAD(deltaView + 90.f)) * fOldSidemove;
    */
    pCmd->forwardmove = cos(DEG2RAD(deltaView)) * fOldForward - sin(DEG2RAD(deltaView)) * fOldSidemove;
    pCmd->sidemove = sin(DEG2RAD(deltaView)) * fOldForward + cos(DEG2RAD(deltaView)) * fOldSidemove;
}
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Поправленный вариант тоже не работает
Ты вычисляешь дельту между старыми углами команды (т.е. твоим взглядом) и новыми углами команды (глазами на сервере).
А нужно до реальных углов ног сервера, а они точно не станут теми которые ты посылаешь в viewangles.
Для вычисления реальных углов нужно хранить отдельное состояние анимации и скармливать ей углы которые ты посылаешь серверу, либо в зависимости от типа антиаимов можешь сам их вычислять, и уже относительно них вычислять дельту.
 
Начинающий
Статус
Оффлайн
Регистрация
24 Окт 2017
Сообщения
52
Реакции[?]
6
Поинты[?]
0
Что ты подразумеваешь под
хранить отдельное состояние анимации
?
Что это такое?

Я просто сколько уже исходников посмотрел, там код для мувмент фикса примерно везде такой же. Но у меня никакой не работает.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Как ты собираешься фиксить движение при антиаимах если ты не понимаешь как антиаимы работают?
Ты рассинхронизируешь серверные и клиентские углы засчет того что сервер получает обе команды, а клиент только последнюю.
Но углы ног != углам глаз, поэтому ты посылаешь глаза определенным образом, и тебе нужно предугадать какие при этом будут ноги.
Для этого либо либо вести дополнительное состояние анимации как делают сервер и клиент, и обновлять его каждый раз когда посылаешь команду, и затем считать оттуда угол ног, либо предугадывать какие ноги будут, например при обычном лби брекере это будут EYE - max_delta + desync если вправо, или влево EYE + max_delta - desync, но при этом учти что они двигаются т.к. стремятся к LBYT.
 
Начинающий
Статус
Оффлайн
Регистрация
24 Окт 2017
Сообщения
52
Реакции[?]
6
Поинты[?]
0
Как ты собираешься фиксить движение при антиаимах если ты не понимаешь как антиаимы работают?
Ты рассинхронизируешь серверные и клиентские углы засчет того что сервер получает обе команды, а клиент только последнюю.
Но углы ног != углам глаз, поэтому ты посылаешь глаза определенным образом, и тебе нужно предугадать какие при этом будут ноги.
Для этого либо либо вести дополнительное состояние анимации как делают сервер и клиент, и обновлять его каждый раз когда посылаешь команду, и затем считать оттуда угол ног, либо предугадывать какие ноги будут, например при обычном лби брекере это будут EYE - max_delta + desync если вправо, или влево EYE + max_delta - desync, но при этом учти что они двигаются т.к. стремятся к LBYT.
Оказалось, что функция работает))))
Я просто CUserCmd использовал из valve sdk 2013.
Я обновил это и всё заработало :)
 
Сверху Снизу