#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <ColorChat>
#include <hamsandwich>
#include <fun>
#include <dhudmessage>
#include <nvault>

#define PLUGIN "System 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 32
#define IsPlayer(%1) (1 <= %1 <= MAX && is_user_connected(%1))

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, madroscc;

new MsgScreenfade;

new vault;

new podkladajacy;
new rozbrajajacy;
new doswiadczenie_za_bombe;
new doswiadczenie_za_hs;

native cod_get_user_Ordery(id)
native cod_set_user_Ordery(id, wartosc)
	
new SyncHudObj, SyncHudObj2;

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

new bool: Resetuj[33];

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],
madrosc_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],
bonusowa_madrosc_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 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"
}

public plugin_init()
{		
	server_print("*** %s v%s by %s Enabled ***", PLUGIN, VERSION, AUTHOR);
		
	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");
	
	register_cvar("cod_bombxp", "200");
	register_cvar("cod_hsexp", "100");
	
	
	asysta_on = register_cvar("asysta_on", "1");
	zemsta_on = register_cvar("zemsta_on", "1");
	headshot_on = register_cvar("headshot_on", "1"); 
		
	register_cvar("cod_inteligencja", "420");
	register_cvar("cod_zdrowie", "500");
	register_cvar("cod_wytrzymalosc", "500");	
	register_cvar("cod_kondycja", "180");
	register_cvar("cod_madrosc", "120");
		
		
	
	// ======== Inne ======== //	
	
	register_clcmd("say /reset", "KomendaResetujPunkty");
	register_clcmd("say /statystyki", "PrzydzielPunkty");
	register_clcmd("say /staty", "PrzydzielPunkty");
	register_clcmd("say /Kontakt", "Kontakt");
	register_clcmd("say /menu","Komendy");
	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", "WyrzucPerk");
	register_clcmd("say /wyrzuc", "WyrzucPerk");	
	
	
	// ======== Klasy ======== //
	
	register_clcmd("say /klasa", "WybierzKlase");
	register_clcmd("say /class", "WybierzKlase");	
	register_clcmd("say /klasy", "OpisKlasy");
	register_clcmd("say /classinfo", "OpisKlasy");	
	
	
	// ======== Centrum Pomocy ======== //
	
	register_clcmd("say /pomoc", "CentrumPomocy");
	register_clcmd("say /item", "CentrumPomocy");
	
	register_menucmd(register_menuid("Klasa:"), 1023, "OpisKlasy");
	register_menucmd(register_menuid("Rozdziel Punkty Statystyk"), 1023, "PrzydzielPunkty_Handler")
	gFWD = CreateMultiForward("DodatkoweHP", ET_CONTINUE,FP_CELL);
	
	
	RegisterHam(Ham_TakeDamage, 	"player", "Obrazenia");
	RegisterHam(Ham_TakeDamage, 	"player", "ObrazeniaPost", 1);
	RegisterHam(Ham_TakeDamage, 	"player", "fwDamage", 1);
	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_CmdStart, "CmdStart");
	register_forward(FM_EmitSound, "EmitSound");
	
	register_message(get_user_msgid("Health"),"MessageHealth");
	
	register_logevent("PoczatekRundy", 2, "1=Round_Start"); 
	register_logevent("BombaPodlozona", 3, "2=Planted_The_Bomb");
	
	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("CodMod");
	
	MsgScreenfade = get_user_msgid("ScreenFade");
	
	SyncHudObj = CreateHudSyncObj();
	SyncHudObj2 = CreateHudSyncObj();
	
	doswiadczenie_za_bombe = get_cvar_num("cod_bombxp");
	doswiadczenie_za_hs = get_cvar_num("cod_hsexp");
	
	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()
}		
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/codmod.cfg", lokalizacja_cfg);
	server_exec();
}

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");
}


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_points_to_madrosc", "PrzydzielMadrosc", 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_user_madrosc", "PobierzMadrosc", 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_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;
				ColorChat(id, RED, "%s Dostales^x04 %i^x01 doswiadczenia za podlozenie bomby przez twoj team.", prefix, doswiadczenie_za_zabojstwo);
			}
			else
			{
				ColorChat(id, RED, "%s Dostales^x04 %i^x01 doswiadczenia za podlozenie bomby.", prefix, doswiadczenie_za_bombe);
			}
			SprawdzPoziom(id);
		}
	}
}

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;
			ColorChat(id, RED, "%s Dostales^x04 %i^x01 doswiadczenia za rozbrojenie bomby przez twoj team.", prefix, doswiadczenie_za_bombe);
		}
		else
			ColorChat(id, RED, "%s Dostales^x04 %i^x01 doswiadczenia za rozbrojenie bomby.", 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.7*(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;
	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");
			}
	}
}
public NowaRunda()
{
	freezetime = true;
	for(new i = 0;i <= MAX;i++)
	{
		if(is_user_connected(i))
		{
			hud_znika[i] = 0;
		}
		for(new j = 0;j <= MAX;j++)
			g_asysta[i][j] = false;
	}	
}
public client_connect(id)
{
	for(new j = 0;j <= MAX;j++)	

	g_asysta[id][j] = false;
	g_zemsta[id] = 0;
}
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]));
	
	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 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 + madrosc_gracza[id]*2;
		}
	}
	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])
			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), "\yZostales zabity przez:\r %s^n\yGra Klasa:\r %s^n\yPoziom:\r %d^n\yZostalo mu:\r %d\d [HP]^n\yPerk:\r %s^n^n\yZostales zabity z:\r(%s)"
		, szName, 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, "HEADSHOT^n   +%i", doswiadczenie_za_hs);
		
		SprawdzPoziom(killer);
	}
}
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, "Zemsciles sie na graczu %s^n^n+ %d XP", 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, "Asystowales w zabiciu gracza %s^n^n+ %d XP", sName, iXp);
					
					doswiadczenie_gracza[i] += iXp;
					
					SprawdzPoziom(i)
				}
				
				g_asysta[i][iVictim] = false;
			}
		}
	}
}

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);
}

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;
	madrosc_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)
	ColorChat(0, RED, "%s Druzyna^x04 %s^x01 dostala^x04 %i^x01 doswiadczenia i^x04 %i^x01 Orderow za wygrana runde!", 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, "Zwyciestwa Druzyn^n^n|%i| Terrorysci^n|%i| Counter - Terrorists", 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), "\d[\wNew \rCOD Elite - CSGramy.eu\d]\w Opis \yPerku^n^n\r||\w Nazwa\y Perku\r ||^n||\w %s\r||^n|| \wOpis\y Perku\r||^n||\w %s\r ||^n^n\r||\w Perk uzywasz na c\r ||", nazwy_perkow[perk], opis_perku);
	show_menu(id, 1023, opis);
	
	client_cmd(id, "spk CodElite/select");
}

public OpisPerkow(id)
{
	hud_znika[id] = 1;
	new menu = menu_create("\r-==|\w Wybierz Perk\r |==-", "OpisPerkow_Handle");
	
	for(new i=1; i <= ilosc_perkow; i++)
		menu_additem(menu, nazwy_perkow[i]);
	
	menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
	menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
	menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
	menu_display(id, menu);
	client_cmd(id, "spk CodElite/select");
}

public OpisPerkow_Handle(id, menu, item, perk, wartosc)
{
	client_cmd(id, "spk CodElite/select");
	
	if(item++ == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	OpisPerku_Handle(id, item, -1);
	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);
	
	ColorChat(id, BLUE, "Perk: ^x01%s.", nazwy_perkow[perk]);
	ColorChat(id, BLUE, "Opis: ^x01%s.", opis_perku);
	
	OpisPerkow(id)
	client_cmd(id, "spk CodElite/select");
}


public OpisKlasy(id)
{    
	hud_znika[id] = 1;
	
	new menu = menu_create("\r-==|\w Wybierz Frakcje\r |==-    ", "OpisKlase_Frakcje");
	for(new i=1; i <= ilosc_klas; i++)
	{
		if(!is_in_previous(frakcja_klas[i],i)){
			menu_additem(menu,frakcja_klas[i],frakcja_klas[i])
		}
	}
	
	menu_addtext(menu, "^n^n^n\r[\dCOD Elite: 801\r]\d Odwiedz Nasze Forum: \rCSGramy.eu^n\r[\dCOD Elite: 801\r]\d Kontakt do H@ GG: \r44244759", 0)
	menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
	menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
	menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
	menu_display(id, menu);
	
	client_cmd(id, "spk CodElite/select");
	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)
	
	new menu2 = menu_create("\r-==|\w Wybierz Klase\r |==-^n\d Aby zdobaczyc opis    ", "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(menu2, klasa,szTmp);
		}
	}
	
	menu_setprop(menu2, MPROP_EXITNAME, "Wyjdz");
	menu_setprop(menu2, MPROP_BACKNAME, "Poprzednia strona");
	menu_setprop(menu2, MPROP_NEXTNAME, "Nastepna strona");
	menu_display(id, menu2);
	
	client_cmd(id, "spk CodElite/select");
	
	menu_destroy(menu);
	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++;
		}
	}	
	
	new opis[1023]
	formatex(opis,charsmax(opis),"\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"
	, 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_CONTINUE;
}
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;
	}	
	new menu = menu_create("\r-==|\w Wybierz Frakcje\r |==-   ","WybierzKlase_Frakcje");
	
	for(new i=1; i <= ilosc_klas; i++)
	{
		if(!equal(frakcja_klas[i],"") && !is_in_previous(frakcja_klas[i],i)){
			menu_additem(menu,frakcja_klas[i],frakcja_klas[i])
		}
	}
	
	menu_addtext(menu, "^n^n^n\r[\dCOD Elite: 801\r]\d Odwiedz Nasze Forum: \rCSGramy.eu^n\r[\dCOD Elite: 801\r]\d Kontakt do H@ GG: \r44244759", 0)
	menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
	menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
	menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
	menu_display(id, menu);
	
	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)
	
	new menu2 = menu_create("\r-==|\w Wybierz Klase\r |==-^n\d Aby zdobywac level    ", "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(menu2, klasa, szTmp);
		}
	}
	
	WczytajDane(id, klasa_gracza[id]);
	
	menu_setprop(menu2, MPROP_EXITNAME, "Wyjdz");
	menu_setprop(menu2, MPROP_BACKNAME, "Poprzednia strona");
	menu_setprop(menu2, MPROP_NEXTNAME, "Nastepna strona");
	menu_display(id, menu2);
	
	client_cmd(id, "spk CodElite/select");
	
	menu_destroy(menu);
	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)
	
	if(klasa_gracza[id])
		ColorChat(id, RED, "%s Klasa zostanie zmieniona w nastepnej rundzie.", 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 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");
	madroscc =  get_cvar_num("cod_madrosc");
	
	hud_znika[id] = 1;
	new keys = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)
	
	new szBuffer[1][1024];
	new iLen = 0;
	iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\yRozdziel Punkty Statystyk - \w%i punktow^n^n", punkty_gracza[id]);
	
	
	if(co_ile[szybkosc_rozdania[id]] == -1)
		iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r1.\wIle dodawac: \rWszystko \d[Ile pkt dodac do statow]^n^n");
	else
		iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r1.\wTryb rozdawania: \y%i^n^n", co_ile[szybkosc_rozdania[id]]); 
	
	iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r2. \wInteligencja \y[%i/%i] \d[Zwieksza sile perkow i umiejetnosci klasy]^n", PobierzInteligencje(id, 1, 1, 1), inteligencjaa);
	iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r3. \wZdrowie \y[%i/%i] \d[Dostajesz %i HP]^n", PobierzZdrowie(id, 1, 1, 1), zdrowiee, zdrowie_gracza[id]);
	iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r4. \wWytrzymalosc \y[%i/%i] \d[Twoje obrazenia sa zmniejszone o %0.1f%%]^n", PobierzWytrzymalosc(id, 1, 1, 1), wytrzymaloscc, redukcja_obrazen_gracza[id]*100);
	iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r5. \wKondycja \y[%i/%i] \d[Biegasz szybciej o %i]^n", PobierzKondycje(id, 1, 1, 1), kondycjaa, floatround(szybkosc_gracza[id]*1.1));
	iLen += formatex(szBuffer[0][iLen], charsmax(szBuffer[]) - iLen, "\r6. \wSkupienie \y[%i/%i] \d[Zwieksza szybkosc wbijania lvl]", PobierzMadrosc(id, 1, 1), madroscc);
	
	keys = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)
	show_menu(id, keys, szBuffer[0])
	
	client_cmd(id, "spk CodElite/select");
	return PLUGIN_HANDLED
}

public PrzydzielPunkty_Handler(id, key) 
{	
	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 limit_poziomu = get_pcvar_num(cvar_limit_poziomu);
	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(key) 
	{ 
		case 1: {

			if(szybkosc_rozdania[id] < charsmax(co_ile)) szybkosc_rozdania[id]++;
			else szybkosc_rozdania[id] = 0;
		} 
		case 2: 
		{
			if(inteligencja_gracza[id] < limit_poziomu/2) 
			{
				if(ilosc > inteligencjaa - inteligencja_gracza[id])
				ilosc = inteligencjaa - inteligencja_gracza[id];
				inteligencja_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ColorChat(id, RED, "%s Maxymalny poziom^x04 Inteligencji^x01 osiagniety", prefix);
		}
		case 3: 
		{
			if(zdrowie_gracza[id] < limit_poziomu) 
			{
				if(ilosc > zdrowiee - zdrowie_gracza[id])	
				ilosc = zdrowiee - zdrowie_gracza[id];
				zdrowie_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ColorChat(id, RED, "%s Maxymalny poziom^x04 Zdrowia^x01 osiagniety", prefix);
		}
		case 4: {

			if(wytrzymalosc_gracza[id] < limit_poziomu/2) 
			{
				if(ilosc > wytrzymaloscc - wytrzymalosc_gracza[id])
				ilosc = wytrzymaloscc - wytrzymalosc_gracza[id];
				wytrzymalosc_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ColorChat(id, RED, "%s Maxymalny poziom^x04 Wytrzymalosc^x01 osiagniety", prefix);
		}
		case 5: {
			if(kondycja_gracza[id] < limit_poziomu/2) 
			{
				if(ilosc > kondycjaa - kondycja_gracza[id])
				ilosc = kondycjaa - kondycja_gracza[id];
				kondycja_gracza[id]+=ilosc;
				punkty_gracza[id]-=ilosc;
			} else ColorChat(id, RED, "%s Maxymalny poziom^x04 Kondycji^x01 osiagniety", prefix);	
		}
		case 6:{
			if(madrosc_gracza[id] < limit_poziomu/2) 
			{
				if(ilosc > madroscc - madrosc_gracza[id]) {
					ilosc = madroscc - madrosc_gracza[id];
					madrosc_gracza[id]+=ilosc;
					punkty_gracza[id]-=ilosc;
				}
			} else ColorChat(id, RED, "%s Maxymalny poziom^x04 Madrosci^x01 osiagniety", prefix);
		}
	}
	
	if(punkty_gracza[id] > 0)
		PrzydzielPunkty(id);
	
	return PLUGIN_CONTINUE;
}

public KomendaResetujPunkty(id)
{	
	ColorChat(id, RED, "%s Umiejetnosci zostana zresetowane w nastepnej rundzie.", 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;
	madrosc_gracza[id] = 0;
	
	if(punkty_gracza[id])
		PrzydzielPunkty(id);
}

public CurWeapon(id)
{
	
	if(!is_user_connected(id))
		return;
	
	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);
}
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#%i"
	, doswiadczenie_gracza[id], poziom_gracza[id], inteligencja_gracza[id], zdrowie_gracza[id], wytrzymalosc_gracza[id], kondycja_gracza[id], madrosc_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[7][32];
	
	parse(vaultdata, danegracza[0], 31, danegracza[1], 31, danegracza[2], 31, danegracza[3], 31, danegracza[4], 31, danegracza[5], 31, danegracza[6], 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]);
	madrosc_gracza[id] = str_to_num(danegracza[6]);
	punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id]-madrosc_gracza[id];
	
	return PLUGIN_CONTINUE;
}

public WyrzucPerk(id)
{
	if(perk_gracza[id])
	{
		ColorChat(id, RED, "%s Wyrzuciles %s.", prefix, nazwy_perkow[perk_gracza[id]]);
		UstawPerk(id, 0, 0, 0);
	}
	else
		ColorChat(id, RED, "%s Nie masz zadnego perku.", prefix);
}

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]-madrosc_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;
		ColorChat(id, RED, "%s Osiagnoles Maxymalny Poziom! Grautlacje", prefix );
		ColorChat(id, RED, "%s Twoje statystyki sa ustawione na maxa", prefix );
	}
	if(stracil_poziom)
	{
		ResetujPunkty(id);
		set_hudmessage(0, 212, 255, 0.31, 0.32, 0, 6.0, 5.0);	
		ShowSyncHudMsg(id, SyncHudObj2,"Spadles do %i poziomu!", poziom_gracza[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]-madrosc_gracza[id];
		client_cmd(id, "spk CodElite/levelup");
		if(poziom_gracza[id] >= 200)
		{
			ColorChat(0, RED, "%s Gracz^x04 %s^x03 %s^x01 awansowal do^x04 %i^x01 poziomu! Grautulacje", prefix, nazwa_gracza[id], nazwy_klas[klasa_gracza[id]], poziom_gracza[id]);
			client_cmd(id, "spk CodElite/levelup");
		}
	}		
	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, 255, 255, 0.6, -1.0, 0, 1.0, 1.0, 0.1, 0.1);
		ShowSyncHudMsg(id, SyncHudObj, "[ COD Elite: 801 ] | [Forum: CSGramy.eu ]^nKlasa: %s | Poziom: %i | Doswiadczenie: %0.1f%%^nZdrowie: %d | Ordery: %i | Perk: %s"
		, nazwy_klas[klasa_gracza[target]], nazwy_perkow[perk_gracza[target]], fProcent, zdrowie, ordery, nazwy_perkow[perk_gracza[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.01, 0, 1.0, 1.0, 0.1, 0.1);
	ShowSyncHudMsg(id, SyncHudObj, "[ COD Elite: 801 ] | [Forum: CSGramy.eu ]^n[ Klasa : %s ]^n[ Poziom : %i | Exp: %0.1f%% ]^n[ Zdrowie : %d | Ordery: %i ]^n[ Perk : %s ]"
	, nazwy_klas[klasa_gracza[id]], poziom_gracza[id], fProcent, zdrowie, ordery, nazwy_perkow[perk_gracza[id]]);
	
	return PLUGIN_CONTINUE;
}  
public PokazReklame(id)
{
	id-=ZADANIE_POKAZ_REKLAME;
	
	client_print(id, print_chat, "%s Wpisz komende /freelvl aby otrzymad level na start", prefix);
	client_print(id, print_chat, "%s W celu uzyskania informacji o komendach napisz /pomoc.", prefix);
}
public CentrumPomocy(id)
{
	hud_znika[id] = 1;
	new menu = menu_create("\r-==|\w Centrum Pomocy\r |==-", "CentrumPomocy_Handler");
	
	menu_additem(menu, "\y~\wKontakt \y-Kontakt Do H@~");
	menu_additem(menu, "\y~\rGildie \y-System Gildi~^n");	
	menu_additem(menu, "\y~\rKomendy \y-Komendy Serwera~");
	menu_additem(menu, "\y~\rRegulamin \y-Regulamin Serwera~ ");
	
	menu_display(id, menu);
	
	client_cmd(id, "spk CodElite/select");
}
public CentrumPomocy_Handler(id, menu, item)
{
	client_cmd(id, "spk CodElite/select");
	if(item == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	switch(item) 
	{
		case 0: 
		{
			Kontakt(id, menu, item)
		}
		case 1: 
		{
			client_cmd(id, "say /Gildie");
		}		
		case 2:
		{
			Komendy(id, menu, item)
		}
		case 3: 
		{
			show_motd(id, "regulamin.txt", "Regulamin Serwera");
		}
		
	}
	return PLUGIN_CONTINUE
}
public Kontakt(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 opis[1023]
	formatex(opis, charsmax(opis), "\d[HeadAdmin] \rPlay \wGG:\y 44244759^n\d[Opiekun] \r.:Tomek:. \wGG:\y 48944616");
	
	new menu = menu_create(opis, "CentrumPomocy")
	
	menu_additem(menu, "Wroc")
	menu_display(id, menu)
	
	return PLUGIN_CONTINUE;
}
public Komendy(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 menu = menu_create("\r-==|\w Komendy Serwera\r |==-", "Komendy_Handler");
	
	menu_additem(menu, "\r|\y \ Reset\r |\w Resetuje Statystyki"); // 0
	menu_additem(menu, "\r|\y \ Statystyki\r |\w Statystyki Twojej Klasy"); //1
	menu_additem(menu, "\r|\y \ Klasa\r |\w Wybor Klas"); // 2
	menu_additem(menu, "\r|\y \ Wyrzuc\r |\w Wyrzuca Perk"); // 3
	menu_additem(menu, "\r|\y \ Perk\r |\w Opis Twojego Perku"); // 4
	menu_additem(menu, "\r|\y \ Klasy\r |\w Opis Klas"); // 5
	menu_additem(menu, "\r|\y \ Sklep\r |\w Dodatki do kupienia"); // 6
	menu_additem(menu, "\r|\y \ Ordery\r |\w System Orderow"); // 7
	menu_additem(menu, "\r|\y \ Gildie\r |\w System Gildi"); // 8
	menu_additem(menu, "\r|\y \ Wymien\r |\w Wymiana sie perkiem"); // 9
	menu_additem(menu, "\r|\y \ Daj\r |\w Oddaj komus perk"); // 10
	menu_additem(menu, "\r|\y \ IP\r |\w Mozliwosc sprawdzenia ip gracza");	// 11
	menu_additem(menu, "\r|\y \ toplvl\r |\w Lista najwiekszych leveli graczy"); // 12
	menu_additem(menu, "\r|\y \ czas\r |\w Sprawdz ile juz grasz na serwerze"); // 13
	
	menu_display(id, menu);
	return PLUGIN_CONTINUE
}
public Komendy_Handler(id, menu, item)	
{
	client_cmd(id, "spk CodElite/select");
	if(item == MENU_EXIT)
	{
		hud_znika[id] = 0;
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	switch(item) 
	{
		case 0: { 
			client_cmd(id, "say /Reset"); 
		}
		case 1: {
			client_cmd(id, "say /Statystyki");
		}
		case 2: {
			client_cmd(id, "say /Klasa");
		}
		case 3: {
			client_cmd(id, "say /Wyrzuc");
		}
		case 4: {
			client_cmd(id, "say /Perk");
		}
		case 5: {
			client_cmd(id, "say /Klasy");
		}	
		case 6: {	
			client_cmd(id, "say /Sklep");
		}		
		case 7: {
			client_cmd(id, "say /Ordery");	
		}
		case 8: {
			client_cmd(id, "say /Gildie");	
		}
		case 9: {
			client_cmd(id, "say /daj");
		}
		case 10: {
			client_cmd(id, "say /wymien");
		}		
		case 11: {
			client_cmd(id, "say /ip");
		}
		case 12: {
			client_cmd(id, "say /toplvl");
		}
		case 13: {
			client_cmd(id, "say /czas");
		}		
	}
	hud_znika[id] = 0;
	return PLUGIN_CONTINUE
}

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]) 
		ColorChat(id, RED, "%s Zdobyles %s.", 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 PrzydzielMadrosc(id, wartosc)
{
	new max_statystyka = get_pcvar_num(cvar_limit_poziomu);
	wartosc = min(min(punkty_gracza[id], wartosc), max_statystyka-madrosc_gracza[id]);
	
	punkty_gracza[id] -= wartosc;
	madrosc_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 PobierzMadrosc(id, madrosc_zdobyta, madrosc_bonusowa)
{
	new madrosc;
	
	if(madrosc_zdobyta)
		madrosc += madrosc_gracza[id];
	if(madrosc_bonusowa)
		madrosc += bonusowa_madrosc_gracza[id];
	
	return madrosc;
}


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 fwd_FM_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;
	
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;
}
public BlokujKomende()
	return PLUGIN_HANDLED;
