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

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


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

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
1656501629807.png

Получив всю нужную информацию, хукаем эту функцию.
C++:
Expand Collapse Copy
/* @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++:
Expand Collapse Copy
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;
}

Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Коротко, понятно, информативно
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я когда пастил супримаси наблюдал эту проблему,спасибо
 
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


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

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
Expand Collapse Copy
/* @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++:
Expand Collapse Copy
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;
}

Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Давно известная фича, но новичкам пойдёт.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


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

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
Expand Collapse Copy
/* @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++:
Expand Collapse Copy
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 и вместо этого ребилдим ее при вычислении шутпоза и в бонус к этому избегаем говно-копирования кэша костей и используем нужную матрицу не посредственно.
 
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


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

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
Expand Collapse Copy
/* @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++:
Expand Collapse Copy
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;
}

Готово! Итого получаем:
Пожалуйста, авторизуйтесь для просмотра ссылки.
По идее, додуматься до такого самому несложно.
Однако, видя как ты всё это расписал, прикрепил свой код (хоть и простейший), я думаю это достойно хорошей реакции.
Надеюсь, ты не забросишь "вкидывание" такой инфы, ибо это впервые за полгода-год (кроме темы @F0rtis) когда я рад посмотреть тему на югейме.
А ещё, сразу немного дополню:
1. ModifyEyePos из супремаси (ребилд такой же, что логично, однако в супремаси чуть проще из-за самого сдк) -
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
2. Чтобы не спрашивать каждый раз где взять оффсет m_bUseNewAnimstate, достаточно после обновы посмотреть сюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
По идее, додуматься до такого самому несложно.
Однако, видя как ты всё это расписал, прикрепил свой код (хоть и простейший), я думаю это достойно хорошей реакции.
Спасибо за фидбек, я очень старался все подробно и ясно расписать.
Надеюсь, ты не забросишь "вкидывание" такой инфы, ибо это впервые за полгода-год (кроме темы @F0rtis) когда я рад посмотреть тему на югейме.
Нет, не заброшу, мне в кайф фиксить различные проблемы и постить исправление их на этот форум.
1. ModifyEyePos из супремаси (ребилд такой же, что логично, однако в супремаси чуть проще из-за самого сдк) -
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
2. Чтобы не спрашивать каждый раз где взять оффсет m_bUseNewAnimstate, достаточно после обновы посмотреть сюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно, вы когда либо сталкивались с проблемой, когда питч опускается вниз на 89 градусов, при приземлении ваша камера очень странно тряслась.
Как это выглядит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


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

Поэтому, хочу показать актуальное решение этой проблемы.
Первым делом я начал с наблюдения поведения этого бага. Я смог увидеть, что камера трясется только от первого лица, а не от третьего и так далее. (запоминаем этот фактор !!!)
Открываем ликнутый код игры, находим код отвечающий за тряску камеры при приземлении, дабы сделать так званый "ребилд". (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Открываем иду, чтобы сверить ликнутый код с актуальным.
Посмотреть вложение 209900
Получив всю нужную информацию, хукаем эту функцию.
C++:
Expand Collapse Copy
/* @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++:
Expand Collapse Copy
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 имеется клиентский код в чем проблема его убрать?
 
Спасибо, годная тема, все информативно и понятно
 
это настолько паблик что даже шарклазер ребилды выкладывал, абсолютно бесполезная информация для людей которые рейджом хотя бы дней 5 занимаются, надеюсь дальше чет лучше зальешь :CoolStoryBob:
 
Хук, который нужен не для рейджа: *существует*.
@BebeRexha:
которые рейджом хотя бы дней 5 занимаются
это настолько паблик что даже шарклазер ребилды выкладывал
Чёт такого не видел нигде (именно этот ребилд).
 
Хуки, которые нужны не для рейджа: *существуют*.
@BebeRexha:


Чёт такого не видел нигде (именно этот ребилд).
В основе своей айпоз не фиксят для легит софтов, а этот "ребилд" побывал во всех читах где можно и где нельзя.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
и так далее и так далее и так далее... :roflanzdarova:
 
В основе своей айпоз не фиксят для легит софтов, а этот "ребилд" побывал во всех читах где можно и где нельзя.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
и так далее и так далее и так далее... :roflanzdarova:
Ты говорил о ребилдах шарклазера.
Так вот, где он? Я не вижу.
Про других говорить не буду, он на самом деле очень часто где появлялся, однако гайд не совсем в ModifyEyePos (Точнее, сам гайд объясняет нам про другой хук, а этот идёт по ходу самого гайда).
 
Ты говорил о ребилдах шарклазера.
Так вот, где он? Я не вижу.
Про других говорить не буду, он на самом деле очень часто где появлялся, однако гайд не совсем в ModifyEyePos (Точнее, сам гайд объясняет нам про другой хук, а этот идёт по ходу самого гайда).
Перепутал стакера и шарклазера но один хуй какая блять разница? Код опубликован на юц в 2019 году и встречается во всех "п2с" сурсах, даже в qo0 он есть.
Чеееел ты о чем вообще "однако гайд не совсем в ModifyEyePos".
Во всех сурсах что я скинул фикится такая же проблема о которой чел пишет, айпоз можно пофиксить несколькими способами
- ребилднуть айпоз и оффнуть виртуал функцию
- перезаписать виртуальную функцию тогда нужно оффнуть еще в калкваеве вызов ( об этом пишет тс )
- да хоть нахуй можно через cl_camera_height_restriction_debug квар ебануть фикс
так что какая нахуй разница о каком методе идет речь если смысл и результат остается таким же, вон иди скачай qo0 и посмотри там не должно быть этого бага если фурса все доделал до конца.

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

P.s бонусом ломаю маня мирок хвх идиотам которые отключат питч на land, это делалось не для "визуала" а при использовании cl_camera_height_restriction_debug есотериксом как раз что бы пофиксить eye_pos, теперь живите с этим :roflanzdarova:
 
Перепутал стакера и шарклазера но один хуй какая блять разница? Код опубликован на юц в 2019 году и встречается во всех "п2с" сурсах, даже в qo0 он есть.
Чеееел ты о чем вообще "однако гайд не совсем в ModifyEyePos".
Во всех сурсах что я скинул фикится такая же проблема о которой чел пишет, айпоз можно пофиксить несколькими способами
- ребилднуть айпоз и оффнуть виртуал функцию
- перезаписать виртуальную функцию тогда нужно оффнуть еще в калкваеве вызов ( об этом пишет тс )
- да хоть нахуй можно через cl_camera_height_restriction_debug квар ебануть фикс
так что какая нахуй разница о каком методе идет речь если смысл и результат остается таким же, вон иди скачай qo0 и посмотри там не должно быть этого бага если фурса все доделал до конца.

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

P.s бонусом ломаю маня мирок хвх идиотам которые отключат питч на land, это делалось не для "визуала" а при использовании cl_camera_height_restriction_debug есотериксом как раз что бы пофиксить eye_pos, теперь живите с этим :roflanzdarova:
Мне интересно, к чему ты это всё расписал, но спасибо.
Ах да, ребилд от шарклазера я всё таки нашёл Xd
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Мне интересно, к чему ты это всё расписал, но спасибо.
Ах да, ребилд от шарклазера я всё таки нашёл Xd
Пожалуйста, авторизуйтесь для просмотра ссылки.
Ну я расписал что бы меньше дизинформации плодилось и так куча идиотов несут сплошную хуйню ибо мозг не способен отличить какой то фикс от плацебо эффекта, поэтому у нас 1000 кордов на всякие п2с читы которые являются лишь мусором и сборником джанк кода, а ведь их еще кто то покупает...
 
Назад
Сверху Снизу