#include <cstrike>
public Plugin:myinfo = 
{
	name = "Special Team Balancer",
	author = "AlmazON",
	description = "Специальный Балансировщик Команд",
	version = "0.5.0",
	url = "http://www.hlmod.ru"
}

#define CSRoundEnd_GameStart 15
new bool:bP[MAXPLAYERS+1], Float:fRD, iAF;
public OnPluginStart()
{
	decl String:f[AdminFlags_TOTAL], Handle:c;
	if(GetEngineVersion() !=Engine_CSGO)
	{
		HookEvent("round_end",			RE);
		if((c=FindConVar("mp_round_restart_delay")))
		{
			HookConVarChange(c, RD);
			fRD = GetConVarFloat(c)-0.1;
		}else LogError("Mode simplified balancing (ConVar \"mp_round_restart_delay\" not found).");
	}else HookEvent("round_prestart",	RP, EventHookMode_PostNoCopy);
	HookConVarChange(c=CreateConVar("stb_admin_flag",	"",		"Flags of administrators, excluding balancing.\n\"\" - all."),	AF);
	GetConVarString(c,f,sizeof(f));
	AF(c,f,f);
}

public AF(Handle:C, String:O[], const String:N[])
{
	iAF = ReadFlagString(N[0] ? N:"abcdefghijklmnopqrstz");
	OnRebuildAdminCache(AdminCache_Admins);
}
public RD(Handle:C, String:O[], String:N[]) fRD = GetConVarFloat(C)-0.1;

public OnClientPostAdminCheck(C) bP[C] = !(GetUserFlagBits(C) &iAF);
public OnRebuildAdminCache(AdminCachePart:P) if(P==AdminCache_Admins) for(new i=1; i<=MaxClients; ++i) if(IsClientInGame(i)) OnClientPostAdminCheck(i);
public RE(Handle:E, String:N[], bool:B) CreateTimer(GetEventInt(E,"reason")!=CSRoundEnd_GameStart ? fRD:2.9, TB, _, TIMER_FLAG_NO_MAPCHANGE);
public RP(Handle:E, String:N[], bool:B) PTB();

public Action:TB(Handle:T)
{
	PTB();
	return Plugin_Stop;
}

PTB()
{
	new i=MaxClients, a, b;
	do if(IsClientInGame(i)) switch(GetClientTeam(i))
	{
		case CS_TEAM_T:++a;
		case CS_TEAM_CT:++b;
	}while(--i);
	if((a=(a-b)/2))
	{
		b = MaxClients;
		if(0 <a)
		{
			decl c[a];
			do if(IsClientInGame(b))
			{
				if(a) if(GetClientTeam(b)==CS_TEAM_T) if(bP[b]) if(IsPlayerAlive(b))
				{
					if(a>i) c[i++] = b;
				}else
				{
					CS_SwitchTeam(b, CS_TEAM_CT);
					--a;
				}PrintToChat(b, "\x01 \x04[Автобаланс] \x01Лишние игроки команды \x03Террористов \x05перемещены\x01.");
			}while(--b);
			while(a--) CS_SwitchTeam(c[a], CS_TEAM_CT);
		}else
		{
			decl c[a=-a];
			do if(IsClientInGame(b))
			{
				if(a) if(GetClientTeam(b)==CS_TEAM_CT) if(bP[b]) if(IsPlayerAlive(b))
				{
					if(a>i) c[i++] = b;
				}else
				{
					CS_SwitchTeam(b, CS_TEAM_T);
					--a;
				}PrintToChat(b, "\x01 \x04[Автобаланс] \x01Лишние игроки команды \x03Контр-террористов \x05перемещены\x01.");
			}while(--b);
			while(a--) CS_SwitchTeam(c[a], CS_TEAM_T);
		}
	}
} 
