Гайд Получение спектаторов

Начинающий
Статус
Оффлайн
Регистрация
2 Сен 2023
Сообщения
75
Реакции[?]
5
Поинты[?]
5K
Всем ку, в этом посте я выложу получение спектаторов для спектатор листа.

Само получение спектаторов:
SpectatorList.cpp:
std::vector<const char*> F::MISC::SPECTATORLIST::Run() {
    std::vector <const char*> vecSpectators;

    if (!I::Engine->IsConnected() || !I::Engine->IsInGame())
        return vecSpectators;

    if (!SDK::LocalController || !SDK::LocalPawn)
        return vecSpectators;

    const bool bLocalPlayerAlive = SDK::LocalController->IsPawnAlive();
    const int iHighestIndex = I::GameResourceService->pGameEntitySystem->GetHighestEntityIndex();

    for (int nIndex = 1; nIndex <= iHighestIndex; nIndex++) {
        C_BaseEntity* pBaseEntity = I::GameResourceService->pGameEntitySystem->Get(nIndex);
        if (pBaseEntity == nullptr)
            continue;

        SchemaClassInfoData_t* pClassInfo = nullptr;
        pBaseEntity->GetSchemaClassInfo(&pClassInfo);
        if (pClassInfo == nullptr)
            continue;

        const FNV1A_t uHashedName = FNV1A::Hash(pClassInfo->szName);
        if (uHashedName != FNV1A::HashConst("CCSPlayerController"))
            continue;

        CCSPlayerController* pPlayerController = reinterpret_cast<CCSPlayerController*>(pBaseEntity);
        if (pPlayerController == nullptr)
            continue;

        if (pPlayerController == SDK::LocalController)
            continue;

        C_CSPlayerPawn* pPlayerPawn = I::GameResourceService->pGameEntitySystem->Get<C_CSPlayerPawn>(pPlayerController->GetPawnHandle());
        if (pPlayerPawn == nullptr)
            continue;

        if (!pPlayerPawn->IsPlayer())
            continue;

        if (pPlayerPawn->IsAlive() && bLocalPlayerAlive)
            continue;

        if (pPlayerPawn->GetFlags() & FL_CLIENT)
            continue;

        CPlayer_ObserverServices* pLocalObserverService = SDK::LocalController->GetObserverService();
        if (pLocalObserverService == nullptr)
            continue;

        CBaseHandle pSpectatorTarget = bLocalPlayerAlive ? SDK::LocalPawn->GetRefEHandle() : pLocalObserverService->GetObserverTargetFix();
        if (!pSpectatorTarget.IsValid())
            continue;

        CPlayer_ObserverServices* pSpectatorObserverService = pPlayerController->GetObserverService();
        if (pSpectatorObserverService == nullptr)
            continue;

        CBaseHandle pPlayerTarget = pSpectatorObserverService->GetObserverTargetFix();
        if (!pPlayerTarget.IsValid())
            continue;

        if (pPlayerTarget == pSpectatorTarget) {
            if (C_GET(bool, Vars.bForceFaceSpectator) && bLocalPlayerAlive) {
                ObserverMode_t pObserverMode = pSpectatorObserverService->GetObserverMode();
                const char* szObserverMode = pObserverMode == ObserverMode_t::OBS_MODE_IN_EYE ? "first-person" : "third-person";

                std::stringstream ssOutString;
                ssOutString << pPlayerController->GetPlayerName() << " [" << szObserverMode << "]";;

                vecSpectators.emplace_back(ssOutString.str().c_str());
            }

            vecSpectators.emplace_back(pPlayerController->GetPlayerName());
        }
    }

    return vecSpectators;
}
Некоторые функции которые вам понадобятся:
GetObserverService:
    CPlayer_ObserverServices* GetObserverService() {
        C_CSPlayerPawn* pObserverPawn = this->GetObserverPawn();
        if (!pObserverPawn)
            return nullptr;

        if (!pObserverPawn->IsObserver())
            return nullptr;

        return pObserverPawn->GetObserverServices();
    }
Кринж с try, но и так сойдет
GetObserverTargetFix:
    CBaseHandle GetObserverTargetFix() {
        try {
            return this->GetObserverTarget();
        }
        catch (...) {
            return CBaseHandle();
        }
    }
 
Сверху Снизу