
#include <amxmod>
#include <mysql>

/* Maximum number of maps that will be included in rotation */
#define MAX_MAPS 100

/* Longest allowed map filename */
#define MAX_MAP_LENGTH 32
#define MAX_TEXT_LENGTH 200
/* Time after vote finishes before map change */

/* Default Number of maps in the nominations menu */
#define MAX_NOMINATIONS 3
#define KEY_START       6

/* Default number of previous maps that can't be nominated */
#define DEFAULT_BAN_LAST 6

#define DEFAULT_EXECADMINPASS 0

#define FLAG_AVAILABLEMAPS 2
#define FLAG_NOMINATEDMAPS 4
#define FLAG_NOMINATION 8
#define FLAG_COUNTDOWNTALK 32
#define FLAG_VOTINGINPROGRESS 64
#define FLAG_WINNEROFVOTE 128

#define SAFETY_MARGIN 600
#define HELP_LIST_AMOUNT 10

#define TEAM_S   0
#define TEAM_T   1
#define TEAM_CT  2

new g_ServerIP[64]
new g_NominatedMaps[MAX_NOMINATIONS];                     /* The list of winning nominated maps */
new g_MapVotes[MAX_MAPS];                                 /* Array containing the count of nominations */
new g_AllMaps[MAX_MAPS][MAX_MAP_LENGTH];                  /* Array contains map names */
new g_AllMapsShort[MAX_MAPS][MAX_MAP_LENGTH];             /* Names with the underscore bit gone */
new g_AllMapsSize=0;                                      /* Number of slots filled in g_AllMaps */
new g_Mapcycle[MAX_MAPS][MAX_MAP_LENGTH];                 /* Array contains map names in mapcycle.txt */
new g_MapcycleSize=0;                                     /* Number of slots filled in g_Mapcycle */
new g_VoteActive=0;                                       /* 1 = Voting process has begun / 0 = Nomiations allowed */
new g_CountDownActive=0;                                  /* 1 = Voting countdown in progress */
new g_NextMap[MAX_MAP_LENGTH];                            /* Name of map that won the vote, if extend didn't win */
new g_NumMapVotes = 2                                     /* Maximum number of votes to call */
new g_AWPMessage=0

new g_MOTMText[35][128]
new g_MOTMSize = 0
new g_MOTMPos = 0

new option[4]
new option_names[4][MAX_MAP_LENGTH]

#define NO_RIFLE_ROUNDS  3

#define IDLE_AREA        78400    /* 280*280 */
#define USER_X           0
#define USER_Y           1
#define USER_Z           2
new player_xyz[32][3]

#define USER_DEAD        0
#define USER_IDLE        1
#define USER_WARNS       2
#define USER_NADES       3
#define USER_CAMP        4
#define DEATHS           5
#define NOMINATED_MAP    6
#define PLAYER_TEAM      7
#define PLAYER_GLOW      8
#define PLAYER_MKILL     9
#define ROCKED_THEVOTE   10
#define USER_PERMS       11
#define UNUSED1          12
#define UNUSED2          13
#define UNUSED3          14
#define UNUSED4          15
#define UNUSED5          16
#define CHOOSE_TEAM      17
#define TEAM_SELECT      18
#define RESTRICT_WEAPON  19
#define WARN_NAME        20
#define MAX_PDATA        21
new player_data[32][MAX_PDATA]

/****************************
 * Voting Control Variables *
 ****************************/
new gNumAdmins = 0
new gRockTheVotes = 0
new bool:gEndMap = false
new bool:gEnableVotes = true

/***************************
 * Admin Control Variables *
 ***************************/
#define LAST_SLAPPED     0
#define ADMIN_LAST       1
new Float:admin_data[32][ADMIN_LAST]

#define ADMIN_VOTE       (1<<0)        # 1
#define ADMIN_SAY        (1<<1)        # 2
#define ADMIN_SLAP       (1<<2)        # 4
#define ADMIN_SLAY       (1<<3)        # 8
#define ADMIN_LLAMA      (1<<4)        # 16
#define ADMIN_BURY       (1<<5)        # 32
#define ADMIN_KICK       (1<<6)        # 64
#define ADMIN_WHO        (1<<7)        # 128
#define ADMIN_MAP        (1<<8)        # 256
#define ADMIN_SWAP       (1<<9)        # 512
#define ADMIN_CHAT       (1<<10)       # 1024

#define ADMIN_TKS        (1<<19)       #
#define ADMIN_BAN        (1<<20)       # 

#define ADMIN_EXEC       (1<<25)       #

#define ADMIN_UNBAN      (1<<30)       #
#define ADMIN_IMMUNE     (1<<31)       #

#define AWP_AMMO         0
#define AWP_SWITCH       1
new Float:awp_fired[32]
new awp_check[32][2]

new team_count[3] = {0,0,0}
new team_scores[3] = {0,0,0}
new g_AutoSwitch = 0

new g_lightning
new g_white
new g_smoke

new gmsgSayText

new mysql
new strQuery[1500]
new strMesg[1500]

#define MAX_CLR 7
new ncolors[MAX_CLR][] = {"white","red","green","blue","yellow","magenta","cyan"}
new vcolors[MAX_CLR][3] = {{255,255,255},{255,0,0},{0,255,0},{0,0,255},{255,255,0},{255,0,255},{0,255,255}} 
new msgchannel = 0

new g_mapname[64]
new g_BombTimer = 40     
new bool:g_BombMap = false
new bool:g_AllowTK = true

/* For the rifle menu restrictions */
new r_restrict[10] = {0,0,0,0,0,0,4,4,4,4}
new r_alias[10][] = {"ak47","galil","famas","sg552","m4a1","aug","scout","awp","g3sg1","sg550"}
new r_name[10][] = {"AK 47","Gali","Famas","Sig SG-552 Commando","Colt M4A1 Carbine","Steyr Aug","Steyr Scout",
                    "AI Arctic Warfare/Magnum","H&K G3/SG-1 Sniper Rifle","Sig SG-550 Sniper"}

new name_warning[] = "Please change your name.^nFailure to comply will result in you being kicked or banned"

public plugin_init(){

  gmsgSayText = get_user_msgid("SayText")

  get_cvar_string("ip",g_ServerIP,63) 

  register_plugin("Axia AMX Plugin","1.0","EnemySpy")

  register_srvcmd("irc_map","irc_map",0,"")
  register_srvcmd("irc_chat","irc_chat",0,"")
  register_srvcmd("irc_kick","irc_kick",0,"")
  register_srvcmd("irc_say","irc_say",0,"")
  register_srvcmd("_sendto","_sendto",0,"")

  register_concmd("admin_rockthevote","admin_rockthevote",ADMIN_CHAT," - on|off|start")
  register_concmd("admin_say","admin_say",ADMIN_CHAT,"<message>")
  register_concmd("admin_chat","admin_chat",ADMIN_CHAT,"<message>")
  register_concmd("admin_psay","admin_psay",ADMIN_CHAT,"<authid, nick or #userid> <message>")
  register_concmd("admin_tsay","admin_tsay",ADMIN_CHAT,"<color> <message>")
  register_concmd("admin_who","admin_who",ADMIN_CHAT,"- list the admins")
  register_concmd("admin_slay","admin_slay",ADMIN_CHAT,"<authid, nick or #userid> <log message>")
  register_concmd("admin_slap","admin_slap",ADMIN_CHAT,"<authid, nick or #userid> <damage>")
  register_concmd("admin_ban","admin_ban",ADMIN_CHAT,"<time> <authid, nick or #userid> <log message>")
  register_concmd("admin_unban","admin_unban",ADMIN_CHAT,"<wonid> <log message>")
  register_concmd("admin_kick","admin_kick",ADMIN_CHAT,"<authid, nick or #userid> <log message>")
  register_concmd("admin_map","admin_map",ADMIN_CHAT,"- change map")
  register_concmd("admin_nextmap","admin_nextmap",ADMIN_CHAT,"- set the next map to be played")
  register_concmd("admin_swap","admin_swap",ADMIN_CHAT,"<authid, nick or #userid>")
  register_concmd("admin_tks","admin_tks",ADMIN_CHAT,"<on|off>")
  register_concmd("admin_exec","admin_exec",0,"- execute a command on the targets client")
  register_concmd("admin_auth","admin_auth",0,"- reauthorise permissions")
  register_concmd("say_irc","say_irc",0,"- talk with people on irc channel #axia")
  register_concmd("admin_help","admin_help",0,"- displays this help")

  register_concmd("uptime","admin_uptime",0,"- shows server uptime") 
  register_concmd("me","emote",0,"- show your emotions") 

  register_concmd("chooseteam","team_block",0) 

  register_menucmd(register_menuid("What map") ,(1<<5)|(1<<6)|(1<<7)|(1<<8),"vote_count") 

  register_menucmd(register_menuid("Team_Select",1),(1<<0)|(1<<1)|(1<<4),"team_select")
  register_event("ShowMenu","menuclass","b","4&CT_Select","4&Terrorist_Select")
  register_clcmd("jointeam","team_select") 

  //register_clcmd("cl_setautobuy","blockcommand")
  //register_clcmd("cl_autobuy","blockcommand")
  //register_clcmd("cl_setrebuy","blockcommand")
  //register_clcmd("cl_rebuy","blockcommand")

  register_clcmd("shield","restrict_shield") 

  register_clcmd("ak47","restrict_ak47") 
  register_clcmd("gali","restrict_gali") 
  register_clcmd("sg552","restrict_sg552") 
  register_clcmd("famas","restrict_famas") 
  register_clcmd("m4a1","restrict_m4a1") 
  register_clcmd("aug","restrict_aug") 
  register_clcmd("awp","restrict_awp") 
  register_clcmd("g3sg1","restrict_g3sg1") 
  register_clcmd("sg550","restrict_sg550") 

  register_clcmd("say","HandleSay") 
  register_clcmd("say_team","HandleSay") 

  register_event("CurWeapon","change_weapon","be","1=1") // 0 = stop using weapon 1 = active weapon
  register_event("TextMsg","hostage_killed","b","2&#Killed_Hostage")
  register_event("WeapPickup","buy_nade","b","1=4");

  register_event("TeamScore","team_score","a")
  register_event("TeamInfo","team_assign","a") 

  register_event("Damage", "damage_event", "b", "2!0", "3=0", "4!0")

  register_event("RoundTime", "start_round", "bc")
  register_event("SendAudio","end_round","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw")
  register_event("ResetHUD","CheckScore","b")

  /* Get the mapname before proceeding */
  get_mapname(g_mapname,63)

  /* Make sure everything is connected and/or reset */
  mysql_open()

  /* Set the MOTM */
  set_task(90.0,"show_motm")

  read_maplist()
  read_motm()

  if(equali(g_mapname,"de_",3) != 0) {
    g_BombMap = true
  }

  set_cvar_num("mp_limitteams", 0)
  set_cvar_num("mp_autoteambalance", 0)
  set_cvar_float("sv_restart",45.0)

  return PLUGIN_CONTINUE
}

public damage_event(victim) {
  new weapon, bodypart, attacker = get_user_attacker(victim,weapon,bodypart)

  if(!attacker) {
    return PLUGIN_CONTINUE
  }

  new ateam = get_user_team(attacker)
  new vteam = get_user_team(victim)
  if(ateam != vteam) {
    player_data[attacker][USER_IDLE] = 0
    return PLUGIN_CONTINUE
  }

  if(g_AllowTK == false) { 
    new name[32]
    get_user_name(attacker,name,31)
     
    _zap(attacker)

    if(ateam == 1) {
      set_hudmessage(140, 0, 0, 0.05, 0.65, 2, 0.1, 4.0, 0.02, 0.02, 10) 
    } else {
      set_hudmessage(0, 100, 200, 0.05, 0.65, 2, 0.1, 4.0, 0.02, 0.02, 10) 
    }
    show_hudmessage(0,"%s is slain for attacking a teammate at round start", name)

    return PLUGIN_HANDLED
  }

  return PLUGIN_CONTINUE
}

public change_weapon(id) {
  new weapon = read_data(2)
  new ammo = read_data(3)
       
  if(weapon != CSW_AWP) {
    // Set the weapon switch flag
    awp_check[id][AWP_SWITCH] = 1
       
    if(weapon != CSW_GLOCK18 && ammo != 20) {
      player_data[id][USER_IDLE] = 0
    }
       
    return PLUGIN_CONTINUE
  }
  
  new ateam = get_user_team(id)
  new oteam = (ateam == TEAM_CT) ? TEAM_T : TEAM_CT

  new Float:ntime = get_gametime()

  // Did they just fire the AWP?
  if(awp_check[id][AWP_AMMO] > ammo) {
    new name[32]
    get_user_name(id,name,32)

    log_message("%s fired AWP (ammo: %d) (AWP_SWITCH: %d) (Next Allowed Shot: %d) (Current Time: %d)",
           name,ammo,awp_check[id][AWP_SWITCH],awp_fired[id],ntime)

    // Was the last shot within X seconds?
    if(awp_fired[id] > ntime) {

      // Have they switched weapons since last shooting the AWP?
      if(awp_check[id][AWP_SWITCH] == 1) {
        log_message("AWP FAST SWITCH DETECTED")

        new dweap[32], sweap[32], dnum 
        get_user_weapons(id,dweap,dnum) 
        for(new a = 0; a < dnum; ++a){ 
          get_weaponname(dweap[a],sweap,31) 
          engclient_cmd(id,"drop",sweap) 
        } 
      }
    }

    // Save when the AWP is allowed to be fired next
    // 1.95 is just over the actual time it takes to fire without fastswitching
    // We are setting it to 2.75 for anyone who uses fastswitch (penalising them for using fastswitch)
    awp_fired[id] = ntime + 1.90

    if((team_scores[ateam] - team_scores[oteam]) > 2) {
      _zap(id);

      format(strMesg,128,"%s was slain for using the AI Arctic Warfare/Magnum when winning by more than 3 rounds.",name)
      client_print(0,print_chat,strMesg)
    }

    // Reset the weapon switch each shot
    awp_check[id][AWP_SWITCH] = 0
  }

  // Save the clip info
  awp_check[id][AWP_AMMO] = ammo

  return PLUGIN_CONTINUE
}

public death() {
  new killer = read_data(1)
  new victim = read_data(2)
    
  // This is handled in the perl program
  //format(strQuery,1499,"UPDATE LOW_PRIORITY live SET IsDead='1',deaths=deaths+1 WHERE idex='%d' AND server='%s'",victim,g_ServerIP)
  //mysql_query(mysql,strQuery)
  
  return PLUGIN_CONTINUE
}

public hostage_killed(id){
  new name[32]
  get_user_name(id,name,31)

  player_data[id][USER_WARNS]++;

  if(player_data[id][USER_WARNS] > 4) {
    _ban(id,240,"Killing hostages (USER_WARNS Exceeded)")
  } else if(player_data[id][USER_WARNS] > 2) {
    _zap(id);
  }

  client_print(0,print_chat,"A hostage was killed by %s",name)
} 

_ban(id,time,message[]) {
  new arg[140]
  arg[0] = id
  arg[1] = time
  copy(arg[2],130,message)

  // Slay them so they can't do any more damage
  if(is_user_alive(id)) {
    _zap(id)
  }

  // Delay the kick so any messages can be sent
  set_task(2.0,"delay_kick",32737+id,arg,140)
}

public delay_kick(param[]) {

  new vuid = get_user_userid(param[0])

  server_cmd("banid %d #%d kick;writeid",param[1],vuid)

  new authid[32]
  get_user_authid(param[0],authid,31)

  format(strQuery,1499,"INSERT INTO ban_list (bantime,wonid,message,server) \
           VALUES (%d,^"%s^",^"%s^",^"%s^")",param[1],authid,param[2],g_ServerIP)
  mysql_query(mysql,strQuery)
}

_zap(id) {
  new origin[3], srco[3]

  get_user_origin(id,origin)

  origin[2] -= 26
  srco[0]=origin[0]+150
  srco[1]=origin[1]+150
  srco[2]=origin[2]+400

  lightning(srco,origin)
  emit_sound(id,CHAN_ITEM, "ambience/thunder_clap.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  user_kill(id,1)
}

explode(id) {
  new origin[3]

  get_user_origin(id,origin)

  // blast circles
  message_begin( MSG_BROADCAST,SVC_TEMPENTITY,origin)
  write_byte( 21 )
  write_coord(origin[0])
  write_coord(origin[1])
  write_coord(origin[2] + 16)
  write_coord(origin[0])
  write_coord(origin[1])
  write_coord(origin[2] + 1936)
  write_short( g_white )
  write_byte( 0 ) // startframe
  write_byte( 0 ) // framerate
  write_byte( 2 ) // life
  write_byte( 16 ) // width
  write_byte( 0 ) // noise
  write_byte( 188 ) // r
  write_byte( 220 ) // g
  write_byte( 255 ) // b
  write_byte( 255 ) //brightness
  write_byte( 0 ) // speed
  message_end()
  //Explosion2
  message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
  write_byte( 12 )
  write_coord(origin[0])
  write_coord(origin[1])
  write_coord(origin[2])
  write_byte( 188 ) // byte (scale in 0.1's)
  write_byte( 10 ) // byte (framerate)
  message_end()
  //Smoke
  message_begin( MSG_BROADCAST,SVC_TEMPENTITY,origin)
  write_byte( 5 )
  write_coord(origin[0])
  write_coord(origin[1])
  write_coord(origin[2])
  write_short( g_smoke )
  write_byte( 2 )
  write_byte( 10 )
  message_end()
}

lightning(vec1[3],vec2[3]) { 
    //Lightning 
    message_begin( MSG_BROADCAST,SVC_TEMPENTITY) 
    write_byte( 0 ) 
    write_coord(vec1[0]) 
    write_coord(vec1[1]) 
    write_coord(vec1[2]) 
    write_coord(vec2[0]) 
    write_coord(vec2[1]) 
    write_coord(vec2[2]) 
    write_short( g_lightning ) 
    write_byte( 1 ) // framestart 
    write_byte( 5 ) // framerate 
    write_byte( 2 ) // life 
    write_byte( 20 ) // width 
    write_byte( 30 ) // noise 
    write_byte( 200 ) // r, g, b 
    write_byte( 200 ) // r, g, b 
    write_byte( 200 ) // r, g, b 
    write_byte( 200 ) // brightness 
    write_byte( 200 ) // speed 
    message_end() 
    //Sparks 
    message_begin( MSG_PVS, SVC_TEMPENTITY,vec2) 
    write_byte( 9 ) 
    write_coord( vec2[0] ) 
    write_coord( vec2[1] ) 
    write_coord( vec2[2] ) 
    message_end() 
    //Smoke      
    message_begin( MSG_BROADCAST,SVC_TEMPENTITY,vec2) 
    write_byte( 5 ) 
    write_coord(vec2[0]) 
    write_coord(vec2[1]) 
    write_coord(vec2[2]) 
    write_short( g_white ) 
    write_byte( 10 )   
    write_byte( 10 )   
    message_end() 
} 

public buy_nade(id){

  player_data[id][USER_NADES]++

  if(player_data[id][USER_NADES] > 1) {
    return PLUGIN_HANDLED;
  }

  return PLUGIN_CONTINUE;
}

public end_round() {
  // Set that the AWP warning message has not been displayed at round start.
  g_AWPMessage = 0
  
  // Check if we are to adjust the bomb timer in favour of the losing team.
  if(g_BombMap == true && (team_scores[TEAM_T] + team_scores[TEAM_CT] > 1)) {
    new score_diff = (team_scores[TEAM_T] - team_scores[TEAM_CT])
    g_BombTimer = 38 + (score_diff * 2)
    if(g_BombTimer < 20) {
      g_BombTimer = 20
    } else if(g_BombTimer > 60) {
      g_BombTimer = 60
    }
    set_cvar_num("mp_c4timer",g_BombTimer)
    log_message("C4 Timer: %d",g_BombTimer)
  }
  
  new players[32], inum, playerid, xyz[3]
  get_players(players,inum)
  
  if((team_scores[TEAM_T] + team_scores[TEAM_CT]) > 0) {
    for(new i = 0; i < inum; ++i) {
      playerid = players[i]
      get_user_origin(playerid,xyz)

      new xx = square(player_xyz[playerid][USER_X] - xyz[0]);
      new yy = square(player_xyz[playerid][USER_Y] - xyz[1]);
      new zz = square(player_xyz[playerid][USER_Z] - xyz[2]);

      if(((xx < IDLE_AREA) && (yy < IDLE_AREA) && (zz < IDLE_AREA))) {
        player_data[playerid][USER_CAMP] += 1;
      } else {
        player_data[playerid][USER_CAMP] = 0;
      }
      
      if(!is_user_hltv(playerid)) {
        new margin = player_data[playerid][USER_IDLE] + player_data[playerid][USER_CAMP]

        new name[32]
        get_user_name(playerid,name,31)
        //log_message("idle_check: %s  (USER_IDLE: %d) (USER_CAMP: %d) (USER_DEAD: %d)",name,
        //       player_data[playerid][USER_IDLE],player_data[playerid][USER_CAMP],player_data[playerid][USER_DEAD]);

        if(margin > 3 || player_data[playerid][USER_DEAD] > 2) {
          format(strMesg,128,"Attention: %s has been logged off for inactivity.",name);
          client_print(0,print_chat,strMesg)
          log_message("Attention: %s logged off for inactivity.",name);
          
          
          new userid = get_user_userid(playerid)
          server_cmd("kick #%d",userid)
        } else if((player_data[playerid][USER_IDLE] > 0 && player_data[playerid][USER_CAMP] > 0)
                || margin > 2 ||  player_data[playerid][USER_DEAD] > 1) {
          log_message("Attention: %s warned for inactivity.",name);
          
          client_print(playerid,print_chat,"Attention: The server has logged you as inactive or camping at spawn.")
          client_print(playerid,print_chat,"Attention: Try getting involved in the game more...")
        }
      }
    }
  }
  
  //set_task(1.0,"auto_balance");
  
  return PLUGIN_CONTINUE
}

square(X) {
  return X * X;
}

new ab_NextSwitch[4] = {2,2,2,9}
new ab_switch = 0

public auto_balance() {
  new score_diff
  new top_team = 0
  new bot_team = 0
  
  // Do this stuff now so we can send it to the log file for debugging.
  // Check who has the best score (see if any side is being pwned).
  if(team_scores[TEAM_T] > team_scores[TEAM_CT]) {
    score_diff = (team_scores[TEAM_T] - team_scores[TEAM_CT])
    top_team = TEAM_T
    bot_team = TEAM_CT
  } else {
    score_diff = (team_scores[TEAM_CT] - team_scores[TEAM_T])
    top_team = TEAM_CT
    bot_team = TEAM_T
  }

  new player_diff
  new player_top = 0
  new player_bot = 0
  // Need to check how many players are on each team.
  if(team_count[TEAM_T] > team_count[TEAM_CT]) {
    player_diff = (team_count[TEAM_T] - team_count[TEAM_CT])
    player_top = TEAM_T
    player_bot = TEAM_CT
  } else {
    player_diff = (team_count[TEAM_CT] - team_count[TEAM_T])
    player_top = TEAM_CT
    player_bot = TEAM_T
  }

  log_message("Score: T=%d / CT=%d (score_diff: %d)(g_AutoSwitch: %d)", team_scores[TEAM_T],team_scores[TEAM_CT],score_diff,--g_AutoSwitch)
  log_message("Players: T=%d / CT=%d", team_count[TEAM_T],team_count[TEAM_CT])
  

  if(score_diff > 2 && g_AutoSwitch < 1) {
    new top_player = 0
    new bot_player = 0

    format(strQuery,1024,"SELECT HIGH_PRIORITY idex FROM live WHERE server='%s' AND team='%d' ORDER BY kills DESC LIMIT 1",g_ServerIP,top_team)
    mysql_query(mysql,strQuery)
    if(mysql_nextrow(mysql)>0) {
      mysql_getfield(mysql,1,strMesg,31)
      top_player = strtonum(strMesg)
    }
      
    format(strQuery,1024,"SELECT HIGH_PRIORITY idex FROM live WHERE server='%s' AND team='%d' ORDER BY kills LIMIT 1",g_ServerIP,bot_team)
    mysql_query(mysql,strQuery)
    if(mysql_nextrow(mysql)>0) {
      mysql_getfield(mysql,1,strMesg,31)
      bot_player = strtonum(strMesg)
    }
      
    log_message("[Top Team: %d / %d] - [Bot Team: %d / %d]",top_team,top_player,bot_team,bot_player);

    if(top_player && bot_player) {
      new name[32]

      get_user_name(top_player,name,31)
      log_message("Top Team: %s (%d)",name,top_player);
      get_user_name(bot_player,name,31)
      log_message("Bot Team: %s (%d)",name,bot_player);

      swap_team(bot_player, top_team, 2)
      swap_team(top_player, bot_team, 2)
    }

    g_AutoSwitch = ab_NextSwitch[ab_switch++]
  }
}

MoveMapToEnd(MapName[],Offset) {
  new i = _lookup_map(MapName,1)

  while (i<(g_AllMapsSize-Offset-1)) {
    copy(g_AllMaps[i],MAX_MAP_LENGTH,g_AllMaps[i+1])
    copy(g_AllMapsShort[i],MAX_MAP_LENGTH,g_AllMapsShort[i+1])
    i++
  }
  copy(g_AllMaps[g_AllMapsSize-Offset-1],MAX_MAP_LENGTH,MapName)
  SetShortName(MapName,g_AllMapsShort[g_AllMapsSize-Offset-1])
  return 0
}

SaveMapList() {
  new i=0;
  new filename[MAX_MAP_LENGTH] = "maps.ini";

  /* Re-Write maps.ini with the new map order */
  if(file_exists(filename) == 0) {
    filename = "mapcycle.txt";
  }

  delete_file(filename)

  for(i=0;i<g_AllMapsSize;i++) {
    write_file(filename,g_AllMaps[i]);
  }

  return 1;
}

public emote(id,level) {
  new plist[32], pcount
  new username[32], message[192]

  get_players(plist,pcount)

  get_user_name(id,username,31)

  read_args(message,181)
  remove_quotes(message)

  format(message,191,"%s %s",username,message)
  log_message(message)

  if(is_user_alive(id)) {
    client_print(0,print_chat,message)
  } else {
    for(new i = 0; i < pcount; ++i) {
      if(!is_user_alive(plist[i])) {
        client_print(plist[i],print_chat,message)
      }
    }
  }

  return PLUGIN_HANDLED
}

public client_authorized(id) {
  new authid[32],name[32],ip[32]

  get_user_authid(id,authid,31)
  get_user_name(id,name,31)
  get_user_ip(id,ip,31)

  if(strlen(name) < 2) {
    client_print(id,print_console,"You are being kicked because your name is too short")
    _ban(id,10,"Name was too short")
  }

  format(strQuery,1499,"SELECT * FROM live WHERE idex='%d' AND server='%s' FOR UPDATE",id,g_ServerIP)
  mysql_query(mysql,strQuery)  
  if(mysql_nextrow(mysql) > 0) {
    format(strQuery,1499,"UPDATE live SET wonid='%s',name=^"%s^",team='600',kills=0,deaths=0 \
           WHERE idex='%d' and server='%s'",authid,name,id,g_ServerIP)
  } else {
    format(strQuery,1499,"INSERT DELAYED INTO live (idex,wonid,name,team,kills,deaths,server) \
           VALUES (%d,^"%s^",^"%s^",'500',0,0,^"%s^")",id,authid,name,g_ServerIP)
  }
  mysql_query(mysql,strQuery)

  player_data[id][PLAYER_TEAM] = TEAM_S

  for(new c=0;c<MAX_PDATA;c++) {
    player_data[id][c] = 0
  }

  log_message("^"%s<%d><%s><>^" connected, address ^"%s^"",name,get_user_userid(id),authid,ip);

  new arg[2]
  arg[0] = id
  new rnd = random_num(3,10)
  set_task(float(rnd),"auto_auth",0,arg,1)

  return PLUGIN_CONTINUE
}

public client_disconnect(id) {

  format(strQuery,1499,"UPDATE live SET deaths='0',kills='0',team='500',name=^"^" WHERE idex='%d' AND server='%s'", id,g_ServerIP)
  mysql_query(mysql,strQuery)

  if(player_data[id][USER_PERMS]) {
    if(gNumAdmins-- == 1) {
      gEnableVotes = true;
      log_message("Enabling rockthevote")
    }
  }

  if(player_data[id][ROCKED_THEVOTE]) {
    gRockTheVotes--
  }

  /* This is taken care of in team assign */
  //team_count[player_data[id][PLAYER_TEAM]]--

  return PLUGIN_CONTINUE
}

public admin_uptime(id,level) {
  new uptime_f[64] = "uptime"
  new load_f[64] = "loadavg"

  if(file_exists(uptime_f) && file_exists(load_f)) { 
    new i=0,len,line[128] 

    read_file(uptime_f,i++,line,128,len) 
    new uptime_s[64] 
    parse(line,uptime_s,64) 
    new uptime = strtonum(uptime_s) 
    new days = uptime / 86400 
    new hours = uptime % 86400 / 60 / 60 
    new minutes = uptime % 86400 / 60 % 60 

    i=0
    read_file(load_f,i++,line,128,len) 
    new one_s[6],five_s[6],fifteen_s[6] 
    parse(line,one_s,6,five_s,6,fifteen_s,6) 

    console_print(id,"Uptime: %i days, %i:%i, load average: %s, %s, %s",days,hours,minutes,one_s,five_s,fifteen_s) 
  } 

  return PLUGIN_HANDLED
}

public DoStartVote() {
  new i=0;
  new j=0;

  /*Time to start a vote */
  g_VoteActive=1;
  g_CountDownActive=0;

  new Current[MAX_MAP_LENGTH];
  get_mapname(Current,MAX_MAP_LENGTH);

  /*Pad any free slots with top maps */
  for(i=0;i<MAX_NOMINATIONS;i++) {
    /* Is there a map in the list already? */
    if(g_NominatedMaps[i]) {
      new NominatedMap = g_NominatedMaps[i] - 1;
      g_MapVotes[NominatedMap] = -1;
    } else {
      while (g_MapVotes[j] != 0 || mapcycle(j) != 1) {
        j++;
      }
      g_NominatedMaps[i] = j+1;
      g_MapVotes[j] = -1;
    }

    log_message("%d) %s",(i+KEY_START),g_AllMaps[g_NominatedMaps[i]-1]);
  }

  /* No point in voting if no-one connected */
  new plist[32], pcount
  get_players(plist,pcount)
  if (pcount == 0) {
    return 0;
  }

  new keys,temp[512]
  format(strMesg,511,"\yWhat map would you like to play next? \w^n^n")
  for(i=0;i<MAX_NOMINATIONS;i++) {
    copy(option_names[i],32,g_AllMaps[g_NominatedMaps[i]-1])

    format(temp,511,"%d.  %s^n",(i+KEY_START),g_AllMaps[g_NominatedMaps[i] -1])
    add(strMesg,511,temp) 
    keys |= (1<<(i+(KEY_START-1))) 
    option[i] = 0
  } 

  if(g_NumMapVotes > 0) {
    format(temp,511,"%d.  (vote some other maps)",(i+KEY_START))
    add(strMesg,511,temp) 
    keys |= (1<<(i+(KEY_START-1))) 

    g_NumMapVotes--
  }

  show_menu(0,keys,strMesg,20)
    
  set_hudmessage(235,80,235,0.1,0.15,0,6.0,12.0,2.0,2.0,1)  
  show_hudmessage(0,"Map voting is in progress ...")

  set_task(20.0,"count_votes")

  return 0;
}

public start_round() {
  new Float:roundtime = get_cvar_float("mp_roundtime") * 60.0 
  new rtime = read_data(1) 

  if(roundtime == rtime){
    set_task(6.0,"_Allow_TK")
    g_AllowTK = false

    new players[32], inum, playerid
    get_players(players,inum)

    for(new i = 0; i < inum; ++i) {
      playerid = players[i]
      get_user_origin(playerid,player_xyz[playerid])

      if(!is_user_alive(playerid) || !player_data[playerid][PLAYER_TEAM]) {
        player_data[playerid][USER_DEAD] += 1
      } else {
        player_data[playerid][USER_DEAD] = 0
      }

      player_data[playerid][USER_NADES] = 0

      // Flag them as idle at round start and let them prove otherwise :)
      player_data[playerid][USER_IDLE]++
    }
  } else if(rtime == get_cvar_num("mp_freezetime")) {
    if(team_scores[TEAM_CT] > 6 || team_scores[TEAM_T] > 6 || gEndMap == true) {
      if(g_VoteActive == 0 && g_CountDownActive == 0) {
        g_CountDownActive = 1

        set_hudmessage(235,80,235,0.1,0.15,0,6.0,12.0,2.0,2.0,1)  
        show_hudmessage(0,"Map voting is about to begin")

        set_task(15.0,"DoStartVote")
      }
    }

    format(strQuery,1499,"UPDATE cur_score SET TERRORIST='%d', CT='%d' WHERE server='%s'",
       team_scores[TEAM_T],team_scores[TEAM_CT],g_ServerIP)
    mysql_query(mysql,strQuery)

    if(!g_AWPMessage) {
      if((team_scores[TEAM_CT] - team_scores[TEAM_T]) > 2) {
        set_hudmessage(0,100,200,0.4,0.25,0,6.0,9.0,2.0,2.0,1)  
        show_hudmessage(0,"CTs should not use the AWP!!")
      } else if((team_scores[TEAM_T] - team_scores[TEAM_CT]) > 2) {
        set_hudmessage(140,0,0,0.4,0.25,0,6.0,9.0,2.0,2.0,1)  
        show_hudmessage(0,"TERRORISTs should not use the AWP!!")
      } else {
        set_hudmessage(50,255,50,0.4,0.25,0,6.0,9.0,2.0,2.0,1)  
        show_hudmessage(0,"Both teams can use the AWP")
      }

      g_AWPMessage = 1
    }
  }

  return PLUGIN_CONTINUE
}

public swap_team(id,team,count)
{ 
  new parm[6]
  parm[0] = id
  parm[1] = team
  parm[2] = count // number of tries
  
  player_data[id][CHOOSE_TEAM] = 1
  
  // Save their primary weapon information
  // parm[3] = clip, parm[4] = ammo, parm[5] = weapon id
  parm[5] = get_user_weapon(id,parm[3],parm[4])
  
  new svgui[2]
  get_user_info(id, "_vgui_menus", svgui, 1)
  set_user_info(id, "_vgui_menus", "0")
  
  log_message("swap_team: (%d/%d/%d)",id,team,count)
  
  engclient_cmd(id,"jointeam", (team == 1) ? "1" : "2" )
  engclient_cmd(id,"joinclass","5")
  engclient_cmd(id,"slot1")

  set_user_info(id, "_vgui_menus", svgui )
  
  set_task(5.0, "check_transfer", 0, parm, 6)
}

public check_transfer(parm[6])
{            
  new name[32]       
  get_user_name(parm[0], name, 31)

  log_message("check_transfer: %d/%d (%d/%d/%d)",get_user_team(parm[0]),player_data[parm[0]][PLAYER_TEAM],parm[0],parm[1],parm[2])
  if(get_user_team(parm[0]) == parm[1] && is_user_alive(parm[0]))
  {
    log_message("swap_team: transfered %s!", name)
    client_print(parm[0], print_chat, "You have been swapped in an effort to help balance the teams.")

    new ammo, clip, wpnid = get_user_weapon(parm[0],clip,ammo)
    new wpnname[32]
    get_weaponname(wpnid,wpnname,31)
    engclient_cmd(parm[0],"drop %s",wpnname) 

    // For the inconvenience of swapping teams we are going 
    // to fit them out with new weapons, kevlar, etc...
    if(player_data[parm[0]][PLAYER_TEAM] == TEAM_CT) {
      server_cmd("give_item #%d weapon_m4a1",parm[0]);
      server_cmd("give_item #%d ammo_556nato",parm[0]);
      server_cmd("give_item #%d ammo_556nato",parm[0]);
      server_cmd("give_item #%d ammo_556nato",parm[0]);
      server_cmd("give_item #%d item_thighpack",parm[0]);
    } else {
      server_cmd("give_item #%d weapon_ak47",parm[0]);
      server_cmd("give_item #%d ammo_762nato",parm[0]);
      server_cmd("give_item #%d ammo_762nato",parm[0]);
      server_cmd("give_item #%d ammo_762nato",parm[0]);
    }
    
    //give_item(parm[0],"weapon_deagle")
    //give_item(parm[0],"ammo_50ae")
    //give_item(parm[0],"ammo_50ae")
    //give_item(parm[0],"ammo_50ae")
    //give_item(parm[0],"ammo_50ae")
    //give_item(parm[0],"ammo_50ae")
    //give_item(parm[0],"ammo_50ae")

    //give_item(parm[0],"item_kevlar")
    server_cmd("give_item #%d item_assaultsuit",parm[0]);
    server_cmd("give_item #%d weapon_flashbang",parm[0]);
    server_cmd("give_item #%d weapon_flashbang",parm[0]);
    server_cmd("give_item #%d weapon_hegrenade",parm[0]);
    server_cmd("give_item #%d weapon_smokegrenade",parm[0]);

    return
  }

  // check number of attempts
  parm[2]--
  if (parm[2] == 0) {
    log_message("swap_team: failed to transfer %s after several attempts!", name)
    return
  }

  swap_team(parm[0],parm[1],parm[2])

  return
}

public _Allow_TK() 
{ 
    g_AllowTK = true 
    return PLUGIN_CONTINUE 
} 

public ChangeMap() {
  
  server_cmd("changelevel %s",g_NextMap) 

  return PLUGIN_CONTINUE
}

public CheckScore(id) { 
  new name[32]

  /******************************************************
    Does the player have an illegal difference of frags
    between his kills and deaths 
  ******************************************************/
  if((get_user_frags(id) - get_user_deaths(id)) > 30) { 

    // Are we less than 16 rounds played?
    if((team_scores[TEAM_CT] + team_scores[TEAM_T]) < 16) {
      // Determine the team the offender is on
      new pTeam = player_data[id][PLAYER_TEAM]
      new oTeam = (pTeam == TEAM_CT) ? TEAM_T : TEAM_CT

      if(team_scores[oTeam] < team_scores[pTeam]) {
        get_user_name(id, name, 31) 

        client_print(0, print_chat, "%s has been auto kicked", name) 
        _ban(id,60,"Frags/Deaths ratio exceeded")
      }
    }
  } 

  return PLUGIN_CONTINUE
} 

public team_score() { 
  new tid[2]
  read_data(1,tid,1) 

  new i = (tid[0] == 'C') ? TEAM_CT : TEAM_T

  team_scores[i] = read_data(2) 
  if(team_scores[i] > 10) {
    set_task(3.0,"ChangeMap")
  }

  return PLUGIN_CONTINUE
} 

public team_block(id) {
  new cTeam = player_data[id][PLAYER_TEAM]
  new dTeam = (cTeam == TEAM_CT) ? TEAM_T : TEAM_CT

  new name[32] 
  get_user_name(id, name, 31) 

  log_message("team_block: %s(Team: %s) (Rounds: T=%d / CT=%d) (Players: T=%d / CT=%d)",name,
              (cTeam == TEAM_T) ? "T" : "CT",
              team_scores[TEAM_T],team_scores[TEAM_CT],team_count[TEAM_T],team_count[TEAM_CT])

  new pdiff = team_count[cTeam] - team_count[dTeam]
  new sdiff = team_scores[cTeam] - team_scores[dTeam]
  new kdiff = get_user_frags(id) - get_user_deaths(id)
  
  if(sdiff > 0 && pdiff > 1 && kdiff > 15) {
    swap_team(id,dTeam,3)
    return PLUGIN_HANDLED
  }

  // Only allow auto choice on connect
  if(cTeam == 0) {
    return PLUGIN_CONTINUE
  } else if(player_data[id][CHOOSE_TEAM] == 1) {
    player_data[id][CHOOSE_TEAM] = 2
    return PLUGIN_CONTINUE
  } else if(player_data[id][CHOOSE_TEAM] == 2) {
    client_print(id, print_chat, "You were auto changed and cannot switch teams.")
    return PLUGIN_HANDLED
  } else if((team_scores[TEAM_CT] + team_scores[TEAM_T]) < 2) {
    return PLUGIN_HANDLED
  }

  // Does the destination team have less players than this team?
  if(pdiff > 1) {
    return PLUGIN_CONTINUE
  }

  // Has the destination team won less rounds than this team?
  if(sdiff > 1 && pdiff > 0) {
    return PLUGIN_CONTINUE
  } else if(sdiff > 0 && pdiff > -1) {
    return PLUGIN_CONTINUE
  }

  player_data[id][TEAM_SELECT]++
  client_print(id, print_chat, "You cannot change team at this time.") 
  client_print(id, print_chat, "You request has been stored and you will be changed when a position is availble.") 

  return PLUGIN_HANDLED
}

public menuclass(id) { 
  log_message("Show MenuClass #%i",id) 

  return PLUGIN_CONTINUE 
} 

public team_select(id, key) { 

  new name[32]
  get_user_name(id, name, 31)

  log_message("team_select: %s - (Players: T: %d / CT: %d) Team: %d Key: %d", \
      name,team_count[TEAM_T],team_count[TEAM_CT],player_data[id][PLAYER_TEAM],key)
       
  // Only allow auto choice on connect
  if(player_data[id][PLAYER_TEAM] == 0) {
    new tdiff = team_count[TEAM_T] - team_count[TEAM_CT]
    new sdiff = team_scores[TEAM_T] - team_scores[TEAM_CT]
    if(tdiff > 0) {
      engclient_cmd(id,"menuselect","2")
    } else if(tdiff < 0) {
      engclient_cmd(id,"menuselect","1")
    } else if(sdiff > 0) {
      engclient_cmd(id,"menuselect","2")
    } else if(sdiff < 0) {
      engclient_cmd(id,"menuselect","1")
    } else {
      engclient_cmd(id,"menuselect", (random_num(1,2) == 1) ? "1" : "2")
    }  
    client_print(id, print_chat, "You have been auto assigned...")
    return PLUGIN_HANDLED
  }

  return PLUGIN_CONTINUE
} 

public team_assign() { 
  new team, id
  new authid[32], name[32], tid[2]
  new ping, loss

  id = read_data(1)     
  get_user_authid(id,authid,31)
  get_user_name(id, name, 31)

  read_data(2,tid,1)

  switch(tid[0]) {
    case 'U': team = TEAM_S
    case 'S': team = TEAM_S
    case 'T': team = TEAM_T
    case 'C': team = TEAM_CT
  }

  if(player_data[id][PLAYER_TEAM] != team) {
    team_count[player_data[id][PLAYER_TEAM]]--
    team_count[team]++ 
    player_data[id][PLAYER_TEAM] = team 
  }

  get_user_ping(id,ping,loss)

  if(is_user_hltv(id)) {
    format(strQuery,1499,"UPDATE live SET team='600',name=^"%s^",wonid='%s',ping='%d',loss='%d' \
           WHERE idex='%d' AND server='%s'",name,authid,ping,loss,id,g_ServerIP)
  } else {
    format(strQuery,1499,"UPDATE live SET team='%d',name=^"%s^",wonid='%s',ping='%d',loss='%d' \
           WHERE idex='%d' AND server='%s'",team,name,authid,ping,loss,id,g_ServerIP)
  }
  mysql_query(mysql,strQuery)

  if(ping > 240) {
    if(++player_data[id][USER_WARNS] > 3) {
      client_print(0,print_console,"%s is being kicked for having a ping continuously higher than 240",name)
      _ban(id,10,"Ping continuously higher than 240")
    }
  } else if(player_data[id][PLAYER_TEAM]) {
    player_data[id][USER_WARNS] = 0

    format(strQuery,1499,"SELECT mesg,bantime FROM barrednicks WHERE ^"%s^" LIKE name",name)
    mysql_query(mysql,strQuery)
    if(mysql_nextrow(mysql) > 0) {
      if(++player_data[id][WARN_NAME] >= 3) {
        new message[128], bantime[32]

        mysql_getfield(mysql,1,message,127)
        mysql_getfield(mysql,2,bantime,31)

        client_print(id,print_chat,message)
        _ban(id,strtonum(bantime),message)
      } else {
        client_print(id,print_center,name_warning)
        client_print(id,print_chat,name_warning)
        client_print(id,print_console,name_warning)
      }
    }
  }

  if(loss > 0) {
    log_message("%s has loss: %d",name,loss)
  }

  return PLUGIN_CONTINUE
} 

public plugin_precache() {
  g_lightning = precache_model("sprites/lgtning.spr") 
  g_white = precache_model("sprites/white.spr") 
  precache_sound( "ambience/thunder_clap.wav") 

  return PLUGIN_CONTINUE
}

_lookup_map(map[], exact) {
  new i;

  for(i=0;i<g_AllMapsSize;i++) {
    if((exact == 1) && equali(map,g_AllMaps[i])) {
      new x = equali(map,g_AllMaps[i])
      new y = equali(g_AllMaps[i],map)
      new z = equali(map,g_AllMaps[i],strlen(g_AllMaps[i]))

      log_message("_lookup_map: x=%d, y=%d, z=%d",x,y,z)

      if(strlen(map) == strlen(g_AllMaps[i])) {
        log_message("_lookup_map: search=%s, found=%s, position=%d (%d)",map,g_AllMaps[i],i,exact)
        return i;
      }
    } else if(containi(g_AllMaps[i],map) == 0) {
      log_message("_lookup_map: search=%s, found=%s, position=%d (%d)",map,g_AllMaps[i],i,exact)

      return i;
    }
  }

  if(!exact) {
    /* Check for a match ignoring characters before the _ */
    for(i=0;i<g_AllMapsSize;i++) {
      if(containi(g_AllMapsShort[i],map) == 0) {
        return i;
      }
    }
  }
  return -1;
}

_nominate(id,map[]) {
  new name[32]
  new MapIndex = _lookup_map(map,0)

  if (g_VoteActive == 1) {
    client_print(id,print_chat,"Voting is in progress.^nYou cannot nominate at this time.")
    return 0
  } else if(g_VoteActive == 2) {
    client_print(id,print_chat,"The admin has already chosen %s as the next map.",g_NextMap)
    return 0
  }

  if (MapIndex == -1) {
    client_print(id,print_chat,"Map: %s was not found on this server.",map)
    return 0
  }

  if (MapIndex >= (g_AllMapsSize - DEFAULT_BAN_LAST)) {
    new pos = (g_AllMapsSize - MapIndex)
    client_print(id,print_chat,"Map: %s was played %d maps ago.",g_AllMaps[MapIndex],pos)
    return 0;
  }

  new lastvote = player_data[id][NOMINATED_MAP]
  get_user_name(id,name,31)

  if(lastvote) {
    lastvote -= 1;

    if(lastvote == MapIndex) {
      client_print(id,print_chat,"You have already voted for %s",g_AllMaps[MapIndex]);
      return 0;
    }

    g_MapVotes[lastvote] -= 1;
  }

  player_data[id][NOMINATED_MAP] = MapIndex + 1;
  g_MapVotes[MapIndex] += 1;

  log_message("%s nominated %s",name,g_AllMaps[MapIndex])
  client_print(0,print_chat,"%s has nominated %s (%d votes)",name,g_AllMaps[MapIndex],g_MapVotes[MapIndex])

  /* Which slot has the least votes */
  new i
  new LowestMapVote[2];
  LowestMapVote[0] = 99999;
  LowestMapVote[1] = -1;

  /* Process the list of nominated maps */
  for(i=0;i<MAX_NOMINATIONS;i++) {

    /* Is there a map in the list already? */
    if(g_NominatedMaps[i]) {

      new NominatedMap = g_NominatedMaps[i] - 1;

      /* If it is the map just voted for then return happy */
      if(NominatedMap == MapIndex) {
        return 1;
      } else if(g_MapVotes[NominatedMap] < LowestMapVote[0]) {
        LowestMapVote[0] = g_MapVotes[NominatedMap];
        LowestMapVote[1] = i;
      }
    } else {
      g_NominatedMaps[i] = MapIndex + 1;
      return 1;
    }
  }

  if(LowestMapVote[1] > -1) {
    i = LowestMapVote[1];
    new NominatedMap = g_NominatedMaps[i] - 1;

    if(g_MapVotes[NominatedMap] < g_MapVotes[MapIndex]) {
      g_NominatedMaps[i] = MapIndex + 1;
      return 1;
    }
  }

  return 1;
}

_report_nominations(id) {
  new c=0;
  new i;

  for(i=0;i<MAX_MAPS;i++) {
    if(g_MapVotes[i] != 0) {
      if(c == 0) {
        client_print(id,print_console,"Maps nominated for the next vote: ");
      }
      c += 1;
      client_print(id,print_console,"%2d : %s",g_MapVotes[i],g_AllMaps[i]);
    }
  }

  if(!c) {
    client_print(id,print_chat,"No maps have been voted for.");
  }

  return 0;
}

_show_mapinfo(id)
{
  new mapname[64]
  get_mapname(mapname,63)

  client_print(0,print_chat,"The current map is %s with no time limit",mapname)
  client_print(0,print_chat,"The first team to win 11 rounds ends the map.")

  if(g_VoteActive == 1) {
    if (strlen(g_NextMap)>0) {
      client_print(0,print_chat,"Players have voted for %s as the next map",g_NextMap)
    } else {
      client_print(0,print_chat,"Voting is in progress for the next map. Result will be announced soon.")
    }
  } else if(g_VoteActive == 2) {
    client_print(0,print_chat,"The admin has chosen %s as the next map.",g_NextMap)
  } else {
    client_print(0,print_chat,"The next map will be determined by a vote when any team has won 6 rounds.")
  }

  return 0;
}

_list_maps(id) {
  new i=0;

  client_print(id,print_console,"The following maps are available on this server:")
  while (i<g_AllMapsSize) {
    if(i+4<g_AllMapsSize) {
      format(strMesg,256,"%s, %s, %s, %s, %s",g_AllMaps[i],g_AllMaps[i+1],g_AllMaps[i+2],g_AllMaps[i+3],g_AllMaps[i+4])
    } else if(i+3<g_AllMapsSize) {
      format(strMesg,256,"%s, %s, %s, %s",g_AllMaps[i],g_AllMaps[i+1],g_AllMaps[i+2],g_AllMaps[i+3])
    } else if(i+2<g_AllMapsSize) {
      format(strMesg,256,"%s, %s, %s",g_AllMaps[i],g_AllMaps[i+1],g_AllMaps[i+2])
    } else if(i+1<g_AllMapsSize) {
      format(strMesg,256,"%s, %s",g_AllMaps[i],g_AllMaps[i+1])
    } else {
      format(strMesg,256,"%s",g_AllMaps[i])
    }
    client_print(id,print_console,strMesg)
    i=i+4;
  }

  client_print(id,print_console,"To nominate a map, say ^"nominate MAPNAME^" in chat, or ^"votemap MAPNAME^" in the console.")

  return 0;
}

_rockthevote(id) {

  if(gEnableVotes == false) {
    client_print(id,print_chat,"An admin is present.  rockthevote is currently disabled.")
  } else if(gEndMap == true) {
    client_print(id,print_chat,"No more votes required.  This map is about to end.")
  } else if(g_VoteActive == 1) {
    client_print(id,print_chat,"Voting is in progress.^nYou cannot rockthevote at this time.")
  } else if(g_VoteActive == 2) {
    client_print(id,print_chat,"The admin has already chosen %s as the next map.",g_NextMap)
  } else if((team_scores[TEAM_T] + team_scores[TEAM_CT]) < 2) {
    client_print(id,print_chat,"Voting cannot start until round 2")
  } else if(player_data[id][ROCKED_THEVOTE]) {
    client_print(id,print_chat,"You have already cast your vote!")
  } else if(!gEndMap) {
    new name[32]
    new req = ((team_count[TEAM_T] + team_count[TEAM_CT]) / 2) + 1;

    gRockTheVotes++
    player_data[id][ROCKED_THEVOTE]++

    if(gRockTheVotes == req) {
      gEndMap = true

      set_hudmessage(235,80,235,0.01,0.25,0,6.0,12.0,2.0,2.0,1)
      show_hudmessage(0,"rockthevote succeeded, map voting will begin shortly...")
    } else {
      get_user_name(id,name,31)
      client_print(0,print_chat,"RockTheVote: %s has rocked the vote.  %d vote(s) (%d required)",name,gRockTheVotes,req)
    }
  }

  return PLUGIN_HANDLED;
}

public count_votes() {
  new top = 0
  new winner

  for(new i=0;i<=MAX_NOMINATIONS;i++) {
    if(option[i] >= top) {
      top = option[i]
      winner = i
      option[i] = 0
    }
  }

  if(winner == MAX_NOMINATIONS  || ((mapcycle(g_NominatedMaps[winner]-1) != 1) && top <= 5)) {
    g_VoteActive = 0;

    set_hudmessage(235,80,235,0.01,0.25,0,6.0,12.0,2.0,2.0,1)
    show_hudmessage(0,"Voting Complete^nPlayers voted for another selection of maps.")

    for(new i=0;i<MAX_NOMINATIONS;i++) {
      MoveMapToEnd(option_names[i],0);
    }
    SaveMapList();

    for(new i=0;i<32;i++) {
      player_data[i][NOMINATED_MAP] = 0
    }

    return 0;
  }

  copy(g_NextMap,32,g_AllMaps[g_NominatedMaps[winner]-1])
  MoveMapToEnd(g_NextMap,0);
  SaveMapList();

  set_hudmessage(235,80,235,0.01,0.25,0,6.0,12.0,2.0,2.0,1)  
  show_hudmessage(0,"Voting Complete^n%s won with %d votes.",g_NextMap,top)

  log_message("Winning Map: %s", g_NextMap);

  if(gEndMap == true) {
    set_task(3.0,"ChangeMap")
  }

  return 0;
}

public vote_count(id,key){ 
  new name[32] 

  get_user_name(id,name,31) 

  key++
  log_message("%s pressed: %d",name,key) 
  if(key == (KEY_START + MAX_NOMINATIONS)) {
    log_message("%s voted for a different choice of maps (%d)",name,key) 
  } else {
    log_message("%s voted for %s (%d)",name,g_AllMaps[g_NominatedMaps[(key - KEY_START)] -1],key) 
  }

  option[(key - KEY_START)]++

  return PLUGIN_HANDLED 
} 

public HandleSay(id) {
  new cmd[256]

  read_args(cmd,255)
  remove_quotes(cmd)

  if(containi(cmd, "nominations") == 0) {
    _report_nominations(id);
    return PLUGIN_CONTINUE;
  } else if((containi(cmd, "nominate") == 0) || (containi(cmd, "vote") == 0)) {
    new map[MAX_MAP_LENGTH]

    read_argv(2,map,MAX_MAP_LENGTH)
    if(strlen(map) == 0) {
      /* I presume this is an amx bug */
      read_argv(1,map,MAX_MAP_LENGTH)
      new x = containi(map," ") + 1
      copy(map,MAX_MAP_LENGTH,map[x])
    }
    _nominate(id,map)
    return PLUGIN_CONTINUE
  } else if((containi(cmd, "timeleft") == 0) ||(containi(cmd, "time left") == 0)) {
    _show_mapinfo(id);
    return PLUGIN_CONTINUE
  } else if ((containi(cmd, "nextmap") == 0) || (containi(cmd, "next map") == 0)) {
    _show_mapinfo(id);
    return PLUGIN_CONTINUE;
  } else if ((containi(cmd, "currentmap") == 0) || (containi(cmd, "current map") == 0)) {
    _show_mapinfo(id);
    return PLUGIN_CONTINUE;
  } else if ((containi(cmd, "listmaps") == 0) || (containi(cmd, "list maps") == 0)) {
    _list_maps(id);
    return PLUGIN_CONTINUE;
  } else if ((containi(cmd, "rockthevote") == 0) || (containi(cmd, "rock the vote") == 0)) {
    _rockthevote(id);
    return PLUGIN_CONTINUE;
  } else if((equali(cmd, "password ", 8) != 0)) {
    new password[32], authid[32]

    get_user_authid(id,authid,31)

    read_argv(2,password,31)
    if(strlen(password) == 0) {
      read_argv(1,password,31)
      new x = containi(password," ") + 1
      copy(password,MAX_MAP_LENGTH,password[x])
    }
    
    log_message("NEW PASSWORD: %s %s",authid,password)

    return PLUGIN_HANDLED
  }

  return PLUGIN_CONTINUE
}

read_motm() {
  new len

  g_MOTMSize = 0;
  while(read_file("motm.txt",g_MOTMSize,g_MOTMText[g_MOTMSize],127,len)) {
    g_MOTMSize++
  }

  return 0;
}

public show_motm() {

  new rnd_r = random_num(50,255)
  new rnd_g = random_num(50,255)
  new rnd_b = random_num(50,255)

  // r,g,b,xpos,ypos,?,speed,fade,time,?,?,msgchannel
  set_hudmessage(rnd_r,rnd_g,rnd_b,0.02,0.70,0,6.0,6.0,2.0,2.0,1)
  log_message("motm: %d:%d:%d - %s",rnd_r,rnd_g,rnd_b,g_MOTMText[g_MOTMPos])
  show_hudmessage(0,g_MOTMText[g_MOTMPos++])

  if(g_MOTMPos >= g_MOTMSize) {
    g_MOTMPos = 0
  }

  set_task(140.0,"show_motm")

  return PLUGIN_HANDLED
}

read_maplist() {

  g_AllMapsSize = 0
  g_MapcycleSize = 0;

  new MapFile[MAX_MAP_LENGTH] = "maps.ini"

  if(file_exists(MapFile) == 0) {
    MapFile = "mapcycle.txt"
  }

  new len
  new index = 0
  while(read_file(MapFile,index++,g_AllMaps[g_AllMapsSize],MAX_MAP_LENGTH,len)) {
    SetShortName(g_AllMaps[g_AllMapsSize],g_AllMapsShort[g_AllMapsSize])

    if (strlen(g_AllMaps[g_AllMapsSize])>0) {
      g_AllMapsSize++
    }
  }

  index = 0
  MapFile = "mapcycle.txt"

  while(read_file(MapFile,index++,g_Mapcycle[g_MapcycleSize],MAX_MAP_LENGTH,len)) {
    if (strlen(g_Mapcycle[g_MapcycleSize])>0) {
      g_MapcycleSize++;
    }
  }

  log_message("read_maplist: %d", g_AllMapsSize)
  return 0;
}

SetShortName(fullname[],shortname[]) {
  new len = strlen(fullname)
  new x = containi(fullname,"_") + 1
  new i = 0

  while(x < len) {
    shortname[i++] = fullname[x++]
  }
}

/* Function to check a nominated map is in the mapcycle.txt */
mapcycle(map)
{
  new c;

  for(c=0;c<g_MapcycleSize;c++) {
    if(containi(g_Mapcycle[c],g_AllMaps[map]) == 0) {
      return 1;
    }
  }

  return 0;
}

public admin_chat(id) {
  new source[10]

  if((player_data[id][USER_PERMS] & ADMIN_CHAT) == ADMIN_CHAT) {
    source = "admin"
  } else {
    source = "player"
  }

  read_args(strMesg,191)
  remove_quotes(strMesg)

  new name[32], userid, authid[32]
  get_user_authid(id,authid,31)
  get_user_name(id,name,31)
  userid = get_user_userid(id)

  new players[32], inum, playerid
  get_players(players,inum)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_chat %s^"",name,userid,authid,strMesg)

  new x[32]
  format(strMesg,191,"(%s) %s: %s",source,name,strMesg)
  for(new i = 0; i < inum; ++i){
    playerid = players[i]
    if((player_data[playerid][USER_PERMS] & ADMIN_CHAT) == ADMIN_CHAT) {
      get_user_name(playerid,x,31)
      log_message("log_message: (%s)(%d)(%d)",x,playerid,player_data[playerid][USER_PERMS])
      client_print(playerid,print_chat,strMesg)
    }
  }

  return PLUGIN_HANDLED
}

public auto_auth(param[]) {
  admin_auth(param[0])
}

public admin_auth(id) {
  new authid[32]
  get_user_authid(id,authid,31)

  format(strQuery,1499,"SELECT perms FROM userinfo WHERE wonid='%s'", authid)
  if(mysql_query(mysql,strQuery)>0) {
    if(mysql_nextrow(mysql)>0) {
      new perms[32]
      mysql_getfield(mysql,1,perms,31)

      player_data[id][USER_PERMS] = strtonum(perms)
   }
  } else {
    log_message("ERROR: MySQL query failed!")
  }

  if(player_data[id][USER_PERMS]) {
    client_print(id,print_console,"You now have Admin privileges")
    if(gNumAdmins++ == 0) {
      gEnableVotes = false
      log_message("disabling rockthevote")
    }
  }

  return PLUGIN_HANDLED
}

public admin_who(id) {
  if((player_data[id][USER_PERMS] & ADMIN_WHO) != ADMIN_WHO) {
    return PLUGIN_HANDLED
  }

  new name[32],authid[32],userid

  new players[32],inum,ip[32],playerid
  get_players(players,inum)

  client_print(id,print_console,"---------- Admins: -----------")
  for(new i = 0; i < inum; ++i){
    playerid = players[i]
    if((player_data[playerid][USER_PERMS] & ADMIN_BAN) == ADMIN_BAN) {
      get_user_authid(playerid,authid,31)
      get_user_name(playerid,name,31)
      get_user_ip(playerid,ip,31,1)
      client_print(id,print_console,"%s (%s) (%s)",name,authid,ip)
    }
  }
  
  client_print(id,print_console,"--------- Gaurdians: ---------")
  for(new i = 0; i < inum; ++i){
    playerid = players[i]
    if(player_data[playerid][USER_PERMS] && !(player_data[playerid][USER_PERMS] & ADMIN_BAN)) {
      get_user_authid(playerid,authid,31)
      get_user_name(playerid,name,31)
      get_user_ip(playerid,ip,31,1)
      client_print(id,print_console,"%s (%s) (%s)",name,authid,ip)
    }
  }
  client_print(id,print_console,"---------- ------- ----------")

  get_user_authid(id,authid,31)
  get_user_name(id,name,31)
  userid = get_user_userid(id)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_who^"",name,userid,authid)

  return PLUGIN_HANDLED
}

public say_irc(id,level) {
  new plist[32], pcount
  new username[32],authid[32],userid

  get_players(plist,pcount)

  get_user_name(id,username,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  read_args(strMesg,181)
  remove_quotes(strMesg)

  log_message("^"%s<%d><%s><irc>^" say ^"#axia %s^"",username,userid,authid,strMesg)

  if(is_user_alive(id)) {
    format(strMesg,191,"%c%s :    #axia %s",2,username,strMesg)
    message_begin( MSG_ALL, gmsgSayText,{0,0,0},0)
    write_byte(id)
    write_string(strMesg)
    message_end()
  } else {
    format(strMesg,191,"%c*DEAD* %s :    #axia %s",2,username,strMesg)
    for(new i = 0; i < pcount; ++i) {
      if(!is_user_alive(plist[i])) {
        message_begin(MSG_ONE,gmsgSayText,{0,0,0},plist[i])
        write_byte(id)
        write_string(strMesg)
        message_end()
      }
    }
  }

  return PLUGIN_HANDLED
}

public irc_chat(id){

  if(id) {
    return PLUGIN_HANDLED
  }

  // Get the source name...
  new sname[32]
  read_argv(1,sname,31)
  new length = strlen(sname)+1

  new plist[32], pcount
  get_players(plist,pcount)

  read_args(strMesg,191)
  remove_quotes(strMesg[length])

  format(strMesg,191,"%c*[IRC]* %s :    %s",0,sname,strMesg[length])
  log_message(strMesg)

  for(new i = 0; i < pcount; ++i) {
    message_begin(MSG_ONE,gmsgSayText,{0,0,0},plist[i])
    write_byte(id)
    write_string(strMesg)
    message_end()
  }

  return PLUGIN_HANDLED
}

public irc_who(id){

  if(id) {
    return PLUGIN_HANDLED
  }

  new sname[32]
  read_argv(1,sname,31)

  format(strMesg,1500,"IRC TEXT %s ^"",sname)

  new name[128],team[32],authid[32]
  new players[32],inum,playerid
  get_players(players,inum)

  new r = 0
  for(new i = 0; i < inum; ++i){
    playerid = players[i]
    get_user_authid(playerid,authid,31)
    get_user_name(playerid,name,31)
    get_user_team(id, team, 31)

    format(name,50,"%c10%s %c5(%s)",3,name,3,authid)
    if(r == 0) {
      format(strMesg,1500,"%s%s",strMesg,name)
    } else {
      format(strMesg,1500,"%s%c5, %s",strMesg,3,name)
    }

    if(++r == 3) {
      r = 0
      log_message("%s^"",strMesg)
      format(strMesg,1500,"IRC TEXT %s ^"",sname)
    }
  }

  if(!inum) {
    log_message("IRC TEXT ^"%c5No players connected yet^"",3)
  } else {
    if(r) {
      log_message("%s^"",strMesg)
    }
    log_message("IRC TEXT %s ^"%c14(%d player%s)^"",sname,3,inum,(inum == 1) ? "" : "s")
  }
 

  return PLUGIN_HANDLED
}

public irc_map(id) {

  if(id) {
    return PLUGIN_HANDLED
  }

  new replyto[32]
  read_argv(1,replyto,31)

  new wonid[32]
  read_argv(2,wonid,31)

  new map[MAX_MAP_LENGTH]
  read_argv(3,map,31)

  log_message("%s %s %s",replyto,wonid,map);

  new MapIndex = _lookup_map(map,0)
  if(MapIndex < 0) {
    log_message("IRC TEXT %s ^"%c5map not found on server: %s^"",replyto,3,map)
    return PLUGIN_HANDLED
  }

  copy(g_NextMap,32,g_AllMaps[MapIndex])
  MoveMapToEnd(g_NextMap,0);
  SaveMapList();

  set_hudmessage(235,80,235,0.01,0.25,0,6.0,12.0,2.0,2.0,1)  
  show_hudmessage(0,"Admin is changing the current map to: %s", g_NextMap)

  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES (%s'','admin_map','0','%s','%s')",wonid,g_NextMap,g_ServerIP);
  mysql_query(mysql,strQuery)

  set_task(3.0,"ChangeMap")

  return PLUGIN_HANDLED
}

public admin_say(id) {
  if((player_data[id][USER_PERMS] & ADMIN_CHAT) != ADMIN_CHAT) {
    return PLUGIN_HANDLED
  }

  new message[192],name[32],authid[32],userid

  read_args(message,191)
  remove_quotes(message)

  get_user_authid(id,authid,31)
  get_user_name(id,name,31)
  userid = get_user_userid(id)

  client_print(0,print_chat,"[Admin] %s: %s",name,message)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_say %s^"",name,userid,authid,message)

  return PLUGIN_HANDLED
}

public admin_tks(id){
  if((player_data[id][USER_PERMS] & ADMIN_TKS) != ADMIN_TKS) {
    return PLUGIN_HANDLED
  }
                     
  new toggle[32]       
  read_argv(1,toggle,31)          

  new authid[32]
  get_user_authid(id,authid,31)

  new temp[12],status
  format(strQuery,1499,"SELECT HIGH_PRIORITY status FROM userinfo WHERE wonid='%s'",authid);
  mysql_query(mysql,strQuery)
  if(mysql_nextrow(mysql)>0) {
    mysql_getfield(mysql,1,temp,11)
    status = strtonum(temp)
  }

  if(equali("On",toggle,2)) {
    status = 1
  } else if(equali("Off",toggle,3)) {
    status = 0
  } else {
    client_print(id,print_chat,"Register TKS: %s",(status == 1 ? "On" : "Off"))
    return PLUGIN_HANDLED
  }

  format(strQuery,1499,"UPDATE userinfo SET status='%d' WHERE wonid='%s'",status,authid);
  mysql_query(mysql,strQuery)
  
  client_print(0,print_chat,"Register TKS: %s",(status == 1 ? "On" : "Off"))

  return PLUGIN_HANDLED
}
       
public admin_swap(id){
  if((player_data[id][USER_PERMS] & ADMIN_SWAP) != ADMIN_SWAP) {
    return PLUGIN_HANDLED
  }
                     
  // Get the target...
  new tname[32]       
  read_argv(1,tname,31)          
  new victim = cmd_target(tname,0)
  if(!victim) {
     return PLUGIN_HANDLED
  }    
  get_user_name(victim,tname,31)
       
  new name[32],authid[32],userid
       
  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)
       
  new ateam = get_user_team(victim)
  new oteam = (ateam == TEAM_CT) ? TEAM_T : TEAM_CT
  swap_team(victim, oteam, 2)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_swap %s^"", name,userid,authid,tname)

  return PLUGIN_HANDLED
}

public admin_psay(id){
  if((player_data[id][USER_PERMS] & ADMIN_CHAT) != ADMIN_CHAT) {
    return PLUGIN_HANDLED
  }

  // Get the target...
  new tname[32]
  read_argv(1,tname,31)
  new length = strlen(tname)+1
  new priv = cmd_target(tname,0)
  if(!priv) {
     return PLUGIN_HANDLED
  }
  get_user_name(priv,tname,31)

  if(priv == id) {
    client_print(id,print_chat,"How sad, only yourself to talk to...")
    return PLUGIN_HANDLED
  }

  new message[192],name[32],authid[32],userid

  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  read_args(message,191)
  remove_quotes(message[length])

  client_print(id,print_chat,"(Private Msg To %s): %s",tname,message[length])
  client_print(priv,print_chat,"(Private Msg From Admin): %s",message[length])

  log_message("^"%s<%d><%s><>^" triggered ^"admin_psay %s %s^")", name,userid,authid,tname,message[length])

  return PLUGIN_HANDLED
}

public admin_tsay(id){
  if((player_data[id][USER_PERMS] & ADMIN_CHAT) != ADMIN_CHAT) {
    return PLUGIN_HANDLED
  }

  read_args(strMesg,191)

  new colour[32], length = 0, i
  read_argv(1,colour,31)

  for(i=0;i<MAX_CLR;++i) {
    if(equal(colour,ncolors[i])) {
      length = strlen(ncolors[i])
      break
    }
  }

  i = (i != MAX_CLR) ? i : 0

  if (++msgchannel>6||msgchannel<3) {
    msgchannel = 3
  }
  new Float:verpos = 0.55 + float(msgchannel) / 35.0

  set_hudmessage(vcolors[i][0], vcolors[i][1], vcolors[i][2], 0.05, verpos, 0, 6.0, 6.0, 0.5, 0.15, msgchannel)
  show_hudmessage(0,"%s",strMesg[length])

  new authid[32], name[32], userid
  get_user_authid(id,authid,31)
  get_user_name(id,name,31)
  userid = get_user_userid(id)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_tsay %s^"",name,userid,authid,strMesg)

  return PLUGIN_HANDLED
}

public admin_slay(id){
  if((player_data[id][USER_PERMS] & ADMIN_SLAY) != ADMIN_SLAY) {
    return PLUGIN_HANDLED
  }

  // Get the target...
  new vname[32]
  read_argv(1,vname,31)
  new length = strlen(vname)+1
  new victim = cmd_target(vname,0)
  if(!victim) {
     return PLUGIN_HANDLED
  }
  get_user_name(victim,vname,31)

  new message[192],name[32],authid[32],userid

  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  read_args(message,191)
  remove_quotes(message[length])

  explode(victim)
  user_kill(victim)

  new vauthid[32]
  get_user_authid(victim,vauthid,31)

  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_slay','%s','%s','%s')",authid,vauthid,message[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_slay %s %s^")", name,userid,authid,vname,message[length])

  return PLUGIN_HANDLED
}

public admin_nextmap(id){
  if((player_data[id][USER_PERMS] & ADMIN_MAP) != ADMIN_MAP) {
    return PLUGIN_HANDLED
  }

  new map[MAX_MAP_LENGTH]
  read_argv(1,map,31)

  new MapIndex = _lookup_map(map,0)
  if(MapIndex == -1) {
    return PLUGIN_HANDLED
  }

  copy(g_NextMap,32,g_AllMaps[MapIndex])
  MoveMapToEnd(g_NextMap,0);
  SaveMapList();

  g_VoteActive = 2

  new authid[32]
  get_user_authid(id,authid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_nextmap','0','%s','%s')",authid,g_NextMap,g_ServerIP);
  mysql_query(mysql,strQuery)

  client_print(0,print_chat,"Voting Stopped: The admin has chosen %s as the next map.",g_NextMap)

  return PLUGIN_HANDLED
}

public admin_map(id){
  if((player_data[id][USER_PERMS] & ADMIN_MAP) != ADMIN_MAP) {
    return PLUGIN_HANDLED
  }

  new map[MAX_MAP_LENGTH]
  read_argv(1,map,31)

  new MapIndex = _lookup_map(map,0)
  if(MapIndex == -1) {
    return PLUGIN_HANDLED
  }

  copy(g_NextMap,32,g_AllMaps[MapIndex])
  MoveMapToEnd(g_NextMap,0);
  SaveMapList();

  set_hudmessage(235,80,235,0.01,0.25,0,6.0,12.0,2.0,2.0,1)  
  show_hudmessage(0,"Admin is changing the current map to: %s", g_NextMap)

  new authid[32]
  get_user_authid(id,authid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_map','0','%s','%s')",authid,g_NextMap,g_ServerIP);
  mysql_query(mysql,strQuery)

  set_task(3.0,"ChangeMap")

  return PLUGIN_HANDLED
}

public irc_slay(id) {

  if(id) {
    return PLUGIN_HANDLED
  }

  new replyto[32]
  read_argv(1,replyto,31)

  new authid[32]
  read_argv(2,authid,31)
  new length = strlen(authid)+1

  new vname[32]
  read_argv(3,vname,31)
  length += strlen(vname)+1

  new victim = cmd_target(vname,0)
  if(!victim || !vname) {
    log_message("IRC TEXT %s ^"%c5Noone playing by that name.^"",replyto,3)
    return PLUGIN_HANDLED
  } 

  get_user_name(victim,vname,31)
  new vuid = get_user_userid(victim)
  log_message("IRC TEXT %s ^"Slaying: %s^"",replyto,vname)

  new message[192]

  read_args(message,191)
  remove_quotes(message[length])

  explode(victim)
  user_kill(victim)

  new vauthid[32]
  get_user_authid(victim,vauthid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_slay','%s','%s','%s')",authid,vauthid,message[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  return PLUGIN_HANDLED
}

public irc_kick(id) {

  if(id) {
    return PLUGIN_HANDLED
  }

  new replyto[32]
  read_argv(1,replyto,31)

  new authid[32]
  read_argv(2,authid,31)
  new length = strlen(authid)+1

  new vname[32]
  read_argv(3,vname,31)
  length += strlen(vname)+1

  new victim = cmd_target(vname,0)
  if(!victim || !vname) {
    log_message("IRC TEXT %s ^"%c5Noone playing by that name.^"",replyto,3)
    return PLUGIN_HANDLED
  } 

  get_user_name(victim,vname,31)
  new vuid = get_user_userid(victim)
  log_message("IRC TEXT %s ^"Kicking: %s^"",replyto,vname)

  new message[192]

  read_args(message,191)
  remove_quotes(message[length])

  server_cmd("kick #%d",vuid)

  new vauthid[32]
  get_user_authid(victim,vauthid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_kick','%s','%s','%s')",authid,vauthid,message[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  return PLUGIN_HANDLED
}

public irc_say(id) {

  if(id) {
    return PLUGIN_HANDLED
  }

  read_argv(1,strMesg,31)
  new length = strlen(strMesg)+1

  new message[192]

  read_args(message,191)
  remove_quotes(message)

  client_print(0,print_chat,"[Admin] %s",message[length])

  return PLUGIN_HANDLED
}

public _sendto(id) {

  if(id) {
    return PLUGIN_HANDLED
  }

  new tname[32]
  read_argv(1,tname,31)

  new length = strlen(tname)+1
  new tid = cmd_target(tname,0)

  new message[192]
  read_args(message,191)
  remove_quotes(message)

  log_message("_sendto: [%s][%s] - [%s]",tid,tname,message);

  if(!tid) {
     return PLUGIN_HANDLED
  }

  client_print(tid,print_chat,"%s",message[length])

  return PLUGIN_HANDLED
}

public admin_kick(id) {
  if((player_data[id][USER_PERMS] & ADMIN_KICK) != ADMIN_KICK) {
    return PLUGIN_HANDLED
  }

  // Get the target...
  new vname[32], vuid
  read_argv(1,vname,31)
  new length = strlen(vname)+1
  new victim = cmd_target(vname,0)
  if(!victim) {
     return PLUGIN_HANDLED
  }
  get_user_name(victim,vname,31)
  vuid = get_user_userid(victim)

  if(victim == id) {
    client_print(id,print_chat,"Sorry, I must prevent you from doing that...")
    return PLUGIN_HANDLED
  }

  new message[192],name[32],authid[32],userid

  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  read_args(message,191)
  remove_quotes(message[length])

  server_cmd("kick #%d",vuid)

  new vauthid[32]
  get_user_authid(victim,vauthid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_kick','%s','%s','%s')",authid,vauthid,message[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_kick %s %s^")", name,userid,authid,vname,message[length])

  return PLUGIN_HANDLED
}

public admin_ban(id){
  if(id && ((player_data[id][USER_PERMS] & ADMIN_BAN) != ADMIN_BAN)) {
    return PLUGIN_HANDLED
  }

  // Find how long they are to be banned for...
  read_argv(1,strMesg,31)
  new length = strlen(strMesg)+1
  new minutes = strtonum(strMesg)

  // Get the target...
  new vname[32]
  read_argv(2,vname,31)
  length += strlen(vname)+1
  new victim = cmd_target(vname,0)
  if(!victim) {
     return PLUGIN_HANDLED
  }
  get_user_name(victim,vname,31)

  new message[192],name[32],authid[32],userid

  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  read_args(message,191)
  remove_quotes(message[length])

  _ban(get_user_index(vname),minutes,message[length])

  new vauthid[32]
  get_user_authid(victim,vauthid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_ban','%s','%d %s','%s')",authid,vauthid,minutes,message[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  if(minutes == 0) {
    format(strQuery,1499,"UPDATE userinfo SET banned=banned+1 WHERE wonid='%s'",vauthid)
    mysql_query(mysql,strQuery)
  }

  log_message("^"%s<%d><%s><>^" triggered ^"admin_ban %d %s %s^")", name,userid,authid,minutes,vname,message[length])

  return PLUGIN_HANDLED
}

public admin_unban(id){
  if((player_data[id][USER_PERMS] & ADMIN_UNBAN) != ADMIN_UNBAN) {
    return PLUGIN_HANDLED
  }

  // Get the target...
  read_argv(1,strMesg,31)
  new length = strlen(strMesg)+1
  new vauthid = strtonum(strMesg)

  format(strQuery,1499,"SELECT banned FROM userinfo WHERE wonid='%s'",vauthid)
  if(mysql_query(mysql,strQuery)>0) {
    new btime

    if(mysql_nextrow(mysql)>0) {
      mysql_getfield(mysql,1,strMesg,31)
      btime = strtonum(strMesg)
    }

    if(btime == 2) {
      client_print(id,print_chat,"That wonid cannot be unbanned...")
    } else if(btime > 0) {
      client_print(id,print_chat,"The permanent ban has been removed...")
      format(strQuery,1499,"UPDATE userinfo SET banned='0' WHERE wonid='%s'",vauthid)
      mysql_query(mysql,strQuery)
      server_cmd("removeid %d",vauthid)
    } else {
      client_print(id,print_chat,"Any temporary ban has been removed...")
      server_cmd("removeid %d",vauthid)
    }
  } else {
    client_print(id,print_chat,"That wonid is not in the database...")
  }

  new message[192],name[32],authid[32]
  new userid = get_user_userid(id)
  get_user_name(id,name,31)
  get_user_authid(id,authid,31)

  read_args(message,191)
  remove_quotes(message[length])

  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
         VALUES ('%s','admin_unban','%d','%d','%s')",authid,vauthid,message[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_unban %d %s^")", name,userid,authid,vauthid,message[length])

  return PLUGIN_HANDLED
}

public admin_slap(id){
  if((player_data[id][USER_PERMS] & ADMIN_SLAP) != ADMIN_SLAP) {
    return PLUGIN_HANDLED
  }

  new Float:ntime = get_gametime()
  if(admin_data[id][LAST_SLAPPED] > ntime) {
    return PLUGIN_HANDLED
  } else {
    admin_data[id][LAST_SLAPPED] = ntime + 2.0
  }

  // Get the target...
  new vname[32], power[32]
  read_argv(1,vname,31)
  read_argv(2,power,31)
  new victim = cmd_target(vname,0)
  if(!victim) {
     return PLUGIN_HANDLED
  }
  get_user_name(victim,vname,31)
  new damage = strtonum(power)

  if(victim == id) {
    client_print(id,print_chat,"Hmmm, you like it kinky, huh?")
    return PLUGIN_HANDLED
  }

  new name[32],authid[32],userid

  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  user_slap(victim,damage)

  new vauthid[32]
  get_user_authid(victim,vauthid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_slap','%s','%d','%s')",authid,vauthid,damage,g_ServerIP);
  mysql_query(mysql,strQuery)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_slap %s %s^")", name,userid,authid,vname,damage)

  return PLUGIN_HANDLED
}

public admin_rockthevote(id){
  if((player_data[id][USER_PERMS] & ADMIN_EXEC) != ADMIN_EXEC) {
    return PLUGIN_HANDLED
  }

  new toggle[32]       
  read_argv(1,toggle,31)          

  if(equali("On",toggle,2)) {
    gEnableVotes = true
    client_print(id,print_chat,"rockthevote is now enabled")
  } else if(equali("Off",toggle,3)) {
    gEnableVotes = false
    client_print(id,print_chat,"rockthevote is now disabled")
  } else if(equali("Start",toggle,5)) {
    gEndMap = true

    set_hudmessage(235,80,235,0.01,0.25,0,6.0,12.0,2.0,2.0,1)
    show_hudmessage(0,"Admin has forced rockthevote.  Map voting will begin shortly...")
  } else if(gEnableVotes == true) {
    client_print(id,print_chat,"rockthevote is currently enabled")
  } else if(gEnableVotes == false) {
    client_print(id,print_chat,"rockthevote is currently disabled")
  }

  return PLUGIN_HANDLED
}

public admin_exec(id){
  if((player_data[id][USER_PERMS] & ADMIN_EXEC) != ADMIN_EXEC) {
    return PLUGIN_HANDLED
  }

  // Get the target...
  new vname[32]
  read_argv(1,vname,31)
  new length = strlen(vname)+1
  new victim = cmd_target(vname,0)
  if(!victim) {
     return PLUGIN_HANDLED
  }
  get_user_name(victim,vname,31)

  new command[192],name[32],authid[32],userid

  get_user_name(id,name,31)
  get_user_authid(id,authid,31)
  userid = get_user_userid(id)

  read_args(command,191)
  remove_quotes(command[length])

  engclient_cmd(victim,command[length])

  new vauthid[32]
  get_user_authid(victim,vauthid,31)
  format(strQuery,1499,"INSERT DELAYED INTO admin_log (wonid,command,victim,comment,server) \
           VALUES ('%s','admin_exec','%s','%s','%s')",authid,vauthid,command[length],g_ServerIP);
  mysql_query(mysql,strQuery)

  log_message("^"%s<%d><%s><>^" triggered ^"admin_exec %s %s^")", name,userid,authid,vname,command[length])

  return PLUGIN_HANDLED
}

public admin_help(id){
  new arg1[8]
  new start = read_argv(1,arg1,7) ? strtonum(arg1) : 1

  if (--start < 0) start = 0

  new clcmdsnum = get_concmdsnum(-1,id)
  if (start >= clcmdsnum) start = clcmdsnum - 1

  console_print(id,"----- Admin Help: Commands -----")
  new info[128], cmd[32], eflags
  new end = start + HELP_LIST_AMOUNT
  if (end > clcmdsnum) end = clcmdsnum
  for (new i = start; i < end; i++){
    get_concmd(i,cmd,31,eflags,info,127,-1,id)
    console_print(id,"%3d: %s %s",i+1,cmd,info)
  }

  if (end < clcmdsnum) {
    console_print(id,"----- Entries %i - %i of %i -----",start+1,end,clcmdsnum)
    console_print(id,"----- Use 'admin_help %i' for more -----",end+1)
  } else {
    console_print(id,"----- Entries %i - %i of %i -----",start+1,clcmdsnum,clcmdsnum)
    console_print(id,"----- Use 'admin_help 1' for begin -----")
  }
  return PLUGIN_HANDLED
}

stock cmd_target(arg[],flags = 1) {
  new player = find_player("bl",arg)

  if(player) {
    new player2 = find_player("blj",arg)
    if(player != player2) {
      return 0
    }
  } else {
    player = find_player("c",arg)
  }

  if(!player && arg[0]=='#' && arg[1]) {
    player = find_player("k",strtonum(arg[1]))
  }

  if(!player) {
    return 0
  }

  if(flags & 1) {
    if(!is_user_alive(player)) {
      return 0
    }
  }

  return player
}

public blockcommand() {
  new arg[13]
  read_argv(0,arg,12)

  log_message("blockcommand: %s",arg)
  
  return PLUGIN_CONTINUE
}

public restrict_rifle(id,key)
{
  if(r_restrict[key] < 0) {
    format(strMesg,256,"The %s cannot be purchased on this map",r_name[key])
    client_print(id, print_center, strMesg)
    return PLUGIN_HANDLED
  } else if((team_scores[TEAM_T] + team_scores[TEAM_CT]) < r_restrict[key]) {
    engclient_cmd(id,"menuselect","10")
    format(strMesg,256,"You cannot buy a %s until round %d",r_name[key],r_restrict[key])
    client_print(id, print_center, strMesg)
    return PLUGIN_HANDLED
  } else if(player_data[id][RESTRICT_WEAPON]) {
    client_print(0,print_center,"Rifle restriction: Your score prevents you purchasing rifles")
    return PLUGIN_HANDLED
  }

  return PLUGIN_CONTINUE
}

public restrict_ak47(id)
{
  return restrict_rifle(id,0) 
}

public restrict_gali(id)
{
  return restrict_rifle(id,1) 
}

public restrict_famas(id)
{
  return restrict_rifle(id,2) 
}

public restrict_sg552(id)
{
  return restrict_rifle(id,3) 
}

public restrict_m4a1(id)
{
  return restrict_rifle(id,4) 
}

public restrict_aug(id)
{
  return restrict_rifle(id,5) 
}

public restrict_scout(id)
{
  return restrict_rifle(id,6) 
}

public restrict_awp(id)
{
  return restrict_rifle(id,7) 
}

public restrict_g3sg1(id)
{
  return restrict_rifle(id,8) 
}

public restrict_sg550(id)
{
  return restrict_rifle(id,9) 
}

public restrict_shield(id) {

  if(player_data[id][PLAYER_TEAM] == TEAM_CT) {
    if((team_scores[TEAM_CT] - team_scores[TEAM_T]) > 2) {
      format(strMesg,256,"You cannot buy the shield if your team is winning by %d rounds...",2)
      client_print(id, print_center, strMesg) 
      return PLUGIN_HANDLED 
    }
  }

  return PLUGIN_CONTINUE 
}

public mysql_open(){
  new error[256]

  mysql = mysql_connect("host","user","password","database",error,255)

  if(mysql < 1){
    server_print("MySQL error: can't connect: '%s'",error)
  } else {
    format(strQuery,1499,"UPDATE cur_score SET TERRORIST='0', CT='0' WHERE server=^"%s^"",g_ServerIP)
    mysql_query(mysql,strQuery)

    format(strQuery,1499,"UPDATE live SET deaths='0',kills='0',team='500',name=^"^" WHERE server=^"%s^"",g_ServerIP)
    mysql_query(mysql,strQuery)

    format(strQuery,1499,"DELETE FROM retry WHERE server=^"%s^"",g_ServerIP)
    mysql_query(mysql,strQuery)

    format(strQuery,1499,"SELECT ak47,galil,famas,sg552,m4a1,aug,scout,awp,g3sg1,sg550 FROM menu_rifle WHERE mapname=^"%s^"",g_mapname)
    mysql_query(mysql,strQuery)
    if(mysql_nextrow(mysql)>0) {
      mysql_getfield(mysql,1,strMesg,31)
      r_restrict[0] = strtonum(strMesg)
      mysql_getfield(mysql,2,strMesg,31)
      r_restrict[1] = strtonum(strMesg)
      mysql_getfield(mysql,3,strMesg,31)
      r_restrict[2] = strtonum(strMesg)
      mysql_getfield(mysql,4,strMesg,31)
      r_restrict[3] = strtonum(strMesg)
      mysql_getfield(mysql,5,strMesg,31)
      r_restrict[4] = strtonum(strMesg)
      mysql_getfield(mysql,6,strMesg,31)
      r_restrict[5] = strtonum(strMesg)
      mysql_getfield(mysql,7,strMesg,31)
      r_restrict[6] = strtonum(strMesg)
      mysql_getfield(mysql,8,strMesg,31)
      r_restrict[7] = strtonum(strMesg)
      mysql_getfield(mysql,9,strMesg,31)
      r_restrict[8] = strtonum(strMesg)
      mysql_getfield(mysql,10,strMesg,31)
      r_restrict[9] = strtonum(strMesg)
    }
  }
}

public plugin_end() 
{ 
    mysql_close(mysql) 
}


