Untitled

 avatar
unknown
c_cpp
2 months ago
12 kB
11
Indexable
// in my DataRead.cpp

std::vector<PlayerData> batchReadAllPlayerData() {
    inGame = in_game();

    if (inGame) {
        if (!hasCachedData) {
            ReadOnce();
        }

        std::vector<PlayerData> playersData;

        uintptr_t cameraBasePointer = cameraBase;
        vec3_t cameraPosition;
        vec2_t cameraAngles;
        size_t localPlayerIndex = local_index();

        int playerCount = driver::read<int>(sdk::module_base + offsets::BO6::game_mode);

        playersData.resize(playerCount);
        auto sizeOfPlayersData = playersData.size();


        if (cameraBasePointer) {
            uintptr_t cameraPositionAddress = cameraBasePointer + offsets::BO6::camera_pos;
            uintptr_t cameraAnglesAddress = cameraPositionAddress + 0xC;

            cameraPosition = get_cam_affected();
            cameraAngles = driver::read<vec2_t>(cameraAnglesAddress);
        }

        std::vector<vec3_t> positions(sizeOfPlayersData);
        std::vector<uintptr_t> positionPointers(sizeOfPlayersData);
        std::vector<NameEntry> nameEntryBuffer(sizeOfPlayersData);
        std::vector<Scoreboard> scoreboardBuffer(sizeOfPlayersData);

        for (size_t i = 0; i < sizeOfPlayersData; ++i) {
            playersData[i].isLocalPlayer = (i == localPlayerIndex);
            uintptr_t baseAddress = sdk::client_info_base + (i * offsets::BO6::player::size);

            positionPointers[i] = driver::read<uintptr_t>(baseAddress + offsets::BO6::player::pos);
            playersData[i].teamId = driver::read<uint8_t>(baseAddress + offsets::BO6::player::team);
            playersData[i].stance = driver::read<int>(baseAddress + offsets::BO6::player::stance);
            nameEntryBuffer[i] = driver::read<NameEntry>(baseNameListAddress + (i * offsets::BO6::name_size));
            scoreboardBuffer[i] = driver::read<Scoreboard>(baseScoreboardAddress + (i * offsets::BO6::scoreboard_size));
        }

        for (size_t i = 0; i < positionPointers.size(); ++i) {
            if (positionPointers[i] != 0) {
                if (i == 9 && settings::settingsSettings::indexNineFix) {
                    positions[i] = driver::read<vec3_t>(positionPointers[i] + 0x50);
                }
                else {
                    positions[i] = driver::read<vec3_t>(positionPointers[i] + 0x50);
                }
            }
        }

        for (size_t i = 0; i < playersData.size(); ++i) {
            if (positionPointers[i] != 0) {
                playersData[i].position = positions[i];
            }

            const auto& nameEntry = nameEntryBuffer[i];
            const auto& scoreboard = scoreboardBuffer[i];

            std::memcpy(playersData[i].name, nameEntry.name, sizeof(nameEntry.name) - 1);
            playersData[i].name[sizeof(nameEntry.name) - 1] = '\0';
            playersData[i].health = nameEntry.health;
            playersData[i].isVisible = is_player_visible(sdk::client_info, i);
            playersData[i].scoreboard = scoreboard;

            bool isHealthZero = (nameEntry.health <= 0);
            bool isStatusDead = (scoreboard.status == 2);
            bool isPingZero = (!settings::settingsSettings::inPrivateMatch && scoreboard.ping == 0);
            bool isActiveTeam = (scoreboard.team == 0);

            if (playersData[i].health < 1 && !playersData[i].isVisible) {
                continue;
            }

            playersData[i].isDead = isHealthZero || isStatusDead || isPingZero || isActiveTeam;
        }

        // Set Camera Data
        if (cameraBasePointer) {
            for (auto& player : playersData) {
                player.cameraPosition = cameraPosition;
                player.cameraAngles = cameraAngles;
            }
        }

        return playersData;
    }
    else {
        hasCachedData = false;
    }
}

// in my esp.cpp
void RenderEsp(const std::vector<PlayerData>& playersData, PlayerData localPlayer, ref_def_t ref_def) {
    const float halfScreenWidth = ref_def.width / 2;
    const float halfScreenHeight = ref_def.height / 2;  

    static int pGM = -1;
    int cGM = driver::read<int>(sdk::module_base + offsets::BO6::game_mode);

    /*if (cGM != pGM) {
        pGM = cGM;
        return;
    }*/

    if (cGM <= 1) {
        return;
    }

    if (settings::aimSettings::DrawCircleFOV) {
        ImGui::GetOverlayDrawList()->AddCircle(ImVec2(halfScreenWidth, halfScreenHeight), settings::fov, settings::visualsSettings::FovColor, 100);
    }

    if (settings::aimSettings::crosshair) {
        ImVec2 center(halfScreenWidth, halfScreenHeight);
        ImVec2 horizontalLineStart(center.x - 12, center.y);
        ImVec2 horizontalLineEnd(center.x + 12, center.y);
        ImVec2 verticalLineStart(center.x, center.y - 12);
        ImVec2 verticalLineEnd(center.x, center.y + 12);

        auto drawList = ImGui::GetBackgroundDrawList();
        drawList->AddLine(horizontalLineStart, horizontalLineEnd, settings::visualsSettings::crosshaircolor, 1.0f);
        drawList->AddLine(verticalLineStart, verticalLineEnd, settings::visualsSettings::crosshaircolor, 1.0f);
    }

    /*if (settings::visualsSettings::enableLootEsp) {
        auto draw = ImGui::GetForegroundDrawList();
        auto lootList = BO6::get_all_loot();

        for (const auto& loot : lootList) {
            if (!loot.is_valid()) {
                continue; // Skip invalid loot
            }

            vec3_t lootPos = loot.get_position();
            vec2_t screenPos;

            if (espw2s(lootPos, screenPos)) {
                float dist = units_to_m(localPlayer.position.distance_to(lootPos));

                if (dist > 1.0f && dist < settings::visualsSettings::lootDist) {
                    std::string lootName = loot.get_name();
                    ImU32 lootColor = loot.is_supply()
                        ? ImGui::GetColorU32(ImVec4(1.0f, 0.5f, 0.0f, 1.0f)) // Supply loot (orange)
                        : ImGui::GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)); // Regular loot (green)

                    // Draw loot name
                    draw->AddText(ImVec2(screenPos.x, screenPos.y), lootColor, lootName.c_str());

                    // Optionally draw distance
                    if (settings::visualsSettings::lootDist) {
                        char distanceText[32];
                        snprintf(distanceText, sizeof(distanceText), "[%.1f m]", dist);
                        draw->AddText(ImVec2(screenPos.x, screenPos.y + 12), lootColor, distanceText);
                    }
                }
            }
        }
    }*/

    if (settings::visualsSettings::enableEsp) {
        auto draw = ImGui::GetForegroundDrawList();

        for (size_t i = 0; i < playersData.size(); ++i) {
            esp_t esp(sdk::client_info_base + (i * offsets::BO6::player::size));
            auto player = playersData[i];
            auto sizeOfPlayersData = playersData.size();
            std::vector<Scoreboard> scoreboardBuffer(sizeOfPlayersData);
            const auto bone_index = offsets::BO6::decrypt_bone_index(i, sdk::module_base);
            const auto bone_ptr = BO6::get_bone_ptr(sdk::bone_base, bone_index);

            const auto& scoreboard = scoreboardBuffer[i];


            if (player.health < 1 && !player.isVisible) {
                continue;
            }

            if ((!settings::reddot && player.teamId == localPlayer.teamId) || player.isDead || scoreboard.status == 2 ||
                (settings::visualsSettings::legitEsp && !player.isVisible)) {
                continue;
            }

            vec2_t screen;
            vec3_t pos = player.position;
            if (w2s(pos, screen, player)) {
                auto dist = units_to_m(localPlayer.position.distance_to(player.position));

                if (dist > 1.0f && dist < settings::visualsSettings::maxespdist) {
                    vec2_t screenHead;
                    vec3_t headPos = pos;
                    headPos.z += 66.f;

                    if (w2s(headPos, screenHead, player)) {
                        float height = screen.y - screenHead.y;
                        float width = height * 0.25f;
                        ImVec2 boxUpperLeft(screenHead.x - width, screenHead.y);
                        ImVec2 boxLowerRight(screenHead.x + width, screen.y);

                        VisualParams params = CalculateVisualParams(dist, settings::visualsSettings::maxespdist, CLOSE_DISTANCE, 0.1f, 2.5f);

                        if (settings::visualsSettings::boxes) {
                            vec2_t headScreen, feetScreen;
                            vec3_t headPos = pos;
                            headPos.z += 66.f;
                            vec3_t feetPos = pos;

                            if (espw2s(headPos, headScreen) && espw2s(feetPos, feetScreen)) {
                                float height = abs(headScreen.y - feetScreen.y);
                                float width = height * 0.65f;

                                if (height > 0 && width > 0) {
                                    ImU32 boxColor = player.isVisible
                                        ? ImGui::GetColorU32(ImVec4(settings::visualsSettings::boxColorVisible[0],
                                            settings::visualsSettings::boxColorVisible[1],
                                            settings::visualsSettings::boxColorVisible[2],
                                            params.alpha))
                                        : ImGui::GetColorU32(ImVec4(settings::visualsSettings::boxColorNotVisible[0],
                                            settings::visualsSettings::boxColorNotVisible[1],
                                            settings::visualsSettings::boxColorNotVisible[2],
                                            params.alpha));

                                    if (settings::boxStyles == 0) {
                                        DrawBox(headScreen.x - width / 2, headScreen.y, width, height, player.isVisible, boxColor, settings::boxThickness, params);
                                    }
                                    else if (settings::boxStyles == 1) {
                                        DrawPlayerCorneredBox(headScreen.x - width / 2, headScreen.y, width, height, player.isVisible, boxColor, settings::boxThickness, params);
                                    }
                                }
                            }
                        }

                        if (settings::healthbars) {
                            DrawHealthBar(draw, player.health, 127.0f, boxUpperLeft, boxLowerRight, params);
                        }
                        if (settings::visualsSettings::nameesp) {
                            DrawPlayerName(draw, player.name, ImVec2(screenHead.x, boxUpperLeft.y + 10), params);
                        }
                        /*if (settings::visualsSettings::killsEsp) {
                            DrawPlayerKills(draw, player.scoreboard.kills, ImVec2(screenHead.x, boxLowerRight.y + 20), params);
                        }*/
                        if (settings::visualsSettings::distanceesp) {
                            DrawDistance(draw, dist, ImVec2(screen.x, screen.y - 20));
                        }
                        /// TODO: refactor for other games maybe.
                        if (settings::visualsSettings::boneesp) {
                            DrawBones(draw, player, i, params);
                        }
                        if (settings::visualsSettings::drawlines) {
                            ImVec2 startPoint = ImVec2(halfScreenWidth, settings::visualsSettings::linetype == 1 ? ref_def.height : halfScreenHeight);
                            ImVec2 endPoint = ImVec2(screen.x, screen.y);
                            DrawLines(draw, startPoint, endPoint, player.isVisible, params);
                        }
                    }
                }
            }
        }
    }
}
Editor is loading...
Leave a Comment