Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Visiblity check

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Июл 2023
Сообщения
114
Реакции
2
хелпаните как в аимботе visiblity check сделать а то он чё то не работает (не наводится крч)
мега вайбкод:
aimbot.cpp:
Expand Collapse Copy
#include <astrum.h>

vec3_t aimbot::calculate_angle(const vec3_t& source, const vec3_t& destination) {
    vec3_t delta = destination - source;
    float length = std::sqrtf(delta.x * delta.x + delta.y * delta.y + delta.z * delta.z);

    if (length < 0.1f || !std::isfinite(length))
        return vec3_t(0, 0, 0);

    constexpr float RAD2DEG = 180.0f / 3.14159265358979323846f;
    
    float pitch = -std::asin(delta.z / length) * RAD2DEG;
    float yaw = std::atan2(delta.y, delta.x) * RAD2DEG;

    if (!std::isfinite(pitch) || !std::isfinite(yaw))
        return vec3_t(0, 0, 0);

    return vec3_t(pitch, yaw, 0.0f);
}

vec3_t aimbot::get_hitbox_position(c_cs_player_pawn* pawn, hitbox_t hitbox) {
    if (!pawn)
        return vec3_t(0, 0, 0);

    auto scene_node = pawn->m_scene_node();
    if (!scene_node)
        return vec3_t(0, 0, 0);

    auto& origin = scene_node->m_abs_origin();
    auto collision = pawn->m_collision();
    if (!collision)
        return origin;

    vec3_t mins = collision->m_mins();
    vec3_t maxs = collision->m_maxs();
    float height = maxs.z - mins.z;

    vec3_t position = origin;

    switch (hitbox) {
    case hitbox_t::HEAD:
        position.z += height * 0.9f;
        break;
    case hitbox_t::NECK:
        position.z += height * 0.8f;
        break;
    case hitbox_t::STOMACH:
        position.z += height * 0.5f;
        break;
    case hitbox_t::HANDS:
        position.z += height * 0.6f;
        break;
    case hitbox_t::LEGS:
        position.z += height * 0.2f;
        break;
    case hitbox_t::NEAREST:
        position.z += height * 0.9f;
        break;
    }

    return position;
}

bool aimbot::is_visible(c_cs_player_pawn* pawn) {
    if (!pawn || !ctx::local_pawn)
        return false;
    
    auto local_scene = ctx::local_pawn->m_scene_node();
    auto enemy_scene = pawn->m_scene_node();
    
    if (!local_scene || !enemy_scene)
        return false;
    
    vec3_t local_origin = local_scene->m_abs_origin();
    vec3_t enemy_origin = enemy_scene->m_abs_origin();
    
    // Добавляем eye offset
    auto local_collision = ctx::local_pawn->m_collision();
    if (local_collision) {
        local_origin.z += local_collision->m_maxs().z * 0.9f;
    }
    
    auto enemy_collision = pawn->m_collision();
    if (enemy_collision) {
        enemy_origin.z += enemy_collision->m_maxs().z * 0.5f; // Center mass
    }
    
    // Используем autowall для проверки видимости
    return autowall::is_visible(local_origin, enemy_origin, pawn, -1);
}

void aimbot::draw_fov_circle() {
    if (!draw_fov || !ctx::local_pawn)
        return;

    ImGui::GetBackgroundDrawList()->AddCircle(
        ImVec2(ImGui::GetIO().DisplaySize.x * 0.5f, ImGui::GetIO().DisplaySize.y * 0.5f),
        fov * (ImGui::GetIO().DisplaySize.y / 90.0f),
        ImGui::ColorConvertFloat4ToU32(fov_color),
        64,
        2.0f
    );
}

c_cs_player_pawn* aimbot::get_best_target() {
    if (!ctx::local_pawn || !interfaces::entity_system)
        return nullptr;

    auto local_scene = ctx::local_pawn->m_scene_node();
    if (!local_scene)
        return nullptr;

    vec3_t local_origin = local_scene->m_abs_origin();
    
    // Используем collision для безопасного получения eye position
    auto local_collision = ctx::local_pawn->m_collision();
    if (local_collision) {
        local_origin.z += local_collision->m_maxs().z * 0.9f;
    }

    auto local_team = ctx::local_pawn->m_team_num();
    
    c_cs_player_pawn* best_target = nullptr;
    float best_fov_value = fov;
    float best_distance = FLT_MAX;

    auto view_angles = interfaces::input->get_view_angles();
    auto highest_index = interfaces::entity_system->get_highest_entity_index();

    // Сначала находим local_index
    int local_index = -1;
    for (int i = 0; i <= highest_index; ++i) {
        auto entity = interfaces::entity_system->get(i);
        if (!entity || !entity->is_player_controller())
            continue;

        auto controller = reinterpret_cast<c_cs_player_controller*>(entity);
        auto pawn = reinterpret_cast<c_cs_player_pawn*>(interfaces::entity_system->get(controller->m_player_pawn()));
        
        if (pawn == ctx::local_pawn) {
            local_index = i;
            break;
        }
    }

    for (int i = 0; i <= highest_index; ++i) {
        auto entity = interfaces::entity_system->get(i);
        if (!entity || !entity->is_player_controller())
            continue;

        auto controller = reinterpret_cast<c_cs_player_controller*>(entity);
        auto pawn = reinterpret_cast<c_cs_player_pawn*>(interfaces::entity_system->get(controller->m_player_pawn()));
        
        if (!pawn || pawn == ctx::local_pawn || pawn->m_health() <= 0)
            continue;

        // ВАЖНО: Не целимся в тиммейтов!
        if (pawn->m_team_num() == local_team)
            continue;

        vec3_t target_pos = get_hitbox_position(pawn, static_cast<hitbox_t>(hitbox));

        if (visible_only && !is_visible(pawn))
            continue;

        vec3_t angle_to_target = calculate_angle(local_origin, target_pos);
        
        if (!std::isfinite(angle_to_target.x) || !std::isfinite(angle_to_target.y))
            continue;
        
        vec3_t delta;
        delta.x = view_angles.x - angle_to_target.x;
        delta.y = view_angles.y - angle_to_target.y;

        while (delta.y > 180.0f) delta.y -= 360.0f;
        while (delta.y < -180.0f) delta.y += 360.0f;

        float current_fov_value = std::hypot(delta.x, delta.y);
        
        if (!std::isfinite(current_fov_value) || current_fov_value > fov)
            continue;
        
        float distance = local_origin.distance_to(target_pos);

        if (hitbox == static_cast<int>(hitbox_t::NEAREST)) {
            if (distance < best_distance && current_fov_value < best_fov_value) {
                best_distance = distance;
                best_target = pawn;
            }
        }
        else {
            if (current_fov_value < best_fov_value) {
                best_fov_value = current_fov_value;
                best_target = pawn;
            }
        }
    }

    return best_target;
}

void aimbot::run(c_user_cmd* cmd) {
    if (!enabled || !cmd || !ctx::local_pawn || !interfaces::input)
        return;

    bool should_aim = false;

    if (aimlock_mode == static_cast<int>(aimlock_mode_t::ALWAYS)) {
        should_aim = true;
    }
    else if (aimlock_mode == static_cast<int>(aimlock_mode_t::ON_KEY)) {
        should_aim = GetAsyncKeyState(aimlock_key) & 0x8000;
    }
    else {
        should_aim = (cmd->button_states.m_button_state & (1ULL << 0));
    }

    if (!should_aim)
        return;

    auto target = get_best_target();
    if (!target)
        return;

    auto local_scene = ctx::local_pawn->m_scene_node();
    if (!local_scene)
        return;

    vec3_t local_origin = local_scene->m_abs_origin();
    
    // Используем collision для безопасного получения eye position
    auto local_collision = ctx::local_pawn->m_collision();
    if (local_collision) {
        local_origin.z += local_collision->m_maxs().z * 0.9f;
    }

    vec3_t target_pos = get_hitbox_position(target, static_cast<hitbox_t>(hitbox));
    vec3_t aim_angle = calculate_angle(local_origin, target_pos);
    
    if (!std::isfinite(aim_angle.x) || !std::isfinite(aim_angle.y))
        return;

    if (silent) {
        if (cmd->user_cmd.has_base()) {
            auto base = cmd->user_cmd.mutable_base();
            if (base && base->has_viewangles()) {
                auto angles = base->mutable_viewangles();
                if (angles) {
                    angles->set_x(aim_angle.x);
                    angles->set_y(aim_angle.y);
                }
            }
        }
    }
    else {
        auto current_angles = interfaces::input->get_view_angles();
        
        vec3_t delta;
        delta.x = aim_angle.x - current_angles.x;
        delta.y = aim_angle.y - current_angles.y;
        delta.z = 0.0f;

        while (delta.y > 180.0f) delta.y -= 360.0f;
        while (delta.y < -180.0f) delta.y += 360.0f;

        if (!std::isfinite(delta.x) || !std::isfinite(delta.y))
            return;

        if (smoothness > 0.0f) {
            delta.x /= smoothness;
            delta.y /= smoothness;
        }

        vec3_t new_angles;
        new_angles.x = current_angles.x + delta.x;
        new_angles.y = current_angles.y + delta.y;
        new_angles.z = 0.0f;

        new_angles.x = std::clamp(new_angles.x, -89.0f, 89.0f);
        new_angles.y = std::fmod(new_angles.y + 180.0f, 360.0f) - 180.0f;

        if (!std::isfinite(new_angles.x) || !std::isfinite(new_angles.y))
            return;

        interfaces::input->set_view_angles(new_angles);
    }
}
 
Назад
Сверху Снизу