Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Plugin generated by AMXX-Studio */
- #include <amxmodx>
- #include <fakemeta>
- #define PLUGIN "::Fair-Match:."
- #define VERSION "1.0"
- #define AUTHOR "Natsheh"
- #define MAX_TEAMS 4
- #define MAX_PLAYERS 32
- #define OFFSET_TEAM 114
- #define PLAYER_LINUXDIFF 5
- #define VGUI_JOIN_TEAM_NUM 2
- // teams variables...
- new bool:team_avaialble[MAX_TEAMS];
- enum
- {
- TEAM_UNASSIGNED = 0,
- TEAM_TERRORIST,
- TEAM_CT,
- TEAM_SPECTATOR,
- TEAM_AUTO_ASSIGN
- }
- // variables..
- new g_iMaxplayers, g_iMsgTeamInfo;
- new g_rounds, g_ctwin, g_terwin;
- // cvars variables
- new g_cvar_enable, g_cvar_ratio, g_match_rounds;
- #define NEWMENUID get_user_msgid("VGUIMenu")
- #define OLDMENUID get_user_msgid("ShowMenu")
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- g_cvar_enable = register_cvar("fmatch_enable", "1", ADMIN_BAN)
- g_cvar_ratio = register_cvar("fmatch_ratio", "5", ADMIN_BAN)
- g_match_rounds = register_cvar("fmatch_match_rounds", "15", ADMIN_BAN)
- //register_logevent("freezetime_end", 2, "1=Round_Start"); // after freezetime
- register_event("HLTV", "round_start", "a", "1=0", "2=0") // before freezetime
- register_message(NEWMENUID, "MessageVGUIMenu")
- register_message(OLDMENUID, "MessageShowMenu")
- register_menucmd(register_menuid("Team_Select", true), (MENU_KEY_1|MENU_KEY_2|MENU_KEY_6|MENU_KEY_0), "old_jointeam_menu")
- register_clcmd("jointeam", "clcmd_join")
- register_clcmd("chooseteam", "clcmd_join")
- register_event("TeamInfo", "event_TeamInfo", "a")
- register_event("SendAudio", "event_terwin", "a", "2&%!MRAD_terwin");
- register_event("SendAudio", "event_ctwin", "a", "2&%!MRAD_ctwin");
- register_logevent("round_end", 2, "0=World triggered", "1=Round_End")
- register_logevent("match_started", 2, "0=World triggered", "1&Restart_Round")
- register_logevent("match_started", 2, "0=World triggered", "1=Game_Commencing")
- register_event("TextMsg","match_started","a","2&#Game_C","2&#Game_w")
- g_iMaxplayers = get_maxplayers();
- g_iMsgTeamInfo = get_user_msgid("TeamInfo");
- for(new iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
- {
- team_avaialble[iTeam] = true;
- }
- }
- public event_terwin()
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- g_terwin++;
- }
- public event_ctwin()
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- g_ctwin++;
- }
- public match_started()
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- g_rounds = 0;
- new g_match_rounds = get_pcvar_num(g_match_rounds);
- }
- public event_TeamInfo()
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- //new id = read_data(1);
- new sTeam[32];
- read_data(2, sTeam, charsmax(sTeam));
- if(equal(sTeam, "SPECTATOR"))
- {
- check_teams()
- }
- }
- public client_disconnect(id)
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- check_teams()
- }
- /*public round_end()
- {
- }*/
- public round_end()
- {
- if(g_rounds >= get_pcvar_num(g_match_rounds))
- {
- client_print( 0, print_chat, "HALF-TIME Swap teams!!" );
- server_cmd( "fmatch_ratio 20" );
- server_cmd( "fmatch_enable 0" );
- check_teams();
- }
- }
- public round_start()
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- new ratio = clamp(get_pcvar_num(g_cvar_ratio), 1, floatround(Float:(g_iMaxplayers/2.0), floatround_floor))
- new cnum, tnum, players[32];
- get_players(players, cnum, "he", "CT")
- get_players(players, tnum, "he", "TERRORIST")
- if((ratio*2) > (cnum+tnum))
- {
- check_teams();
- return;
- }
- else if(!((ratio == cnum) && (ratio == tnum)))
- {
- server_cmd("sv_restart 3")
- }
- check_ratio()
- // counting rounds..
- g_rounds++;
- }
- public client_putinserver(id)
- {
- if(!get_pcvar_num(g_cvar_enable))
- return;
- check_teams();
- }
- public MessageShowMenu(msgid, msgdest, id)
- {
- if(!get_pcvar_num(g_cvar_enable))
- return PLUGIN_CONTINUE;
- if(!is_user_connected(id))
- return PLUGIN_CONTINUE;
- if(get_msg_argtype(4) != ARG_STRING)
- return PLUGIN_CONTINUE;
- static StrMessage[24]
- get_msg_arg_string(4, StrMessage, charsmax(StrMessage))
- // join team
- if(equal(StrMessage, "#Team_Select", strlen("#Team_Select")) || equal(StrMessage, "#IG_Team_Select", strlen("#IG_Team_Select")))
- {
- set_task(0.1, "oldstyle_newmenu", id)
- return PLUGIN_HANDLED;
- }
- return PLUGIN_CONTINUE;
- }
- public oldstyle_newmenu(id)
- {
- if(!is_user_connected(id))
- return;
- // check teams..
- check_teams();
- new sText[256], len, iKeys;
- len = formatex(sText, charsmax(sText), "Choose your team...^n^n")
- len += formatex(sText[len], charsmax(sText)-len, "\r1. %sTeam Terrorist^n", team_avaialble[TEAM_TERRORIST] ? "\w":"\d")
- iKeys |= team_avaialble[TEAM_TERRORIST] ? MENU_KEY_1:~MENU_KEY_1
- len += formatex(sText[len], charsmax(sText)-len, "\r2. %sTeam Counter-terrorist^n^n^n", team_avaialble[TEAM_CT] ? "\w":"\d")
- iKeys |= team_avaialble[TEAM_CT] ? MENU_KEY_2:~MENU_KEY_2
- len += formatex(sText[len], charsmax(sText)-len, "\r6. %sSpectator^n^n^n", is_user_alive(id) ? "\d":"\w")
- iKeys |= is_user_alive(id) ? ~MENU_KEY_6:MENU_KEY_6
- len += formatex(sText[len], charsmax(sText)-len, "\r0. \yExit")
- iKeys |= MENU_KEY_0
- show_menu(id, iKeys, sText, _, "Team_Select")
- }
- public old_jointeam_menu(id, ikey)
- {
- switch(ikey)
- {
- case 0:
- {
- if(team_avaialble[TEAM_TERRORIST])
- {
- fm_set_user_team(id, TEAM_TERRORIST)
- check_teams();
- }
- else
- {
- client_print(id, print_center, "The Terrorist team is not available right now!")
- return PLUGIN_HANDLED;
- }
- }
- case 1:
- {
- if(team_avaialble[TEAM_CT])
- {
- fm_set_user_team(id, TEAM_CT)
- check_teams();
- }
- else
- {
- client_print(id, print_center, "The Counter terrorist team is not available right now!")
- return PLUGIN_HANDLED;
- }
- }
- case 5:
- {
- if(team_avaialble[TEAM_SPECTATOR] && !is_user_alive(id))
- {
- fm_set_user_team(id, TEAM_SPECTATOR)
- check_teams();
- }
- else
- {
- return PLUGIN_HANDLED;
- }
- }
- case 9:
- {
- return PLUGIN_CONTINUE;
- }
- }
- return PLUGIN_CONTINUE;
- }
- public MessageVGUIMenu(msgid, msgdest, id)
- {
- if(!get_pcvar_num(g_cvar_enable) || !is_user_connected(id))
- return PLUGIN_CONTINUE;
- if(get_msg_arg_int(1) == VGUI_JOIN_TEAM_NUM) // user joined a team (NewMenu)
- {
- // user joined a team. (NewMenu)
- set_task(0.1, "oldstyle_newmenu", id)
- return PLUGIN_HANDLED;
- }
- return PLUGIN_CONTINUE;
- }
- public task_joinclass(id)
- {
- engclient_cmd(id, "joinclass", "5")
- }
- public clcmd_join(id)
- {
- if(!get_pcvar_num(g_cvar_enable))
- return PLUGIN_CONTINUE;
- new sArg[5]
- read_argv(1, sArg, 4)
- switch( str_to_num(sArg) )
- {
- case 1: if(!team_avaialble[TEAM_TERRORIST]) return PLUGIN_HANDLED;
- case 2: if(!team_avaialble[TEAM_CT]) return PLUGIN_HANDLED;
- case 5: return PLUGIN_HANDLED;
- default : return PLUGIN_CONTINUE;
- }
- return PLUGIN_CONTINUE;
- }
- get_players_inteams(Players[MAX_TEAMS][MAX_PLAYERS], &ctnum, &tsnum, &specnum, &unassigned)
- {
- get_players(Players[TEAM_CT], ctnum, "eh", "CT")
- get_players(Players[TEAM_TERRORIST], tsnum, "eh", "TERRORIST")
- static players[32], pnum, spec, una, i;
- get_players(players, pnum, "h")
- spec = 0; una = 0;
- for(i = 0; i < pnum; i++)
- {
- switch( fm_get_user_team(players[i]) )
- {
- case TEAM_SPECTATOR: spec++;
- case TEAM_UNASSIGNED: una++;
- }
- }
- specnum = spec;
- unassigned = una;
- }
- check_teams()
- {
- static ratio;
- ratio = clamp(get_pcvar_num(g_cvar_ratio), 1, floatround(Float:(g_iMaxplayers/2.0), floatround_floor))
- // get players into teams..
- static TPlayers[MAX_TEAMS][MAX_PLAYERS], ctsnum, tsnum, unassigned, specsnum;
- get_players_inteams(TPlayers, ctsnum, tsnum, specsnum, unassigned)
- // no players..
- if( ( ratio * 2 ) > ( ctsnum + tsnum ) )
- {
- team_avaialble[TEAM_CT] = true;
- team_avaialble[TEAM_TERRORIST] = true;
- return;
- }
- // check teams if they are available..
- team_avaialble[TEAM_CT] = (ctsnum < ratio) ? true:false
- team_avaialble[TEAM_TERRORIST] = (tsnum < ratio) ? true:false
- }
- check_ratio()
- {
- new ratio = clamp(get_pcvar_num(g_cvar_ratio), 1, floatround(Float:(g_iMaxplayers/2.0), floatround_floor))
- // get players into teams..
- new TPlayers[MAX_TEAMS][MAX_PLAYERS], ctsnum, tsnum, unassigned, specsnum;
- get_players_inteams(TPlayers, ctsnum, tsnum, specsnum, unassigned)
- if((ratio*2) > (ctsnum+tsnum))
- return;
- // check if teams are available!
- check_teams();
- // few variables..
- static sName[32], loop, chosen, player;
- if(ratio != ctsnum)
- {
- loop = (ratio - ctsnum);
- if(loop > 0)
- {
- while(loop)
- {
- if(tsnum > ratio)
- {
- --tsnum;
- chosen = random(tsnum)
- player = TPlayers[TEAM_TERRORIST][chosen]
- TPlayers[TEAM_TERRORIST][chosen] = TPlayers[TEAM_TERRORIST][tsnum]
- }
- else break;
- TPlayers[TEAM_CT][ctsnum] = player;
- ++ctsnum;
- fm_set_user_team(player, TEAM_CT)
- get_user_name(player, sName, 31)
- client_print(0, print_chat, "%s has been transfered to counter-terrorist!", sName)
- loop--;
- }
- }
- else //extra cts
- {
- while(loop < 0)
- {
- --ctsnum;
- chosen = random(ctsnum);
- player = TPlayers[TEAM_CT][chosen];
- TPlayers[TEAM_CT][chosen] = TPlayers[TEAM_CT][ctsnum];
- get_user_name(player, sName, 31)
- if(tsnum < ratio) // move them to terorist
- {
- TPlayers[TEAM_TERRORIST][tsnum] = player;
- ++tsnum;
- fm_set_user_team(player, TEAM_TERRORIST)
- client_print(0, print_chat, "%s has been transfered to terrorist!", sName)
- }
- else // move them to spectators
- {
- TPlayers[TEAM_SPECTATOR][specsnum] = player;
- ++specsnum;
- client_print(0, print_chat, "%s has been transfered to spectator!", sName)
- fm_set_user_team(player, TEAM_SPECTATOR)
- }
- loop++;
- }
- }
- }
- if(ratio != tsnum)
- {
- loop = (ratio - tsnum);
- if(loop > 0)
- {
- while(loop--)
- {
- if(ctsnum > ratio)
- {
- --ctsnum;
- chosen = random(ctsnum)
- player = TPlayers[TEAM_CT][chosen]
- TPlayers[TEAM_CT][chosen] = TPlayers[TEAM_CT][ctsnum]
- }
- else break;
- TPlayers[TEAM_TERRORIST][tsnum] = player;
- ++tsnum;
- fm_set_user_team(player, TEAM_TERRORIST)
- get_user_name(player, sName, 31)
- client_print(0, print_chat, "%s has been transfered to terrorist!", sName)
- }
- }
- else //extra ts
- {
- while(loop < 0)
- {
- --tsnum;
- chosen = random(tsnum);
- player = TPlayers[TEAM_TERRORIST][chosen];
- TPlayers[TEAM_TERRORIST][chosen] = TPlayers[TEAM_TERRORIST][tsnum];
- get_user_name(player, sName, 31)
- if(ctsnum < ratio) // move them to counter-terorist
- {
- TPlayers[TEAM_CT][ctsnum] = player;
- ++ctsnum;
- fm_set_user_team(player, TEAM_CT)
- client_print(0, print_chat, "%s has been transfered to counter-terrorist!", sName)
- }
- else // move them to spectators
- {
- TPlayers[TEAM_SPECTATOR][specsnum] = player;
- ++specsnum;
- client_print(0, print_chat, "%s has been transfered to spectator!", sName)
- fm_set_user_team(player, TEAM_SPECTATOR)
- }
- loop++;
- }
- }
- }
- if(ctsnum == ratio) team_avaialble[TEAM_CT] = false;
- if(tsnum == ratio) team_avaialble[TEAM_TERRORIST] = false;
- }
- stock fm_get_user_team(index)
- {
- new iteam = get_user_team(index);
- switch( iteam )
- {
- case 1: return TEAM_TERRORIST;
- case 2: return TEAM_CT;
- case -1, 3: return TEAM_SPECTATOR;
- case 0: return TEAM_UNASSIGNED
- }
- return -2;
- }
- stock fm_set_user_team(id, team)
- {
- switch( team )
- {
- case TEAM_CT: engclient_cmd(id, "jointeam", "2")
- case TEAM_TERRORIST: engclient_cmd(id, "jointeam", "1")
- case TEAM_SPECTATOR: engclient_cmd(id, "jointeam", "6")
- case TEAM_AUTO_ASSIGN:
- {
- new sString[2]
- team = random_num(TEAM_TERRORIST, TEAM_CT)
- num_to_str(team, sString, charsmax(sString))
- engclient_cmd(id, "jointeam", sString)
- }
- default: {
- log_error(AMX_ERR_NOTFOUND, "Team with this id #%d is not found!", team)
- return
- }
- }
- // set user team...
- set_pdata_int(id, OFFSET_TEAM, team, PLAYER_LINUXDIFF)
- set_pev(id, pev_team, team)
- static const TeamInfo[MAX_TEAMS][] =
- {
- "UNASSIGNED",
- "TERRORIST",
- "CT",
- "SPECTATOR"
- };
- message_begin(MSG_ALL, g_iMsgTeamInfo);
- write_byte(id);
- write_string(TeamInfo[team]);
- message_end();
- if(is_user_alive(id))
- {
- user_kill(id)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement