Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Как улучшить резольвер?

  • Автор темы Автор темы zhanulka
  • Дата начала Дата начала
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
14 Июл 2019
Сообщения
1,116
Реакции
505
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
Expand Collapse Copy
bool resolve_p::ncontinue(int id, player_t* e, ClientFrameStage_t stage) {
    switch (stage) {
    case FRAME_RENDER_START:
        if (!e->valid(true))
            return false;

        break;
    case FRAME_NET_UPDATE_POSTDATAUPDATE_START:
        if (!e->valid(true)) {
            return false;
        }

        break;
    case FRAME_NET_UPDATE_POSTDATAUPDATE_END:
        if (e->m_iHealth() <= 0 || e->m_iTeamNum() == g_ctx.m_local->m_iTeamNum()) {
            return false;
        }

        if (e->IsDormant() || e->m_bGunGameImmunity())
            return false;

        break;
    case FRAME_NET_UPDATE_END:
        if (!e->valid(true))
            return false;

        break;
    }

    return true;
}



void resolve_p::create_move(ClientFrameStage_t stage)
{
    if (!g_ctx.m_local || !g_csgo.m_engine()->IsInGame() || !g_csgo.m_engine()->IsConnected())
        return;

    static bool  wasDormant[65];

    for (int i = 0; i <= g_csgo.m_globals()->m_maxclients; ++i)
    {
        auto pPlayerEntity = static_cast<player_t *>(g_csgo.m_entitylist()->GetClientEntity(i));

        if (!pPlayerEntity
            || !pPlayerEntity->is_alive()
            || !pPlayerEntity->is_valid_player())
            continue;

        if (pPlayerEntity->IsDormant())
        {
            wasDormant[i] = true;
            continue;
        }

        switch (stage)
        {
        case FRAME_NET_UPDATE_POSTDATAUPDATE_END:

            if (pPlayerEntity != g_ctx.m_local)
                pPlayerEntity->update_clientside_animation();

            break;
        case FRAME_RENDER_START:

            if (pPlayerEntity != g_ctx.m_local)
            {
                // skip_animations(pPlayerEntity);
                // sync_animations(pPlayerEntity);
            }

            break;
        case FRAME_NET_UPDATE_POSTDATAUPDATE_START:

            
            if (pPlayerEntity != g_ctx.m_local)
            {
                update(pPlayerEntity);
                resolve_yaw(pPlayerEntity);
                resolve_pitch(pPlayerEntity);
            }

            break;
        case FRAME_NET_UPDATE_END:

            if (pPlayerEntity != g_ctx.m_local)
            {
                auto VarMap = reinterpret_cast<uintptr_t>(pPlayerEntity) + 36;
                auto VarMapSize = *reinterpret_cast<int*>(VarMap + 20);

                for (auto index = 0; index < VarMapSize; index++)
                    *reinterpret_cast<uintptr_t*>(*reinterpret_cast<uintptr_t*>(VarMap) + index * 12) = 0;
            }

            break;
        }

        wasDormant[i] = false;
    }
}

void resolve_p::update(player_t * x)
{
    for (int i = 0; i < x->animlayer_count(); i++)
        rec.layers[i] = x->get_animlayers()[i];
        
    rec.pitch = x->m_angEyeAngles().x;
    rec.yaw = x->m_angEyeAngles().y;
    rec.state = x->get_animation_state();
    // rec.misses[x->EntIndex()] = g_ctx.m_globals.missed_shots[x->EntIndex()];
    rec.server_hurt[x->EntIndex()] = miss_count::get().bPlayerHurt[x->EntIndex()];
    rec.modificated = x->get_modificated_state();

    rec.is_desync[x->EntIndex()] = rec.modificated->pad_0x0000[0];

    Vector direction_1, direction_2;
    math::angle_vectors(Vector(0.f, math::calculate_angle(g_ctx.m_local->m_vecOrigin(), x->m_vecOrigin()).y - 90.f, 0.f), direction_1);
    math::angle_vectors(Vector(0.f, math::calculate_angle(g_ctx.m_local->m_vecOrigin(), x->m_vecOrigin()).y + 90.f, 0.f), direction_2);

    const float height = 64;
    const auto left_eye_pos = x->m_vecOrigin() + Vector(0, 0, height) + (direction_1 * 16.f);
    const auto right_eye_pos = x->m_vecOrigin() + Vector(0, 0, height) + (direction_2 * 16.f);

    rec.left_damage = autowall::get().calculate_return_info(g_ctx.m_local->get_eye_pos(), left_eye_pos, g_ctx.m_local, x, 1).m_damage;
    rec.right_damage = autowall::get().calculate_return_info(g_ctx.m_local->get_eye_pos(), right_eye_pos, g_ctx.m_local, x, 1).m_damage;

    Ray_t ray;
    trace_t trace;
    CTraceFilterWorldOnly filter;

    ray.Init(left_eye_pos, g_ctx.m_local->get_eye_pos());
    g_csgo.m_trace()->TraceRay(ray, MASK_ALL, &filter, &trace);
    rec.left_fraction = trace.fraction;

    ray.Init(right_eye_pos, g_ctx.m_local->get_eye_pos());
    g_csgo.m_trace()->TraceRay(ray, MASK_ALL, &filter, &trace);
    rec.right_fraction = trace.fraction;

    switch (rec.misses[x->EntIndex()])
    {
        case 0:
            rec.mode[x->EntIndex()] = mode::brute_side_0;
            break;
        case 1:
            rec.mode[x->EntIndex()] = mode::brute_side_1;
            break;
        case 2:
            rec.mode[x->EntIndex()] = mode::brute_side_2;
            break;
        default:
            break;
    }
}

void resolve_p::resolve_yaw(player_t * ent)
{
    if (!g_cfg.ragebot.antiaim_correction)
        return;

    if (!rec.state)
        return;

    if (rec.is_desync[ent->EntIndex()])
    {
        sync_animations(ent);

        if (rec.mode[ent->EntIndex()] == mode::brute_side_0 || rec.mode[ent->EntIndex()] == mode::brute_side_1 ||rec.mode[ent->EntIndex()] == mode::brute_side_2)
            brute(ent);

        normalize_yaw(rec.state->m_flGoalFeetYaw);

        ent->set_animation_state(rec.state);
    }
}

void resolve_p::normalize_yaw(float yaw)
{
    for (; yaw > 180.0; yaw = yaw - 360.0);
    for (; yaw < -180.0; yaw = yaw + 360.0);
}

void resolve_p::brute(player_t * ent)
{
    auto rec_yaw = rec.state->m_flEyeYaw;

    if (rec.mode[ent->EntIndex()] == mode::brute_side_0)
        rec.state->m_flGoalFeetYaw = rec_yaw + 58.0;

    else if (rec.mode[ent->EntIndex()] == mode::brute_side_1)
        rec.state->m_flGoalFeetYaw = server_goal_feet_yaw(ent);

    else if (rec.mode[ent->EntIndex()] == mode::brute_side_2)
        rec.state->m_flGoalFeetYaw = rec_yaw - 60.0;
}

float resolve_p::fl_approach_angle(float fl_target, float fl_value, float fl_speed)
{
    auto fl_angle_mod = [](float fl_angle) -> float
    {
        return ((360.0f / 65536.0f) * ((int32_t)(fl_angle * (65536.0f / 360.0f)) & 65535));
    };

    float fl_adjusted_speed = fl_speed;

    if (fl_adjusted_speed < 0.0f)
        fl_adjusted_speed *= -1.0f;

    float fl_angle_mod_target = fl_angle_mod(fl_target);
    float fl_angle_mod_value = fl_angle_mod(fl_value);

    float fl_delta = (fl_angle_mod_target - fl_angle_mod_value);

    if (fl_delta >= -180.0f)
    {
        if (fl_delta >= 180.0f)
            fl_delta -= 360.0f;
    }
    else
    {
        if (fl_delta <= -180.0f)
            fl_delta += 360.0f;
    }

    float fl_return;

    if (fl_delta <= fl_adjusted_speed)
    {
        if ((fl_adjusted_speed * -1.0f) <= fl_delta)
            fl_return = fl_angle_mod_target;
        else
            fl_return = (fl_angle_mod_value - fl_adjusted_speed);
    }
    else
        fl_return = (fl_angle_mod_value + fl_adjusted_speed);

    return fl_return;
}

float resolve_p::server_goal_feet_yaw(player_t* entity)
{
    auto animstate = rec.state;

    if (!animstate)
        return 0.f;

    auto ground_fraction = *(float*)(animstate + 0x11C);
    auto duck_ammount = *(float*)(animstate + 0xA4);
    auto ducking_speed = max(0.f, min(1.f, *reinterpret_cast<float*> (animstate + 0xFC)));
    auto running_speed = max(0.f, min(*reinterpret_cast<float*> (animstate + 0xF8), 1.f));

    auto abs_velocity = *reinterpret_cast<Vector*> (uintptr_t(entity) + 0x94);

    auto speed = std::fmin(abs_velocity.Length2D(), 260.0f);

    auto goal_feet_yaw = animstate->m_flGoalFeetYaw;

    auto angle_diff = [](float destAngle, float srcAngle) -> float
    {
        auto delta = 0.f;

        delta = fmodf(destAngle - srcAngle, 360.0f);

        if (destAngle > srcAngle)
        {
            if (delta >= 180)
                (delta -= 160);
                delta -= 360;
        }
        else
        {
            if (delta <= -180)
                (delta += 160);
                delta += 360;
        }

        return delta;
    };

    auto eye_feet_delta = angle_diff(animstate->m_flEyeYaw, goal_feet_yaw);

    auto flYawModifier = (((ground_fraction * -0.3f) - 0.2f) * running_speed) + 1.0f;

    if (duck_ammount > 0.0f)
        flYawModifier = flYawModifier + ((duck_ammount * ducking_speed) * (0.5f - flYawModifier));

    auto flMaxYawModifier = flYawModifier * 58.f;
    auto flMinYawModifier = flYawModifier * -58.f;

    if (eye_feet_delta <= flMaxYawModifier)
    {
        if (flMinYawModifier > eye_feet_delta)
            goal_feet_yaw = fabs(flMinYawModifier) + animstate->m_flEyeYaw;
    }
    else
        goal_feet_yaw = animstate->m_flEyeYaw - fabs(flMaxYawModifier);

    if (goal_feet_yaw > 5000 || goal_feet_yaw < -5000)
        return 0.f;

    math::normalize_yaw(goal_feet_yaw);

    if (speed > 0.1f || fabs(abs_velocity.z) > 100.0f)
    {
        goal_feet_yaw = fl_approach_angle(
            animstate->m_flEyeYaw,
            goal_feet_yaw,
            ((ground_fraction * 20.0f) + 30.0f)
            * animstate->m_flLastClientSideAnimationUpdateTime);
    }
    else
    {
        goal_feet_yaw = fl_approach_angle(
            entity->m_flLowerBodyYawTarget(),
            goal_feet_yaw,
            animstate->m_flLastClientSideAnimationUpdateTime * 100.0f);
    }

    if (goal_feet_yaw > 5000 || goal_feet_yaw < -5000)
        return 0.f;

    math::normalize_yaw(goal_feet_yaw);

    return goal_feet_yaw;
}

void resolve_p::direction_based(player_t * e)
{
    if (rec.left_damage <= 0 && rec.right_damage <= 0) {
        if (rec.right_fraction < rec.left_fraction)
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw + 58.0;
        else
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw - 58.0;
    }
    else {
        if (rec.left_damage > rec.right_damage)
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw + 58.0;
        else
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw - 58.0;
    }
}

void resolve_p::skip_animations(player_t * player)
{
    static ConVar *sv_pvsskipanimation = g_csgo.m_cvar()->FindVar("sv_pvsskipanimation");
    int32_t backup_sv_pvsskipanimation = sv_pvsskipanimation->GetFloat();
    sv_pvsskipanimation->SetValue(0);
    *(int32_t*)((uintptr_t)player + 0xA30) = 0;
    *(int32_t*)((uintptr_t)player + 0x269C) = 0;
    int32_t backup_effects = *(int32_t*)((uintptr_t)player + 0xEC);
    *(int32_t*)((uintptr_t)player + 0xEC) |= 8;
    player->SetupBones(NULL, -1, 0x7FF00, g_csgo.m_globals()->m_curtime);
    *(int32_t*)((uintptr_t)player + 0xEC) = backup_effects;
    sv_pvsskipanimation->SetValue(backup_sv_pvsskipanimation);
}

void resolve_p::sync_animations(player_t * entity)
{
    auto state = entity->get_animation_state(); if (!state) return;
    auto index = entity->EntIndex();
    static float sim_time[65];

    if (sim_time[index] != entity->get_simulation_time())
    {
        const float curtime = g_csgo.m_globals()->m_curtime;
        const float frametime = g_csgo.m_globals()->m_frametime;
        static auto host_timescale = g_csgo.m_cvar()->FindVar(("host_timescale"));

        g_csgo.m_globals()->m_frametime = g_csgo.m_globals()->m_interval_per_tick * host_timescale->GetFloat();
        g_csgo.m_globals()->m_curtime = entity->get_simulation_time() + g_csgo.m_globals()->m_interval_per_tick;

        vec3_t backup_velocity = entity->m_vecVelocity();

        int backup_flags = entity->m_fFlags();
        int backup_eflags = entity->m_iEFlags();

        AnimationLayer backup_layers[15];
        std::memcpy(backup_layers, entity->GetAnimOverlays(), (sizeof(0x0038) * 15));

        state->m_bOnGround ? entity->m_fFlags() |= (1 << 0) : entity->m_fFlags() &= ~(1 << 0);

        entity->m_iEFlags() &= ~0x1000;

        entity->m_vecAbsVelocity() = entity->m_vecVelocity();

        if (state->m_iLastClientSideAnimationUpdateFramecount == g_csgo.m_globals()->m_framecount)
            state->m_iLastClientSideAnimationUpdateFramecount = g_csgo.m_globals()->m_framecount - 1;

        entity->update_clientside_animation();

        float lby_delta = entity->m_flLowerBodyYawTarget() - entity->m_angEyeAngles().y;
        lby_delta = std::remainderf(lby_delta, 360.f);
        lby_delta = math::clamp(lby_delta, -60.f, 60.f);

        float feet_yaw = std::remainderf(entity->m_angEyeAngles().y + lby_delta, 360.f);

        if (feet_yaw < 0.f) {
            feet_yaw += 360.f;
        }

        static float pitch, yaw = 0.f;

        std::memcpy(entity->GetAnimOverlays(), backup_layers, (sizeof(0x0038) * 15));

        entity->m_vecVelocity() = backup_velocity;
        entity->m_fFlags() = backup_flags;
        entity->m_iEFlags() = backup_eflags;

        g_csgo.m_globals()->m_curtime = curtime;
        g_csgo.m_globals()->m_frametime = frametime;
        sim_time[index] = entity->get_simulation_time();
    }

    entity->SetupBones(nullptr, -1, 0x7FF00, g_csgo.m_globals()->m_curtime);
}

void resolve_p::resolve_pitch(player_t * e)
{
    if (!g_cfg.ragebot.pitch_resolve)
        return;

    float last_simtime[64] = { 0.f };
    float stored_pitch_1[64] = { 0.f };
    float fixed_pitch[64] = { 0.f };

    bool has_been_set[64] = { false };

    for (auto i = 0; i < g_csgo.m_globals()->m_maxclients; ++i)
    {
        auto eye = rec.pitch;

        auto pitch = 0.f;

        if (stored_pitch_1[i] == FLT_MAX || !has_been_set[i])
        {
            stored_pitch_1[i] = eye;
            has_been_set[i] = true;
        }

        if (stored_pitch_1[i] - eye < 30 && stored_pitch_1[i] - eye > -30)
        {
            pitch = eye;
        }
        else
        {
            pitch = stored_pitch_1[i];
        }

        e->m_angEyeAngles().x = pitch;
    }
}
 
Код:
Expand Collapse Copy
bool resolve_p::ncontinue(int id, player_t* e, ClientFrameStage_t stage) {
    switch (stage) {
    case FRAME_RENDER_START:
        if (!e->valid(true))
            return false;

        break;
    case FRAME_NET_UPDATE_POSTDATAUPDATE_START:
        if (!e->valid(true)) {
            return false;
        }

        break;
    case FRAME_NET_UPDATE_POSTDATAUPDATE_END:
        if (e->m_iHealth() <= 0 || e->m_iTeamNum() == g_ctx.m_local->m_iTeamNum()) {
            return false;
        }

        if (e->IsDormant() || e->m_bGunGameImmunity())
            return false;

        break;
    case FRAME_NET_UPDATE_END:
        if (!e->valid(true))
            return false;

        break;
    }

    return true;
}



void resolve_p::create_move(ClientFrameStage_t stage)
{
    if (!g_ctx.m_local || !g_csgo.m_engine()->IsInGame() || !g_csgo.m_engine()->IsConnected())
        return;

    static bool  wasDormant[65];

    for (int i = 0; i <= g_csgo.m_globals()->m_maxclients; ++i)
    {
        auto pPlayerEntity = static_cast<player_t *>(g_csgo.m_entitylist()->GetClientEntity(i));

        if (!pPlayerEntity
            || !pPlayerEntity->is_alive()
            || !pPlayerEntity->is_valid_player())
            continue;

        if (pPlayerEntity->IsDormant())
        {
            wasDormant[i] = true;
            continue;
        }

        switch (stage)
        {
        case FRAME_NET_UPDATE_POSTDATAUPDATE_END:

            if (pPlayerEntity != g_ctx.m_local)
                pPlayerEntity->update_clientside_animation();

            break;
        case FRAME_RENDER_START:

            if (pPlayerEntity != g_ctx.m_local)
            {
                // skip_animations(pPlayerEntity);
                // sync_animations(pPlayerEntity);
            }

            break;
        case FRAME_NET_UPDATE_POSTDATAUPDATE_START:

           
            if (pPlayerEntity != g_ctx.m_local)
            {
                update(pPlayerEntity);
                resolve_yaw(pPlayerEntity);
                resolve_pitch(pPlayerEntity);
            }

            break;
        case FRAME_NET_UPDATE_END:

            if (pPlayerEntity != g_ctx.m_local)
            {
                auto VarMap = reinterpret_cast<uintptr_t>(pPlayerEntity) + 36;
                auto VarMapSize = *reinterpret_cast<int*>(VarMap + 20);

                for (auto index = 0; index < VarMapSize; index++)
                    *reinterpret_cast<uintptr_t*>(*reinterpret_cast<uintptr_t*>(VarMap) + index * 12) = 0;
            }

            break;
        }

        wasDormant[i] = false;
    }
}

void resolve_p::update(player_t * x)
{
    for (int i = 0; i < x->animlayer_count(); i++)
        rec.layers[i] = x->get_animlayers()[i];
       
    rec.pitch = x->m_angEyeAngles().x;
    rec.yaw = x->m_angEyeAngles().y;
    rec.state = x->get_animation_state();
    // rec.misses[x->EntIndex()] = g_ctx.m_globals.missed_shots[x->EntIndex()];
    rec.server_hurt[x->EntIndex()] = miss_count::get().bPlayerHurt[x->EntIndex()];
    rec.modificated = x->get_modificated_state();

    rec.is_desync[x->EntIndex()] = rec.modificated->pad_0x0000[0];

    Vector direction_1, direction_2;
    math::angle_vectors(Vector(0.f, math::calculate_angle(g_ctx.m_local->m_vecOrigin(), x->m_vecOrigin()).y - 90.f, 0.f), direction_1);
    math::angle_vectors(Vector(0.f, math::calculate_angle(g_ctx.m_local->m_vecOrigin(), x->m_vecOrigin()).y + 90.f, 0.f), direction_2);

    const float height = 64;
    const auto left_eye_pos = x->m_vecOrigin() + Vector(0, 0, height) + (direction_1 * 16.f);
    const auto right_eye_pos = x->m_vecOrigin() + Vector(0, 0, height) + (direction_2 * 16.f);

    rec.left_damage = autowall::get().calculate_return_info(g_ctx.m_local->get_eye_pos(), left_eye_pos, g_ctx.m_local, x, 1).m_damage;
    rec.right_damage = autowall::get().calculate_return_info(g_ctx.m_local->get_eye_pos(), right_eye_pos, g_ctx.m_local, x, 1).m_damage;

    Ray_t ray;
    trace_t trace;
    CTraceFilterWorldOnly filter;

    ray.Init(left_eye_pos, g_ctx.m_local->get_eye_pos());
    g_csgo.m_trace()->TraceRay(ray, MASK_ALL, &filter, &trace);
    rec.left_fraction = trace.fraction;

    ray.Init(right_eye_pos, g_ctx.m_local->get_eye_pos());
    g_csgo.m_trace()->TraceRay(ray, MASK_ALL, &filter, &trace);
    rec.right_fraction = trace.fraction;

    switch (rec.misses[x->EntIndex()])
    {
        case 0:
            rec.mode[x->EntIndex()] = mode::brute_side_0;
            break;
        case 1:
            rec.mode[x->EntIndex()] = mode::brute_side_1;
            break;
        case 2:
            rec.mode[x->EntIndex()] = mode::brute_side_2;
            break;
        default:
            break;
    }
}

void resolve_p::resolve_yaw(player_t * ent)
{
    if (!g_cfg.ragebot.antiaim_correction)
        return;

    if (!rec.state)
        return;

    if (rec.is_desync[ent->EntIndex()])
    {
        sync_animations(ent);

        if (rec.mode[ent->EntIndex()] == mode::brute_side_0 || rec.mode[ent->EntIndex()] == mode::brute_side_1 ||rec.mode[ent->EntIndex()] == mode::brute_side_2)
            brute(ent);

        normalize_yaw(rec.state->m_flGoalFeetYaw);

        ent->set_animation_state(rec.state);
    }
}

void resolve_p::normalize_yaw(float yaw)
{
    for (; yaw > 180.0; yaw = yaw - 360.0);
    for (; yaw < -180.0; yaw = yaw + 360.0);
}

void resolve_p::brute(player_t * ent)
{
    auto rec_yaw = rec.state->m_flEyeYaw;

    if (rec.mode[ent->EntIndex()] == mode::brute_side_0)
        rec.state->m_flGoalFeetYaw = rec_yaw + 58.0;

    else if (rec.mode[ent->EntIndex()] == mode::brute_side_1)
        rec.state->m_flGoalFeetYaw = server_goal_feet_yaw(ent);

    else if (rec.mode[ent->EntIndex()] == mode::brute_side_2)
        rec.state->m_flGoalFeetYaw = rec_yaw - 60.0;
}

float resolve_p::fl_approach_angle(float fl_target, float fl_value, float fl_speed)
{
    auto fl_angle_mod = [](float fl_angle) -> float
    {
        return ((360.0f / 65536.0f) * ((int32_t)(fl_angle * (65536.0f / 360.0f)) & 65535));
    };

    float fl_adjusted_speed = fl_speed;

    if (fl_adjusted_speed < 0.0f)
        fl_adjusted_speed *= -1.0f;

    float fl_angle_mod_target = fl_angle_mod(fl_target);
    float fl_angle_mod_value = fl_angle_mod(fl_value);

    float fl_delta = (fl_angle_mod_target - fl_angle_mod_value);

    if (fl_delta >= -180.0f)
    {
        if (fl_delta >= 180.0f)
            fl_delta -= 360.0f;
    }
    else
    {
        if (fl_delta <= -180.0f)
            fl_delta += 360.0f;
    }

    float fl_return;

    if (fl_delta <= fl_adjusted_speed)
    {
        if ((fl_adjusted_speed * -1.0f) <= fl_delta)
            fl_return = fl_angle_mod_target;
        else
            fl_return = (fl_angle_mod_value - fl_adjusted_speed);
    }
    else
        fl_return = (fl_angle_mod_value + fl_adjusted_speed);

    return fl_return;
}

float resolve_p::server_goal_feet_yaw(player_t* entity)
{
    auto animstate = rec.state;

    if (!animstate)
        return 0.f;

    auto ground_fraction = *(float*)(animstate + 0x11C);
    auto duck_ammount = *(float*)(animstate + 0xA4);
    auto ducking_speed = max(0.f, min(1.f, *reinterpret_cast<float*> (animstate + 0xFC)));
    auto running_speed = max(0.f, min(*reinterpret_cast<float*> (animstate + 0xF8), 1.f));

    auto abs_velocity = *reinterpret_cast<Vector*> (uintptr_t(entity) + 0x94);

    auto speed = std::fmin(abs_velocity.Length2D(), 260.0f);

    auto goal_feet_yaw = animstate->m_flGoalFeetYaw;

    auto angle_diff = [](float destAngle, float srcAngle) -> float
    {
        auto delta = 0.f;

        delta = fmodf(destAngle - srcAngle, 360.0f);

        if (destAngle > srcAngle)
        {
            if (delta >= 180)
                (delta -= 160);
                delta -= 360;
        }
        else
        {
            if (delta <= -180)
                (delta += 160);
                delta += 360;
        }

        return delta;
    };
   // воть туть)
    auto eye_feet_delta = angle_diff(animstate->m_flEyeYaw,  player->lby());

    auto flYawModifier = (((ground_fraction * -0.3f) - 0.2f) * running_speed) + 1.0f;

    if (duck_ammount > 0.0f)
        flYawModifier = flYawModifier + ((duck_ammount * ducking_speed) * (0.5f - flYawModifier));

    auto flMaxYawModifier = flYawModifier * 58.f;
    auto flMinYawModifier = flYawModifier * -58.f;

    if (eye_feet_delta <= flMaxYawModifier)
    {
        if (flMinYawModifier > eye_feet_delta)
            goal_feet_yaw = fabs(flMinYawModifier) + animstate->m_flEyeYaw;
    }
    else
        goal_feet_yaw = animstate->m_flEyeYaw - fabs(flMaxYawModifier);

    if (goal_feet_yaw > 5000 || goal_feet_yaw < -5000)
        return 0.f;

    math::normalize_yaw(goal_feet_yaw);

    if (speed > 0.1f || fabs(abs_velocity.z) > 100.0f)
    {
        goal_feet_yaw = fl_approach_angle(
            animstate->m_flEyeYaw,
            goal_feet_yaw,
            ((ground_fraction * 20.0f) + 30.0f)
            * animstate->m_flLastClientSideAnimationUpdateTime);
    }
    else
    {
        goal_feet_yaw = fl_approach_angle(
            entity->m_flLowerBodyYawTarget(),
            goal_feet_yaw,
            animstate->m_flLastClientSideAnimationUpdateTime * 100.0f);
    }

    if (goal_feet_yaw > 5000 || goal_feet_yaw < -5000)
        return 0.f;

    math::normalize_yaw(goal_feet_yaw);

    return goal_feet_yaw;
}

void resolve_p::direction_based(player_t * e)
{
    if (rec.left_damage <= 0 && rec.right_damage <= 0) {
        if (rec.right_fraction < rec.left_fraction)
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw + 58.0;
        else
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw - 58.0;
    }
    else {
        if (rec.left_damage > rec.right_damage)
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw + 58.0;
        else
            rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw - 58.0;
    }
}

void resolve_p::skip_animations(player_t * player)
{
    static ConVar *sv_pvsskipanimation = g_csgo.m_cvar()->FindVar("sv_pvsskipanimation");
    int32_t backup_sv_pvsskipanimation = sv_pvsskipanimation->GetFloat();
    sv_pvsskipanimation->SetValue(0);
    *(int32_t*)((uintptr_t)player + 0xA30) = 0;
    *(int32_t*)((uintptr_t)player + 0x269C) = 0;
    int32_t backup_effects = *(int32_t*)((uintptr_t)player + 0xEC);
    *(int32_t*)((uintptr_t)player + 0xEC) |= 8;
    player->SetupBones(NULL, -1, 0x7FF00, g_csgo.m_globals()->m_curtime);
    *(int32_t*)((uintptr_t)player + 0xEC) = backup_effects;
    sv_pvsskipanimation->SetValue(backup_sv_pvsskipanimation);
}

void resolve_p::sync_animations(player_t * entity)
{
    auto state = entity->get_animation_state(); if (!state) return;
    auto index = entity->EntIndex();
    static float sim_time[65];

    if (sim_time[index] != entity->get_simulation_time())
    {
        const float curtime = g_csgo.m_globals()->m_curtime;
        const float frametime = g_csgo.m_globals()->m_frametime;
        static auto host_timescale = g_csgo.m_cvar()->FindVar(("host_timescale"));

        g_csgo.m_globals()->m_frametime = g_csgo.m_globals()->m_interval_per_tick * host_timescale->GetFloat();
        g_csgo.m_globals()->m_curtime = entity->get_simulation_time() + g_csgo.m_globals()->m_interval_per_tick;

        vec3_t backup_velocity = entity->m_vecVelocity();

        int backup_flags = entity->m_fFlags();
        int backup_eflags = entity->m_iEFlags();

        AnimationLayer backup_layers[15];
        std::memcpy(backup_layers, entity->GetAnimOverlays(), (sizeof(0x0038) * 15));

        state->m_bOnGround ? entity->m_fFlags() |= (1 << 0) : entity->m_fFlags() &= ~(1 << 0);

        entity->m_iEFlags() &= ~0x1000;

        entity->m_vecAbsVelocity() = entity->m_vecVelocity();

        if (state->m_iLastClientSideAnimationUpdateFramecount == g_csgo.m_globals()->m_framecount)
            state->m_iLastClientSideAnimationUpdateFramecount = g_csgo.m_globals()->m_framecount - 1;

        entity->update_clientside_animation();

        float lby_delta = entity->m_flLowerBodyYawTarget() - entity->m_angEyeAngles().y;
        lby_delta = std::remainderf(lby_delta, 360.f);
        lby_delta = math::clamp(lby_delta, -60.f, 60.f);

        float feet_yaw = std::remainderf(entity->m_angEyeAngles().y + lby_delta, 360.f);

        if (feet_yaw < 0.f) {
            feet_yaw += 360.f;
        }

        static float pitch, yaw = 0.f;

        std::memcpy(entity->GetAnimOverlays(), backup_layers, (sizeof(0x0038) * 15));

        entity->m_vecVelocity() = backup_velocity;
        entity->m_fFlags() = backup_flags;
        entity->m_iEFlags() = backup_eflags;

        g_csgo.m_globals()->m_curtime = curtime;
        g_csgo.m_globals()->m_frametime = frametime;
        sim_time[index] = entity->get_simulation_time();
    }

    entity->SetupBones(nullptr, -1, 0x7FF00, g_csgo.m_globals()->m_curtime);
}

void resolve_p::resolve_pitch(player_t * e)
{
    if (!g_cfg.ragebot.pitch_resolve)
        return;

    float last_simtime[64] = { 0.f };
    float stored_pitch_1[64] = { 0.f };
    float fixed_pitch[64] = { 0.f };

    bool has_been_set[64] = { false };

    for (auto i = 0; i < g_csgo.m_globals()->m_maxclients; ++i)
    {
        auto eye = rec.pitch;

        auto pitch = 0.f;

        if (stored_pitch_1[i] == FLT_MAX || !has_been_set[i])
        {
            stored_pitch_1[i] = eye;
            has_been_set[i] = true;
        }

        if (stored_pitch_1[i] - eye < 30 && stored_pitch_1[i] - eye > -30)
        {
            pitch = eye;
        }
        else
        {
            pitch = stored_pitch_1[i];
        }

        e->m_angEyeAngles().x = pitch;
    }
}
впервые вижу что б кто-то скинул нормальный ресольвер. Дам небольшую подсказку: ты от сервера получаешь неверный гоалфит и обычно это goalfeet = eye angles.
Это означает, что либо это верно, либо это десинк. Но нет смысла вообще опираться на clientside goalfeet, это тебе ничего не даст.

Лучше angle diff от lby.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
auto rec_yaw = rec.state->m_flEyeYaw;
:da:
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
pasted from luxi v2 l0l
 
Назад
Сверху Снизу