
/* for B3 custom

balance = balance <ARG:OPT:normal>
balance = Balances team 

level thread smv\_balance::init();
*/
init()
 {
 setDvar("balance", "");

 thread DvarChecker();
 }

 DvarChecker()
 {
	
 while(1)
 {
 if( getdvar( "balance" ) != "" )
  {data = getdvar("balance");
 thread balanceinit(data);
  setdvar("balance", "");
 }
 wait .1;
 }
 }


 
 
 
 balanceinit(data)
 {
if(!isdefined(data)||data=="") return;

switch(data)
{
case "normal": thread balanceNormal(); break;


default: thread balanceNormal(); break;
}
 
}


balanceNormal()
{

	level endon( "game_ended" );
		
	//iPrintLn( "^0Teams are being balanced^1...." );

	if(isdefined(game["strings"]["autobalance"]))
		iPrintLn( game["strings"]["autobalance"] );
	//Create/Clear the team arrays
	AlliedPlayers = [];
	AxisPlayers = [];
	
	// Populate the team arrays
	players= getEntArray( "player", "classname" );
	for(i = 0; i < players.size; i++)
	{
		//if(!isdefined(players[i].pers["teamTime"])) continue;
			
		if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "allies"))
			AlliedPlayers[AlliedPlayers.size] = players[i];
		else if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "axis"))
			AxisPlayers[AxisPlayers.size] = players[i];
	}
	
	MostRecent = undefined;
	
	while((AlliedPlayers.size > (AxisPlayers.size + 1)) || (AxisPlayers.size > (AlliedPlayers.size + 1)))
	{	
		if(AlliedPlayers.size > (AxisPlayers.size + 1))
		{
			// Move the player that's been on the team the shortest ammount of time (highest teamTime value)
			for(j = 0; j < AlliedPlayers.size; j++)
			{
				if(isdefined(AlliedPlayers[j].dont_auto_balance))
					continue;
				
				if(!isdefined(MostRecent))
					MostRecent = AlliedPlayers[j];
				else if(isdefined(AlliedPlayers[j].pers["teamTime"]) && isdefined(MostRecent.pers["teamTime"]) && AlliedPlayers[j].pers["teamTime"] > MostRecent.pers["teamTime"])
					MostRecent = AlliedPlayers[j];
			}
			
			MostRecent Teamchange("axis");
		}
		else if(AxisPlayers.size > (AlliedPlayers.size + 1))
		{
			// Move the player that's been on the team the shortest ammount of time (highest teamTime value)
			for(j = 0; j < AxisPlayers.size; j++)
			{
				if(isdefined(AxisPlayers[j].dont_auto_balance))
					continue;

				if(!isdefined(MostRecent))
					MostRecent = AxisPlayers[j];
				else if(isdefined(axisPlayers[j].pers["teamTime"]) && isdefined(MostRecent.pers["teamTime"])&& AxisPlayers[j].pers["teamTime"] > MostRecent.pers["teamTime"])
					MostRecent = AxisPlayers[j];
			}

			MostRecent Teamchange("allies");
		}

		MostRecent = undefined;
		AlliedPlayers = [];
		AxisPlayers = [];
		
		players= getEntArray( "player", "classname" );
		for(i = 0; i < players.size; i++)
		{
			if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "allies"))
				AlliedPlayers[AlliedPlayers.size] = players[i];
			else if((isdefined(players[i].pers["team"])) &&(players[i].pers["team"] == "axis"))
				AxisPlayers[AxisPlayers.size] = players[i];
		}
	}
}

Teamchange( team )
{
	if (self.sessionstate != "dead")
	{
		// Set a flag on the player to they aren't robbed points for dying - the callback will remove the flag
		self.switching_teams = true;
		self.joining_team = team;
		self.leaving_team = self.pers["team"];
		
		// Suicide the player so they can't hit escape and fail the team balance
		self suicide();
	}

	self.pers["team"] = team;
	self.team = team;
	self.pers["teamTime"] = undefined;
	self.sessionteam = self.pers["team"];
	self maps\mp\gametypes\_globallogic::updateObjectiveText();
	
	// update spectator permissions immediately on change of team
	self maps\mp\gametypes\_spectating::setSpectatePermissions();
	
	if ( self.pers["team"] == "allies" )
	{
		self setclientdvar("g_scriptMainMenu", game["menu_class_allies"]);
		if (self.sessionstate != "dead"){
			self setclientdvar("g_scriptMainMenu", game["menu_class_allies"]);
		}else{
			self maps\mp\gametypes\_globallogic::spawnPlayer();
		}
		
	}
	else
	{
		self setclientdvar("g_scriptMainMenu", game["menu_class_axis"]);
		if (self.sessionstate != "dead"){
			self setclientdvar("g_scriptMainMenu", game["menu_class_axis"]);
		}else{
			self maps\mp\gametypes\_globallogic::spawnPlayer();
		}
	}
	
	self notify("spawned");
}



