/* Script generated by Pawn Studio */

#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <ColorChat>

#define PLUGIN	"[CoD] Magazyn na perki"
#define AUTHOR	"Goliath & Edit: Play"
#define VERSION	"2.2"

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


#define MAX_PLAYERS 32	// Zmień 32 na ilość slotów na twoim serwerze
#define ZAPISUJ
#define ILOSC_SLOTOW 2	// Tutaj zmień 3 na ilość slotów, jaką chcesz mieć w magazynie.


native cod_get_user_Ordery(id)
native cod_set_user_Ordery(id, wartosc)
native cod_get_user_perk(id, &wartosc=0);
native cod_get_perk_name(perk, Return[], len);
native cod_set_user_perk(id, perk, wartosc=-1, pokaz_info=1);
native cod_get_perkid(const perk[]);
native cod_set_user_hud(id)
native cod_get_user_hud(id)


new Array:aPerki, Array:aWartosc;
new Uzyto[MAX_PLAYERS+1];

new magazyn_koszt

new cvar_typ_zapisu,
typ_zapisu;
new vault;

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	aPerki = ArrayCreate();
	aWartosc = ArrayCreate();
	
	cvar_typ_zapisu = get_cvar_pointer("cod_savetype");
	typ_zapisu = get_pcvar_num(cvar_typ_zapisu);
	magazyn_koszt = register_cvar("koszt_dodania_perku_do_magazynu", 	"500");
	
	vault = nvault_open("CodMagazyn");
	
	register_clcmd("say /magazyn", "Magazyn");
	register_clcmd("say /schowaj", "Magazyn");
	
	register_event("HLTV", "NowaRunda", "a", "1=0", "2=0");
	
	for(new i=0; i<=ILOSC_SLOTOW; i++)
	{
		for(new id=0; id<=MAX_PLAYERS; id++)
		{
			ArrayPushCell(aPerki, 0);
			ArrayPushCell(aWartosc, -1);
		}
	}
}

public Magazyn(id)
{
	if(!is_user_alive(id))
	{
		ColorChat( id, RED, "%s Musisz byc zywy, aby korzystac z magazynu", TAG );
		return 0;
	}
	if(cod_set_user_hud(id))
		return PLUGIN_CONTINUE;	
	
	Wczytaj(id);
	new tytul[128];
	
	formatex(tytul, charsmax(tytul), "\yMagazyn Perkow^n\yKoszt Przechowania:\r %i Orderow", get_pcvar_num(magazyn_koszt) );
	new menu = menu_create(tytul, "Magazyn_Handler");
	
	new text[33], perk;
	for(new i=1; i<=ILOSC_SLOTOW; i++)
	{
		perk = ArrayGetCell(aPerki, id*ILOSC_SLOTOW+i)
		
		if(!perk)
			formatex(text, 32, "Pusty slot");
		else
		{
			cod_get_perk_name(perk, text, 32);
		}
		menu_additem(menu, text);
	}
	menu_setprop(menu, MPROP_NEXTNAME, "Dalej");
	menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
	menu_setprop(menu, MPROP_BACKNAME, "Wstecz");
	menu_display(id, menu);
	return 1;
}

public Magazyn_Handler(id, menu, item)
{
	if(item++ == MENU_EXIT)
	{
		cod_get_user_hud(id);
		return 0;
	}
	
	new perk = ArrayGetCell(aPerki, id*ILOSC_SLOTOW+item), wartosc = ArrayGetCell(aWartosc, id*ILOSC_SLOTOW+item);
	new wartosc_gracza, perk_gracza = cod_get_user_perk(id, wartosc_gracza);
	new kasa = cod_get_user_Ordery(id)
	
	if(perk)
	{
		if(Uzyto[id] & (1<<item))
		{
			ColorChat(id, TEAM_COLOR, "%s Nie mozesz wyjac perku, ktory dopiero wlozyles!", TAG);
			Magazyn(id);
			return 0;
		}
		if(perk_gracza)
		{
			ArraySetCell(aPerki, id*ILOSC_SLOTOW+item, perk_gracza);
			ArraySetCell(aWartosc, id*ILOSC_SLOTOW+item, wartosc_gracza);
			cod_set_user_perk(id, perk, wartosc, 0);
			Uzyto[id] |= (1<<item);
		}
		else
		{
			cod_set_user_perk(id, perk, wartosc, 0);
			ArraySetCell(aPerki, id*ILOSC_SLOTOW+item, 0);
			ArraySetCell(aWartosc, id*ILOSC_SLOTOW+item, 0);
		}
	}
	else
	{
		if(!perk_gracza)
		{
			ColorChat(id, TEAM_COLOR, "%s Nie masz zadnego perku!", TAG);
			Magazyn(id);
			return 0;
		}		
		if(kasa >= get_pcvar_num(magazyn_koszt))
		{	
			cod_set_user_Ordery(id, kasa - get_pcvar_num(magazyn_koszt))
		
			ArraySetCell(aPerki, id*ILOSC_SLOTOW+item, perk_gracza);
			ArraySetCell(aWartosc, id*ILOSC_SLOTOW+item, wartosc_gracza);
			cod_set_user_perk(id, 0, 0, 0);
			ColorChat(id, TEAM_COLOR, "%s Schowales perk do magazynu za^x04 %i^x01 orderow.", TAG, get_pcvar_num(magazyn_koszt));
			Uzyto[id] |= (1<<item);
		}		
		else
			ColorChat(id, TEAM_COLOR, "%s Nie masz tylu orderow, aby schowac perk do magazynu.", TAG);
	}
	cod_get_user_hud(id);
	Zapisz(id);
	Magazyn(id);
	return 0;
}
public Zapisz(id)
{
	if(!is_user_connected(id))
		return 0;
	
	new key[40], value[513], identyfikator[33], val_len = 0;
	
	switch(typ_zapisu)
	{
		case 1: get_user_name(id, identyfikator, charsmax(identyfikator));
		case 2: get_user_authid(id, identyfikator, charsmax(identyfikator));
		case 3: get_user_ip(id, identyfikator, charsmax(identyfikator));
	}
	formatex(key, charsmax(key), "%s-%i", identyfikator, typ_zapisu);
	new text[33], perk, wartosc;
	for(new i=1; i<=ILOSC_SLOTOW; i++)
	{
		perk = ArrayGetCell(aPerki, id*ILOSC_SLOTOW+i);
		wartosc = ArrayGetCell(aWartosc, id*ILOSC_SLOTOW+i);
		if(perk)
		{
			cod_get_perk_name(perk, text, charsmax(text));
			replace_all(text, charsmax(text), " ", "_");
			val_len += formatex(value[val_len], charsmax(value)-val_len, "%s#%i#", text, wartosc);
		}
		else
			val_len += formatex(value[val_len], charsmax(value)-val_len, "Brak#-1#");
	}
	nvault_set(vault, key, value);
	return 0;
}

public Wczytaj(id)
{
	if(!is_user_connected(id))
		return 0;
	
	new key[40], identyfikator[33];
	
	switch(typ_zapisu)
	{
		case 1: get_user_name(id, identyfikator, charsmax(identyfikator));
		case 2: get_user_authid(id, identyfikator, charsmax(identyfikator));
		case 3: get_user_ip(id, identyfikator, charsmax(identyfikator));
	}
	
	formatex(key, charsmax(key), "%s-%i", identyfikator, typ_zapisu);
	
	new text[2*ILOSC_SLOTOW+2][33], value[513];
	nvault_get(vault, key, value, 512);
	explode(value, '#', text, 2*ILOSC_SLOTOW+1, 32);
	
	for(new i=0; i<ILOSC_SLOTOW; i++)
	{
		new perk, wartosc;
		replace_all(text[2*i], 32, "_", " ");
		perk = cod_get_perkid(text[2*i]);
		wartosc = str_to_num(text[2*i+1]);
		if(perk)
		{
			ArraySetCell(aPerki, id*ILOSC_SLOTOW+i+1, perk);
			ArraySetCell(aWartosc, id*ILOSC_SLOTOW+i+1, wartosc);
		}
		else
		{
			ArraySetCell(aPerki, id*ILOSC_SLOTOW+i+1, 0);
			ArraySetCell(aWartosc, id*ILOSC_SLOTOW+i+1, -1);
		}
	}
	return 0;
}
public NowaRunda()
{
	for(new i=0; i<=MAX_PLAYERS; i++)
		Uzyto[i] = 0;
}

public client_authorized(id)
{
	Uzyto[id] = 0;
	for(new i=1; i<=ILOSC_SLOTOW; i++)
	{
		ArraySetCell(aPerki, id*ILOSC_SLOTOW+i, 0);
		ArraySetCell(aWartosc, id*ILOSC_SLOTOW+1, -1);
	}
}

//Stock by DarkGL
stock explode(const string[],const character,output[][],const maxs,const maxlen)
{
	new iDo = 0;
	new len = strlen(string);
	new oLen = 0;
	
	do {
		oLen += (1+copyc(output[iDo++],maxlen,string[oLen],character))
	}
	while(oLen < len && iDo < maxs)
}

