#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>
#include <fakemeta>
#include <cstrike>
#include <fun>
#if AMXX_VERSION_NUM < 183
	#include <colorchat>
	#define MAX_PLAYERS 32
#else
	#define GREEN 0
#endif
#include <fakemeta_util>
#include <fun>

#define EXTRAOFFSET_WEAPONS 4
#define OFFSET_CLIPAMMO 51

#define menunev "\y[*-derbY-*] \wRULI/KÉS" // a menü első sora (név)
#define szamszin "\r" // fehér
#define szoveg1 "^1Megöltél egy CT-t ezért visszatöltöttük a hp-d ^3100-ra^1!" //Ha a t megöl egy ct-t ezt az üzenetet kapja!
#define szoveg3 "^3FreeRun van! ^1Ilyenkor nem használhatsz csapdákat!" // feerunkor ha a ct gombot nyom ezt az üzenetet kapja!
#define szoveg4 "^1Ezt a csapdát már használtad!" // ha nincs freerun és a ct már használta azt a csapdát ezt az üzenetet kapja
#define szoveg5 "^1Vigyázz CT ként csak 3x használhatsz gombokat!!" // ct leszabályzott gombnyomásra való figyelmeztetések:
#define szoveg6 "^1Vigyázz CT ként csak 3x (- már csak 2x -) használhatsz gombokat!!"
#define szoveg7 "^1Vigyázz CT ként csak 3x (- már csak 1x -) használhatsz gombokat!!"
#define szoveg8 "^1Te sajnos ebben a körben több gombot nem használhatsz!" // ct 4. gombhasználata után ezt az üzenetet kapja
#define szoveg2 "^1A terrorista nem választott! ^3Nincs free kör!" // ha afk a terrorista akkor automata nincs freerun (15 sec után), ilyenkor erről ezt az információt kapjuk"
#define szoveg9 "^1A terrorista döntött! ^3Ez a kör freerun lesz!" // a terrorista döntésénél való visszejelzés (freerun)
#define szoveg10 "^1A terrorista döntött! ^3Ez a kör nem lesz freerun!" // a terrorista döntésénél való visszejelzés (nincs freerun)
#define szoveg11 "^1Ez a kör freerun! ^3(Kés/Ruli)"  //kör lekérdezésekor ezt kapjuk, ha freerun van.
#define szoveg12 "^1Ez a kör nem freerun ^3(Szabad ölni a Terroristát!)" //kör lekérdezésekor ezt kapjuk, ha nincs freerun.
#define szoveg13 "^1A terrorista döntött! ^3Ez a kör, ruli kör lesz" // ha amx_dr_matchmode cvar értéke 1, akkor ezeket az üzeneteket írja ki (freerun usp-vel)
#define szoveg14 "^1A terrorista döntött! ^3Ez a kör, kés kör lesz" // ha amx_dr_matchmode cvar értéke 1, akkor ezeket az üzeneteket írja ki (freerun késsel)
#define szoveg15 "^1Ez a kör kés kör lesz" //ha amx_dr_matchmode cvar értéke 1, akkor ezt írja ki ha kés kör van
#define szoveg16 "^1Ez a kör ruli kör lesz" //ha amx_dr_matchmode cvar értéke 1, akkor ezt írja ki ha ruli kör van (USP)

#define MAX_BUTTONS 1000

new g_menu;
new g_freemenu;
new g_bEnable;
new free = 0
new valasztott;
new g_used[MAX_BUTTONS];
new g_usedid[32];
new prefix[] = "[*-derbY-*]";
new knife = 0;
new g_cvar_hpup;
new g_cvar_freebuttonst;
new g_cvar_freebuttonsct;
new g_cvar_freerunperknifematch;
new g_cvar_pickupinfreerun;

public plugin_init() {
	register_plugin("FreeRun menu", "1.2", "Random");
	g_cvar_hpup = register_cvar("amx_dr_hpup","1"); // ha a terrorista freerun közben megöl egy ct-t és kevesebb a hp-ja mint 100 akkor töltse-e vissza 100-ra? (0- ne, 1, igen)
	g_cvar_freebuttonst = register_cvar("amx_dr_tfreebuttons", "1") // Terrorista gombhasználatának szabályzása, ha freerun van nem tudjon gombot nyomni ha nincs freerun csak 1x tudjon egy gombot megnyomni, (0- ne legyen szabályozva, 1-legyen szabályozva)
	g_cvar_freebuttonsct = register_cvar("amx_dr_ctfreebuttons", "1") // CT gombhasználatának korlátozása, csak 3x nyomhat gombot egy kör alatt (0-ne legyen korlátozva, 1-legyen korlátozva)
	g_cvar_freerunperknifematch = register_cvar("amx_dr_matchmode", "1") //Freerunon belül külön válaszható legyen-e a kés és a ruli vagy egy menüponton belül legyen csak simán freerun? (0-egy menüpont (freerun), 1-külön ruli és külön kés kör)
	g_cvar_pickupinfreerun = register_cvar("amx_dr_pickup", "1") // Fegyverfelvétel szabályzása (0- bármikor tudjanak felvenni fegyvert, 1-freerun közben nemtudnak felvenni fegyvert)
	RegisterHam(Ham_Spawn,"player","openmenu", 1);
	RegisterHam(Ham_Touch, "armoury_entity", "FwdHamPlayerPickup" );
	RegisterHam(Ham_Touch, "weaponbox", "FwdHamPlayerPickup" );
	RegisterHam(Ham_Use, "func_button", "fwButtonUsed");
	RegisterHam(Ham_Use, "func_rot_button", "fwButtonUsed");
	RegisterHam(Ham_Use, "button_target", "fwButtonUsed");
	RegisterHam(Ham_Item_Deploy, "weapon_usp", "FwdHamDeployPost", 1);
	register_clcmd("say /fr", "showagain")
	register_clcmd("say fr", "showagain")
	register_clcmd("say /free", "showagain")
	register_clcmd("say free", "showagain")
	register_clcmd("say /kor", "checkfree")
	register_clcmd("say kor", "checkfree")
	register_clcmd("say /kör", "checkfree")
	register_clcmd("say kör", "checkfree")
	register_event( "DeathMsg" , "DeathMsgEvent" , "a" );
	
	create_menu();
}
public plugin_end()
{
	menu_destroy(g_menu);
	menu_destroy(g_freemenu);
}

public DeathMsgEvent()
{
if (get_pcvar_num(g_cvar_hpup) == 1) {
	new iKiller = read_data( 1 );
	new health = get_user_health(iKiller)
	new iVictim = read_data(2)
	if (get_user_team(iVictim) == 1) {
		client_cmd(iVictim, "slot3");
	}

	if (get_user_team(iKiller) == 1 && free == 1 ) {
		if (health < 100){
			set_user_health(iKiller, 100)
			client_print_color(iKiller, GREEN, "%s %s", prefix, szoveg1)
		}
	}
}
}
public showagain(id) {
	if(get_user_team(id) != 1)
	{
		client_print_color(id, 0, "%s ^3Csak terrorista választhat.", prefix)
		return
	}
	if (valasztott == 0 )
		menu_display(id, g_menu, 0)
	else
		client_print_color(id, 0, "%s ^3Már választottál.", prefix)
}

public openmenu(id) {
	g_usedid[id] = 0;
	if(get_user_team(id) == 1){
		resetButtons();
		free = 0
		valasztott = 0
		g_bEnable = false;
		menu_display(id, g_menu, 0)
		set_task(10.0, "stopshow", id)
	}
	return PLUGIN_HANDLED;
}
public stopshow(id) {
	if (get_user_team(id) == 1 && free == 0)
		client_cmd(id, "slot3");
}
public stopdraw(id) {
	if (get_user_team(id) == 1) {
		client_print_color(0, GREEN, "%s %s", prefix, szoveg2)
		free = 2
		valasztott = 1
	}
}

public resetButtons() {
	for(new i=0;i<MAX_BUTTONS;i++){
		g_used[i] = 0;
	}
}

public fwButtonUsed(this, id, idactivator, use_type, Float:value){
	if(get_user_team(id) == 1 && get_pcvar_num(g_cvar_freebuttonst) == 1 ){
		if(id!=idactivator) return HAM_IGNORED;
		if (free == 1) {
			client_print_color(id,GREEN, "%s %s", prefix, szoveg3);
			return HAM_SUPERCEDE;
		}
		else if ( free == 2 && g_used[this] != 1) {
			g_used[this] = 1;
			return HAM_IGNORED;
		}
		else if (free == 2 && g_used[this] <= 1){
			client_print_color(id,GREEN, "%s %s", prefix, szoveg4);
			return HAM_SUPERCEDE;
		}
	}
	else if (get_user_team(id) == 2 && get_pcvar_num(g_cvar_freebuttonsct) == 1 )
	{
		if (g_usedid[id] == 0 )
		{
			client_print_color(id,GREEN, "%s %s", prefix, szoveg5);
			g_usedid[idactivator] = 1
			return HAM_IGNORED;
		}
		else if (g_usedid[id] == 1)
		{
			client_print_color(id,GREEN, "%s %s", prefix, szoveg6);
			g_usedid[idactivator] = 2
			return HAM_IGNORED;
		}
		else if (g_usedid[idactivator] == 2)
		{
			client_print_color(id,GREEN, "%s %s", prefix, szoveg7);
			g_usedid[idactivator] = 3
			return HAM_IGNORED;
		}
		else if (g_usedid[id] == 3)
		{
			client_print_color(id,GREEN, "%s %s", prefix, szoveg8);
			return HAM_SUPERCEDE;
		}
	}
	return HAM_IGNORED;
}
public select(id, version)
{
	if (get_user_team(id) != 1)
		return
	if (get_pcvar_num(g_cvar_freerunperknifematch) == 0)
	{
		menu_cancel(g_freemenu)
		if(version == 1)
		{
			free = 1
			valasztott = 1
			g_bEnable = true;
			client_print_color(0, GREEN, "%s %s", prefix, szoveg9)
			new players[32], num, i;
			get_players(players, num, "ach");

			for(i=0;i<num;i++)
			{
				strip_user_weapons(players[i])
				give_item(players[i], "weapon_knife")
				give_item(players[i], "weapon_usp")
				cs_set_user_bpammo(players[i], CSW_USP, 100)
				}
		}
		else if(version == 2)
		{
			free = 2
			valasztott = 1
			g_bEnable = false;
			client_print_color(0, GREEN, "%s %s", prefix, szoveg10)
		}
	}
	else
	{
		if(version == 1)
			menu_display(id, g_freemenu, 0)
		else if(version == 2)
		{
			free = 2
			valasztott = 1
			g_bEnable = false;
			client_print_color(0, GREEN, "%s %s", prefix, szoveg10)
		}
		else if(version == 3)
		{
			free = 1
			knife = 0
			valasztott = 1
			g_bEnable = true;
			client_print_color(0, GREEN, "%s %s", prefix, szoveg13)
			new players[32], num, i;
			get_players(players, num, "ach");

			for(i=0;i<num;i++)
			{
				strip_user_weapons(players[i])
				give_item(players[i], "weapon_knife")
				give_item(players[i], "weapon_usp")
				cs_set_user_bpammo(players[i], CSW_USP, 100)
			}
		}
		else if(version == 4)
		{
			free = 1
			knife = 1
			valasztott = 1
			g_bEnable = true;
			client_print_color(0, GREEN, "%s %s", prefix, szoveg14)
			new players[32], num, i;
			get_players(players, num, "ach");										
			for(i=0;i< MAX_PLAYERS;i++)
			{
				if(!is_user_alive(players[i]))
					continue
				strip_user_weapons(players[i])
				give_item(players[i], "weapon_knife")
				give_item(players[i], "weapon_usp")
				cs_set_user_bpammo(players[i], CSW_USP, 0)
			}
		}
	}
}

public FwdHamDeployPost(iEnt)
{
	if(free == 1 && knife == 1 && valasztott == 1 && g_bEnable)
	{
		if(iEnt <= 0)
			return HAM_IGNORED;

		new id = get_pdata_cbase(iEnt, 41, 4);
		if(!is_user_alive(id))
			return HAM_IGNORED

		cs_set_weapon_ammo(iEnt,0)
	}
	return HAM_IGNORED;
}

public checkfree(id) {
if (get_pcvar_num(g_cvar_freerunperknifematch) == 0) {
	if (free == 1 ) {
		client_print_color(id, GREEN, "%s %s",prefix, szoveg11)
	}
	else
	{
		client_print_color(id, GREEN, "%s %s",prefix, szoveg12)
	}
}
else if(get_pcvar_num(g_cvar_freerunperknifematch) == 1){
	if (free == 1 && knife == 1) {
		client_print_color(id, GREEN, "%s %s",prefix, szoveg15)
	}
	else if(free == 1 && knife == 0)
	{
		client_print_color(id, GREEN, "%s %s",prefix, szoveg16)
	}
	else
	{
		client_print_color(id, GREEN, "%s %s",prefix, szoveg12)
	}
}
}
public create_menu() {
	g_menu = menu_create(menunev, "freemenu");
	g_freemenu = menu_create(menunev, "freerunmenu");
	menu_additem(g_menu, "\wFREE", "", 0);
	menu_additem(g_menu, "\wSzabadkör", "", 0);
	menu_setprop(g_menu, MPROP_EXIT, MEXIT_NEVER);
	menu_setprop(g_menu, MPROP_PERPAGE, 0);
	menu_setprop(g_menu, MPROP_NOCOLORS, 1);
	menu_setprop(g_menu, MPROP_NUMBER_COLOR, szamszin);
	menu_additem(g_freemenu, "\wRuli kör", "", 0);
	menu_additem(g_freemenu, "\wKés kör", "", 0);
	menu_setprop(g_freemenu, MPROP_EXIT, MEXIT_ALL);
	menu_setprop(g_freemenu, MPROP_PERPAGE, 0);
	menu_setprop(g_freemenu, MPROP_NOCOLORS, 1);
	menu_setprop(g_freemenu, MPROP_NUMBER_COLOR, szamszin);
}

public freemenu(id, menu, item)
{
	new command[6], name[64], access, callback;

	menu_item_getinfo(menu, item, access, command, sizeof command - 1, name, sizeof name - 1, callback);

	switch(item)
	{
		case 0: select(id, 1);
		case 1: select(id, 2);
		case 2: stopdraw(id);
	}
	return PLUGIN_HANDLED;
}
public freerunmenu(id,menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_cancel(id);
		return PLUGIN_HANDLED;
	}

	new command[6], name[64], access, callback;

	menu_item_getinfo(menu, item, access, command, sizeof command - 1, name, sizeof name - 1, callback);

	switch(item)
	{
		case 0: select(id, 3);
		case 1: select(id, 4);
	}
	return PLUGIN_HANDLED;
}
public FwdHamPlayerPickup( iEntity, id ) {
	if (get_pcvar_num(g_cvar_pickupinfreerun) == 1) {
		return g_bEnable ? HAM_SUPERCEDE : HAM_IGNORED
	}
	else
	{
		return HAM_IGNORED;
	}
}
