There is a bug with bots and spect elimination:
Code:
new bool:bBot = bIncludeBots && IsFakeClient(i);
new bool:bSpec = bIncludeSpec && IsClientObserver(i);
if(bBot || bSpec ||
(!bBot && !bSpec))
iClients++;
if (bBot || bSpec || (!bBot && !bSpec)) could be replaced with if (TRUE) in this case.

I think it should have been:
Code:
new bool:bBot = !bIncludeBots && IsFakeClient(i);
new bool:bSpec = !bIncludeSpec && IsClientObserver(i);
if (!bBot && !bSpec)
iClients++;
Edit. Well, it's more to it with that bug. First of all, no config execution should be run on bot or spects join, if those are not included, to avoid infinitive loops. Together with some optimization all changes come to this:
Code:
public OnClientPutInServer(client)
{
new bool:bIncludeBots = GetConVarBool(g_hIncludeBots);
new bool:bIncludeSpec = GetConVarBool(g_hIncludeSpec);
if ((bIncludeBots || !IsFakeClient(client)) && (bIncludeSpec || !IsClientObserver(client)))
ExecClientsConfig(0);
}
ExecClientsConfig(iClients)
{
if(!GetConVarBool(g_hEnabled))
return;
new bool:bIncludeBots = GetConVarBool(g_hIncludeBots);
new bool:bIncludeSpec = GetConVarBool(g_hIncludeSpec);
if(bIncludeBots && bIncludeSpec)
iClients += GetClientCount();
else
{
for(new i = 1; i <= MaxClients; i++)
{
if(!IsClientInGame(i))
continue;
if ((bIncludeBots || !IsFakeClient(i)) && (bIncludeSpec || !IsClientObserver(i)))
iClients++;
}
}
decl String:sClients[4];
IntToString(iClients, sClients, sizeof(sClients));
ExecConfig(CLIENTS, sClients);
}