#include <sourcemod>

#pragma semicolon 1
#pragma newdecls required

#define NUMBEROFNAMES 62
char g_cName[NUMBEROFNAMES][] = {"Dwelitram", "Gwyri", "Caredus", "Arerawia", "Vilali", "Astiwiel", "Vardonydd", "Ybaossa", "Umyk", "Nico50Pax", "Onand", "Thelian", "Nydaleth", "Chomarin", "Traedien", "Miev", "Kaaede", "Koamond", "TheRottenBenson", "BigLegend2017", "TRIGGEREDHarambexXx", "InPepe2016", "xXxMaster2012", "InBoixXx", "TheKopsing", "Cornelius", "Gustavo", "Bryant", "Winfred", "Nicolas", "Mitchel", "Dana", "Carrol", "Darell", "Ruben", "Jeromy", "Wade", "Scotty", "Salvatore", "Kory", "Don", "Morgan", "Kurtis", "Federico", "Darin", "css-ru", "aimbot", "lastkraftwagenfahrzeug", "edger", "clownface", "слово", "счастливый", "kara", "puta", "meow", "uncle sam", "FunBun", "Counter-Strike.Com.Ua", "For-css.Ru", "BOBO", "", "."};

bool g_bFakePopulation[MAXPLAYERS+1];

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
	name        = "ImprovedHitboxes", //camouflage
	author      = "Neon + Dogan",
	description = "Handle Hitboxes via Plugin",
	version     = "2.0",
	url         = "https://steamcommunity.com/id/n3ontm"
};

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart()
{
	RegAdminCmd("sm_debugfakes", Command_DebugFakes, ADMFLAG_RCON, "");
	CheckPopulation();
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginEnd()
{
	for(int i = 1; i <= MaxClients; i++)
	{
		if(g_bFakePopulation[i])
		{
			g_bFakePopulation[i] = false;
			KickClientEx(i);
		}
	}
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action Command_DebugFakes(int client, int argc)
{
	int iFakes = 0;
	for(int i = 1; i <= MaxClients; i++)
	{
		if (g_bFakePopulation[i])
			iFakes++;
	}
	ReplyToCommand(client, "[SM] There are currently %d Fake Players.", iFakes);
	return Plugin_Handled;
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnClientConnected(int client)
{
	if ((client > 0) && (!IsFakeClient(client)))
		CheckPopulation();
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnClientDisconnect(int client)
{
	if (client > 0)
	{
		if(g_bFakePopulation[client])
			g_bFakePopulation[client] = false;

		if (!IsFakeClient(client))
				CheckPopulation();
	}
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void CheckPopulation()
{
	int iPlayers = 0;
	for(int i = 1; i <= MaxClients; i++)
	{
		if(IsClientConnected(i) && !IsFakeClient(i))
			iPlayers++;
	}

	int iFakes = 0;
	for(int i = 1; i <= MaxClients; i++)
	{
		if (g_bFakePopulation[i])
			iFakes++;
	}

	int iFakesNeeded = 0;
	if (iPlayers > 61)
		iFakesNeeded = 0;
	else if(iPlayers > 60)
		iFakesNeeded = 1;
	else if(iPlayers > 55)
		iFakesNeeded = 3;
	else if (iPlayers > 20)
		iFakesNeeded = 4;
	else if (iPlayers > 10)
		iFakesNeeded = 3;
	else if (iPlayers > 5)
		iFakesNeeded = 2;
	else
		iFakesNeeded = 0;

	if(iFakesNeeded == iFakes)
		return;

	while (iFakes < iFakesNeeded)
	{
		int RandomName = GetRandomInt(0, NUMBEROFNAMES - 1);
		int iIndex = CreateFakeClient(g_cName[RandomName]);
		g_bFakePopulation[iIndex] = true;
		iFakes++;
	}

	while (iFakes > iFakesNeeded)
	{
		for(int i = 1; i <= MaxClients; i++)
		{
			if(g_bFakePopulation[i])
			{
				g_bFakePopulation[i] = false;
				KickClientEx(i);
				iFakes--;
				break;
			}
		}
	}
}