- #include <amxmodx> 
-   
- enum 
- { 
- 	TEAM_NONE = 0, 
- 	TEAM_T, 
- 	TEAM_CT, 
- 	TEAM_SPEC, 
-   
- 	MAX_TEAMS 
- }; 
- new const g_cTeamChars[MAX_TEAMS] = 
- { 
- 	'U', 
- 	'T', 
- 	'C', 
- 	'S' 
- }; 
- new const g_sTeamNums[MAX_TEAMS][] = 
- { 
- 	"0", 
- 	"1", 
- 	"2", 
- 	"3" 
- }; 
- new const g_sClassNums[MAX_TEAMS][] = 
- { 
- 	"1", 
- 	"2", 
- 	"3", 
- 	"4" 
- }; 
-   
- // Old Style Menus 
- stock const FIRST_JOIN_MSG[] =		"#Team_Select"; 
- stock const FIRST_JOIN_MSG_SPEC[] =	"#Team_Select_Spect"; 
- stock const INGAME_JOIN_MSG[] =		"#IG_Team_Select"; 
- stock const INGAME_JOIN_MSG_SPEC[] =	"#IG_Team_Select_Spect"; 
- const iMaxLen = sizeof(INGAME_JOIN_MSG_SPEC); 
-   
- // New VGUI Menus 
- stock const VGUI_JOIN_TEAM_NUM =		2; 
-   
- new g_iTeam[33]; 
- new g_iPlayers[MAX_TEAMS]; 
-   
- new tjm_join_team; 
- new tjm_switch_team; 
- new tjm_class[MAX_TEAMS]; 
- new tjm_block_change; 
-   
- public plugin_init() 
- { 
- 	register_plugin("Team Join Management", "0.3", "Exolent"); 
- 	register_event("TeamInfo", "event_TeamInfo", "a"); 
- 	register_message(get_user_msgid("ShowMenu"), "message_ShowMenu"); 
- 	register_message(get_user_msgid("VGUIMenu"), "message_VGUIMenu"); 
- 	tjm_join_team = register_cvar("tjm_join_team", "2"); 
- 	tjm_switch_team = register_cvar("tjm_switch_team", "1"); 
- 	tjm_class[TEAM_T] = register_cvar("tjm_class_t", "2"); 
- 	tjm_class[TEAM_CT] = register_cvar("tjm_class_ct", "4"); 
- 	tjm_block_change = register_cvar("tjm_block_change", "1"); 
- } 
-   
- public plugin_cfg() 
- { 
- 	set_cvar_num("mp_limitteams", 32); 
- 	set_cvar_num("sv_restart", 1); 
- } 
-   
- public client_disconnect(id) 
- { 
- 	remove_task(id); 
- } 
-   
- public event_TeamInfo() 
- { 
- 	new id = read_data(1); 
- 	new sTeam[32], iTeam; 
- 	read_data(2, sTeam, sizeof(sTeam) - 1); 
- 	for(new i = 0; i < MAX_TEAMS; i++) 
- 	{ 
- 		if(g_cTeamChars[i] == sTeam[0]) 
- 		{ 
- 			iTeam = i; 
- 			break; 
- 		} 
- 	} 
-   
- 	if(g_iTeam[id] != iTeam) 
- 	{ 
- 		g_iPlayers[g_iTeam[id]]--; 
- 		g_iTeam[id] = iTeam; 
- 		g_iPlayers[iTeam]++; 
- 	} 
- } 
-   
- public message_ShowMenu(iMsgid, iDest, id) 
- { 
- 	static sMenuCode[iMaxLen]; 
- 	get_msg_arg_string(4, sMenuCode, sizeof(sMenuCode) - 1); 
- 	if(equal(sMenuCode, FIRST_JOIN_MSG) || equal(sMenuCode, FIRST_JOIN_MSG_SPEC)) 
- 	{ 
- 		if(should_autojoin(id)) 
- 		{ 
- 			set_autojoin_task(id, iMsgid); 
- 			return PLUGIN_HANDLED; 
- 		} 
- 	} 
- 	else if(equal(sMenuCode, INGAME_JOIN_MSG) || equal(sMenuCode, INGAME_JOIN_MSG_SPEC)) 
- 	{ 
- 		if(should_autoswitch(id)) 
- 		{ 
- 			set_autoswitch_task(id, iMsgid); 
- 			return PLUGIN_HANDLED; 
- 		} 
- 		else if(get_pcvar_num(tjm_block_change)) 
- 		{ 
- 			return PLUGIN_HANDLED; 
- 		} 
- 	} 
- 	return PLUGIN_CONTINUE; 
- } 
-   
- public message_VGUIMenu(iMsgid, iDest, id) 
- { 
- 	if(get_msg_arg_int(1) != VGUI_JOIN_TEAM_NUM) 
- 	{ 
- 		return PLUGIN_CONTINUE; 
- 	} 
-   
- 	if(should_autojoin(id)) 
- 	{ 
- 		set_autojoin_task(id, iMsgid); 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	else if(should_autoswitch(id)) 
- 	{ 
- 		set_autoswitch_task(id, iMsgid); 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	else if((TEAM_NONE < g_iTeam[id] < TEAM_SPEC) && get_pcvar_num(tjm_block_change)) 
- 	{ 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	return PLUGIN_CONTINUE; 
- } 
-   
- public task_Autojoin(iParam[], id) 
- { 
- 	new iTeam = get_new_team(get_pcvar_num(tjm_join_team)); 
- 	if(iTeam != -1) 
- 	{ 
- 		handle_join(id, iParam[0], iTeam); 
- 	} 
- } 
-   
- public task_Autoswitch(iParam[], id) 
- { 
- 	new iTeam = get_switch_team(id); 
- 	if(iTeam != -1) 
- 	{ 
- 		handle_join(id, iParam[0], iTeam); 
- 	} 
- } 
-   
- stock handle_join(id, iMsgid, iTeam) 
- { 
- 	new iMsgBlock = get_msg_block(iMsgid); 
- 	set_msg_block(iMsgid, BLOCK_SET); 
-   
- 	engclient_cmd(id, "jointeam", g_sTeamNums[iTeam]); 
-   
- 	new iClass = get_team_class(iTeam); 
- 	if(1 <= iClass <= 4) 
- 	{ 
- 		engclient_cmd(id, "joinclass", g_sClassNums[iClass - 1]); 
- 	} 
- 	set_msg_block(iMsgid, iMsgBlock); 
- } 
-   
- stock get_new_team(iCvar) 
- { 
- 	switch(iCvar) 
- 	{ 
- 		case 1: 
- 		{ 
- 			return TEAM_T; 
- 		} 
- 		case 2: 
- 		{ 
- 			return TEAM_CT; 
- 		} 
- 		case 3: 
- 		{ 
- 			return TEAM_SPEC; 
- 		} 
- 		case 4: 
- 		{ 
- 			new iTCount = g_iPlayers[TEAM_T]; 
- 			new iCTCount = g_iPlayers[TEAM_CT]; 
- 			if(iTCount < iCTCount) 
- 			{ 
- 				return TEAM_T; 
- 			} 
- 			else if(iTCount > iCTCount) 
- 			{ 
- 				return TEAM_CT; 
- 			} 
- 			else 
- 			{ 
- 				return random_num(TEAM_T, TEAM_CT); 
- 			} 
- 		} 
- 	} 
- 	return -1; 
- } 
-   
- stock get_switch_team(id) 
- { 
- 	new iTeam; 
-   
- 	new iTCount = g_iPlayers[TEAM_T]; 
- 	new iCTCount = g_iPlayers[TEAM_CT]; 
- 	switch(g_iTeam[id]) 
- 	{ 
- 		case TEAM_T: iTCount--; 
- 		case TEAM_CT: iCTCount--; 
- 	} 
- 	if(iTCount < iCTCount) 
- 	{ 
- 		iTeam = TEAM_T; 
- 	} 
- 	else if(iTCount > iCTCount) 
- 	{ 
- 		iTeam = TEAM_CT; 
- 	} 
- 	else 
- 	{ 
- 		iTeam = random_num(TEAM_T, TEAM_CT); 
- 	} 
-   
- 	if(iTeam != g_iTeam[id]) 
- 	{ 
- 		return iTeam; 
- 	} 
-   
- 	return -1; 
- } 
-   
- stock get_team_class(iTeam) 
- { 
- 	new iClass; 
- 	if(TEAM_NONE < iTeam < TEAM_SPEC) 
- 	{ 
- 		iClass = get_pcvar_num(tjm_class[iTeam]); 
- 		if(iClass < 1 || iClass > 4) 
- 		{ 
- 			iClass = random_num(1, 4); 
- 		} 
- 	} 
- 	return iClass; 
- } 
-   
- stock set_autojoin_task(id, iMsgid) 
- { 
- 	new iParam[2]; 
- 	iParam[0] = iMsgid; 
- 	set_task(0.1, "task_Autojoin", id, iParam, sizeof(iParam)); 
- } 
-   
- stock set_autoswitch_task(id, iMsgid) 
- { 
- 	new iParam[2]; 
- 	iParam[0] = iMsgid; 
- 	set_task(0.1, "task_Autoswitch", id, iParam, sizeof(iParam)); 
- } 
-   
- stock bool:should_autojoin(id) 
- { 
- 	return ((5 > get_pcvar_num(tjm_join_team) > 0) && is_user_connected(id) && !(TEAM_NONE < g_iTeam[id] < TEAM_SPEC) && !task_exists(id)); 
- } 
-   
- stock bool:should_autoswitch(id) 
- { 
- 	return (get_pcvar_num(tjm_switch_team) && is_user_connected(id) && (TEAM_NONE < g_iTeam[id] < TEAM_SPEC) && !task_exists(id)); 
- } 
-