Начинающий
-
Автор темы
- #1
Всем ку, в этом посте я выложу получение спектаторов для спектатор листа.
Само получение спектаторов:
Некоторые функции которые вам понадобятся:
Само получение спектаторов:
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();
}
}