both ct and t needs to be set, otherwise it will be randomized.
If you want to remove captains (in case you want to get random captains instead) you use the command amx_removecaptains
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#define TASK_MENUCLOSE 9001
#define TASK_PLAYERSLIST 9002
#define MinPlayers 10
new const Prefix[] = "[Captain]";
new RandomPlayer1;
new RandomPlayer2;
new bool:CaptainSort;
public plugin_init()
{
register_plugin("Captain Sorting", "1.0", "kramesa");
register_concmd("amx_captain_ct", "cmd_ct_captain")
register_concmd("amx_captain_t", "cmd_t_captain")
register_concmd("amx_removecaptains", "cmd_removecaptains")
register_concmd("say /capsort", "StartCaptain");
register_clcmd("chooseteam", "Block");
register_clcmd("jointeam", "Block");
}
public cmd_removecaptains(id) {
if(!is_user_admin(id)) {
client_print(id, print_console, "%s You don't have access to that command", Prefix)
return PLUGIN_HANDLED
}
RandomPlayer1 = 0
RandomPlayer2 = 0
client_print(id, print_console, "%s The captains are now removed.", Prefix)
return PLUGIN_HANDLED
}
public cmd_ct_captain(id) {
cmd_captain(id, CS_TEAM_CT)
return PLUGIN_HANDLED
}
public cmd_t_captain(id) {
cmd_captain(id, CS_TEAM_T)
return PLUGIN_HANDLED
}
public cmd_captain(id, {CsTeams,_}:team) {
if(!is_user_admin(id)) {
client_print(id, print_console, "%s You don't have access to that command", Prefix)
return PLUGIN_HANDLED
}
new args[32]
read_args(args, 31)
new iPlayers[32]
new iNum
get_players(iPlayers, iNum, "ch")
for(new i = 0; i < iNum; i++) {
new temp_plr_name[32]
get_user_name(iPlayers[i], temp_plr_name, 31)
if(containi(temp_plr_name, args)!=-1) {
if(team == CS_TEAM_CT) {
RandomPlayer1 = iPlayers[i]
client_print(id, print_console, "%s Player '%s' is now captain of the Counter-Terrorists.", Prefix, temp_plr_name)
} else if (team == CS_TEAM_T) {
RandomPlayer2 = iPlayers[i]
client_print(id, print_console, "%s Player '%s' is now captain of the Terrorists.", Prefix, temp_plr_name)
}
return PLUGIN_HANDLED
}
}
new cur_captain[32]
new team_str[32]
if(team == CS_TEAM_CT) {
get_user_name(RandomPlayer1, cur_captain, 31)
format(team_str, 31, "Counter-Terrorist")
} else if (team == CS_TEAM_T) {
format(team_str, 31, "Terrorist")
get_user_name(RandomPlayer2, cur_captain, 31)
}
client_print(id, print_console, "%s Captain for %s is '%s'", Prefix, team_str, cur_captain)
return PLUGIN_HANDLED
}
public StartCaptain(id)
{
//Check wheter user is admin or not
if(is_user_admin(id))
{
//If captain is already running
if(CaptainSort == true)
{
client_print(id, print_chat, "%s Captain Sort already running.", Prefix);
return PLUGIN_HANDLED;
}
//Start the captain
Captain();
return PLUGIN_HANDLED;
}
client_print(id, print_chat, "%s Only admins have access to this command.", Prefix);
return PLUGIN_HANDLED;
}
public Block(id)
{
if(CaptainSort == true)
{
client_print(id, print_chat, "%s Captain Sort is running.", Prefix);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public client_putinserver(id)
{
if(!is_user_connected(RandomPlayer1) && CaptainSort && get_user_flags(id) & ADMIN_KICK)
{
RandomPlayer1 = id;
new First_Captain[35];
get_user_name(RandomPlayer1, First_Captain, charsmax(First_Captain));
client_print(0, print_chat, "%s The new Captain of CTs is: %s", Prefix, First_Captain);
set_cvar_num("sv_restartround", 1);
}
if(!is_user_connected(RandomPlayer2) && CaptainSort && get_user_flags(id) & ADMIN_KICK)
{
RandomPlayer2 = id;
new Second_Captain[35];
get_user_name(RandomPlayer2, Second_Captain, charsmax(Second_Captain));
client_print(0, print_chat, "%s The new Captain of Ts is: %s", Prefix, Second_Captain);
set_cvar_num("sv_restartround", 1)
}
}
public Num_Admins_Online() {
new iPlayers[32], iNum;
get_players(iPlayers, iNum, "ch");
new numAdmins
for(new i = 0; i < iNum;i++) {
new id = iPlayers[i]
if(get_user_flags(id) & ADMIN_KICK) {
numAdmins++
}
}
return numAdmins
}
//adminOnly? 1 = only admins can be captains, 0 = all players can be captains
public RandomCaptain(adminOnly) {
//I think this is wrong... iPlayers[iNum] will never return an actual player.
//On a closer look this is just a more pretentious way of saying "if (true)"
new iPlayers[32], iNum;
get_players(iPlayers, iNum, "ch");
RandomPlayer1 = iPlayers[random(iNum)];
while(adminOnly == 1 && !(get_user_flags(RandomPlayer1) & ADMIN_KICK)) {
RandomPlayer1 = iPlayers[random(iNum)];
}
RandomPlayer2 = RandomPlayer1
//Making sure not getting same captain for both teams
while(RandomPlayer1 == RandomPlayer2 || (adminOnly == 1 && !(get_user_flags(RandomPlayer2) & ADMIN_KICK)))
{
RandomPlayer2 = iPlayers[random(iNum)];
}
}
public Captain()
{
new iPlayers[32], iNum;
get_players(iPlayers, iNum, "ch");
//Run only if enough players are connected
if(iNum < MinPlayers)
{
client_print(0, print_chat, "%s Need have more %d players to start Captain Sort.", Prefix, (iNum - MinPlayers));
return PLUGIN_HANDLED;
}
//Sort players to spectators
for(new i; i < iNum; i++)
{
user_silentkill(iPlayers[i]);
cs_set_user_team(iPlayers[i], 3);
}
if(!is_user_connected(RandomPlayer1) || !is_user_connected(RandomPlayer2)) {
//NEW CODE HERE
if(Num_Admins_Online() >= 2) {
RandomCaptain(1)
} else {
RandomCaptain(0)
}
//--------------
}
//Set captains to respective teams
cs_set_user_team(RandomPlayer1, CS_TEAM_CT);
cs_set_user_team(RandomPlayer2, CS_TEAM_T);
new First_Captain[35], Second_Captain[35];
get_user_name(RandomPlayer1, First_Captain, charsmax(First_Captain));
get_user_name(RandomPlayer2, Second_Captain, charsmax(Second_Captain));
client_print(0, print_chat, "%s The Captain's are: %s (TRs) and %s (CTs).", Prefix, First_Captain, Second_Captain);
client_print(0, print_chat, "%s If no player is selected in 10 seconds, a player will be chosen random.", Prefix);
set_cvar_num("sv_restartround", 1)
new First = random(2)
set_task(1.5, "captain_menu", First ? RandomPlayer1 : RandomPlayer2);
set_task(0.2, "PlayersList", TASK_PLAYERSLIST, _, _, "b");
CaptainSort = true
return PLUGIN_CONTINUE
}
public captain_menu(id)
{
new menu = menu_create("Select a Player:", "captainmenu_handler")
set_task(11.5, "menu_task", id + TASK_MENUCLOSE);
new players[32], pnum, tempid;
new szName[32], szTempid[10];
get_players(players, pnum, "ch")
if(pnum == 0)
{
remove_task(id+TASK_MENUCLOSE)
remove_task(TASK_PLAYERSLIST)
CaptainSort = false
client_print(0, print_chat, "%s Closing Captain Sort. Missing players.", Prefix);
return PLUGIN_HANDLED;
}
for(new i; i<pnum; i++)
{
tempid = players[i];
if(cs_get_user_team(tempid) != CS_TEAM_SPECTATOR) continue;
get_user_name(tempid, szName, charsmax(szName));
num_to_str(tempid, szTempid, charsmax(szTempid));
menu_additem(menu, szName, szTempid,0);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
menu_display(id, menu, 0);
return PLUGIN_HANDLED;
}
public captainmenu_handler(id,menu,item)
{
if(item == MENU_EXIT)
{
menu_display(id,menu,0)
return PLUGIN_HANDLED;
}
new data[6], szName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
new tempid = str_to_num(data)
new name[35], namec[35];
get_user_name(tempid, name, charsmax(name));
get_user_name(id, namec, charsmax(namec));
cs_set_user_team(tempid, cs_get_user_team(id));
client_print(0, print_chat, "%s %s choose the player %s", Prefix, namec, name);
set_cvar_num("sv_restart",1)
remove_task(id+TASK_MENUCLOSE)
new iPlayers[32],pnum
get_players(iPlayers,pnum,"ch")
if(is_user_connected(RandomPlayer1) && is_user_connected(RandomPlayer2))
{
set_task(1.5,"captain_menu",id == RandomPlayer1 ? RandomPlayer2 : RandomPlayer1)
}
else
{
set_task(5.0,"CheckCaptainJoin",id == RandomPlayer1 ? RandomPlayer1 : RandomPlayer2)
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
public menu_task(id)
{
id -= TASK_MENUCLOSE
new players[32], pnum;
get_players(players, pnum, "ch");
new randomnum = random(pnum)
new bool:has_spec
for(new i; i < pnum; i++)
{
if(cs_get_user_team(players[i]) == CS_TEAM_SPECTATOR)
{
has_spec = true
}
}
if(!has_spec)
{
remove_task(TASK_PLAYERSLIST);
CaptainSort = false;
return;
}
while(cs_get_user_team(players[randomnum]) != CS_TEAM_SPECTATOR)
{
randomnum = random(pnum)
}
if(is_user_connected(id))
{
set_cvar_num("sv_restart",1)
cs_set_user_team(players[randomnum],cs_get_user_team(id))
set_task(1.5, "captain_menu", id == RandomPlayer1 ? RandomPlayer2 : RandomPlayer1);
}
else
{
set_task(5.0, "CheckCaptainJoin", id == RandomPlayer1 ? RandomPlayer2 : RandomPlayer1);
client_print(0, print_chat, "%s Awaiting the arrival of a new Captain.", Prefix);
}
show_menu(id, 0, "^n", 1);
}
public CheckCaptainJoin(NextCaptainMenu)
{
if(is_user_connected(RandomPlayer1) && is_user_connected(RandomPlayer2))
{
set_task(1.5, "captain_menu", NextCaptainMenu)
}
else
{
set_task(5.0, "CheckCaptainJoin", NextCaptainMenu)
}
}
public PlayersList()
{
new iPlayers[32], iNum;
get_players(iPlayers, iNum, "ch");
new posTR, posCT, posSPEC;
new HudTextTR[512], HudTextCT[512], HudTextSPEC[512];
new szName[38], name[38];
for(new i; i < iNum; i++)
{
get_user_name(iPlayers[i], szName, charsmax(szName));
if(iPlayers[i] == RandomPlayer1 || iPlayers[i] == RandomPlayer2)
{
formatex(name, charsmax(name), "%s (C)", szName);
}
else
{
name = szName;
}
if(cs_get_user_team(iPlayers[i]) == CS_TEAM_T)
{
posTR += formatex(HudTextTR[posTR], 511-posTR,"%s^n", name);
}
else if(cs_get_user_team(iPlayers[i]) == CS_TEAM_CT)
{
posCT += formatex(HudTextCT[posCT], 511-posCT, "%s^n", name);
}
else
{
posSPEC += formatex(HudTextSPEC[posSPEC], 511-posSPEC, "%s^n", name);
}
}
for(new i; i < iNum; i++)
{
set_hudmessage(255, 0, 0, 0.70, 0.16, 0, 0.0, 1.1, 0.0, 0.0, 1);
show_hudmessage(iPlayers[i], "Terrorists:");
set_hudmessage(255, 255, 255, 0.70, 0.19, 0, 0.0, 1.1, 0.0, 0.0, 2);
show_hudmessage(iPlayers[i], HudTextTR);
set_hudmessage(0, 0, 255, 0.70, 0.51, 0, 0.0, 1.1, 0.0, 0.0, 3);
show_hudmessage(iPlayers[i], "Counter-Terrorist:");
set_hudmessage(255, 255, 255, 0.70, 0.54, 0, 0.0, 1.1, 0.0, 0.0, 4);
show_hudmessage(iPlayers[i], HudTextCT);
}
}