Гайд Исправление странной анимации при приземлении

Модератор раздела «Создание читов CS2»
Забаненный
Статус
Оффлайн
Регистрация
21 Июн 2022
Сообщения
148
Реакции[?]
366
Поинты[?]
155K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Первым делом вы пойдете в интернет и найдете относительно старую тему на unknowncheats (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Спастите код, который там дадут, но он ничего не принесет, у вас все еще останется этот баг.

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
1656501629807.png
Получив всю нужную информацию, хукаем эту функцию.
C++:
/* @ida: module: client.dll; sig: 55 8B EC 83 E4 F8 83 EC 70 56 57 8B F9 89 7C 24 14 83 7F 60 */
void __fastcall c_hooks::hk_modify_eye_position(void* ecx, void* edx, vec3_t& input_eye_pos)
{
    const auto animation_state = static_cast<anim_state_t*>(ecx);
    if (!animation_state)
        return g_sdk.m_hooks_data.m_originals.m_modify_eye_position(ecx, edx, input_eye_pos);

    if (!animation_state->m_landing && animation_state->m_anim_duck_amount == 0.0f)
    {
        animation_state->m_smooth_height_valid = false;
        animation_state->m_camera_smooth_height = 0x7F7FFFFF;
        return;
    }

    using bone_lookup_fn = int(__thiscall*)(void*, const char*);
    static auto lookup_bone = reinterpret_cast<bone_lookup_fn>(c_utils::find_sig(client_dll, _("55 8B EC 53 56 8B F1 57 83 BE ? ? ? ? ? 75 14 8B 46 04 8D 4E 04 FF 50 20 85 C0 74 07 8B CE E8 ? ? ? ? 8B 8E ? ? ? ? 85 C9 0F 84")));

    auto head_pos = animation_state->m_player->get_cached_bone_data()[lookup_bone(animation_state->m_player, "head_0")].at(3);
    head_pos.z += 1.7f;

    if (input_eye_pos.z > head_pos.z)
    {
        const auto lol = abs(input_eye_pos.z - head_pos.z);
        const auto v22 = (lol - 4.0) * 0.16666667;
        float v23;

        if (v22 >= 0.0)
            v23 = fminf(v22, 1.0);
        else
            v23 = 0.0;

        input_eye_pos.z = (head_pos.z - input_eye_pos.z) * (v23 * v23 * 3.0 - v23 * v23 * 2.0 * v23) +
            input_eye_pos.z;
    }
}
Ребилда нам мало, он особо ничего не даст. Нам нужно избежать вызов функции modify eye position, дабы не производить тряску камеры.
Смотрим где вызывается эта функция.
1656501666313.png
Видим, что она вызывается в двух функциях -
Пожалуйста, авторизуйтесь для просмотра ссылки.
и
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

Разобравшись какая функция нам нужна, снова, на всякий случай, сверяем с кодом модуля.
1656504217905.png
Видим, что ничего не поменялось, предотвращаем вызов функции modify eye position.
Для этого смотрим условия вызова этой функции, видим, что все что нам нужно сделать - это просто изменить значение m_bUseNewAnimstate на false, дабы не сработало
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Хукаем.

C++:
void __fastcall c_hooks::calculate_view(void* ecx, void* edx, vec3_t& eye_origin, qangle_t& eye_angles, float& z_near, float& z_far, float& fov)
{
    /* @ida: module: client.dll; sig: 55 8B EC 83 EC 14 53 56 57 FF 75 18 */
    /* @note: should_use_new_animstate offset - 0x9B14 */

    const auto player = static_cast<c_base_player*>(ecx);

    if (!player || !g_sdk.m_local() || player != g_sdk.m_local())
        return g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);

    const auto backup_use_new_anim_state = player->should_use_new_anim_state();

    player->should_use_new_anim_state() = false;
    {
        g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);
    }
    player->should_use_new_anim_state() = backup_use_new_anim_state;
}
Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Забаненный
Статус
Оффлайн
Регистрация
6 Июн 2022
Сообщения
35
Реакции[?]
11
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я когда пастил супримаси наблюдал эту проблему,спасибо
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,123
Реакции[?]
391
Поинты[?]
46K
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Первым делом вы пойдете в интернет и найдете относительно старую тему на unknowncheats (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Спастите код, который там дадут, но он ничего не принесет, у вас все еще останется этот баг.

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
/* @ida: module: client.dll; sig: 55 8B EC 83 E4 F8 83 EC 70 56 57 8B F9 89 7C 24 14 83 7F 60 */
void __fastcall c_hooks::hk_modify_eye_position(void* ecx, void* edx, vec3_t& input_eye_pos)
{
    const auto animation_state = static_cast<anim_state_t*>(ecx);
    if (!animation_state)
        return g_sdk.m_hooks_data.m_originals.m_modify_eye_position(ecx, edx, input_eye_pos);

    if (!animation_state->m_landing && animation_state->m_anim_duck_amount == 0.0f)
    {
        animation_state->m_smooth_height_valid = false;
        animation_state->m_camera_smooth_height = 0x7F7FFFFF;
        return;
    }

    using bone_lookup_fn = int(__thiscall*)(void*, const char*);
    static auto lookup_bone = reinterpret_cast<bone_lookup_fn>(c_utils::find_sig(client_dll, _("55 8B EC 53 56 8B F1 57 83 BE ? ? ? ? ? 75 14 8B 46 04 8D 4E 04 FF 50 20 85 C0 74 07 8B CE E8 ? ? ? ? 8B 8E ? ? ? ? 85 C9 0F 84")));

    auto head_pos = animation_state->m_player->get_cached_bone_data()[lookup_bone(animation_state->m_player, "head_0")].at(3);
    head_pos.z += 1.7f;

    if (input_eye_pos.z > head_pos.z)
    {
        const auto lol = abs(input_eye_pos.z - head_pos.z);
        const auto v22 = (lol - 4.0) * 0.16666667;
        float v23;

        if (v22 >= 0.0)
            v23 = fminf(v22, 1.0);
        else
            v23 = 0.0;

        input_eye_pos.z = (head_pos.z - input_eye_pos.z) * (v23 * v23 * 3.0 - v23 * v23 * 2.0 * v23) +
            input_eye_pos.z;
    }
}
Ребилда нам мало, он особо ничего не даст. Нам нужно избежать вызов функции modify eye position, дабы не производить тряску камеры.
Смотрим где вызывается эта функция.
Посмотреть вложение 209901
Видим, что она вызывается в двух функциях -
Пожалуйста, авторизуйтесь для просмотра ссылки.
и
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

Разобравшись какая функция нам нужна, снова, на всякий случай, сверяем с кодом модуля.
Посмотреть вложение 209912
Видим, что ничего не поменялось, предотвращаем вызов функции modify eye position.
Для этого смотрим условия вызова этой функции, видим, что все что нам нужно сделать - это просто изменить значение m_bUseNewAnimstate на false, дабы не сработало
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Хукаем.

C++:
void __fastcall c_hooks::calculate_view(void* ecx, void* edx, vec3_t& eye_origin, qangle_t& eye_angles, float& z_near, float& z_far, float& fov)
{
    /* @ida: module: client.dll; sig: 55 8B EC 83 EC 14 53 56 57 FF 75 18 */
    /* @note: should_use_new_animstate offset - 0x9B14 */

    const auto player = static_cast<c_base_player*>(ecx);

    if (!player || !g_sdk.m_local() || player != g_sdk.m_local())
        return g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);

    const auto backup_use_new_anim_state = player->should_use_new_anim_state();

    player->should_use_new_anim_state() = false;
    {
        g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);
    }
    player->should_use_new_anim_state() = backup_use_new_anim_state;
}
Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Давно известная фича, но новичкам пойдёт.
 
Забаненный
Статус
Оффлайн
Регистрация
20 Май 2022
Сообщения
91
Реакции[?]
51
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Первым делом вы пойдете в интернет и найдете относительно старую тему на unknowncheats (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Спастите код, который там дадут, но он ничего не принесет, у вас все еще останется этот баг.

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
/* @ida: module: client.dll; sig: 55 8B EC 83 E4 F8 83 EC 70 56 57 8B F9 89 7C 24 14 83 7F 60 */
void __fastcall c_hooks::hk_modify_eye_position(void* ecx, void* edx, vec3_t& input_eye_pos)
{
    const auto animation_state = static_cast<anim_state_t*>(ecx);
    if (!animation_state)
        return g_sdk.m_hooks_data.m_originals.m_modify_eye_position(ecx, edx, input_eye_pos);

    if (!animation_state->m_landing && animation_state->m_anim_duck_amount == 0.0f)
    {
        animation_state->m_smooth_height_valid = false;
        animation_state->m_camera_smooth_height = 0x7F7FFFFF;
        return;
    }

    using bone_lookup_fn = int(__thiscall*)(void*, const char*);
    static auto lookup_bone = reinterpret_cast<bone_lookup_fn>(c_utils::find_sig(client_dll, _("55 8B EC 53 56 8B F1 57 83 BE ? ? ? ? ? 75 14 8B 46 04 8D 4E 04 FF 50 20 85 C0 74 07 8B CE E8 ? ? ? ? 8B 8E ? ? ? ? 85 C9 0F 84")));

    auto head_pos = animation_state->m_player->get_cached_bone_data()[lookup_bone(animation_state->m_player, "head_0")].at(3);
    head_pos.z += 1.7f;

    if (input_eye_pos.z > head_pos.z)
    {
        const auto lol = abs(input_eye_pos.z - head_pos.z);
        const auto v22 = (lol - 4.0) * 0.16666667;
        float v23;

        if (v22 >= 0.0)
            v23 = fminf(v22, 1.0);
        else
            v23 = 0.0;

        input_eye_pos.z = (head_pos.z - input_eye_pos.z) * (v23 * v23 * 3.0 - v23 * v23 * 2.0 * v23) +
            input_eye_pos.z;
    }
}
Ребилда нам мало, он особо ничего не даст. Нам нужно избежать вызов функции modify eye position, дабы не производить тряску камеры.
Смотрим где вызывается эта функция.
Посмотреть вложение 209901
Видим, что она вызывается в двух функциях -
Пожалуйста, авторизуйтесь для просмотра ссылки.
и
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

Разобравшись какая функция нам нужна, снова, на всякий случай, сверяем с кодом модуля.
Посмотреть вложение 209912
Видим, что ничего не поменялось, предотвращаем вызов функции modify eye position.
Для этого смотрим условия вызова этой функции, видим, что все что нам нужно сделать - это просто изменить значение m_bUseNewAnimstate на false, дабы не сработало
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Хукаем.

C++:
void __fastcall c_hooks::calculate_view(void* ecx, void* edx, vec3_t& eye_origin, qangle_t& eye_angles, float& z_near, float& z_far, float& fov)
{
    /* @ida: module: client.dll; sig: 55 8B EC 83 EC 14 53 56 57 FF 75 18 */
    /* @note: should_use_new_animstate offset - 0x9B14 */

    const auto player = static_cast<c_base_player*>(ecx);

    if (!player || !g_sdk.m_local() || player != g_sdk.m_local())
        return g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);

    const auto backup_use_new_anim_state = player->should_use_new_anim_state();

    player->should_use_new_anim_state() = false;
    {
        g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);
    }
    player->should_use_new_anim_state() = backup_use_new_anim_state;
}
Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Куда проще - не даем выполняться функции ModifyEyePosition и вместо этого ребилдим ее при вычислении шутпоза и в бонус к этому избегаем говно-копирования кэша костей и используем нужную матрицу не посредственно.
 
Keep Ev0lving, Stay Fatal
Эксперт
Статус
Оффлайн
Регистрация
6 Фев 2018
Сообщения
1,546
Реакции[?]
584
Поинты[?]
100K
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Первым делом вы пойдете в интернет и найдете относительно старую тему на unknowncheats (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Спастите код, который там дадут, но он ничего не принесет, у вас все еще останется этот баг.

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
/* @ida: module: client.dll; sig: 55 8B EC 83 E4 F8 83 EC 70 56 57 8B F9 89 7C 24 14 83 7F 60 */
void __fastcall c_hooks::hk_modify_eye_position(void* ecx, void* edx, vec3_t& input_eye_pos)
{
    const auto animation_state = static_cast<anim_state_t*>(ecx);
    if (!animation_state)
        return g_sdk.m_hooks_data.m_originals.m_modify_eye_position(ecx, edx, input_eye_pos);

    if (!animation_state->m_landing && animation_state->m_anim_duck_amount == 0.0f)
    {
        animation_state->m_smooth_height_valid = false;
        animation_state->m_camera_smooth_height = 0x7F7FFFFF;
        return;
    }

    using bone_lookup_fn = int(__thiscall*)(void*, const char*);
    static auto lookup_bone = reinterpret_cast<bone_lookup_fn>(c_utils::find_sig(client_dll, _("55 8B EC 53 56 8B F1 57 83 BE ? ? ? ? ? 75 14 8B 46 04 8D 4E 04 FF 50 20 85 C0 74 07 8B CE E8 ? ? ? ? 8B 8E ? ? ? ? 85 C9 0F 84")));

    auto head_pos = animation_state->m_player->get_cached_bone_data()[lookup_bone(animation_state->m_player, "head_0")].at(3);
    head_pos.z += 1.7f;

    if (input_eye_pos.z > head_pos.z)
    {
        const auto lol = abs(input_eye_pos.z - head_pos.z);
        const auto v22 = (lol - 4.0) * 0.16666667;
        float v23;

        if (v22 >= 0.0)
            v23 = fminf(v22, 1.0);
        else
            v23 = 0.0;

        input_eye_pos.z = (head_pos.z - input_eye_pos.z) * (v23 * v23 * 3.0 - v23 * v23 * 2.0 * v23) +
            input_eye_pos.z;
    }
}
Ребилда нам мало, он особо ничего не даст. Нам нужно избежать вызов функции modify eye position, дабы не производить тряску камеры.
Смотрим где вызывается эта функция.
Посмотреть вложение 209901
Видим, что она вызывается в двух функциях -
Пожалуйста, авторизуйтесь для просмотра ссылки.
и
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

Разобравшись какая функция нам нужна, снова, на всякий случай, сверяем с кодом модуля.
Посмотреть вложение 209912
Видим, что ничего не поменялось, предотвращаем вызов функции modify eye position.
Для этого смотрим условия вызова этой функции, видим, что все что нам нужно сделать - это просто изменить значение m_bUseNewAnimstate на false, дабы не сработало
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Хукаем.

C++:
void __fastcall c_hooks::calculate_view(void* ecx, void* edx, vec3_t& eye_origin, qangle_t& eye_angles, float& z_near, float& z_far, float& fov)
{
    /* @ida: module: client.dll; sig: 55 8B EC 83 EC 14 53 56 57 FF 75 18 */
    /* @note: should_use_new_animstate offset - 0x9B14 */

    const auto player = static_cast<c_base_player*>(ecx);

    if (!player || !g_sdk.m_local() || player != g_sdk.m_local())
        return g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);

    const auto backup_use_new_anim_state = player->should_use_new_anim_state();

    player->should_use_new_anim_state() = false;
    {
        g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);
    }
    player->should_use_new_anim_state() = backup_use_new_anim_state;
}
Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
По идее, додуматься до такого самому несложно.
Однако, видя как ты всё это расписал, прикрепил свой код (хоть и простейший), я думаю это достойно хорошей реакции.
Надеюсь, ты не забросишь "вкидывание" такой инфы, ибо это впервые за полгода-год (кроме темы f0rtis1337) когда я рад посмотреть тему на югейме.
А ещё, сразу немного дополню:
1. ModifyEyePos из супремаси (ребилд такой же, что логично, однако в супремаси чуть проще из-за самого сдк) -
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
2. Чтобы не спрашивать каждый раз где взять оффсет m_bUseNewAnimstate, достаточно после обновы посмотреть сюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
 
Модератор раздела «Создание читов CS2»
Забаненный
Статус
Оффлайн
Регистрация
21 Июн 2022
Сообщения
148
Реакции[?]
366
Поинты[?]
155K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
По идее, додуматься до такого самому несложно.
Однако, видя как ты всё это расписал, прикрепил свой код (хоть и простейший), я думаю это достойно хорошей реакции.
Спасибо за фидбек, я очень старался все подробно и ясно расписать.
Надеюсь, ты не забросишь "вкидывание" такой инфы, ибо это впервые за полгода-год (кроме темы f0rtis1337) когда я рад посмотреть тему на югейме.
Нет, не заброшу, мне в кайф фиксить различные проблемы и постить исправление их на этот форум.
1. ModifyEyePos из супремаси (ребилд такой же, что логично, однако в супремаси чуть проще из-за самого сдк) -
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
2. Чтобы не спрашивать каждый раз где взять оффсет m_bUseNewAnimstate, достаточно после обновы посмотреть сюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
👍
 
Забаненный
Статус
Оффлайн
Регистрация
2 Дек 2020
Сообщения
34
Реакции[?]
8
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Первым делом вы пойдете в интернет и найдете относительно старую тему на unknowncheats (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Спастите код, который там дадут, но он ничего не принесет, у вас все еще останется этот баг.

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
/* @ida: module: client.dll; sig: 55 8B EC 83 E4 F8 83 EC 70 56 57 8B F9 89 7C 24 14 83 7F 60 */
void __fastcall c_hooks::hk_modify_eye_position(void* ecx, void* edx, vec3_t& input_eye_pos)
{
    const auto animation_state = static_cast<anim_state_t*>(ecx);
    if (!animation_state)
        return g_sdk.m_hooks_data.m_originals.m_modify_eye_position(ecx, edx, input_eye_pos);

    if (!animation_state->m_landing && animation_state->m_anim_duck_amount == 0.0f)
    {
        animation_state->m_smooth_height_valid = false;
        animation_state->m_camera_smooth_height = 0x7F7FFFFF;
        return;
    }

    using bone_lookup_fn = int(__thiscall*)(void*, const char*);
    static auto lookup_bone = reinterpret_cast<bone_lookup_fn>(c_utils::find_sig(client_dll, _("55 8B EC 53 56 8B F1 57 83 BE ? ? ? ? ? 75 14 8B 46 04 8D 4E 04 FF 50 20 85 C0 74 07 8B CE E8 ? ? ? ? 8B 8E ? ? ? ? 85 C9 0F 84")));

    auto head_pos = animation_state->m_player->get_cached_bone_data()[lookup_bone(animation_state->m_player, "head_0")].at(3);
    head_pos.z += 1.7f;

    if (input_eye_pos.z > head_pos.z)
    {
        const auto lol = abs(input_eye_pos.z - head_pos.z);
        const auto v22 = (lol - 4.0) * 0.16666667;
        float v23;

        if (v22 >= 0.0)
            v23 = fminf(v22, 1.0);
        else
            v23 = 0.0;

        input_eye_pos.z = (head_pos.z - input_eye_pos.z) * (v23 * v23 * 3.0 - v23 * v23 * 2.0 * v23) +
            input_eye_pos.z;
    }
}
Ребилда нам мало, он особо ничего не даст. Нам нужно избежать вызов функции modify eye position, дабы не производить тряску камеры.
Смотрим где вызывается эта функция.
Посмотреть вложение 209901
Видим, что она вызывается в двух функциях -
Пожалуйста, авторизуйтесь для просмотра ссылки.
и
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

Разобравшись какая функция нам нужна, снова, на всякий случай, сверяем с кодом модуля.
Посмотреть вложение 209912
Видим, что ничего не поменялось, предотвращаем вызов функции modify eye position.
Для этого смотрим условия вызова этой функции, видим, что все что нам нужно сделать - это просто изменить значение m_bUseNewAnimstate на false, дабы не сработало
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Хукаем.

C++:
void __fastcall c_hooks::calculate_view(void* ecx, void* edx, vec3_t& eye_origin, qangle_t& eye_angles, float& z_near, float& z_far, float& fov)
{
    /* @ida: module: client.dll; sig: 55 8B EC 83 EC 14 53 56 57 FF 75 18 */
    /* @note: should_use_new_animstate offset - 0x9B14 */

    const auto player = static_cast<c_base_player*>(ecx);

    if (!player || !g_sdk.m_local() || player != g_sdk.m_local())
        return g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);

    const auto backup_use_new_anim_state = player->should_use_new_anim_state();

    player->should_use_new_anim_state() = false;
    {
        g_sdk.m_hooks_data.m_originals.m_calculate_view(ecx, edx, eye_origin, eye_angles, z_near, z_far, fov);
    }
    player->should_use_new_anim_state() = backup_use_new_anim_state;
}
Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
у modify_eye_pos имеется клиентский код в чем проблема его убрать?
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
693
Реакции[?]
536
Поинты[?]
149K
это настолько паблик что даже шарклазер ребилды выкладывал, абсолютно бесполезная информация для людей которые рейджом хотя бы дней 5 занимаются, надеюсь дальше чет лучше зальешь :CoolStoryBob:
 
Keep Ev0lving, Stay Fatal
Эксперт
Статус
Оффлайн
Регистрация
6 Фев 2018
Сообщения
1,546
Реакции[?]
584
Поинты[?]
100K
Хук, который нужен не для рейджа: *существует*.
BebeRexha:
которые рейджом хотя бы дней 5 занимаются
это настолько паблик что даже шарклазер ребилды выкладывал
Чёт такого не видел нигде (именно этот ребилд).
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
693
Реакции[?]
536
Поинты[?]
149K
Хуки, которые нужны не для рейджа: *существуют*.
BebeRexha:


Чёт такого не видел нигде (именно этот ребилд).
В основе своей айпоз не фиксят для легит софтов, а этот "ребилд" побывал во всех читах где можно и где нельзя.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
и так далее и так далее и так далее... :roflanzdarova:
 
Keep Ev0lving, Stay Fatal
Эксперт
Статус
Оффлайн
Регистрация
6 Фев 2018
Сообщения
1,546
Реакции[?]
584
Поинты[?]
100K
В основе своей айпоз не фиксят для легит софтов, а этот "ребилд" побывал во всех читах где можно и где нельзя.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
и так далее и так далее и так далее... :roflanzdarova:
Ты говорил о ребилдах шарклазера.
Так вот, где он? Я не вижу.
Про других говорить не буду, он на самом деле очень часто где появлялся, однако гайд не совсем в ModifyEyePos (Точнее, сам гайд объясняет нам про другой хук, а этот идёт по ходу самого гайда).
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
693
Реакции[?]
536
Поинты[?]
149K
Ты говорил о ребилдах шарклазера.
Так вот, где он? Я не вижу.
Про других говорить не буду, он на самом деле очень часто где появлялся, однако гайд не совсем в ModifyEyePos (Точнее, сам гайд объясняет нам про другой хук, а этот идёт по ходу самого гайда).
Перепутал стакера и шарклазера но один хуй какая блять разница? Код опубликован на юц в 2019 году и встречается во всех "п2с" сурсах, даже в qo0 он есть.
Чеееел ты о чем вообще "однако гайд не совсем в ModifyEyePos".
Во всех сурсах что я скинул фикится такая же проблема о которой чел пишет, айпоз можно пофиксить несколькими способами
- ребилднуть айпоз и оффнуть виртуал функцию
- перезаписать виртуальную функцию тогда нужно оффнуть еще в калкваеве вызов ( об этом пишет тс )
- да хоть нахуй можно через cl_camera_height_restriction_debug квар ебануть фикс
так что какая нахуй разница о каком методе идет речь если смысл и результат остается таким же, вон иди скачай qo0 и посмотри там не должно быть этого бага если фурса все доделал до конца.

Так что вся эта информация это чистый паблик и не несет никакой смысловой нагрузки

P.s бонусом ломаю маня мирок хвх идиотам которые отключат питч на land, это делалось не для "визуала" а при использовании cl_camera_height_restriction_debug есотериксом как раз что бы пофиксить eye_pos, теперь живите с этим :roflanzdarova:
 
Keep Ev0lving, Stay Fatal
Эксперт
Статус
Оффлайн
Регистрация
6 Фев 2018
Сообщения
1,546
Реакции[?]
584
Поинты[?]
100K
Перепутал стакера и шарклазера но один хуй какая блять разница? Код опубликован на юц в 2019 году и встречается во всех "п2с" сурсах, даже в qo0 он есть.
Чеееел ты о чем вообще "однако гайд не совсем в ModifyEyePos".
Во всех сурсах что я скинул фикится такая же проблема о которой чел пишет, айпоз можно пофиксить несколькими способами
- ребилднуть айпоз и оффнуть виртуал функцию
- перезаписать виртуальную функцию тогда нужно оффнуть еще в калкваеве вызов ( об этом пишет тс )
- да хоть нахуй можно через cl_camera_height_restriction_debug квар ебануть фикс
так что какая нахуй разница о каком методе идет речь если смысл и результат остается таким же, вон иди скачай qo0 и посмотри там не должно быть этого бага если фурса все доделал до конца.

Так что вся эта информация это чистый паблик и не несет никакой смысловой нагрузки

P.s бонусом ломаю маня мирок хвх идиотам которые отключат питч на land, это делалось не для "визуала" а при использовании cl_camera_height_restriction_debug есотериксом как раз что бы пофиксить eye_pos, теперь живите с этим :roflanzdarova:
Мне интересно, к чему ты это всё расписал, но спасибо.
Ах да, ребилд от шарклазера я всё таки нашёл Xd
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
693
Реакции[?]
536
Поинты[?]
149K
Мне интересно, к чему ты это всё расписал, но спасибо.
Ах да, ребилд от шарклазера я всё таки нашёл Xd
Пожалуйста, авторизуйтесь для просмотра ссылки.
Ну я расписал что бы меньше дизинформации плодилось и так куча идиотов несут сплошную хуйню ибо мозг не способен отличить какой то фикс от плацебо эффекта, поэтому у нас 1000 кордов на всякие п2с читы которые являются лишь мусором и сборником джанк кода, а ведь их еще кто то покупает...
 
Сверху Снизу