sdktools: Clean non-ingame clients from NormalSHook (#1450)

This commit is contained in:
rtldg 2021-06-24 21:32:47 +00:00 committed by GitHub
parent 0d956b229f
commit 3b2fa89926
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -388,6 +388,17 @@ void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChann
} }
case Pl_Changed: case Pl_Changed:
{ {
if (size < 0 || size > SM_ARRAYSIZE(players))
{
pFunc->GetParentContext()->BlamePluginError(pFunc, "Callback-provided size %d is invalid", size);
#if SOURCE_ENGINE >= SE_PORTAL2
RETURN_META_VALUE(MRES_IGNORED, -1);
#else
return;
#endif
}
/* Client validation */ /* Client validation */
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
@ -397,17 +408,18 @@ void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChann
if (!pPlayer) if (!pPlayer)
{ {
pFunc->GetParentContext()->BlamePluginError(pFunc, "Callback-provided client index %d is invalid", client); pFunc->GetParentContext()->BlamePluginError(pFunc, "Callback-provided client index %d is invalid", client);
} else if (!pPlayer->IsInGame()) {
pFunc->GetParentContext()->BlamePluginError(pFunc, "Client %d is not in game", client);
} else {
continue;
}
#if SOURCE_ENGINE >= SE_PORTAL2 #if SOURCE_ENGINE >= SE_PORTAL2
RETURN_META_VALUE(MRES_IGNORED, -1 ); RETURN_META_VALUE(MRES_IGNORED, -1);
#else #else
return; return;
#endif #endif
} else if (!pPlayer->IsInGame()) {
// Shift array down to remove non-ingame client
memmove(&players[i], &players[i+1], (size-i-1) * sizeof(int));
--i;
--size;
}
} }
#if SOURCE_ENGINE >= SE_PORTAL2 #if SOURCE_ENGINE >= SE_PORTAL2
@ -540,6 +552,17 @@ void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChan
} }
case Pl_Changed: case Pl_Changed:
{ {
if (size < 0 || size > SM_ARRAYSIZE(players))
{
pFunc->GetParentContext()->BlamePluginError(pFunc, "Callback-provided size %d is invalid", size);
#if SOURCE_ENGINE >= SE_PORTAL2
RETURN_META_VALUE(MRES_IGNORED, -1);
#else
return;
#endif
}
/* Client validation */ /* Client validation */
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
@ -549,17 +572,18 @@ void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChan
if (!pPlayer) if (!pPlayer)
{ {
pFunc->GetParentContext()->BlamePluginError(pFunc, "Client index %d is invalid", client); pFunc->GetParentContext()->BlamePluginError(pFunc, "Client index %d is invalid", client);
} else if (!pPlayer->IsInGame()) {
pFunc->GetParentContext()->BlamePluginError(pFunc, "Client %d is not in game", client);
} else {
continue;
}
#if SOURCE_ENGINE >= SE_PORTAL2 #if SOURCE_ENGINE >= SE_PORTAL2
RETURN_META_VALUE(MRES_IGNORED, -1 ); RETURN_META_VALUE(MRES_IGNORED, -1);
#else #else
return; return;
#endif #endif
} else if (!pPlayer->IsInGame()) {
// Shift array down to remove non-ingame client
memmove(&players[i], &players[i+1], (size-i-1) * sizeof(int));
--i;
--size;
}
} }
#if SOURCE_ENGINE >= SE_PORTAL2 #if SOURCE_ENGINE >= SE_PORTAL2