#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <dhudmessage>
#include <fun>
#include <nvault>
#include <engine> 
#include <codmod>
#include <csx>
#include <tutor>


#define PLUGIN "COD:Elite"
#define VERSION "1.0"
#define AUTHOR "Play"

#define MAX_WIELKOSC_NAZWY 32
#define MAX_WIELKOSC_OPISU 256
#define MAX_ILOSC_PERKOW 120
#define MAX_ILOSC_KLAS 100


#define STANDARDOWA_SZYBKOSC 250.0

#define ZADANIE_POKAZ_INFORMACJE 672
#define ZADANIE_POKAZ_REKLAME 768
#define ZADANIE_USTAW_SZYBKOSC 832

#define MAX_RANG 18
#define MAX 32
#define IsPlayer(%1) (1 <= %1 <= MAX && is_user_connected(%1))


/*----------------- MISJE -----------------*/


#pragma tabsize 0

#define DMG_HEGRENADE (1<<24)
#define DMG_BULLET (1<<1)

/*-----------------KONFIGURACJA-----------------*/

#define VAULT_EXPIREDAYS 21            // po ilu dniach nieobecnosci na serwerze ma usuwac aktualny postep misji gracza
#define MAX_PLAYERS 32                 // max ilosc graczy (chcesz mniej zuzycia pamieci? ustaw wartosc: ilosc slotow+1

/*--------------KONIEC KONFIGURACJI--------------*/

enum _:typy
{
	BRAK = 0, 
	ZABIJ, 
	PLANT, 
	DEFUSE, 
	HEADSHOT, 
	HOSTY, 
	DMG_LACZNIE, 
	KILL_DGL_HS, 
	KNIFE, 
	KNIFE_HEADSHOT, 
	GRANAT, 
	DMG_GRANAT,
	KILL_AWP_HS,
	CELNOSC,
	KILLSROUND,
	HSRATIO,
	DOUBLE,
	CLASS
}

new const QuestInfoMessage[typy][] =
{
	"Brak misji", 
	"Zabij", 
	"Podloz pake", 
	"Rozbroj pake", 
	"Strzel HS'y", 
	"Uratuj hosty", 
	"Zadaj obrazenia", 
	"Zabij deaglem HS", 
	"Zabij z noza", 
	"Zabij z noza HS", 
	"Zabij granatem", 
	"Zadaj dmg granatem",
	"Zabij awp HS",
	"Uzyskaj % celnosci w rundzie",
	"Uzyskaj fragi w rundzie",
	"Uzyskaj % hs'ow w rundzie",
	"Strzel doublekill'a",
	"Zabij wybrana klase"
}

new const QuestRozdzial[][] =
{
	"Podstawowy", 
	"Zaawansowany", 
	"Ekspert", 
	"Arcymistrz"
}

new iPlayerQuestID[MAX_PLAYERS+1], 
ePlayerQuestType[MAX_PLAYERS+1], 
iPlayerPrzedzial[MAX_PLAYERS+1], 
iPlayerQuestProgress[MAX_PLAYERS+1],
misje_nazwa_gracza[MAX_PLAYERS+1][33];

new iDoubleKillVariable[MAX_PLAYERS+1]; // do double
new bool:bZrobilWszystkie[MAX_PLAYERS+1];


new Array: gPrzedzial, 
Array: gIleRazy, 
Array: gTyp, 
Array: gNagroda,
Array: gOrdery;


/*----------------- KONIEC MISJE -----------------*/

new const maxAmmo[31] = {0, 52, 0, 90, 1, 31, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120, 30, 120, 200, 31, 90, 120,
90, 2, 35, 90, 90,0, 100};

new const co_ile[] = { 1, 5, 10, 15, 50, -1 }
new szybkosc_rozdania[33];  

new inteligencjaa, zdrowiee, wytrzymaloscc, kondycjaa;

new MsgScreenfade, MsgSayText;

new vault;

new podkladajacy;
new rozbrajajacy;
new doswiadczenie_za_bombe;
new doswiadczenie_za_hs;
new cvar_bomb_sound
	
new SyncHudObj// SyncHudObj2;

new nazwa_forum[64], forum;

new const prefix[] = "^03[COD Elite]^01";

new bool: Resetuj[33];

new CVAR_KNIFE_HIGHSPEED,
CVAR_KNIFE_HEALTH_ADD,
CVAR_KNIFE_HP_TIME,
CVAR_KNIFE_LOWGRAV;

new CVAR_RANDOM_PERK

new cvar_doswiadczenie_za_zabojstwo,
cvar_doswiadczenie_za_obrazenia,
cvar_doswiadczenie_za_wygrana,
cvar_ordery_za_wygrana,
cvar_typ_zapisu,
cvar_limit_poziomu,
cvar_proporcja_poziomu,
cvar_blokada_broni,
cvar_block_kill;

new cvar_asysta, cvar_zemsta;

new perk_zmieniony,
klasa_zmieniona;


new nazwy_perkow[MAX_ILOSC_PERKOW+1][MAX_WIELKOSC_NAZWY+1],
opisy_perkow[MAX_ILOSC_PERKOW+1][MAX_WIELKOSC_OPISU+1],
max_wartosci_perkow[MAX_ILOSC_PERKOW+1],
min_wartosci_perkow[MAX_ILOSC_PERKOW+1],
pluginy_perkow[MAX_ILOSC_PERKOW+1],
ilosc_perkow;


new nazwa_gracza[33][64],
klasa_gracza[33],
nowa_klasa_gracza[33],
poziom_gracza[33],
doswiadczenie_gracza[33],
perk_gracza[33],
wartosc_perku_gracza[33];

new Float:maksymalne_zdrowie_gracza[33],
Float:szybkosc_gracza[33],
Float:redukcja_obrazen_gracza[33];


new punkty_gracza[33],
zdrowie_gracza[33],
inteligencja_gracza[33],
wytrzymalosc_gracza[33],
kondycja_gracza[33];

new bool:gracz_ma_tarcze[33],
bool:gracz_ma_noktowizor[33];     

new bonusowe_bronie_gracza[33],
bonusowe_zdrowie_gracza[33],
bonusowa_inteligencja_gracza[33],
bonusowa_wytrzymalosc_gracza[33],
bonusowa_kondycja_gracza[33];

new bronie_klasy[MAX_ILOSC_KLAS+1], 
zdrowie_klas[MAX_ILOSC_KLAS+1],
kondycja_klas[MAX_ILOSC_KLAS+1], 
inteligencja_klas[MAX_ILOSC_KLAS+1], 
wytrzymalosc_klas[MAX_ILOSC_KLAS+1],
nazwy_klas[MAX_ILOSC_KLAS+1][MAX_WIELKOSC_NAZWY+1],
opisy_klas[MAX_ILOSC_KLAS+1][MAX_WIELKOSC_OPISU+1],
pluginy_klas[MAX_ILOSC_KLAS+1],
ilosc_klas;

new bronie_druzyny[] = {0, 1<<CSW_GLOCK18, 1<<CSW_USP},
bronie_dozwolone = 1<<CSW_KNIFE | 1<<CSW_C4;

new bool:freezetime = true;

new hud_znika[33];

new weaponname[22];

new TerrorWins, CounterWins	

#define MAX_WIELKOSC_FRAKCJA 64
new frakcja_klas[MAX_ILOSC_KLAS+1][MAX_WIELKOSC_FRAKCJA+1];
new nazwa_klasy[MAX_ILOSC_KLAS+1][64];
new nazwa_frakcji[MAX_ILOSC_KLAS+1][64];
new klasid;
new gFWD

new g_zemsta[MAX+1];
new bool:g_asysta[MAX+1][MAX+1];

new asysta_on, zemsta_on, headshot_on; 

new ranga[124];

new knife_model[33];
new knife_uzyl[33];

new const playerWeapon[][] = {
	"",
	"P228",
	"",
	"SCOUT",
	"HEGRENADE",
	"XM1014",
	"",
	"MAC10",
	"AUG",
	"",
	"ELITE",
	"FIVESEVEN",
	"UMP45",
	"SG550",
	"GALIL",
	"FAMAS",
	"USP",
	"GLOCK18",
	"AWP",
	"MP5",
	"M249",
	"M3",
	"M4A1",
	"TMP",
	"G3SG1",
	"",
	"DEAGLE",
	"SG552",
	"AK47",
	"KNIFE",
	"P90"
}

new const nazwy_rang[MAX_RANG][] = {
	"Silver I", 
	"Silver II", 
	"Silver III", 
	"Silver IV", 
	"Silver Elite", 
	"Silver Elite Master",
	"Gold Nova I", 
	"Gold Nova II",
	"Gold Nova III",
	"Gold Nova Master", 
	"Master Guardian I", 
	"Master Guardian II",
	"Master Guardian Elite", 
	"Distinguished Master Guardian", 
	"Legendary Eagle", 
	"Legendary Eagle Master",
	"Supreme Master First Class",
	"Global Elite"
}

new przedzial[MAX_RANG] = 
{
	30, 
	60,
	120, 
	325, 
	500, 
	730, 
	1000, 
	1400, 
	1850, 
	2300, 
	2600, 
	3180, 
	3500, 
	3930, 
	4500, 
	5000, 
	5600, 
	6260
}



//new const serverIP[] = "31.186.82.132:27016";
	
public plugin_init()
{
	/*
	new szIp[ 33 ];
	get_user_ip( 0, szIp, charsmax( szIp ) );
	
	if( !equal( szIp , serverIP ) ){
		server_print("*** %s v%s by %s Disabled ***", PLUGIN, VERSION, AUTHOR);
		set_fail_state("*** BRAK LICENCJI, SKONTAKTUJ SIE Z AUTROEM PACZKI ***");
	}*/	
	server_print("*** %s v%s by %s Enabled ***", PLUGIN, VERSION, AUTHOR);
	
	// Language files
	register_dictionary("CodElite.txt")	
	
	register_plugin(PLUGIN, VERSION, AUTHOR);
	
	cvar_doswiadczenie_za_zabojstwo = register_cvar("cod_killxp", "400"); // ilość doświadczenia za zabójstwo
	cvar_doswiadczenie_za_obrazenia = register_cvar("cod_damagexp", "250"); // ilosc doswiadczenia za 20 obrazen 
	cvar_doswiadczenie_za_wygrana = register_cvar("cod_winxp", "500");// ilość doświadczenia za wygraną rundę
	cvar_ordery_za_wygrana = register_cvar("cod_win_ordery", "10");// ilość orderów za wygraną rundę
	cvar_typ_zapisu = register_cvar("cod_savetype", "1");  // 1-Nick; 2-SID dla Steam; 3-IP
	cvar_limit_poziomu = register_cvar("cod_maxlevel", "801"); // ilość poziomów
	cvar_proporcja_poziomu = register_cvar("cod_levelratio", "35"); 
	cvar_blokada_broni = register_cvar("cod_weaponsblocking", "1"); 
	cvar_asysta = register_cvar("cod_xp_asysta", "200");
	cvar_zemsta = register_cvar("cod_xp_zemsta", "150");
	cvar_block_kill	= register_cvar("cod_blok_kill", "1");
	cvar_bomb_sound = register_cvar("cod_bomb_sound", "1"); // 1 - włącza muzyke gdy przeciwnik podlozy bombe | 0 - wyłącza
	CVAR_RANDOM_PERK = register_cvar("cod_szansa_na_perk", "3");
	
	
	CVAR_KNIFE_HIGHSPEED = register_cvar("cod_knife_speed","70.0");
	CVAR_KNIFE_HEALTH_ADD = register_cvar("cod_knife_add_health","2");
	CVAR_KNIFE_HP_TIME = register_cvar("cod_knife_add_health_time", "1");
	CVAR_KNIFE_LOWGRAV = register_cvar("cod_knife_gravity" , "0.5");
	
	
	forum = register_cvar("cod_nazwa_forum", "Play-Shop.pl");
	
	
	asysta_on = register_cvar("asysta_on", "1");
	zemsta_on = register_cvar("zemsta_on", "1");
	headshot_on = register_cvar("headshot_on", "1"); 
	
	
	register_cvar("cod_bombxp", "200");
	register_cvar("cod_hsexp", "100");	
	
	register_cvar("cod_inteligencja", "420");
	register_cvar("cod_zdrowie", "500");
	register_cvar("cod_wytrzymalosc", "500");	
	register_cvar("cod_kondycja", "180");
	
	// ========== Misje ====== //
	register_clcmd("say /questy", "QuestMenu");
	register_clcmd("say /misje", "QuestMenu");
	register_clcmd("say /misja", "QuestMenu");
	register_clcmd("say /quest", "QuestMenu");
	
	
	
	// ======== Inne ======== //	
	
	register_clcmd("say /reset"		, "KomendaResetujPunkty");
	register_clcmd("say /statystyki"	, "PrzydzielPunkty");
	register_clcmd("say /staty"		, "PrzydzielPunkty");
	register_clcmd("say /knife"		, "KnifeMenu");
	register_clcmd("say /rangi" 		, "OpisRang");
	register_clcmd("useperk"		, "UzyjPerku");
	register_clcmd("radio3"			, "UzyjPerku");
	register_clcmd("fullupdate"		, "BlokujKomende");
	
	// ======== Perki ======== //
	
	register_clcmd("say /perk"		, "KomendaOpisPerku");
	register_clcmd("say /perki"		, "OpisPerkow");
	register_clcmd("say /perks"		, "OpisPerkow");
	register_clcmd("say /przedmiot"		, "OpisPerku");
	register_clcmd("say /drop"		, "SprzedajPerk");
	register_clcmd("say /wyrzuc"		, "SprzedajPerk");	
	register_clcmd("say /sprzedaj"		, "SprzedajPerk");
	register_clcmd("say /sell"		, "SprzedajPerk");
	
	
	// ======== Klasy ======== //
	
	register_clcmd("say /klasa"		, "WybierzKlase");
	register_clcmd("say /class"		, "WybierzKlase");	
	register_clcmd("say /klasy"		, "OpisKlasy");
	register_clcmd("say /classinfo"		, "OpisKlasy");	
	
	
	register_menucmd(register_menuid("Klasa:"), 1023, "OpisKlasy");
	
	
	RegisterHam(Ham_TakeDamage, 	"player", "Obrazenia");
	RegisterHam(Ham_TakeDamage, 	"player", "ObrazeniaPost", 1);
	RegisterHam(Ham_TakeDamage, 	"player", "fwDamage", 1);
	RegisterHam(Ham_TakeDamage, 	"player", "fwdTakeDamage", 0)
	RegisterHam(Ham_Spawn, 		"player", "Odrodzenie", 1);
	RegisterHam(Ham_Killed, 	"player", "SmiercGraczaPost", 1);
	
	RegisterHam(Ham_Touch, 		"armoury_entity", "DotykBroni");
	RegisterHam(Ham_Touch, 		"weapon_shield", "DotykTarczy");
	RegisterHam(Ham_Touch, 		"weaponbox", "DotykBroni");
	
	register_forward(FM_Touch, 	"fwd_touch");
	register_forward(FM_CmdStart, 	"CmdStart");
	register_forward(FM_EmitSound, 	"EmitSound");
	register_forward(FM_ClientKill, "ClientKill")
	
	register_message(get_user_msgid("Health"),"MessageHealth");
	
	register_logevent("PoczatekRundy", 2, "1=Round_Start"); 
	register_logevent("BombaPodlozona", 3, "2=Planted_The_Bomb");
	register_logevent("LogEvent_Quest", 3, "1=triggered");
	
	
	register_event("SendAudio", "BombaRozbrojona", "a", "2&%!MRAD_BOMBDEF");
	register_event("BarTime", "RozbrajaBombe", "be", "1=10", "1=5");
	register_event("SendAudio", "WygranaTerro" , "a", "2&%!MRAD_terwin");
	register_event("SendAudio", "WygranaCT", "a", "2&%!MRAD_ctwin");
	register_event("CurWeapon","CurWeapon","be", "1=1");
	register_event("HLTV", "NowaRunda", "a", "1=0", "2=0");
	register_event("DeathMsg", "eventDeath", "a");
	
	vault = nvault_open("CodElite");
	
	MsgScreenfade = get_user_msgid("ScreenFade");
	MsgSayText = get_user_msgid("SayText")
	
	SyncHudObj = CreateHudSyncObj();
//	SyncHudObj2 = CreateHudSyncObj();
	
	doswiadczenie_za_bombe = get_cvar_num("cod_bombxp");
	doswiadczenie_za_hs = get_cvar_num("cod_hsexp");
	
	gFWD = CreateMultiForward("DodatkoweHP", ET_CONTINUE,FP_CELL);
	
	perk_zmieniony = CreateMultiForward("cod_perk_changed", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL);
	klasa_zmieniona = CreateMultiForward("cod_class_changed", ET_CONTINUE, FP_CELL, FP_CELL);
	
	copy(nazwy_perkow[0], MAX_WIELKOSC_NAZWY, "Brak");
	copy(opisy_perkow[0], MAX_WIELKOSC_OPISU, "Zabij kogos, aby otrzymac przedmiot");
	copy(nazwy_klas[0], MAX_WIELKOSC_NAZWY, "Brak");
	
	set_task(1.0, "plugin_cfg");
	loadfile()
	tutorInit()
}	
public loadfile()
{
	new file[256];
	get_configsdir(file,charsmax(file));
	formatex(file, charsmax(file), "%s/cod_frakcje.ini", file);
	
	if(!file_exists(file))
		return;
	
	new row[128], trash,  size=file_size(file,1);
	for(new i=0;i<size;i++)
	{
		read_file(file, i, row, charsmax(row), trash);
		
		if((contain(row,";")!=0) && strlen(row) && klasid<MAX_ILOSC_KLAS+1)
		{
			replace(row, charsmax(row), "[klasa]", "");
			split(row, nazwa_klasy[klasid], charsmax(nazwa_klasy[]), nazwa_frakcji[klasid], charsmax(nazwa_frakcji[]), "[frakcja]");
			klasid++;
		}
	}    
}
public plugin_cfg()
{
	new lokalizacja_cfg[33];
	get_configsdir(lokalizacja_cfg, charsmax(lokalizacja_cfg));
	server_cmd("exec %s/CodElite.cfg", lokalizacja_cfg);
	server_exec();
	
	gPrzedzial    = ArrayCreate();
	gIleRazy   = ArrayCreate();
	gTyp      = ArrayCreate();
	gNagroda   = ArrayCreate();
	gOrdery   = ArrayCreate();
	
	new plik_tresc[64];
	formatex(plik_tresc, charsmax(plik_tresc), "addons/amxmodx/configs/cod_misje.ini");
	
	if(!file_exists(plik_tresc))
	set_fail_state("[Misje] Nie mozna znalesc pliku cod_misje.ini w addons/amxmodx/configs/");
	
	new fp = fopen(plik_tresc, "r");
	
	new dane[5][7];
	while(!feof(fp))
	{
		fgets(fp, plik_tresc, charsmax(plik_tresc));
		
		if(plik_tresc[0] == ';' || !plik_tresc[0] || plik_tresc[0] == '^n' || plik_tresc[0] == '^r' || plik_tresc[0] == '^t' || plik_tresc[0] == ' ')  continue;
		
		parse(plik_tresc, dane[0], 7, dane[1], 7, dane[2], 7, dane[3], 7, dane[4], 7);
		
		replace_all(plik_tresc, 63, "^"", "");
		
		ArrayPushCell(gPrzedzial, str_to_num(dane[0]));
		ArrayPushCell(gIleRazy, str_to_num(dane[1]));
		ArrayPushCell(gTyp, str_to_num(dane[2]));
		ArrayPushCell(gNagroda, str_to_num(dane[3]));  
		ArrayPushCell(gOrdery, str_to_num(dane[4]));
	}
	fclose(fp);
	
	if(vault != INVALID_HANDLE)
	nvault_prune(vault, 0, get_systime() - (86400 * VAULT_EXPIREDAYS));	
}

public plugin_precache()
{	
	precache_sound("CodElite/select.wav");
	precache_sound("CodElite/start.wav");
	precache_sound("CodElite/start2.wav");
	precache_sound("CodElite/levelup.wav");
	precache_sound("CodElite/win_sound.wav");
	precache_sound("CodElite/getin.mp3");
	precache_sound("CodElite/bp.wav");
	precache_sound("CodElite/missiondone.wav");
	
	
	// Knife MOD //
	precache_model("models/CodElite/knife/v_huntsman.mdl");
	precache_model("models/CodElite/knife/p_huntsman.mdl");		
	precache_model("models/CodElite/knife/v_karambit.mdl");
	precache_model("models/CodElite/knife/p_karambit.mdl");
	precache_model("models/CodElite/knife/v_m9bayonet.mdl");
	precache_model("models/CodElite/knife/p_m9bayonet.mdl");
	precache_model("models/CodElite/knife/v_butterfly.mdl");
	precache_model("models/CodElite/knife/p_butterfly.mdl");
	precache_model("models/CodElite/knife/v_gut.mdl");
	precache_model("models/CodElite/knife/p_gut.mdl");
	precache_model("models/CodElite/knife/v_knife.mdl") 
	precache_model("models/CodElite/knife/p_knife.mdl")
	
	tutorPrecache()
}
public plugin_natives()
{
	register_native("cod_set_user_xp", "UstawDoswiadczenie", 1);
	register_native("cod_set_user_class", "UstawKlase", 1);
	register_native("cod_set_user_perk", "UstawPerk", 1);
	register_native("cod_set_user_bonus_health", "UstawBonusoweZdrowie", 1);
	register_native("cod_set_user_bonus_intelligence", "UstawBonusowaInteligencje", 1);
	register_native("cod_set_user_bonus_trim", "UstawBonusowaKondycje", 1);
	register_native("cod_set_user_bonus_stamina", "UstawBonusowaWytrzymalosc", 1);
	
	register_native("cod_points_to_health", "PrzydzielZdrowie", 1);	
	register_native("cod_points_to_intelligence", "PrzydzielInteligencje", 1);	
	register_native("cod_points_to_trim", "PrzydzielKondycje", 1);	
	register_native("cod_points_to_stamina", "PrzydzielWytrzymalosc", 1);
	
	register_native("cod_get_user_xp", "PobierzDoswiadczenie", 1);
	register_native("cod_get_user_level", "PobierzPoziom", 1);
	register_native("cod_get_user_points", "PobierzPunkty", 1);
	register_native("cod_get_user_class", "PobierzKlase", 1);
	register_native("cod_get_user_perk", "PobierzPerk", 1);
	register_native("cod_get_user_health", "PobierzZdrowie", 1);
	register_native("cod_get_user_intelligence", "PobierzInteligencje", 1);
	register_native("cod_get_user_trim", "PobierzKondycje", 1);
	register_native("cod_get_user_stamina", "PobierzWytrzymalosc", 1);
	
	
	register_native("cod_get_level_xp", "PobierzDoswiadczeniePoziomu", 1);
	
	register_native("cod_get_perkid", "PobierzPerkPrzezNazwe", 1);
	register_native("cod_get_perks_num", "PobierzIloscPerkow", 1);
	register_native("cod_get_perk_name", "PobierzNazwePerku", 1);
	register_native("cod_get_perk_desc", "PobierzOpisPerku", 1);
	
	register_native("cod_get_classid", "PobierzKlasePrzezNazwe", 1);
	register_native("cod_get_classes_num", "PobierzIloscKlas", 1);
	register_native("cod_get_class_name", "PobierzNazweKlasy", 1);
	register_native("cod_get_class_desc", "PobierzOpisKlasy", 1);
	
	register_native("cod_get_class_health", "PobierzZdrowieKlasy", 1);
	register_native("cod_get_class_intelligence", "PobierzInteligencjeKlasy", 1);
	register_native("cod_get_class_trim", "PobierzKondycjeKlasy", 1);
	register_native("cod_get_class_stamina", "PobierzWytrzymaloscKlasy", 1);
	
	
	register_native("cod_give_weapon", "DajBron", 1);
	register_native("cod_take_weapon", "WezBron", 1);
	register_native("cod_set_user_shield", "UstawTarcze", 1);
	register_native("cod_set_user_nightvision", "UstawNoktowizor", 1);
	
	register_native("cod_inflict_damage", "ZadajObrazenia", 1);
	
	register_native("cod_register_perk", "ZarejestrujPerk");
	register_native("cod_register_class", "ZarejestrujKlase");
	

	register_native("cod_register_class", "ZarejestrujKlase");
		
	
	register_native("cod_get_user_hud", "GetHud", 1);
	register_native("cod_set_user_hud", "SetHud", 1);
}
public RozbrajaBombe(id)
	if(klasa_gracza[id])
	rozbrajajacy = id;

public BombaPodlozona()
{
	new Players[32], playerCount, id;
	get_players(Players, playerCount, "aeh", "TERRORIST");
	new doswiadczenie_za_zabojstwo = get_pcvar_num(cvar_doswiadczenie_za_zabojstwo);
	
	if(get_playersnum() > 1)
	{
		doswiadczenie_gracza[podkladajacy] += doswiadczenie_za_bombe;
		for (new i=0; i<playerCount; i++) 
		{
			id = Players[i];
			if(!klasa_gracza[id])
				continue;
			
			if(id != podkladajacy)
			{
				doswiadczenie_gracza[id] += doswiadczenie_za_zabojstwo;
				ChatColor(id, "%L", LANG_PLAYER, "INFO_PLANT_BOMB1", prefix, doswiadczenie_za_zabojstwo);
			}
			else
				ChatColor(id, "%L", LANG_PLAYER, "INFO_PLANT_BOMB2", prefix, doswiadczenie_za_zabojstwo);
			
			SprawdzPoziom(id);
		}
	}
	if(get_pcvar_num(cvar_bomb_sound)) 
	{
		client_cmd(0, "stopsound")
		client_cmd(0, "spk CodElite/bp");
	}
}

public BombaRozbrojona()
{
	new Players[32], playerCount, id;
	get_players(Players, playerCount, "aeh", "CT");
	new doswiadczenie_za_zabojstwo = get_pcvar_num(cvar_doswiadczenie_za_zabojstwo);
	
	doswiadczenie_gracza[rozbrajajacy] += doswiadczenie_za_bombe;
	for (new i=0; i<playerCount; i++) 
	{
		id = Players[i];
		if(!klasa_gracza[id])
			continue;
		if(id != rozbrajajacy)
		{
			doswiadczenie_gracza[id]+= doswiadczenie_za_zabojstwo;
			ChatColor(id, "%L", LANG_PLAYER, "INFO_DEFUSE_BOMB1", prefix, doswiadczenie_za_bombe);
		}
		else
			ChatColor(id, "%L", LANG_PLAYER, "INFO_DEFUSE_BOMB2", prefix, doswiadczenie_za_bombe);
		SprawdzPoziom(id);
	}
}
public CmdStart(id, uc_handle)
{		
	if(!is_user_alive(id))
		return FMRES_IGNORED;
	
	new Float: velocity[3];
	pev(id, pev_velocity, velocity);
	new Float: speed = vector_length(velocity);
	if(szybkosc_gracza[id] > speed*1.8)
		set_pev(id, pev_flTimeStepSound, 300);
	
	return FMRES_IGNORED;
}
public Odrodzenie(id, menu, item)
{
	if(!is_user_alive(id))
		return HAM_IGNORED;
	
	if(!task_exists(id+ZADANIE_POKAZ_INFORMACJE))
		set_task(1.0, "PokazInformacje", id+ZADANIE_POKAZ_INFORMACJE, _, _, "b");
	
	if(nowa_klasa_gracza[id])
		UstawNowaKlase(id);
	
	if(!klasa_gracza[id])
	{
		WybierzKlase(id, menu, item);
		return HAM_IGNORED;
	}
	if(Resetuj[id])
	{
		ResetujPunkty(id);
		Resetuj[id] = false;
	}	
	DajBronie(id);
	ZastosujAtrybuty(id);
	
	if(punkty_gracza[id] > 0)
		PrzydzielPunkty(id);
	
	return PLUGIN_CONTINUE;
}

public UstawNowaKlase(id)
{
	new ret;
	
	new forward_handle = CreateOneForward(pluginy_klas[klasa_gracza[id]], "cod_class_disabled", FP_CELL, FP_CELL);
	ExecuteForward(forward_handle, ret, id, klasa_gracza[id]);
	DestroyForward(forward_handle);
	
	forward_handle = CreateOneForward(pluginy_klas[nowa_klasa_gracza[id]], "cod_class_enabled", FP_CELL, FP_CELL);
	ExecuteForward(forward_handle, ret, id, nowa_klasa_gracza[id]);
	DestroyForward(forward_handle);
	
	
	if(ret == 4)	
	{
		klasa_gracza[id] = 0;
		return PLUGIN_CONTINUE;
	}
	
	ExecuteForward(klasa_zmieniona, ret, id, klasa_gracza[id]);
	
	if(ret == 4)	
	{
		klasa_gracza[id] = 0;
		return PLUGIN_CONTINUE;
	}
	
	klasa_gracza[id] = nowa_klasa_gracza[id];
	nowa_klasa_gracza[id] = 0;
	
	UstawPerk(id, perk_gracza[id], wartosc_perku_gracza[id], 0);
	
	WczytajDane(id, klasa_gracza[id]);
	return PLUGIN_CONTINUE;
}

public DajBronie(id)
{
	for(new i=1; i < 32; i++)
	{
		if((1<<i) & (bronie_klasy[klasa_gracza[id]] | bonusowe_bronie_gracza[id]))
		{
			new weaponname[22];
			get_weaponname(i, weaponname, 21);
			fm_give_item(id, weaponname);
		}
	}
	
	if(gracz_ma_tarcze[id])
		fm_give_item(id, "weapon_shield");
	
	if(gracz_ma_noktowizor[id])
		cs_set_user_nvg(id, 1);
	
	new weapons[32];
	new weaponsnum;
	get_user_weapons(id, weapons, weaponsnum);
	for(new i=0; i<weaponsnum; i++)
		if(is_user_alive(id))
		if(maxAmmo[weapons[i]] > 0)
		cs_set_user_bpammo(id, weapons[i], maxAmmo[weapons[i]]);
}

public ZastosujAtrybuty(id)
{
	redukcja_obrazen_gracza[id] = 0.15*(1.0-floatpower(1.1, -0.112311341*PobierzWytrzymalosc(id, 1, 1, 1)));
	
	maksymalne_zdrowie_gracza[id] = 100.0+PobierzZdrowie(id, 1, 1, 1);
	
	szybkosc_gracza[id] = STANDARDOWA_SZYBKOSC+PobierzKondycje(id, 1, 1, 1)*1.1;
	
	set_pev(id, pev_health, maksymalne_zdrowie_gracza[id]);
	
	new iRet
	ExecuteForward(gFWD,iRet,id)	
}

public PoczatekRundy(id)	
{
	freezetime = false;
	new stats[8], bdhits[8]	
	for(new id=0;id<=32;id++)
	{
		if(!is_user_alive(id))
			continue;
		
		Display_Fade(id, 1<<9, 1<<9, 1<<12, 0, 255, 70, 100);
		
		set_task(0.1, "UstawSzybkosc", id+ZADANIE_USTAW_SZYBKOSC);
		
		switch(get_user_team(id))
		{
			case 1: client_cmd(id, "spk CodElite/start2");
			case 2: client_cmd(id, "spk CodElite/start");
		}
		if(!is_user_connected(id) || !ePlayerQuestType[id]) continue;
		
		get_user_rstats(id, stats, bdhits)
		
		switch(ePlayerQuestType[id])
		{
			case CELNOSC:
			{
				if(stats[5])
				{
					new celnosc = 100 * stats[5] / stats[4];
					
					if(celnosc >= ArrayGetCell(gIleRazy, iPlayerQuestID[id]))
					{
						Nagroda(id);
						return;
					}
					ChatColor(id, "%L", LANG_PLAYER, "QUEST_PREVIOUS_ROUND", prefix, celnosc);
				}
			}
			case KILLSROUND:
				iPlayerQuestProgress[id] = 0
			
			case HSRATIO:
			{
				if(stats[2])
				{
					new hsratio = 100 * stats[2] / stats[0];
					
					if(hsratio >= ArrayGetCell(gIleRazy, iPlayerQuestID[id]))
					{
						Nagroda(id);
						return;
					}
					ChatColor(id, "%L", LANG_PLAYER, "QUEST_PREVIOUS_ROUND2", prefix, hsratio);
				}
			}
		}
		switch(ePlayerQuestType[id])
		{
			case GRANAT:
			{
				cod_give_weapon(id, CSW_HEGRENADE);
			}
			case DMG_GRANAT:
			{
				cod_give_weapon(id, CSW_HEGRENADE);
			}
			case KILL_DGL_HS:
			{
				cod_give_weapon(id, CSW_DEAGLE);
			}
			case KILL_AWP_HS:
			{
				cod_give_weapon(id, CSW_AWP);
			}
		}	
	}
}
public NowaRunda()
{
	freezetime = true;
	for(new i = 0;i <= MAX;i++)
	{
		if(is_user_connected(i))
		{
			hud_znika[i] = 0;
			knife_uzyl[i] = false;
		}
		for(new j = 0;j <= MAX;j++)
			g_asysta[i][j] = false;
			
		switch(ePlayerQuestType[i])
		{
			case GRANAT:
			{
				cod_give_weapon(i, CSW_HEGRENADE);
			}
			case DMG_GRANAT:
			{
				cod_give_weapon(i, CSW_HEGRENADE);
			}
			case KILL_DGL_HS:
			{
				cod_give_weapon(i, CSW_DEAGLE);
			}
			case KILL_AWP_HS:
			{
				cod_give_weapon(i, CSW_AWP);
			}
		}		
	}	
}
public client_connect(id)
{	
	for(new j = 0;j <= MAX;j++)	
		
	g_asysta[id][j] = false;
	g_zemsta[id] = 0;
	
	ranga[id] = 0;
	
	get_pcvar_string(forum, nazwa_forum, 63);	
}
public Obrazenia(this, idinflictor, idattacker, Float:damage, damagebits)
{
	if(!is_user_alive(idattacker))
		return HAM_IGNORED;
	
	if(get_user_team(this) == get_user_team(idattacker))
		return HAM_IGNORED;
	
	if(get_user_health(this) <= 1)
		return HAM_IGNORED;
	
	SetHamParamFloat(4, damage*(1.0-redukcja_obrazen_gracza[this]));

	
	if(!is_user_connected(idattacker) || get_user_team(this) == get_user_team(idattacker) || !ePlayerQuestType[idattacker] || idattacker == this) return HAM_IGNORED;
	
	switch(ePlayerQuestType[idattacker])
	{
		case DMG_LACZNIE: add_progress(idattacker, floatround(damage))
			case DMG_GRANAT:
		{
			if(damagebits & DMG_HEGRENADE)
				add_progress(idattacker, floatround(damage));
		}
	}	
	
	return HAM_IGNORED;
	
}
public fwDamage(iVictim, iInflicter, iAttacker, Float:fDamage, iBitDamage)
{
	if( (IsPlayer(iAttacker) && IsPlayer(iVictim)) && !g_asysta[iAttacker][iVictim] && get_user_team(iVictim) != get_user_team(iAttacker) && iVictim != iAttacker)
		g_asysta[iAttacker][iVictim] = true;
	
	return HAM_IGNORED;
}
public fwdTakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
	if(IsPlayer(attacker) && get_user_weapon(attacker) == CSW_KNIFE && knife_model[attacker] == 1 && victim != attacker)
	{
		SetHamParamFloat(4, damage*2.0) //Obrazenia z knife beda 2 razy wieksze
	}
}
public ObrazeniaPost(id, idinflictor, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !klasa_gracza[attacker])
		return HAM_IGNORED;
	
	if(get_user_team(id) != get_user_team(attacker))
	{
		new doswiadczenie_za_obrazenia = get_pcvar_num(cvar_doswiadczenie_za_obrazenia);
		while(damage>20)
		{
			damage -= 20;
			doswiadczenie_gracza[attacker] += doswiadczenie_za_obrazenia;
		}
	}
	SprawdzPoziom(attacker);
	return HAM_IGNORED;
}
public SmiercGraczaPost(id, attacker, shouldgib)
{	
	if(!is_user_connected(attacker))
		return HAM_IGNORED;
	
	if(get_user_team(id) != get_user_team(attacker) && klasa_gracza[attacker])
	{
		new doswiadczenie_za_zabojstwo = get_pcvar_num(cvar_doswiadczenie_za_zabojstwo);
		new nowe_doswiadczenie = get_pcvar_num(cvar_doswiadczenie_za_zabojstwo);
		
		if(poziom_gracza[id] > poziom_gracza[attacker])
			nowe_doswiadczenie += (poziom_gracza[id]-poziom_gracza[attacker])*(doswiadczenie_za_zabojstwo/10);
		
		if(!perk_gracza[attacker])
		{
			if(random(get_pcvar_num(CVAR_RANDOM_PERK)) == 1)
			
			{
				UstawPerk(attacker, -1, -1, 1);
			}
		}
				
		doswiadczenie_gracza[attacker] += nowe_doswiadczenie;
		set_hudmessage(255, 212, 0, 0.53, -1.0, 0, 0.3, 1.5, 0.1, 0.3, true)
		show_hudmessage(attacker, "+%i ", nowe_doswiadczenie);	
		
	}
	if(id != attacker)
	{
		new opis[1023]
		new szName[64];
		get_user_name(attacker, szName, charsmax(szName))
		
		formatex(opis, charsmax(opis), "%L", LANG_PLAYER, "DEAD_INFO"
		, szName, nazwy_rang[ranga[attacker]], nazwy_klas[klasa_gracza[attacker]], poziom_gracza[attacker], get_user_health(attacker), nazwy_perkow[perk_gracza[attacker]], playerWeapon[get_user_weapon(attacker)]);
		new menu = menu_create(opis, "Wynik")
		
		menu_additem(menu, "OK")
		menu_display(id, menu)
	}
	
	SprawdzPoziom(attacker);
	return HAM_IGNORED;
}
public Wynik()
	return PLUGIN_HANDLED;
	

public client_death(killer, victim, wpnindex, hitplace, TK)
{
	if(!killer || !victim || TK)	
		return;
	
	if(hitplace == HIT_HEAD && get_pcvar_num(headshot_on) > 0)
	{
		doswiadczenie_gracza[killer] += doswiadczenie_za_hs;		
		set_hudmessage(38, 218, 116, 0.50, 0.33, 1, 6.0, 4.0)
		show_hudmessage(killer, "%L", LANG_PLAYER, "HEADSHOT", doswiadczenie_za_hs)
		
		SprawdzPoziom(killer);
	}
	if(!is_user_connected(killer) || !ePlayerQuestType[killer] || !killer || TK || killer == victim) return;
	
	switch(ePlayerQuestType[killer])
	{
		case ZABIJ, KILLSROUND: add_progress(killer, 1) 
		case HEADSHOT: 
		{ 
			if(hitplace == HIT_HEAD)
				add_progress(killer, 1);
		}
		case KNIFE:
		{
			if(wpnindex == CSW_KNIFE)
				add_progress(killer, 1)
		}
		case KNIFE_HEADSHOT:
		{
			if(wpnindex == CSW_KNIFE && hitplace == HIT_HEAD)
				add_progress(killer, 1)
		}
		case GRANAT:
		{
			if(wpnindex == CSW_HEGRENADE)
				add_progress(killer, 1)
		}
		case KILL_DGL_HS:
		{
			if(wpnindex == CSW_DEAGLE && hitplace == HIT_HEAD)
				add_progress(killer, 1)
		}
		case KILL_AWP_HS:
		{
			if(wpnindex == CSW_AWP && hitplace == HIT_HEAD)
				add_progress(killer, 1)
		}
		case DOUBLE:
		{
			if(iDoubleKillVariable[killer] && iDoubleKillVariable[killer] == wpnindex)
			{  
				add_progress(killer, 1)
				
				iDoubleKillVariable[killer] = 0
			}
			else
			{
				iDoubleKillVariable[killer] = wpnindex
				set_task(0.1, "ClearDouble", killer)
			}
		}
		case CLASS:
		{
			 if(cod_get_user_class(victim) == cod_get_classid("Komandos")) 
				add_progress(killer, 1);
		}
	}	
}
public eventDeath()
{
	new iKiller = read_data(1);
	new iVictim = read_data(2);
	
	
	if(IsPlayer(iKiller) && IsPlayer(iVictim))
	{	
		if(get_pcvar_num(zemsta_on) > 0)
		{
			g_zemsta[iVictim] = iKiller;
			
			new iXp = get_pcvar_num(cvar_zemsta);
			
			
			if(iKiller != g_zemsta[iKiller] && g_zemsta[iKiller] == iVictim)
			{	
				new sName[32];
				get_user_name(iVictim, sName, sizeof sName - 1);
				
				
				set_hudmessage(255, 212, 0, 0.59, 0.52, 0, 2.0, 2.0, 0.05, 0.05, 4)
				show_hudmessage(iKiller, "%L", LANG_PLAYER, "ZEMSTA", sName, iXp);
				
				doswiadczenie_gracza[iKiller] += iXp;
				
				g_zemsta[iKiller] = 0;
			}
			SprawdzPoziom(iKiller)	
		}
		if(get_pcvar_num(asysta_on) > 0)
		{
			new iXp = get_pcvar_num(cvar_asysta);
			
			for(new i = 0 ; i <= MAX; i ++)
			{
				if(i == iKiller)
					continue;
				
				new sName[32];
				get_user_name(iVictim, sName, sizeof sName - 1);
				
				if(g_asysta[i][iVictim]){		
					
					set_hudmessage(255, 212, 0, 0.59, 0.52, 0, 2.0, 2.0, 0.05, 0.05, 4)
					show_hudmessage(i, "%L", LANG_PLAYER, "ASYSTA", sName, iXp);
					
					doswiadczenie_gracza[i] += iXp;
					
					SprawdzPoziom(i)
				}
				
				g_asysta[i][iVictim] = false;
			}
		}
	}				
	return PLUGIN_CONTINUE;	
}

public MessageHealth(msg_id, msg_dest, msg_entity)
{
	static health;
	health = get_msg_arg_int(1);
	
	if (health < 256) return;
	
	if (!(health % 256))
		set_pev(msg_entity, pev_health, pev(msg_entity, pev_health)-1);
	
	set_msg_arg_int(1, get_msg_argtype(1), 255);
}

public client_authorized(id)
{
	UsunUmiejetnosci(id);
	get_user_name(id, nazwa_gracza[id], 63);
	UsunZadania(id);	
	set_task(10.0, "PokazReklame", id+ZADANIE_POKAZ_REKLAME);
}

public client_disconnect(id)
{
	ZapiszDane(id);
	UsunUmiejetnosci(id);
	UsunZadania(id);
	
	remove_task(id)
	
	if(!bZrobilWszystkie[id])
		SaveAktQuest(id);
	
	iDoubleKillVariable[id] = 0
	bZrobilWszystkie[id] = false
	ResetQuest(id);	
}

public client_putinserver(id)
{
	get_user_name(id, misje_nazwa_gracza[id], 32)
	if(nvault_get(vault, misje_nazwa_gracza[id]) >= sizeof(QuestRozdzial))
	{
		bZrobilWszystkie[id] = true
		return;
	}
	
	LoadAktQuest(id);	
}

public UsunUmiejetnosci(id)
{
	nowa_klasa_gracza[id] = 0;
	UstawNowaKlase(id);
	klasa_gracza[id] = 0;
	poziom_gracza[id] = 0;
	doswiadczenie_gracza[id] = 0;
	punkty_gracza[id] = 0;
	zdrowie_gracza[id] = 0;
	inteligencja_gracza[id] = 0;
	wytrzymalosc_gracza[id] = 0;
	kondycja_gracza[id] = 0;
	bonusowe_zdrowie_gracza[id] = 0;
	bonusowa_wytrzymalosc_gracza[id] = 0;
	bonusowa_inteligencja_gracza[id] = 0;
	bonusowa_kondycja_gracza[id] = 0;
	maksymalne_zdrowie_gracza[id] = 0.0;
	szybkosc_gracza[id] = 0.0;
	UstawPerk(id, 0, 0, 0);
	hud_znika[id] = 0;
}

public UsunZadania(id)
{
	remove_task(id+ZADANIE_POKAZ_INFORMACJE);
	remove_task(id+ZADANIE_POKAZ_REKLAME);	
	remove_task(id+ZADANIE_USTAW_SZYBKOSC);
}

public WygranaTerro()
{
	TerrorWins++
	WygranaRunda("TERRORIST");
}

public WygranaCT()
{
	CounterWins++
	WygranaRunda("CT");	
}
public WygranaRunda(const Team[])
{
	
	new Players[32], playerCount, id;
	get_players(Players, playerCount, "aeh", Team);
	new doswiadczenie_za_wygrana = get_pcvar_num(cvar_doswiadczenie_za_wygrana);
	new ordery_za_wygrana = get_pcvar_num(cvar_ordery_za_wygrana);
	
	if(get_playersnum() < 3)
		return;
	
	for (new i=0; i<playerCount; i++) 
	{
		id = Players[i];
		
		if(!klasa_gracza[id])
			continue;
		
		doswiadczenie_gracza[id] += doswiadczenie_za_wygrana;
		
		cod_set_user_Ordery(id, cod_get_user_Ordery(id) + ordery_za_wygrana);
		client_cmd(id, "spk CodElite/win_sound");
		SprawdzPoziom(id);
		hud_znika[id] = 1;
	}	
	InfoTeam(id)
	ChatColor(0, "%L", id, "INFO_WIN", prefix, Team, doswiadczenie_za_wygrana, ordery_za_wygrana);
}
public InfoTeam(id)
{
	hud_znika[id] = 1;
	new iPlayers[32], playerCount		
	
	get_players(iPlayers, playerCount, "ae", "TERRORIST");
	get_players(iPlayers, playerCount, "ae", "CT");
	
	
	set_dhudmessage(255, 0, 0, 0.28, 0.19, 0, 6.0, 12.0)	
	show_dhudmessage(0, "%L", LANG_PLAYER, "INFO_WIN_TEAM", TerrorWins, CounterWins);
}

public KomendaOpisPerku(id)
	OpisPerku(id, perk_gracza[id], wartosc_perku_gracza[id]);

public OpisPerku(id, perk, wartosc)
{
	new opis_perku[MAX_WIELKOSC_OPISU];
	new losowa_wartosc[15];
	if(wartosc > -1)
		num_to_str(wartosc, losowa_wartosc, 14);
	else
		format(losowa_wartosc, charsmax(losowa_wartosc), "%i-%i", min_wartosci_perkow[perk], max_wartosci_perkow[perk]);
	
	format(opis_perku, charsmax(opis_perku), opisy_perkow[perk]);
	replace_all(opis_perku, charsmax(opis_perku), "LW", losowa_wartosc);
	
	new opis[416+MAX_WIELKOSC_OPISU];
	formatex(opis, charsmax(opis), "%L", LANG_PLAYER, "OPIS_PERKU", nazwa_forum, nazwy_perkow[perk], opis_perku);
	show_menu(id, 1023, opis);
	
	client_cmd(id, "spk CodElite/select");
}

public OpisPerkow(id)
{
	hud_znika[id] = 1;
	static menu[128], formats
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "MENU_CHOOSE_PERK_TITLE")
	formats = menu_create(menu,"OpisPerkow_Handle");
	
	for(new i=1; i <= ilosc_perkow; i++)
		menu_additem(formats, nazwy_perkow[i]);
	
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
	return PLUGIN_CONTINUE;
}
public OpisPerkow_Handle(id, menu, item, perk, wartosc)
{
	if(item++ == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	
	OpisPerku_Handle(id, item, -1);
	
	client_cmd(id, "spk CodElite/select");
	
	return PLUGIN_CONTINUE;
}
public OpisPerku_Handle(id, perk, wartosc)
{
	new opis_perku[MAX_WIELKOSC_OPISU];
	new losowa_wartosc[15];
	if(wartosc > -1)
		num_to_str(wartosc, losowa_wartosc, 14);
	else
		format(losowa_wartosc, charsmax(losowa_wartosc), "%i-%i", min_wartosci_perkow[perk], max_wartosci_perkow[perk]);
	
	format(opis_perku, charsmax(opis_perku), opisy_perkow[perk]);
	replace_all(opis_perku, charsmax(opis_perku), "LW", losowa_wartosc);
	
	ChatColor(id, "Perk: !y%s", nazwy_perkow[perk]);
	ChatColor(id, "Opis: !y%s", opis_perku);
	
	hud_znika[id] = 0;
	OpisPerkow(id)
	client_cmd(id, "spk CodElite/select");
}
public OpisRang(id){
	if(is_user_connected(id))
		show_motd(id, "addons/amxmodx/data/rangi.txt", "Wszystkie Rangi COD:Elite");
}
public OpisKlasy(id)
{    
	hud_znika[id] = 1;
	static menu[128], formats
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "MENU_CHOOSE_FRAKCJE_TITLE")
	formats = menu_create(menu,"OpisKlase_Frakcje");	
	
	for(new i=1; i <= ilosc_klas; i++)
	{
		if(!is_in_previous(frakcja_klas[i],i)){
			menu_additem(formats,frakcja_klas[i],frakcja_klas[i])
		}
	}
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
	return PLUGIN_CONTINUE;
}
public OpisKlase_Frakcje(id, menu, item)
{
	hud_znika[id] = 1;
	
	if(item == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	
	new data[65], iName[64]
	new acces, callback
	menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
	
	static menu[128], formats
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "MENU_CHOOSE_CLASS_OPIS_TITLE")
	formats = menu_create(menu,"OpisKlasy_Handle");	
	
	new klasa[50],szTmp[5];
	for(new i=1; i <= ilosc_klas; i++)
	{
		if(equali(data,frakcja_klas[i]))
		{
			format(klasa, charsmax(klasa), "%s", nazwy_klas[i]);
			num_to_str(i,szTmp,charsmax(szTmp));
			menu_additem(formats, klasa,szTmp);
		}
	}
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
	return PLUGIN_CONTINUE;
}
public OpisKlasy_Handle(id, menu, item)
{
	hud_znika[id] = 1;
	client_cmd(id, "spk CodElite/select");
	
	if(item == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}	
	
	new data[65], iName[64]
	new acces, callback
	menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
	
	item = str_to_num(data);
	
	new bronie[320];
	for(new i=1, n=1; i <= 32; i++)
	{
		if((1<<i) & bronie_klasy[item])
		{
			new weaponname[22];
			get_weaponname(i, weaponname, 21);
			replace_all(weaponname, 21, "weapon_", " ");
			if(n > 1)    
				add(bronie, charsmax(bronie), ",");
			add(bronie, charsmax(bronie), weaponname);
			n++;
		}
	}	
	// \rKlasa:\w %s^n^n\r|\y %i\r |\w Inteligencja^n\r|\y %i\r |\w Zdrowie^n\r|\y %i\r |\w Wytrzymalosc^n\r|\y %i\r |\w Kondycja^n^n^n\rBronie:\w%s^n\rOpis: \w%s^n%s


	new opis[1023];
	
	formatex(opis,charsmax(opis),"%L", LANG_PLAYER, "OPIS_KLASY"
	, nazwy_klas[item], inteligencja_klas[item], zdrowie_klas[item], wytrzymalosc_gracza[item], kondycja_klas[item], bronie, opisy_klas[item], opisy_klas[item][79]); 
	
	new menu = menu_create(opis, "OpisKlasy");
	
	menu_additem(menu, "Wroc");
	
	menu_display(id, menu)
	return PLUGIN_HANDLED;
}
public WybierzKlase(id, menu, item)
{
	hud_znika[id] = 1;
	client_cmd(id, "spk CodElite/select");
	if(item == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}	
	static menu[128], formats
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "MENU_CHOOSE_FRAKCJE_TITLE")
	formats = menu_create(menu,"WybierzKlase_Frakcje");	
	
	
	for(new i=1; i <= ilosc_klas; i++)
	{
		if(!equal(frakcja_klas[i],"") && !is_in_previous(frakcja_klas[i],i)){
			menu_additem(formats,frakcja_klas[i],frakcja_klas[i])
		}
	}
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
	return PLUGIN_CONTINUE;
}
public WybierzKlase_Frakcje(id, menu, item)
{
	hud_znika[id] = 1;
	
	if(item == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	
	new data[65], iName[64]
	new acces, callback
	menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
	
	static menu[128], formats
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "MENU_CHOOSE_CLASS_TITLE")
	formats = menu_create(menu,"WybierzKlase_Handle");	
		

	new klasa[370],bronie[320],bron[22],n,szTmp[5];
	for(new i=1; i <= ilosc_klas; i++)
	{
		if(equali(data,frakcja_klas[i]))
		{
			WczytajDane(id, i);
			bronie = ""
			n=1
			for(new b=1 ; b <= 32; b++)
			{
				if((1<<b) & bronie_klasy[i])
				{
					get_weaponname(b, bron, 21)
					replace_all(bron, 21, "weapon_deagle", "DGL")
					replace_all(bron, 21, "weapon_mp5navy", "MP5")				
					replace(bron, 21, "weapon_","")
					strtoupper(bron)
					if(n > 1)    add(bronie, charsmax(bronie), "\w |\d ")			    
					add(bronie, charsmax(bronie), bron)
					n++
				}
			}	
			format(klasa, charsmax(klasa), "\r| \w%i\r | \y%s\r | \d%s", poziom_gracza[id], nazwy_klas[i], bronie);
			num_to_str(i,szTmp,charsmax(szTmp));
			menu_additem(formats, klasa, szTmp);
				
		}
	}
	
	WczytajDane(id, klasa_gracza[id]);
	
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
	return PLUGIN_CONTINUE;
}
public WybierzKlase_Handle(id, menu, item)
{
	hud_znika[id] = 0;
	client_cmd(id, "spk CodElite/select");
	
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}	  
	
	new data[65], iName[64]
	new acces, callback
	menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
	
	item = str_to_num(data);
	
	
	if(item == klasa_gracza[id] && !nowa_klasa_gracza[id])
		return PLUGIN_CONTINUE;				
		
 	nowa_klasa_gracza[id] = item;
	//Display_Fade(id, 1<<9, 1<<3, 1<<3, 0, 128, 255, 200)
	
	message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id); 
	write_short(1<<12) 
	write_short(1<<8)
	write_short(0x0001)
	write_byte(0)
	write_byte(128)
	write_byte(255) 
	write_byte(200)
	message_end()	
	
	if(klasa_gracza[id])
		ChatColor(id, "%L", LANG_PLAYER, "CLASS_NEXT_ROUND", prefix);	
	else
	{
		UstawNowaKlase(id);
		DajBronie(id);
		ZastosujAtrybuty(id);
	}
	
	return PLUGIN_CONTINUE;
}
public bool:is_in_previous(frakcja[],from){
	for(new i = from - 1;i>=1;i--){
		if(equali(frakcja_klas[i],frakcja)){
			return true;
		}
	}
	return false;
}
public KnifeMenu(id)
{
	if(knife_uzyl[id])
	{
		ChatColor(id, "%L", LANG_PLAYER, "BLOCK_CHOOSE_KNIFE", prefix);
		return PLUGIN_HANDLED;
	}
	else
	{
		knife_uzyl[id] = true;
		hud_znika[id] = 1;		
		static menu[128], formats
		
		
		new knife1[64], knife2[64], knife3[64], knife4[64], knife5[64], knife_default[64];
		
		format(knife1, charsmax(knife1), "%L", LANG_PLAYER, "MENU_KNIFE1");
		format(knife2, charsmax(knife2), "%L", LANG_PLAYER, "MENU_KNIFE2");
		format(knife3, charsmax(knife3), "%L", LANG_PLAYER, "MENU_KNIFE3");
		format(knife4, charsmax(knife4), "%L", LANG_PLAYER, "MENU_KNIFE4");
		format(knife5, charsmax(knife5), "%L", LANG_PLAYER, "MENU_KNIFE5");
		format(knife_default, charsmax(knife_default), "%L", LANG_PLAYER, "MENU_KNIFE_DEFAULT");
		
		// Title	
		formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "MENU_CHOOSE_KNIFE_TITLE")
		formats = menu_create(menu,"Knife_Handler");
		
		menu_additem(formats, knife1);
		menu_additem(formats, knife2);
		menu_additem(formats, knife3);
		menu_additem(formats, knife4);
		menu_additem(formats, knife5);
		menu_additem(formats, knife_default);
		
		menu_display(id, formats);
		
		client_cmd(id, "spk CodElite/select");
	}
	return PLUGIN_HANDLED
}

public Knife_Handler(id, menu, item)
{
	if(item == MENU_BACK)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}	
	switch(item) 
	{
		case 0:
		{
			SetKnife(id , 1)
			
			message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id)
			write_short(1<<12) 
			write_short(1<<8)
			write_short(0x0001)
			write_byte(205)
			write_byte(205)
			write_byte(0) 
			write_byte(200)
			message_end()
			
			ChatColor(id, "%L", LANG_PLAYER, "INFO_KNIFE1", prefix);		
		}
		
		case 1: 
		{
			SetKnife(id , 2)
			
			message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id); 
			write_short(1<<12) 
			write_short(1<<8)
			write_short(0x0001)
			write_byte(190)
			write_byte(190)
			write_byte(0) 
			write_byte(200)
			message_end()	
			
			ChatColor(id, "%L", LANG_PLAYER, "INFO_KNIFE2", prefix);	
		}
		
		case 2: 
		{	
			SetKnife(id , 3)
			
			message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id); 
			write_short(1<<12) 
			write_short(1<<8)
			write_short(0x0001)
			write_byte(0)
			write_byte(206)
			write_byte(209) 
			write_byte(200)
			message_end()
			
			ChatColor(id, "%L", LANG_PLAYER, "INFO_KNIFE3", prefix);	
		}	
		case 3:
		{
			SetKnife(id, 4)
			
			message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id); 
			write_short(1<<12) 
			write_short(1<<8)
			write_short(0x0001)
			write_byte(255)
			write_byte(127)
			write_byte(80) 
			write_byte(200)
			message_end()
			
			ChatColor(id, "%L", LANG_PLAYER, "INFO_KNIFE4", prefix);	
		}
		case 4: 
		{
			SetKnife(id , 5)
			
			message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id); 
			write_short(1<<12) 
			write_short(1<<8)
			write_short(0x0001)
			write_byte(208)
			write_byte(32)
			write_byte(144) 
			write_byte(200)
			message_end()
			
			ChatColor(id, "%L", LANG_PLAYER, "INFO_KNIFE5", prefix);	
		}
		case 5:
		{
			SetKnife(id , 6)
			
			message_begin(MSG_ONE_UNRELIABLE, MsgScreenfade, {0, 0, 0}, id); 
			write_short(1<<12) 
			write_short(1<<8)
			write_short(0x0001)
			write_byte(30)
			write_byte(144)
			write_byte(255) 
			write_byte(200)
			message_end()
			
			ChatColor(id, "%L", LANG_PLAYER, "INFO_KNIFE_DEFAULT", prefix);	
		}
		
	}
	hud_znika[id] = 0;
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}
public SetKnife(id , Knife) 
{
	knife_model[id] = Knife
	
	new Clip, Ammo, Weapon = get_user_weapon(id, Clip, Ammo) 
	if ( Weapon != CSW_KNIFE )
		return PLUGIN_HANDLED
	
	new vModel[56],pModel[56]
	
	switch(Knife)
	{
		case 1: {
			format(vModel,55,"models/CodElite/knife/v_huntsman.mdl")
			format(pModel,55,"models/CodElite/knife/p_huntsman.mdl")			
		}
		case 2: {
			format(vModel,55,"models/CodElite/knife/v_karambit.mdl")
			format(pModel,55,"models/CodElite/knife/p_karambit.mdl")		
		}
		case 3: {
			format(vModel,55,"models/CodElite/knife/v_m9bayonet.mdl")
			format(pModel,55,"models/CodElite/knife/p_m9bayonet.mdl")			
		}
		case 4: {
			format(vModel,55,"models/CodElite/knife/v_butterfly.mdl")
			format(pModel,55,"models/CodElite/knife/p_butterfly.mdl")			
		}
		case 5: {
			format(vModel,55,"models/CodElite/knife/v_gut.mdl")
			format(pModel,55,"models/CodElite/knife/p_gut.mdl")	
		}
		case 6: {
			format(vModel,55,"models/CodElite/knife/v_knife.mdl")
			format(pModel,55,"models/CodElite/knife/p_knife.mdl")	
		}	
		default: {
			
			format(vModel,55,"models/CodElite/knife/v_knife.mdl")
			format(pModel,55,"models/CodElite/knife/p_knife.mdl")
		}
	} 
	hud_znika[id] = 0;
	entity_set_string(id, EV_SZ_viewmodel, vModel)
	entity_set_string(id, EV_SZ_weaponmodel, pModel)
	
	return PLUGIN_HANDLED;  
}
public PrzydzielPunkty(id)
{	
	inteligencjaa = get_cvar_num("cod_inteligencja");
	zdrowiee = get_cvar_num("cod_zdrowie");
	wytrzymaloscc = get_cvar_num("cod_wytrzymalosc");
	kondycjaa = get_cvar_num("cod_kondycja");
	
	hud_znika[id] = 1;
	
	new szybkosc[124];
	new inteligencja[124];
	new zdrowie[124];
	new wytrzymalosc[124];
	new kondycja[124];
	new tytul[124];
	
	
	if(co_ile[szybkosc_rozdania[id]] == -1)
		format(szybkosc, charsmax(szybkosc), "%L", LANG_PLAYER, "MENU_SZYBKOSC_ROZDAWANIA2");
	else
		format(szybkosc, charsmax(szybkosc), "%L", LANG_PLAYER, "MENU_SZYBKOSC_ROZDAWANIA1", co_ile[szybkosc_rozdania[id]]); 
	
	
	format(inteligencja, charsmax(inteligencja), "%L", LANG_PLAYER, "MENU_INTELIGENCJA", PobierzInteligencje(id, 1, 0, 0), PobierzInteligencje(id, 0,0,1), inteligencjaa);
	format(zdrowie, charsmax(zdrowie), "%L", LANG_PLAYER, "MENU_ZDROWIE", PobierzZdrowie(id, 1, 0, 0), PobierzZdrowie(id, 0, 0, 1), zdrowiee, zdrowie_gracza[id]);
	format(wytrzymalosc, charsmax(wytrzymalosc), "%L", LANG_PLAYER, "MENU_WYTRZYMALOSC", PobierzWytrzymalosc(id, 1, 0, 0), PobierzWytrzymalosc(id, 0, 0, 1), wytrzymaloscc, redukcja_obrazen_gracza[id]*100);
	format(kondycja, charsmax(kondycja), "%L", LANG_PLAYER, "MENU_KONDYCJA", PobierzKondycje(id, 1, 0, 0), PobierzKondycje(id, 0, 0, 1), kondycjaa, floatround(szybkosc_gracza[id]*1.1));	
	
	
	format(tytul, charsmax(tytul), "%L", LANG_PLAYER, "MENU_PUNKTY", punkty_gracza[id]);
	new menu = menu_create(tytul, "PrzydzielPunkty_Handler");
	
	menu_additem(menu, szybkosc);
	menu_addblank(menu, 0);
	
	menu_additem(menu, inteligencja);
	menu_additem(menu, zdrowie);
	menu_additem(menu, wytrzymalosc);
	menu_additem(menu, kondycja);
	menu_setprop(menu, MPROP_EXIT, 0);
	menu_display(id, menu);
	
	client_cmd(id, "spk CodElite/select");
	return PLUGIN_HANDLED
}
public PrzydzielPunkty_Handler(id, menu, item) 
{	
	if(item == MENU_EXIT) {
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}	
	hud_znika[id] = 0;
	
	inteligencjaa = get_cvar_num("cod_inteligencja");
	zdrowiee = get_cvar_num("cod_zdrowie");
	wytrzymaloscc = get_cvar_num("cod_wytrzymalosc");
	kondycjaa = get_cvar_num("cod_kondycja");
	
	client_cmd(id, "spk CodElite/select");
	
	if(punkty_gracza[id] < 1)
		return PLUGIN_CONTINUE;	
	
	new ilosc;
	if(co_ile[szybkosc_rozdania[id]] == -1)
		ilosc = punkty_gracza[id];
	else ilosc = (co_ile[szybkosc_rozdania[id]] > punkty_gracza[id]) ? punkty_gracza[id] : co_ile[szybkosc_rozdania[id]]
	
	switch(item) 
	{ 
		case 0: {
			
			if(szybkosc_rozdania[id] < charsmax(co_ile)) szybkosc_rozdania[id]++;
			else szybkosc_rozdania[id] = 0;
		} 
		
		case 1: {
			if(inteligencja_gracza[id] < inteligencjaa) {
				if(ilosc > inteligencjaa - inteligencja_gracza[id])
					ilosc = inteligencjaa - inteligencja_gracza[id];
				inteligencja_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ChatColor(id, "%L", LANG_PLAYER, "INFO_INTELIGENCJA", prefix, PobierzInteligencje(id, 1, 0, 0), inteligencjaa);
		}		
		case 2: 
		{
			if(zdrowie_gracza[id] < zdrowiee) 
			{
				if(ilosc > zdrowiee - zdrowie_gracza[id])
					ilosc = zdrowiee - zdrowie_gracza[id];
				zdrowie_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ChatColor(id, "%L", LANG_PLAYER, "INFO_ZDROWIE", prefix, PobierzZdrowie(id, 1, 0, 0), zdrowiee);
		}
		
		case 3: 
		{
			if(wytrzymalosc_gracza[id] < wytrzymaloscc) 
			{
				if(ilosc > wytrzymaloscc - wytrzymalosc_gracza[id])
					ilosc = wytrzymaloscc - wytrzymalosc_gracza[id];
				wytrzymalosc_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ChatColor(id, "%L", LANG_PLAYER, "INFO_WYTRZYMALOSC", prefix, PobierzWytrzymalosc(id, 1, 0, 0), wytrzymaloscc);
		}
		case 4: 
		{
			if(kondycja_gracza[id] < kondycjaa) 
			{
				if(ilosc > kondycjaa - kondycja_gracza[id])
					ilosc = kondycjaa - kondycja_gracza[id];
				kondycja_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ChatColor(id, "%L", LANG_PLAYER, "INFO_KONDYCJA",  prefix, PobierzKondycje(id, 1, 0, 0), kondycjaa);	
		}
	}
	
	if(punkty_gracza[id] > 0)
		PrzydzielPunkty(id);
	
	return PLUGIN_CONTINUE;
}

public KomendaResetujPunkty(id)
{	
	ChatColor(id,"%L", LANG_PLAYER, "INFO_RESET_PUNKTOW", prefix);
	client_cmd(id, "spk CodElite/select");
	
	Resetuj[id] = true;
}


public ResetujPunkty(id)
{
	punkty_gracza[id] = (poziom_gracza[id]-1)*2;
	inteligencja_gracza[id] = 0;
	zdrowie_gracza[id] = 0;
	kondycja_gracza[id] = 0;
	wytrzymalosc_gracza[id] = 0;
	
	if(punkty_gracza[id])
		PrzydzielPunkty(id);
}
public regeneracja_hp(id)
{
	if(!is_user_alive(id))
		return FMRES_IGNORED;
	
	if(knife_model[id] == 5)
	{
		new cur_health = get_user_health(id);
		new max_health = (PobierzZdrowie(id, 1, 1, 1))+100;
		new new_health;
		
		//floatround(wartosc_regeneracji_gracza[id], floatround_floor)
		
		if(cur_health+CVAR_KNIFE_HEALTH_ADD < max_health)
		{
			new_health = cur_health+CVAR_KNIFE_HEALTH_ADD;
			set_user_health(id, new_health);
			message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
			write_short(1<<10)
			write_short(1<<10)
			write_short(0x0000)
			write_byte(0)
			write_byte(200)
			write_byte(0)
			write_byte(75)
			message_end()			
		}
		else {
			new_health = max_health;
		}		
	}
	else 
		remove_task(id);
	
	return PLUGIN_CONTINUE;
}
public CurWeapon(id)
{	
	if(!is_user_connected(id))
		return;
	
	new weapon = read_data(2)
	new team = get_user_team(id);
	
	if(team > 2)
		return;
	
	new bron = read_data(2);     
	new bronie = (bronie_klasy[klasa_gracza[id]] | bonusowe_bronie_gracza[id] | bronie_druzyny[team] | bronie_dozwolone);
	
	
	if(!(1<<bron & bronie))
	{
		new param[2];
		param[0] = id;
		param[1] = bron;
		set_task(0.1, "Strip", _, param, 2);
	}
	
	if(cs_get_user_shield(id) && !gracz_ma_tarcze[id])
		engclient_cmd(id, "drop", "weapon_shield");    
	
	
	UstawSzybkosc(id);
	
	// Set Knife Model
	SetKnife(id, knife_model[id])   
	
	if(knife_model[id] == 2)
	{
		set_user_footsteps(id, ((weapon == CSW_KNIFE) ? 1 : 0))
	}
	if(knife_model[id] == 3 && !freezetime)
	{
		if(weapon == CSW_KNIFE)
			set_pev(id, pev_maxspeed, szybkosc_gracza[id]+get_pcvar_float(CVAR_KNIFE_HIGHSPEED));
		else
			return;
	}
	
	if(knife_model[id] == 4)
	{
		set_user_gravity(id, ((weapon == CSW_KNIFE) ? get_pcvar_float(CVAR_KNIFE_LOWGRAV) : 1.0))
	}
	if(knife_model[id] == 5)
	{
		if(weapon == CSW_KNIFE)
			set_task(get_pcvar_float(CVAR_KNIFE_HP_TIME), "regeneracja_hp", id, _, _, "b");
		else
		{
			remove_task(id);
			return;
		}
	}
}
public Strip(param[2])
{
	if(is_user_alive(param[0]) && ( 1 <= param[1] <= 30) )
	{
		get_weaponname(param[1], weaponname, 21);
		ham_strip_weapon(param[0], weaponname);
	}
}
public EmitSound(id, iChannel, szSound[], Float:fVol, Float:fAttn, iFlags, iPitch ) 
{
	if(!is_user_alive(id))
		return FMRES_IGNORED;
	
	if(equal(szSound, "common/wpn_denyselect.wav"))
	{
		new forward_handle = CreateOneForward(pluginy_klas[klasa_gracza[id]], "cod_class_skill_used", FP_CELL);
		ExecuteForward(forward_handle, id, id);
		DestroyForward(forward_handle);
		return FMRES_SUPERCEDE;
	}
	
	if(equal(szSound, "items/ammopickup2.wav"))
	{
		cs_set_user_armor(id, 0, CS_ARMOR_NONE);
		return FMRES_SUPERCEDE;
	}
	
	if(equal(szSound, "items/equip_nvg.wav") && !gracz_ma_noktowizor[id])
	{
		cs_set_user_nvg(id, 0);
		return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED;
}

public UzyjPerku(id)
{
	if(!is_user_alive(id))
		return PLUGIN_HANDLED;
	
	new forward_handle = CreateOneForward(pluginy_perkow[perk_gracza[id]], "cod_perk_used", FP_CELL);
	ExecuteForward(forward_handle, id, id);
	DestroyForward(forward_handle);
	return PLUGIN_HANDLED;
}

public ZapiszDane(id)
{
	if(!klasa_gracza[id])
		return PLUGIN_CONTINUE;
	
	new vaultkey[128],vaultdata[256], identyfikator[64];
	format(vaultdata, charsmax(vaultdata),"#%i#%i#%i#%i#%i#%i"
	, doswiadczenie_gracza[id], poziom_gracza[id], inteligencja_gracza[id], zdrowie_gracza[id], wytrzymalosc_gracza[id], kondycja_gracza[id]);
	
	new typ_zapisu = get_pcvar_num(cvar_typ_zapisu);
	
	switch(typ_zapisu)
	{
		case 1: copy(identyfikator, charsmax(identyfikator), nazwa_gracza[id]);
			case 2: get_user_authid(id, identyfikator, charsmax(identyfikator));
			case 3: get_user_ip(id, identyfikator, charsmax(identyfikator));
		}
	
	format(vaultkey, charsmax(vaultkey),"%s-%s-%i-cod", identyfikator, nazwy_klas[klasa_gracza[id]], typ_zapisu);
	nvault_set(vault,vaultkey,vaultdata);
	
	return PLUGIN_CONTINUE;
}

public WczytajDane(id, klasa)
{
	new vaultkey[128],vaultdata[256], identyfikator[64];
	
	new typ_zapisu = get_pcvar_num(cvar_typ_zapisu);
	
	switch(typ_zapisu)
	{
		case 1: copy(identyfikator, charsmax(identyfikator), nazwa_gracza[id]);
			case 2: get_user_authid(id, identyfikator, charsmax(identyfikator));
			case 3: get_user_ip(id, identyfikator, charsmax(identyfikator));
		}
	
	format(vaultkey, charsmax(vaultkey),"%s-%s-%i-cod", identyfikator, nazwy_klas[klasa], typ_zapisu);
	
	
	if(!nvault_get(vault,vaultkey,vaultdata,255)) // Jezeli nie ma danych gracza sprawdza stary zapis. 
	{
		format(vaultkey, charsmax(vaultkey), "%s-%i-cod", nazwa_gracza[id], klasa);
		nvault_get(vault,vaultkey,vaultdata,255);
	}
	
	replace_all(vaultdata, 255, "#", " ");
	
	new danegracza[6][32];
	
	parse(vaultdata, danegracza[0], 31, danegracza[1], 31, danegracza[2], 31, danegracza[3], 31, danegracza[4], 31, danegracza[5], 31);
	
	doswiadczenie_gracza[id] = str_to_num(danegracza[0]);
	poziom_gracza[id] = str_to_num(danegracza[1])>0?str_to_num(danegracza[1]):1;
	inteligencja_gracza[id] = str_to_num(danegracza[2]);
	zdrowie_gracza[id] = str_to_num(danegracza[3]);
	wytrzymalosc_gracza[id] = str_to_num(danegracza[4]);
	kondycja_gracza[id] = str_to_num(danegracza[5]);
	punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id];
	
	return PLUGIN_CONTINUE;
}
/*
public SprzedajPerk(id)
{
	if(perk_gracza[id])
	{
		ChatColor(id, "%L", LANG_PLAYER, "INFO_DROP_PERK1", prefix, nazwy_perkow[perk_gracza[id]]);
		UstawPerk(id, 0, 0, 0);
	}
	else
		ChatColor(id, "%L", LANG_PLAYER, "INFO_DROP_PERK2", prefix);
}
*/
public SprzedajPerk(id)
{	
	new Orders = cod_get_user_Ordery(id);
	new LosowaCena = random_num(1, 9);		
		
	if(perk_gracza[id])
	{					
		cod_set_user_Ordery(id, Orders + LosowaCena);
		ChatColor(id, "%L", LANG_PLAYER, "INFO_SELL_PERK", prefix, LosowaCena);
		UstawPerk(id, 0, 0, 0);
		
	}
	else
		ChatColor(id, "%L", LANG_PLAYER, "INFO_DROP_PERK2", prefix);

}

public SprawdzRange(id)
{
	static bool:zdobyl_range;
	zdobyl_range = false;
	
	static stats[8], body[8]
	get_user_stats(id, stats, body)
	
	while(stats[0] >= przedzial[ranga[id]] && ranga[id] <= MAX_RANG)
	{
		ranga[id]++;
		zdobyl_range = true;
	}
	
	if(zdobyl_range)
	{
		ChatColor(id, "%L", LANG_PLAYER, "INFO_RANGA_AWANS", prefix, nazwy_rang[ranga[id]]);
		client_cmd(id, "spk CodElite/getin");
	}
}
public Sprawdz_Range(id)
{	
	static stats[8], body[8]
	get_user_stats(id, stats, body)
	
	while(stats[0] >= przedzial[ranga[id]] && ranga[id] <= MAX_RANG)
		ranga[id]++;	
}
public SprawdzPoziom(id)
{	
	if(!is_user_connected(id))
		return;
	
	new limit_poziomu = get_pcvar_num(cvar_limit_poziomu);
	
	new bool:zdobyl_poziom = false, bool:stracil_poziom = false;
	
	while(doswiadczenie_gracza[id] >= PobierzDoswiadczeniePoziomu(poziom_gracza[id]) && poziom_gracza[id] < limit_poziomu)
	{
		poziom_gracza[id]++;
		punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id];
		zdobyl_poziom = true;
	}
	
	while(doswiadczenie_gracza[id] < PobierzDoswiadczeniePoziomu(poziom_gracza[id]-1))
	{
		poziom_gracza[id]--;
		stracil_poziom = true;
	}
	
	if(poziom_gracza[id] > limit_poziomu)
	{
		poziom_gracza[id] = limit_poziomu;
		ResetujPunkty(id);
		inteligencja_gracza[id] = inteligencjaa;
		zdrowie_gracza[id] = zdrowiee;
		wytrzymalosc_gracza[id] = wytrzymaloscc;
		kondycja_gracza[id] = kondycjaa;
		ChatColor(id, "%L", LANG_PLAYER, "INFO_MAX_POZIOM1", prefix );
		ChatColor(id, "%L", LANG_PLAYER, "INFO_MAX_POZIOM2", prefix );
	}
	if(stracil_poziom)
	{
		ResetujPunkty(id);
	}
	else if(zdobyl_poziom)
	{
		punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id];
		
		set_dhudmessage(212, 255, 85, 0.49, 0.57, 0, 6.0, 5.0);
		show_dhudmessage(id,"%L", LANG_PLAYER, "INFO_AWANS_DHUD", poziom_gracza[id], nazwy_klas[klasa_gracza[id]]);
		
		client_cmd(id, "spk CodElite/levelup");
		
		if(!(poziom_gracza[id] % 50))
		{
			ChatColor(0, "%L", LANG_PLAYER, "INFO_POZIOM_AWANS", prefix, nazwa_gracza[id], poziom_gracza[id], nazwy_klas[klasa_gracza[id]]);
			client_cmd(id, "spk CodElite/levelup");
		}
	}	
	SprawdzRange(id);
	ZapiszDane(id);
}
public PokazInformacje(id) 
{
	id -= ZADANIE_POKAZ_INFORMACJE;
	
	if(!is_user_connected(id))
	{
		remove_task(id+ZADANIE_POKAZ_INFORMACJE);
		return PLUGIN_CONTINUE;
	}
	
	if(!is_user_alive(id))
	{       
		new target = pev(id, pev_iuser2);
		
		if(!target)
			return PLUGIN_CONTINUE;         
		
		new ileMa = doswiadczenie_gracza[target],ilePotrzeba = PobierzDoswiadczeniePoziomu(poziom_gracza[target]),ilePotrzebaBylo = PobierzDoswiadczeniePoziomu(poziom_gracza[target]-1)
		new Float:fProcent = 0.0;
		fProcent = (float((ileMa - ilePotrzebaBylo)) / float((ilePotrzeba - ilePotrzebaBylo))) * 100.0;
		
		new zdrowie = get_user_health(target);
		new ordery = cod_get_user_Ordery(target)
		
		
		set_hudmessage(255, 0, 0, 0.8, -1.0, 0, 1.0, 1.0, 0.1, 0.1);
		
		if(!ePlayerQuestType[target])
			ShowSyncHudMsg(id, SyncHudObj, "[COD Elite: %i ]^n[Forum: %s ]^n[Klasa: %s]^n[Poziom: %i]^n[Exp: %0.1f%%]^n[Zdrowie: %d]^n[Ordery: %i]^n[Perk: %s]^n[Ranga: %s]^n[Brak misji]"
			, get_pcvar_num(cvar_limit_poziomu), nazwa_forum, nazwy_klas[klasa_gracza[target]], poziom_gracza[target], fProcent, zdrowie, ordery, nazwy_perkow[perk_gracza[target]], nazwy_rang[ranga[target]]);	
		else
			ShowSyncHudMsg(id, SyncHudObj, "[COD Elite: %i ]^n[Forum: %s ]^n[Klasa: %s]^n[Poziom: %i]^n[Exp: %0.1f%%]^n[Zdrowie: %d]^n[Ordery: %i]^n[Perk: %s]^n[Ranga: %s]^n[Rozdzial: %s^n%s [%i/%i]]"
			, get_pcvar_num(cvar_limit_poziomu), nazwa_forum, nazwy_klas[klasa_gracza[target]], poziom_gracza[target], fProcent, zdrowie, ordery, nazwy_perkow[perk_gracza[target]], nazwy_rang[ranga[target]], QuestRozdzial[iPlayerPrzedzial[target]], QuestInfoMessage[ePlayerQuestType[target]], iPlayerQuestProgress[target], ArrayGetCell(gIleRazy, iPlayerQuestID[target]));
		
		return PLUGIN_CONTINUE;         
		
	}  
	new ileMa = doswiadczenie_gracza[id],ilePotrzeba = PobierzDoswiadczeniePoziomu(poziom_gracza[id]),ilePotrzebaBylo = PobierzDoswiadczeniePoziomu(poziom_gracza[id]-1)
	new Float:fProcent = 0.0;
	fProcent = (float((ileMa - ilePotrzebaBylo)) / float((ilePotrzeba - ilePotrzebaBylo))) * 100.0;
	new zdrowie = get_user_health(id);
	new ordery = cod_get_user_Ordery(id)
	
	if(hud_znika[id])
		return PLUGIN_CONTINUE;
	
	set_hudmessage(42, 170, 255, 0.11, 0.04, 0, 1.0, 1.0, 0.1, 0.1);
	
	if(!ePlayerQuestType[id])
		ShowSyncHudMsg(id, SyncHudObj, "[ COD Elite: %i ] | [Forum: %s ]^n[ Klasa : %s | Ranga: %s ]^n[ Poziom : %i | Exp: %0.1f%% ]^n[ Zdrowie : %d | Ordery: %i ]^n[ Perk : %s ] | [Oddzial: ]^n^n [ Brak Misji | Wpisz: /misje ]"
		, get_pcvar_num(cvar_limit_poziomu), nazwa_forum, nazwy_klas[klasa_gracza[id]], nazwy_rang[ranga[id]], poziom_gracza[id], fProcent, zdrowie, ordery, nazwy_perkow[perk_gracza[id]]);
	else	
		
	ShowSyncHudMsg(id, SyncHudObj, "[ COD Elite: %i ] | [Forum: %s ]^n[ Klasa : %s | Ranga: %s ]^n[ Poziom : %i | Exp: %0.1f%% ]^n[ Zdrowie : %d | Ordery: %i ]^n[ Perk : %s ] | [Oddzial: ]^n^n| Rozdzial: %s - (%s [%i/%i])"
	, get_pcvar_num(cvar_limit_poziomu), nazwa_forum, nazwy_klas[klasa_gracza[id]], nazwy_rang[ranga[id]], poziom_gracza[id], fProcent, zdrowie, ordery, nazwy_perkow[perk_gracza[id]], QuestRozdzial[iPlayerPrzedzial[id]], QuestInfoMessage[ePlayerQuestType[id]], iPlayerQuestProgress[id], ArrayGetCell(gIleRazy, iPlayerQuestID[id]));
	
	return PLUGIN_CONTINUE;
}

public PokazReklame(id)
{
	id-=ZADANIE_POKAZ_REKLAME;
	ChatColor(id, "%L", LANG_PLAYER, "INFO1", prefix , nazwy_rang[ranga[id]]);
	ChatColor(id, "%L", LANG_PLAYER, "INFO2", prefix);
	ChatColor(id, "%L", LANG_PLAYER, "INFO3", prefix);
}

public UstawSzybkosc(id)
{
	id -= id>32? ZADANIE_USTAW_SZYBKOSC: 0;
	
	if(klasa_gracza[id] && !freezetime)
		set_pev(id, pev_maxspeed, szybkosc_gracza[id]);
}

public DotykBroni(weapon, id)
{
	if(get_pcvar_num(cvar_blokada_broni) < 1)
		return HAM_IGNORED;
	
	if(!is_user_connected(id))
		return HAM_IGNORED;
	
	new model[23];
	pev(weapon, pev_model, model, 22);
	if (pev(weapon, pev_owner) == id || containi(model, "w_backpack") != -1)
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}

public DotykTarczy(weapon, id)
{
	if(get_pcvar_num(cvar_blokada_broni) < 1)
		return HAM_IGNORED;
	
	if(!is_user_connected(id))
		return HAM_IGNORED;
	
	if(gracz_ma_tarcze[id])
		return HAM_IGNORED;
	
	return HAM_SUPERCEDE;
}

public UstawPerk(id, perk, wartosc, pokaz_info)
{
	if(!ilosc_perkow)
		return PLUGIN_CONTINUE;
	
	static obroty[33];
	
	if(obroty[id]++ >= 5)
	{
		UstawPerk(id, 0, 0, 0);
		obroty[id] = 0;
		return PLUGIN_CONTINUE;
	}
	
	perk = (perk == -1)? random_num(1, ilosc_perkow): perk;
	wartosc = (wartosc == -1 || min_wartosci_perkow[perk] > wartosc ||  wartosc > max_wartosci_perkow[perk])? random_num(min_wartosci_perkow[perk], max_wartosci_perkow[perk]): wartosc; 
	
	new ret;
	
	new forward_handle = CreateOneForward(pluginy_perkow[perk_gracza[id]], "cod_perk_disabled", FP_CELL, FP_CELL);
	ExecuteForward(forward_handle, ret, id, perk);
	DestroyForward(forward_handle);
	
	perk_gracza[id] = 0;
	
	forward_handle = CreateOneForward(pluginy_perkow[perk], "cod_perk_enabled", FP_CELL, FP_CELL, FP_CELL);
	ExecuteForward(forward_handle, ret, id, wartosc, perk);
	DestroyForward(forward_handle);
	
	if(ret == 4)
	{
		UstawPerk(id, -1, -1, 1);
		return PLUGIN_CONTINUE;
	}
	
	ExecuteForward(perk_zmieniony, ret, id, perk, wartosc);
	
	if(ret == 4)
	{
		UstawPerk(id, -1, -1, 1);
		return PLUGIN_CONTINUE;
	}
	
	perk_gracza[id] = perk;	
	wartosc_perku_gracza[id] = wartosc;
	
	obroty[id] = 0;
	
	if(pokaz_info && perk_gracza[id]) 
		ChatColor(id, "%L", LANG_PLAYER, "INFO_ZDOBYLES_PERK", prefix, nazwy_perkow[perk_gracza[id]]);
	
	return PLUGIN_CONTINUE;
}

public UstawDoswiadczenie(id, wartosc)
{
	doswiadczenie_gracza[id] = wartosc;
	SprawdzPoziom(id);
}
public UstawKlase(id, klasa, zmien)
{
	nowa_klasa_gracza[id] = klasa;
	if(zmien)
	{
		UstawNowaKlase(id);
		DajBronie(id);
		ZastosujAtrybuty(id);
	}
}

public UstawTarcze(id, wartosc)
{
	if((gracz_ma_tarcze[id] = (wartosc > 0)))
		fm_give_item(id, "weapon_shield");
}

public UstawNoktowizor(id, wartosc)
{
	if((gracz_ma_noktowizor[id] = (wartosc > 0)))
		cs_set_user_nvg(id, 1);
}

public DajBron(id, bron)
{
	bonusowe_bronie_gracza[id] |= (1<<bron);
	new weaponname[22];
	get_weaponname(bron, weaponname, 21);
	return fm_give_item(id, weaponname);
}

public WezBron(id, bron)
{
	bonusowe_bronie_gracza[id] &= ~(1<<bron);
	
	if((1<<bron) & (bronie_dozwolone | bronie_klasy[get_user_team(id)] | bronie_klasy[klasa_gracza[id]])) 
		return;
	
	new weaponname[22];
	get_weaponname(bron, weaponname, 21);
	if(!((1<<bron) & (1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_FLASHBANG)))
		engclient_cmd(id, "drop", weaponname);
}

public UstawBonusoweZdrowie(id, wartosc)
	bonusowe_zdrowie_gracza[id] = wartosc;


public UstawBonusowaInteligencje(id, wartosc)
	bonusowa_inteligencja_gracza[id] = wartosc;


public UstawBonusowaKondycje(id, wartosc)
	bonusowa_kondycja_gracza[id] = wartosc;


public UstawBonusowaWytrzymalosc(id, wartosc)
	bonusowa_wytrzymalosc_gracza[id] = wartosc;

public PrzydzielZdrowie(id, wartosc)
{
	new max_statystyka = get_pcvar_num(cvar_limit_poziomu)/2;
	wartosc = min(min(punkty_gracza[id], wartosc), max_statystyka-zdrowie_gracza[id]);
	
	punkty_gracza[id] -= wartosc;
	zdrowie_gracza[id] += wartosc;
}

public PrzydzielInteligencje(id, wartosc)
{
	new max_statystyka = get_pcvar_num(cvar_limit_poziomu)/2;
	wartosc = min(min(punkty_gracza[id], wartosc), max_statystyka-inteligencja_gracza[id]);
	
	punkty_gracza[id] -= wartosc;
	inteligencja_gracza[id] += wartosc;
}

public PrzydzielKondycje(id, wartosc)
{
	new max_statystyka = get_pcvar_num(cvar_limit_poziomu)/2;
	wartosc = min(min(punkty_gracza[id], wartosc), max_statystyka-kondycja_gracza[id]);
	
	punkty_gracza[id] -= wartosc;
	kondycja_gracza[id] += wartosc;
}

public PrzydzielWytrzymalosc(id, wartosc)
{
	new max_statystyka = get_pcvar_num(cvar_limit_poziomu)/2;
	wartosc = min(min(punkty_gracza[id], wartosc), max_statystyka-wytrzymalosc_gracza[id]);
	
	punkty_gracza[id] -= wartosc;
	wytrzymalosc_gracza[id] += wartosc;
}

public PobierzPerk(id, &wartosc)
{
	wartosc = wartosc_perku_gracza[id];
	return perk_gracza[id];
}

public PobierzIloscPerkow()
	return ilosc_perkow;


public PobierzNazwePerku(perk, Return[], len)
{
	if(perk <= ilosc_perkow)
	{
		param_convert(2);
		copy(Return, len, nazwy_perkow[perk]);
	}
}

public PobierzOpisPerku(perk, Return[], len)
{
	if(perk <= ilosc_perkow)
	{
		param_convert(2);
		copy(Return, len, opisy_perkow[perk]);
	}
}

public PobierzPerkPrzezNazwe(const nazwa[])
{
	param_convert(1);
	for(new i=1; i <= ilosc_perkow; i++)
		if(equal(nazwa, nazwy_perkow[i]))
		return i;
	return 0;
}

public PobierzDoswiadczeniePoziomu(poziom)
	return power(poziom, 2)*get_pcvar_num(cvar_proporcja_poziomu);

public PobierzDoswiadczenie(id)
	return doswiadczenie_gracza[id];

public PobierzPunkty(id)
	return punkty_gracza[id];

public PobierzPoziom(id)
	return poziom_gracza[id];

public PobierzZdrowie(id, zdrowie_zdobyte, zdrowie_klasy, zdrowie_bonusowe)
{
	new zdrowie;
	
	if(zdrowie_zdobyte)
		zdrowie += zdrowie_gracza[id];
	if(zdrowie_bonusowe)
		zdrowie += bonusowe_zdrowie_gracza[id];
	if(zdrowie_klasy)
		zdrowie += zdrowie_klas[klasa_gracza[id]];
	
	return zdrowie;
}

public PobierzInteligencje(id, inteligencja_zdobyta, inteligencja_klasy, inteligencja_bonusowa)
{
	new inteligencja;
	
	if(inteligencja_zdobyta)
		inteligencja += inteligencja_gracza[id];
	if(inteligencja_bonusowa)
		inteligencja += bonusowa_inteligencja_gracza[id];
	if(inteligencja_klasy)
		inteligencja += inteligencja_klas[klasa_gracza[id]];
	
	return inteligencja;
}

public PobierzKondycje(id, kondycja_zdobyta, kondycja_klasy, kondycja_bonusowa)
{
	new kondycja;
	
	if(kondycja_zdobyta)
		kondycja += kondycja_gracza[id];
	if(kondycja_bonusowa)
		kondycja += bonusowa_kondycja_gracza[id];
	if(kondycja_klasy)
		kondycja += kondycja_klas[klasa_gracza[id]];
	
	return kondycja;
}

public PobierzWytrzymalosc(id, wytrzymalosc_zdobyta, wytrzymalosc_klasy, wytrzymalosc_bonusowa)
{
	new wytrzymalosc;
	
	if(wytrzymalosc_zdobyta)
		wytrzymalosc += wytrzymalosc_gracza[id];
	if(wytrzymalosc_bonusowa)
		wytrzymalosc += bonusowa_wytrzymalosc_gracza[id];
	if(wytrzymalosc_klasy)
		wytrzymalosc += wytrzymalosc_klas[klasa_gracza[id]];
	
	return wytrzymalosc;
}
public PobierzKlase(id)
	return klasa_gracza[id];

public PobierzIloscKlas()
	return ilosc_klas;

public PobierzNazweKlasy(klasa, Return[], len)
{
	if(klasa <= ilosc_klas)
	{
		param_convert(2);
		copy(Return, len, nazwy_klas[klasa]);
	}
}

public PobierzOpisKlasy(klasa, Return[], len)
{
	if(klasa <= ilosc_klas)
	{
		param_convert(2);
		copy(Return, len, opisy_klas[klasa]);
	}
}

public PobierzKlasePrzezNazwe(const nazwa[])
{
	param_convert(1);
	for(new i=1; i <= ilosc_klas; i++)
		if(equal(nazwa, nazwy_klas[i]))
		return i;
	return 0;
}

public PobierzZdrowieKlasy(klasa)
{
	if(klasa <= ilosc_klas)
		return zdrowie_klas[klasa];
	return -1;
}

public PobierzInteligencjeKlasy(klasa)
{
	if(klasa <= ilosc_klas)
		return inteligencja_klas[klasa];
	return -1;
}

public PobierzKondycjeKlasy(klasa)
{
	if(klasa <= ilosc_klas)
		return kondycja_klas[klasa];
	return -1;
}

public PobierzWytrzymaloscKlasy(klasa)
{
	if(klasa <= ilosc_klas)
		return wytrzymalosc_klas[klasa];
	return -1;
}

public ClientKill(id)
{
	if(get_pcvar_num(cvar_block_kill) && is_user_alive(id)) {
		return FMRES_SUPERCEDE;
	}
	return FMRES_IGNORED;
}

public ZadajObrazenia(atakujacy, ofiara, Float:obrazenia, Float:czynnik_inteligencji, byt_uszkadzajacy, dodatkowe_flagi)
	ExecuteHam(Ham_TakeDamage, ofiara, byt_uszkadzajacy, atakujacy, obrazenia+PobierzInteligencje(atakujacy, 1, 1, 1)*czynnik_inteligencji, (1<<31) | dodatkowe_flagi);

public ZarejestrujPerk(plugin, params)
{
	if(params != 4)
		return PLUGIN_CONTINUE;
	
	if(++ilosc_perkow > MAX_ILOSC_PERKOW)
		return -1;
	
	pluginy_perkow[ilosc_perkow] = plugin;
	get_string(1, nazwy_perkow[ilosc_perkow], MAX_WIELKOSC_NAZWY);
	get_string(2, opisy_perkow[ilosc_perkow], MAX_WIELKOSC_OPISU);
	min_wartosci_perkow[ilosc_perkow] = get_param(3);
	max_wartosci_perkow[ilosc_perkow] = get_param(4);
	
	return ilosc_perkow;
}
public ZarejestrujKlase(plugin, params)
{
	if(params != 7)
		return PLUGIN_CONTINUE;
	
	if(++ilosc_klas > MAX_ILOSC_KLAS)
		return -1;
	
	pluginy_klas[ilosc_klas] = plugin;
	
	get_string(1, nazwy_klas[ilosc_klas], MAX_WIELKOSC_NAZWY);
	get_string(2, opisy_klas[ilosc_klas], MAX_WIELKOSC_OPISU);
	
	bronie_klasy[ilosc_klas] = get_param(3);
	zdrowie_klas[ilosc_klas] = get_param(4);
	kondycja_klas[ilosc_klas] = get_param(5);
	inteligencja_klas[ilosc_klas] = get_param(6);
	wytrzymalosc_klas[ilosc_klas] = get_param(7);
	
	for(new i=0;i < klasid;i++)
	{
		if(equali(nazwy_klas[ilosc_klas],nazwa_klasy[i])){
			frakcja_klas[ilosc_klas] = nazwa_frakcji[i];
		}
	}
	return ilosc_klas;
}

public SetHud(id)
	hud_znika[id] = 1;

public GetHud(id)
	hud_znika[id] = 0;


/*================================================================================
[Stocks]
=================================================================================*/	

stock ham_strip_weapon(id, weapon[])
{
	if(!equal(weapon, "weapon_", 7) ) return 0
	new wId = get_weaponid(weapon)
	if(!wId) return 0
	new wEnt
	while( (wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname", weapon) ) && pev(wEnt, pev_owner) != id) {}
	if(!wEnt) return 0
	
	if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon, wEnt)
	
	if(!ExecuteHamB(Ham_RemovePlayerItem, id, wEnt)) return 0
	ExecuteHamB(Ham_Item_Kill ,wEnt)
	
	set_pev(id, pev_weapons, pev(id, pev_weapons) & ~(1<<wId) )
	return 1
}

stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha)
{
	message_begin( MSG_ONE, MsgScreenfade,{0,0,0},id );
	write_short( duration );	// Duration of fadeout
	write_short( holdtime );	// Hold time of color
	write_short( fadetype );	// Fade type
	write_byte ( red );		// Red
	write_byte ( green );		// Green
	write_byte ( blue );		// Blue
	write_byte ( alpha );	// Alpha
	message_end();
}

stock fm_give_item(index, const item[]) {
	if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
		return 0;
	
	new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item));
	if (!pev_valid(ent))
		return 0;
	
	new Float:origin[3];
	pev(index, pev_origin, origin);
	set_pev(ent, pev_origin, origin);
	set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
	dllfunc(DLLFunc_Spawn, ent);
	
	new save = pev(ent, pev_solid);
	dllfunc(DLLFunc_Touch, ent, index);
	if (pev(ent, pev_solid) != save)
		return ent;
	
	engfunc(EngFunc_RemoveEntity, ent);
	
	return -1;
}

stock ChatColor(const id, const input[], any:...)
{
	new count = 1, players[32]
	static msg[191]
	vformat(msg, 190, input, 3)
	
	replace_all(msg, 190, "!g", "^4") // Green Color
	replace_all(msg, 190, "!y", "^1") // Default Color
	replace_all(msg, 190, "!t", "^3") // Team Color
	replace_all(msg, 190, "!t2", "^0") // Team2 Color)
	
	if (id) players[0] = id; 
	else get_players(players, count, "ch"); 
	{
		for (new i = 0; i < count; i++)
		{
			if (is_user_connected(players[i]))
			{
				message_begin(MSG_ONE_UNRELIABLE, MsgSayText, _, players[i])
				write_byte(players[i]);
				write_string(msg);
				message_end();
			}
		}
	}
}

stock PokazStatusText(id, szText[], any:...) {
	new szTemp[192];
	vformat(szTemp, 191, szText, 3);
	message_begin(MSG_ONE_UNRELIABLE, 106, {0,0,0}, id);
	write_byte(0);
	write_string(szTemp);
	message_end();
}


public BlokujKomende()
	return PLUGIN_HANDLED;
	
public QuestMenu(id)
{
	if(bZrobilWszystkie[id])
	{
		ChatColor(id, "%L", LANG_PLAYER, "QUEST_ALL", prefix);
		return PLUGIN_HANDLED;
	}
	static menu[128], formats
	
	new team = get_user_team(id);
	
	if(!team || team == 3) 
		return PLUGIN_CONTINUE;
	
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "QUEST_MENU")
	formats = menu_create(menu,"QuestMenu_Handle");	
	
	new MenuCallback = menu_makecallback("menu_callback");
	
	new choose[32], stop[32]
	
	format(choose, charsmax(choose), "%L", LANG_PLAYER, "QUEST_MENU_CHOOSE");
	format(stop, charsmax(stop), "%L", LANG_PLAYER, "QUEST_MENU_STOP");
	
	if(ePlayerQuestType[id])
	{		
		menu_additem(formats, choose, _, _, MenuCallback)
		menu_additem(formats, stop);	
	}
	else
	{
		menu_additem(formats, choose)
		menu_additem(formats, stop, _, _, MenuCallback)	
	}
		
	// Back - Next - Exit
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
	return PLUGIN_CONTINUE;
}

public QuestMenu_Handle(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return;
	}
	
	switch(item)
	{
		case 0: MenuQuestow(id)
		case 1: 
		{
			ePlayerQuestType[id] = BRAK;
			iPlayerQuestID[id]   = -1;
			iPlayerQuestProgress[id]  = 0;
		
			tutorMake(id,TUTOR_RED,5.0,"%L", LANG_PLAYER, "QUEST_STOP");
		}
			

	}
	
	menu_destroy(menu)
}

public menu_callback() return ITEM_DISABLED

public MenuQuestow(id)
{
	iPlayerPrzedzial[id] = nvault_get(vault, misje_nazwa_gracza[id])
	
	new temp[80], bool:jestChociazJedna = false, idQuesta[3], i, wielkoscRozdzialu;
	static menu[128], formats
	
	// Title	
	formatex(menu, charsmax(menu), "%L", LANG_PLAYER, "QUEST_MENU", QuestRozdzial[iPlayerPrzedzial[id]])
	formats = menu_create(menu,"MenuQuestow_handle");		
	
	wielkoscRozdzialu = ArraySize(gPrzedzial)
	for(i = 0; i < wielkoscRozdzialu; i++)
	{   
		if(ArrayGetCell(gPrzedzial, i) != iPlayerPrzedzial[id] || LoadQuest(id, i)) continue;
		
		switch(ArrayGetCell(gTyp, i))
		{
			case ZABIJ: formatex(temp, charsmax(temp), "Zabij %i razy \y(%i expa i %i orderow)", ArrayGetCell(gIleRazy, i), ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case HEADSHOT: formatex(temp, charsmax(temp), "Strzel %i Headshotow \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i), ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case PLANT: formatex(temp, charsmax(temp), "Podloz %i bomb \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i), ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case HOSTY: formatex(temp, charsmax(temp), "Uratuj %i razy hosty \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i), ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case DEFUSE: formatex(temp, charsmax(temp), "Rozbroj %i bomb \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case DMG_LACZNIE: formatex(temp, charsmax(temp), "Zadaj lacznie %i obrazen \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case KILL_DGL_HS: formatex(temp, charsmax(temp), "Zabij %i osob deaglem HS \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case KNIFE: formatex(temp, charsmax(temp), "Zabij %i graczy nozem \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case KNIFE_HEADSHOT: formatex(temp, charsmax(temp), "Zabij %i graczy headshotem z noza \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case GRANAT: formatex(temp, charsmax(temp), "Zabij %i graczy granatem \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case DMG_GRANAT: formatex(temp, charsmax(temp), "Zadaj %i dmg granatem \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case KILL_AWP_HS: formatex(temp, charsmax(temp), "Zabij %i osob z awp HS \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case CELNOSC: formatex(temp, charsmax(temp), "Uzyskaj %i%% celnosci w rundzie \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case KILLSROUND: formatex(temp, charsmax(temp), "Uzyskaj %i fragow w rundzie \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case HSRATIO: formatex(temp, charsmax(temp), "Uzyskaj %i%% hs/kills w rundzie \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case DOUBLE: formatex(temp, charsmax(temp), "Strzel %i razy doublekill'a \y(%i expa i %i orderow)",  ArrayGetCell(gIleRazy, i),  ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
			case CLASS: formatex(temp, charsmax(temp), "Zabij %i razy klase Komandos \y(%i expa i %i orderow)", ArrayGetCell(gIleRazy, i), ArrayGetCell(gNagroda, i), ArrayGetCell(gOrdery, i))
		}
		
		num_to_str(i, idQuesta, 2)
		menu_additem(formats, temp, idQuesta);
		
		jestChociazJedna = true
	}
	
	if(!jestChociazJedna)
	{
		SaveQuestLvl(id);
		
		if(iPlayerPrzedzial[id] >= sizeof(QuestRozdzial) - 1) //tu odejmuje 1 zeby nie wczytywac jeszcze raz przedialu
		{				
			tutorMake(id,TUTOR_BLUE,5.0,"%L", LANG_PLAYER, "QUEST_FINISH_ALL_MISSION");
			
			cod_set_user_xp(id, cod_get_user_xp(id)+100000);
			cod_set_user_Ordery(id, cod_get_user_Ordery(id)+10000);
			bZrobilWszystkie[id] = true
			
			formatex(temp, charsmax(temp), "%s-a", misje_nazwa_gracza[id]);
			nvault_remove(vault, temp)
			
			for(i = 0; i < wielkoscRozdzialu; i++)
			{
				formatex(temp, charsmax(temp), "%s-%i", misje_nazwa_gracza[id], i);
				nvault_remove(vault, temp)
			}
			
			menu_destroy(formats);
			
			return;
		}		
		tutorMake(id,TUTOR_BLUE,5.0,"%L", LANG_PLAYER, "QUEST_FINISH_LEVEL", QuestRozdzial[iPlayerPrzedzial[id]], QuestRozdzial[iPlayerPrzedzial[id]+1]);
		
		cod_set_user_Ordery(id, cod_get_user_Ordery(id)+5000);
		cod_set_user_xp(id, cod_get_user_xp(id)+20000);
		
		menu_destroy(formats);
		
		return;
	}
	
	// Back - Next - Exit
	menu_setprop(formats, MPROP_PERPAGE, 7);
	formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
	menu_setprop(formats, MPROP_BACKNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
	menu_setprop(formats, MPROP_NEXTNAME, menu)
	formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
	menu_setprop(formats, MPROP_EXITNAME, menu)
	
	client_cmd(id, "spk CodElite/select");
	
	menu_display(id, formats)
}

public MenuQuestow_handle(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return;
	}
	new idQuesta, data[3], tmp[2] //idQuesta - do menu_item_getinfo musze, a potem wykorzystam :D
	menu_item_getinfo(menu, item, idQuesta, data, 2, tmp, 1, idQuesta)
	
	ResetQuest(id)
	
	idQuesta = str_to_num(data);
	iPlayerQuestID[id] = idQuesta
	ePlayerQuestType[id] = ArrayGetCell(gTyp, idQuesta)
	
	tutorMake(id,TUTOR_GREEN,5.0,"%L", LANG_PLAYER, "QUEST_START");

	switch(ePlayerQuestType[id])
	{
		case GRANAT:
		{
			cod_give_weapon(id, CSW_HEGRENADE);
		}
		case DMG_GRANAT:
		{
			cod_give_weapon(id, CSW_HEGRENADE);
		}
		case KILL_DGL_HS:
		{
			cod_give_weapon(id, CSW_DEAGLE);
		}
		case KILL_AWP_HS:
		{
			cod_give_weapon(id, CSW_AWP);
		}
	}	
	
	menu_destroy(menu)
}

add_progress(id, amount)
{
	if((iPlayerQuestProgress[id] += amount) >= ArrayGetCell(gIleRazy, iPlayerQuestID[id]))
		Nagroda(id);
}

Nagroda(id)
{
	client_cmd(id, "spk CodElite/missiondone");
	
	new award = ArrayGetCell(gNagroda, iPlayerQuestID[id]);
	new awardx2 = ArrayGetCell(gOrdery, iPlayerQuestID[id]);
	cod_set_user_xp(id, cod_get_user_xp(id)+award);
	cod_set_user_Ordery(id, cod_get_user_Ordery(id)+awardx2);
	
	
	tutorMake(id,TUTOR_YELLOW,5.0,"%L", LANG_PLAYER, "QUEST_FINISH", award, awardx2);	
	
	SaveQuest(id);
	ResetQuest(id);
}

ResetQuest(id)
{
	ePlayerQuestType[id] = BRAK;
	iPlayerQuestID[id]   = -1;
	iPlayerQuestProgress[id]  = 0;
}


public ClearDouble(id)
	iDoubleKillVariable[id] = 0
	
	
public LogEvent_Quest()
{
	if(get_playersnum() < 4) return;
	
	new user[80], action[64], name[33]
	
	read_logargv(0, user, 79);
	read_logargv(2, action, 63);
	parse_loguser(user, name, 32);
	new id = get_user_index(name);
	
	if(!is_user_connected(id) || !ePlayerQuestType[id]) return
	
	if(equal(action, "Planted_The_Bomb"))
	{ 
		if(ePlayerQuestType[id] == PLANT) 
			add_progress(id, 1);
	}
	else if(equal(action, "Defused_The_Bomb"))
	{ 
		if(ePlayerQuestType[id] == DEFUSE) 
			add_progress(id, 1); 
	}
	else if(equal(action, "Rescued_A_Hostage"))
	{ 
		if(ePlayerQuestType[id] == HOSTY)
			add_progress(id, 1); 
	}
}

/* -------------------- NVAULT -------------------- */

SaveQuestLvl(id)
{
	new vaultkey[33], PoziomQuesta[3];
	get_user_name(id, vaultkey, charsmax(vaultkey));
	
	num_to_str(nvault_get(vault, misje_nazwa_gracza[id])+1, PoziomQuesta, 2)
	nvault_pset(vault, vaultkey, PoziomQuesta);
}

SaveAktQuest(id)
{
	new vaultkey[36], vaultdata[32];
	formatex(vaultkey, 35, "%s-a", misje_nazwa_gracza[id])
	formatex(vaultdata, charsmax(vaultdata), "%i %i %i", ePlayerQuestType[id] ? iPlayerQuestID[id] : -1, ePlayerQuestType[id], iPlayerQuestProgress[id]);
	
	nvault_set(vault, vaultkey, vaultdata);
}

LoadAktQuest(id) 
{
	new vaultkey[36], vaultdata[32];
	formatex(vaultkey, 35, "%s-a", misje_nazwa_gracza[id])
	
	nvault_get(vault, vaultkey, vaultdata, 31);
	nvault_touch(vault, vaultkey)
	
	new data[3][10];
	parse(vaultdata, data[0], 9, data[1], 9, data[2], 9)
	
	vaultkey[0] = str_to_num(data[1]) //nie uzywam juz vaultkey wiec wykorzystam sobie do ePlayerQuestType
	if(!vaultkey[0]) return;
	
	iPlayerQuestID[id] = str_to_num(data[0])
	ePlayerQuestType[id] = vaultkey[0]
	iPlayerQuestProgress[id] = str_to_num(data[2])
}

SaveQuest(id)
{
	new vaultkey[40];
	formatex(vaultkey, charsmax(vaultkey), "%s-%i", misje_nazwa_gracza[id], iPlayerQuestID[id]);
	nvault_pset(vault, vaultkey, "1");
}
	
LoadQuest(id, QuestID)
{
	new vaultkey[40], name[33];
	get_user_name(id, name, charsmax(name));
	
	formatex(vaultkey, charsmax(vaultkey), "%s-%i", misje_nazwa_gracza[id], QuestID);
	
	return nvault_get(vault, vaultkey);
}

public plugin_end()
{
	ArrayDestroy(gPrzedzial)
	ArrayDestroy(gIleRazy)
	ArrayDestroy(gTyp)
	ArrayDestroy(gNagroda)
	ArrayDestroy(gOrdery)
	nvault_close(vault)
}
