Team_Join buginas
Posted: 2015 Feb 25 15:14
Code: Select all
#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 Menusstock 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 Menusstock 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", "4"); tjm_switch_team = register_cvar("tjm_switch_team", "0"); tjm_class[TEAM_T] = register_cvar("tjm_class_t", "5"); tjm_class[TEAM_CT] = register_cvar("tjm_class_ct", "5"); tjm_block_change = register_cvar("tjm_block_change", "0");} 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));}
