/* AMX Mod X script. 
* 
* Drop AWP with Team Limit and Win limit v1.5 (CS & CS:CZ) 
* By SuicideDog & MattOG
*
* Modded orignal from JustinHoMi 
*
*Up-To Version 0.5: SuicideDog & JustinHoMi
*******************************************
*
*
* VERSION: 1.0: MattOG
**********************
*
* Combined all 3 plugins (g3sg1/sg550/awp limit) into one.
* Added seperate commands to control Auto's and Awps. (different limits/rounds)
* Fixed bug with old-style menu's still being able to buy guns. (Credit to bAnTAi, I used his Y.A.S.C. plugin to help with the code).
*
* I didn't make it stop bots:
* 1. All bots come with built in weapon restrictions.
* 2. Bots tend not to be AWP whores  ;)
*
*
* VERSION 1.1: MattOG
*********************
* Changed Maxawps/autos and winspreads to cvars to enable on-the-fly changing, and to allow changes to be set in server/amxx/map configs.
*
*
* VERSION: 1.2: MattOG
**********************
*
* Minor bug fix where old style menu's couldn't buy at all. (Thanks to Olie for pointing it out).
*
*
* VERSION: 1.3: SuicideDog/DaSoul
**********************
*
* Added DaSoul's code to allow it to work with PTB correctly
*
* VERSION: 1.4: KWo
**********************
*
* Little bug fixes causing Run Time Errors etc...
* Blocking pickup limited weapon
* Bots are affected by this plugin, too but it doesn't prevent them from buying (they drop limited weapons after buying)
* Optimized usage of cvars by using pcvar functions.
*
*
*
*
* VERSION: 1.5: KWo
*
* Added support for team balancing (if someone has an awp or auto sniper and get switched alive to the opposite team)
*
*
**********************

* COMMANDS:
***********
*
* max_awps <xx> - Maximum Awps Allowed
* max_autos <xx> - Maximum Autos Allowed
* winspread_awp <xx> - When This Many Rounds Ahead, No Awps Allowed
* winspread_auto <xx> - When This Many Rounds Ahead, No Autos Allowed
* autolimit <1/0> - 1 = Restrict Auto, 0 = Don't
* awplimit <1/0> - 1 = Restrict Awp, 0 = Don't
* checkrebuy <1/0> - 1 = Prevent Rebuy Command, 0 = Don't
*
* TIPS:
*     To ALWAYS restrict to X number of awps/autos set winspread_awp/auto to 0 and max_awps/autos to however many awps/autos
*	   To ONLY restrict after X number of rounds ahead, set max_awps/autos to 20 and winspread_awp/autos to however many rounds
*
* KNOWN BUG/ISSUES:
************
* Updating the CVARS in game will only take effect after the following round has finished.
* Bots can buy limitted weapon, but they drop it immediatelly after buying. They cannot pickup dropped limited weapons 
* (like human players), so it's not a big issue.
*
* TO DO:
********
* Dunno, you tell me  ;)  Possibly will look at that following round thing, though it isn't too much hassle so I may not bother. You Decide.
*
*/

#include <amxmodx> 
#include <fakemeta>

new plist[33] = { 0, ... }   // 0 = no awp; 1 = carrying awp 
new plist2[33] = {0, ... }   // 0 = no auto; 1 = carrying auto
new awp_count[3]         // 1 = T; 2 = CT 
new auto_count[3]        // 1 = T; 2 = CT
new ctscore = 0 
new tscore = 0 
new pl_team[33] 

/* PCvars */
new pv_awplimit
new pv_max_awps
new pv_winspread_awp
new pv_autolimit
new pv_max_autos
new pv_winspread_auto
new pv_checkrebuy

/* handles restricting the menu */
public menu_awp(id,key)
{
	if (get_pcvar_num(pv_awplimit) != 1) return PLUGIN_CONTINUE
	
	new team = get_user_team(id)
	new winspread_awp = get_pcvar_num(pv_winspread_awp)
	if (((team == 2 && ctscore-tscore >= winspread_awp) || (team == 1 && tscore-ctscore >= winspread_awp))
		&& winspread_awp)
	{
		engclient_cmd(id,"menuselect","10")
		client_print(id,print_center,"You are on the winning team and cannot use AWP's")
		return PLUGIN_HANDLED
	}

	if (awp_count[team] >= get_pcvar_num(pv_max_awps))
	{
		engclient_cmd(id,"menuselect","10")
		client_print(id,print_center,"Too many people on your team have AWP's")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

/* handles restricting the menu */
public menu_auto(id,key)
{
	if (get_pcvar_num(pv_autolimit) != 1) return PLUGIN_CONTINUE

	new team = get_user_team(id)
	new winspread_auto = get_pcvar_num(pv_winspread_auto)
	if (((team == 2 && ctscore-tscore >= winspread_auto) || (team == 1 && tscore-ctscore >= winspread_auto))
		&& winspread_auto)
	{
		engclient_cmd(id,"menuselect","10")
		client_print(id,print_center,"You are on the winning team and cannot use AUTO's")
		return PLUGIN_HANDLED
	}

	if (auto_count[team] >= get_pcvar_num(pv_max_autos))
	{
		engclient_cmd(id,"menuselect","10")
		client_print(id,print_center,"Too many people on your team have AUTO's")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

/* handles if they script the AWP buy*/
public cmdawp(id)
{
	if (get_pcvar_num(pv_awplimit) != 1) return PLUGIN_CONTINUE

	new team = get_user_team(id)

	if ((team < 1) || (team > 2)) return PLUGIN_CONTINUE
	new winspread_awp = get_pcvar_num(pv_winspread_awp)
	if (((team == 2 && ctscore-tscore >= winspread_awp) || (team == 1 && tscore-ctscore >= winspread_awp))
		&& winspread_awp)
	{
		client_print(id,print_center,"You are on the winning team and cannot use AWP's")
		return PLUGIN_HANDLED
   }

	new name[32]
	get_user_name(id,name,31)
	if (awp_count[team] >= get_pcvar_num(pv_max_awps))
	{
		client_print(id,print_center,"Too many people on your team have AWP's")
//		client_print(id,print_chat,"You are about to buy an awp. There was currently %d awps in Your team %d - too many to buy.", awp_count[team], team)
//		log_message("The player %s was about to buy an awp. There was %d awps in his team %d - too many to buy.", name, awp_count[team], team)
		return PLUGIN_HANDLED
	}
//	client_print(id,print_chat,"You are about to buy an awp. There was currently %d awps in Your team before You bought it.", awp_count[team])
//	log_message("The player %s is about to buy an awp. There was %d awps in his team %d before he bought it.", name, awp_count[team], team)
	
	return PLUGIN_CONTINUE
}

/* handles if they script the AUTO buy*/ 
public cmdauto(id) 
{ 
	if (get_pcvar_num(pv_autolimit) != 1) return PLUGIN_CONTINUE
	new team = get_user_team(id) 
	new winspread_auto = get_pcvar_num(pv_winspread_auto)
	if (((team == 2 && ctscore-tscore >= winspread_auto) || (team == 1 && tscore-ctscore >= winspread_auto))
		&& winspread_auto)
	{
		client_print(id,print_center,"You are on the winning team and cannot use AUTO's")
		return PLUGIN_HANDLED
	}

	if (auto_count[team] >= get_pcvar_num(pv_max_autos))
	{
		client_print(id,print_center,"Too many people on your team have AUTO's")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

/* handles when a player drops his weapon */ 
public handle_drop_weapon(id)
{
	new tmp1,tmp2 
	new curweapon = get_user_weapon(id,tmp1,tmp2)
	new team = get_user_team(id)
	
/* handles when a player drops their awp */	
	if (curweapon == CSW_AWP)
	{
		if (get_pcvar_num(pv_awplimit) != 1)
			return PLUGIN_CONTINUE

		if ((plist[id]==1) && (awp_count[team] > 0))
			awp_count[team]--
		plist[id] = 0			
		return PLUGIN_CONTINUE
   }
/* handles when a player drops his auto */ 
	else if ((curweapon == CSW_SG550) || (curweapon == CSW_G3SG1))
	{
		if (get_pcvar_num(pv_autolimit) != 1)
			return PLUGIN_CONTINUE

		if ((plist2[id]==1) && (auto_count[team] > 0))
			auto_count[team]--
		plist2[id] = 0
		return PLUGIN_CONTINUE
   }
	return PLUGIN_CONTINUE
} 


/* handles when a player picks up an awp */ 
public handle_pickup_awp(id)
{ 
	if (get_pcvar_num(pv_awplimit) != 1) return PLUGIN_CONTINUE

	new team = get_user_team(id)
	new winspread_awp = get_pcvar_num(pv_winspread_awp)
	if (((team == 2 && ctscore-tscore >= winspread_awp) || (team == 1 && tscore-ctscore >= winspread_awp))
		&& winspread_awp)
	{
		client_print(id,print_center,"You are on the winning team and cannot use AWP's")
		set_task(0.5, "drop_awp", id)
//		engclient_cmd(id, "drop", "weapon_awp")
//		client_cmd(id,"weapon_awp;wait;wait;wait;drop")
		return PLUGIN_CONTINUE
   } 

	new name[32]
	get_user_name(id,name,31)
	if (awp_count[team] >= get_pcvar_num(pv_max_awps)) 
   { 
		client_print(id,print_center,"Too many people on your team have AWP's")
//		log_message("The player %s bought or picked-up an awp. There is %d awps in his %d team. He should drop it.", name, awp_count[team], team)
		set_task(0.5, "drop_awp", id)
//		engclient_cmd(id, "drop", "weapon_awp")
//		client_cmd(id,"weapon_awp;wait;wait;wait;drop")
		return PLUGIN_CONTINUE
	} 
	else
	{
		plist[id] = 1
		awp_count[team]++
//		client_print(id,print_chat,"You have bought or picked-up an awp. There is %d awps in Your team.", awp_count[team])
//		log_message("The player %s bought or picked-up an awp. There is %d awps in his team %d.", name, awp_count[team], team)
	}
	return PLUGIN_CONTINUE 
}

public drop_awp(id)
{
	engclient_cmd(id, "drop", "weapon_awp")
}

/* handles when a player picks up a g3sg1 */ 
public handle_pickup_g3sg1(id)
{
	if (get_pcvar_num(pv_autolimit) != 1) return PLUGIN_CONTINUE

	new team = get_user_team(id)
	new winspread_auto = get_pcvar_num(pv_winspread_auto)
	if (((team == 2 && ctscore-tscore >= winspread_auto) || (team == 1 && tscore-ctscore >= winspread_auto))
		&& winspread_auto)
	{  
		client_print(id,print_center,"You are on the winning team and cannot use AUTO's")
		set_task(0.5, "drop_g3sg1", id)
//		engclient_cmd(id, "drop", "weapon_g3sg1")
//		client_cmd(id,"weapon_g3sg1;weapon_sg550;wait;wait;wait;drop")
		return PLUGIN_CONTINUE
	}

	if (auto_count[team] >= get_pcvar_num(pv_max_autos))
	{
		client_print(id,print_center,"Too many people on your team have AUTO's")
		set_task(0.5, "drop_g3sg1", id)		
//		engclient_cmd(id, "drop", "weapon_g3sg1")
//		client_cmd(id,"weapon_g3sg1;weapon_sg550;wait;wait;wait;drop")
		return PLUGIN_CONTINUE
	}
	else
	{
		plist2[id] = 1
		auto_count[team]++
	}
	return PLUGIN_CONTINUE 
}

public drop_g3sg1(id)
{
	engclient_cmd(id, "drop", "weapon_g3sg1")
}

/* handles when a player picks up a sg550 */ 
public handle_pickup_sg550(id)
{
	if (get_pcvar_num(pv_autolimit) != 1) return PLUGIN_CONTINUE

	new team = get_user_team(id)
	new winspread_auto = get_pcvar_num(pv_winspread_auto)
	if (((team == 2 && ctscore-tscore >= winspread_auto) || (team == 1 && tscore-ctscore >= winspread_auto))
		&& winspread_auto)
	{  
		client_print(id,print_center,"You are on the winning team and cannot use AUTO's")
		set_task(0.5, "drop_sg550", id)
//		engclient_cmd(id, "drop", "weapon_sg550")
//		client_cmd(id,"weapon_g3sg1;weapon_sg550;wait;wait;wait;drop")
		return PLUGIN_CONTINUE
	}

	if (auto_count[team] >= get_pcvar_num(pv_max_autos))
	{
		client_print(id,print_center,"Too many people on your team have AUTO's")
		set_task(0.5, "drop_sg550", id)
//		engclient_cmd(id, "drop", "weapon_sg550")
//		client_cmd(id,"weapon_g3sg1;weapon_sg550;wait;wait;wait;drop")
		return PLUGIN_CONTINUE
	}
	else
	{
		plist2[id] = 1
		auto_count[team]++
	}
	return PLUGIN_CONTINUE 
}

public drop_sg550(id)
{
	engclient_cmd(id, "drop", "weapon_sg550")
}

/* removes awp and auto when player dies */ 
public handle_death() 
{
	if ((get_pcvar_num(pv_awplimit) != 1) && (get_pcvar_num(pv_autolimit) != 1))
		return PLUGIN_CONTINUE 
  
	new idx = read_data(2)
	
	if (plist[idx] == 1)
	{
		new team = get_user_team(idx)
		if (awp_count[team] > 0)
			awp_count[team]--
		plist[idx] = 0
	}
	if (plist2[idx] == 1)
	{
		new team = get_user_team(idx)
		if (auto_count[team] > 0)
			auto_count[team]--
		plist2[idx] = 0
	}
	return PLUGIN_CONTINUE
}

/* clear vars when player connects */ 
public client_connect(id)
{
	plist[id] = 0
	plist2[id] = 0
	return PLUGIN_CONTINUE
}

/* clear vars when player disconnects */ 
public client_disconnect(id)
{
	if (plist[id] == 1)
	{
		new team = get_user_team(id)
		if (awp_count[team] > 0)
			awp_count[team]--
	} 
	if (plist2[id] == 1)
	{
		new team = get_user_team(id)
		if (auto_count[team] > 0)
			auto_count[team]--
	}
	plist[id] = 0
	plist2[id] = 0

	return PLUGIN_CONTINUE
}

public team_score()
{ 
	if ((get_pcvar_num(pv_awplimit) != 1) && (get_pcvar_num(pv_autolimit) != 1))
		return PLUGIN_CONTINUE

	new team[32]
	read_data(1,team,32)

	if (equal(team,"CT"))
	{ 
		ctscore = read_data(2)
	}
	else if (equal(team,"TERRORIST"))
	{
		tscore = read_data(2)
	}
	return PLUGIN_CONTINUE
} 

public check_winning_team(id) 
{ 
	if ((get_pcvar_num(pv_awplimit) != 1) && (get_pcvar_num(pv_autolimit) != 1)) return PLUGIN_CONTINUE
	if (!id || id > get_maxplayers()) return PLUGIN_CONTINUE
	
	new team = get_user_team(id) 
	if (plist[id] == 1) 
	{
		new winspread_awp = get_pcvar_num(pv_winspread_awp)
		if (((team == 2 && ctscore-tscore >= winspread_awp) || (team == 1 && tscore-ctscore >= winspread_awp))
			&& winspread_awp)
		{
			client_print(id,print_center,"You are on the winning team and cannot use AWP's")
			engclient_cmd(id, "drop", "weapon_awp")
//			client_cmd(id,"weapon_awp;wait;wait;wait;drop")
			return PLUGIN_CONTINUE
		}
		return PLUGIN_CONTINUE
	}
	if (plist2[id] == 1) 
	{
		new winspread_auto = get_pcvar_num(pv_winspread_auto)
		if (((team == 2 && ctscore-tscore >= winspread_auto) || (team == 1 && tscore-ctscore >= winspread_auto))
			&& winspread_auto)
		{
			client_print(id,print_center,"You are on the winning team and cannot use AUTO's")
			new iwpn, iwpns[32], nwpn[32]
			get_user_weapons(id, iwpns, iwpn)
			for (new a = 0; a < iwpn; ++a)
			{
				get_weaponname(iwpns[a], nwpn, 31)
				if (equali(nwpn,"weapon_g3sg1") || equali(nwpn,"weapon_sg550"))
					engclient_cmd(id, "drop", nwpn)
			}
			return PLUGIN_CONTINUE
		}
		return PLUGIN_CONTINUE
	}
	return PLUGIN_CONTINUE
}


/*
* 1 = T's: AWP Key 4, AUTOSNIPER Key 5
* 2 = CT's: AWP Key 5, AUTOSNIPER Key 4
*/
public via_me(id,key)
{
	new team = get_user_team(id)

	if ((team==1 && key==5) || (team==2 && key==4))
		menu_auto(id, key)
	if ((team==1 && key==4) || (team==2 && key==5))
		menu_awp(id, key)

	return PLUGIN_CONTINUE
}

public check_rebuy(id)
{
	if (get_pcvar_num(pv_checkrebuy) != 1) return PLUGIN_CONTINUE
	client_print(id,print_center,"Sorry Rebuy command is blocked on this server")

	return PLUGIN_HANDLED
}

public total_snipers()
{
	new players[32], numPlayerCount, idxPlayer
	
	// 1 = T; 2 = CT 
	awp_count[1] = 0
	auto_count[1] = 0

	get_players(players, numPlayerCount,"he","TERRORIST")
	for(idxPlayer = 0; idxPlayer < numPlayerCount; idxPlayer++)
	{
		new Weapons[32]
		new numWeapons, i
		get_user_weapons(players[idxPlayer], Weapons, numWeapons)
		plist[players[idxPlayer]] = 0
		plist2[players[idxPlayer]] = 0
		for (i=0; i<numWeapons; i++)
		{
			if (Weapons[i] == CSW_AWP)
			{
				plist[players[idxPlayer]] = 1
				awp_count[1]++
			}
			if ((Weapons[i] == CSW_G3SG1) || (Weapons[i] == CSW_SG550))
			{
				plist2[players[idxPlayer]] = 1
				auto_count[1]++
			}
		} 
	} 

	awp_count[2] = 0
	auto_count[2] = 0
	
	get_players(players, numPlayerCount,"he","CT")
	for(idxPlayer = 0; idxPlayer < numPlayerCount; idxPlayer++)
	{
		new Weapons[32]
		new numWeapons, i
		get_user_weapons(players[idxPlayer], Weapons, numWeapons)
		plist[players[idxPlayer]] = 0
		plist2[players[idxPlayer]] = 0		
		for (i=0; i<numWeapons; i++)
		{
			if (Weapons[i] == CSW_AWP)
			{
				plist[players[idxPlayer]] = 1
				awp_count[2]++
			}
			if ((Weapons[i] == CSW_G3SG1) || (Weapons[i] == CSW_SG550))
			{
				plist2[players[idxPlayer]] = 1
				auto_count[2]++
			}
		} 
	} 
}

public round_start()
{
	total_snipers()
	return PLUGIN_CONTINUE  
}

public hook_touch(ptr, ptd)
{
	new ptrClass[32]
	new ptdClass[32]
	new ptrModel[128]
	new team

	if ((get_pcvar_num(pv_awplimit) != 1) && (get_pcvar_num(pv_autolimit) != 1))
		return PLUGIN_CONTINUE

	if (ptd > get_maxplayers() || ptd < 1 || ptr < 1 )
		return PLUGIN_CONTINUE
		
	if ( (!pev_valid(ptr)) || (!pev_valid(ptd)) )
		return PLUGIN_CONTINUE

	if (!is_user_connected(ptd))
		return PLUGIN_CONTINUE

	pev(ptr, pev_classname, ptrClass, 31)
	pev(ptr, pev_model, ptrModel, 127)
	pev(ptd, pev_classname, ptdClass, 31)
	
	if (!equal(ptrClass, "weaponbox"))
		return PLUGIN_CONTINUE
	
	if (equal(ptdClass, "player"))
	{
		team = get_user_team(ptd)
		
		if (equal(ptrModel, "models/w_awp.mdl"))
		{
			if (awp_count[team] >= get_pcvar_num(pv_max_awps))
			{
				client_print(ptd,print_center,"Too many people on your team have AWP's")
				return FMRES_SUPERCEDE
			}

			new winspread_awp = get_pcvar_num(pv_winspread_awp)
			if (((team == 2 && ctscore-tscore >= winspread_awp) || (team == 1 && tscore-ctscore >= winspread_awp))
				&& winspread_awp)
			{
				client_print(ptd,print_center,"You are on the winning team and cannot use AWP's")
				return FMRES_SUPERCEDE
			}

			return PLUGIN_CONTINUE
		}
		if ((equal(ptrModel, "models/w_g3sg1.mdl")) || (equal(ptrModel, "models/w_sg550.mdl")))
		{
			if (auto_count[team] >= get_pcvar_num(pv_max_autos))
			{
				client_print(ptd,print_center,"Too many people on your team have AUTO's")
				return FMRES_SUPERCEDE
			}

			new winspread_auto = get_pcvar_num(pv_winspread_auto)
			if (((team == 2 && ctscore-tscore >= winspread_auto) || (team == 1 && tscore-ctscore >= winspread_auto))
				&& winspread_auto)
			{
				client_print(ptd,print_center,"You are on the winning team and cannot use AUTO's")
				return FMRES_SUPERCEDE
			}
			return PLUGIN_CONTINUE
		}
	}	
	return PLUGIN_CONTINUE
}

public team_assign() 
{
	new arg[2], team
	new id = read_data(1)
	read_data(2,arg,1)
	if ( arg[0] == 'C'  )
		team = 2
	else if ( arg[0] == 'T' )
		team = 1
	else
		team = 0

	if (!is_user_connected(id) || !is_user_alive(id) || (!plist[id] && !plist2[id]) 
		|| (pl_team[id] == team))
	{
		pl_team[id] = team
		return PLUGIN_CONTINUE
	}
	pl_team[id] = team
	total_snipers()
	new name[32]
	get_user_name(id,name,31)
/*
	if (plist[id]) 
   { 
		client_print(id,print_center,"You had an awp and got transferred alive to the new team.")
		log_message("The player %s with an awp changed the team alive. There is now %d awps for team 1 and %d for team 2.", 
			name, awp_count[1], awp_count[2])
	}
*/
	return PLUGIN_CONTINUE
}


public plugin_init()
{
	register_plugin("AWP/AUTO Limit (Team/Win)","1.5","SuicideDog/MattOG/DaSoul")
	register_menucmd(-31,(1<<4),"via_me" )                                    //  T: AWP, CT: Sig SG-550 Sniper       - VGUI
	register_menucmd(-31,(1<<5),"via_me" )                                    // CT: AWP, T:  H&K G3SG-1 Sniper Rifle - VGUI
	register_menucmd(register_menuid("BuyRifle",1),(1<<4),"via_me" )          //  T: AWP, CT: Sig SG-550 Sniper       - STANDARD
	register_menucmd(register_menuid("BuyRifle",1),(1<<5),"via_me" )          // CT: AWP, T:  H&K G3SG-1 Sniper Rifle - STANDARD
	register_clcmd("drop","handle_drop_weapon")

	register_clcmd("awp","cmdawp") 
	register_clcmd("magnum","cmdawp")
	register_clcmd("g3sg1","cmdauto")
	register_clcmd("d3au1","cmdauto")
	register_clcmd("sg550","cmdauto")
	register_clcmd("krieg550","cmdauto")
	register_clcmd("rebuy","check_rebuy")

	pv_awplimit = register_cvar("awplimit","1")
	pv_autolimit = register_cvar("autolimit","1")
	pv_checkrebuy = register_cvar("checkrebuy","1")
	pv_max_awps = register_cvar("max_awps","2")
	pv_max_autos = register_cvar("max_autos","1")
	pv_winspread_awp = register_cvar("winspread_awp","3")
	pv_winspread_auto = register_cvar("winspread_auto","2")

	register_event("TeamScore", "team_score", "a")
	register_event("TeamInfo","team_assign","a")
	register_event("WeapPickup","handle_pickup_awp","b","1=18") 
	register_event("WeapPickup","handle_pickup_sg550","b","1=13") 
	register_event("WeapPickup","handle_pickup_g3sg1","b","1=24") 
	register_event("DeathMsg","handle_death","a") 

	register_event("ResetHUD","check_winning_team","b") 

	register_logevent("round_start", 2, "1=Round_Start")
	register_forward(FM_Touch, "hook_touch")
}