/*[Bugok]:	*Amíg nem választod ki a raktárban az 1. skint, nem mutatja a többit
*/
		
/*[Tennivalók]:	*Tec-9, PP-Bizon, és egyéb fegyverek berakása
		*Offline piac elkészítése
		*Natívok készítése külső pluginokhoz (kérésre megcsinálok bármilyet)
		*Offline piac
*/

/*[Megjegyzések]:	*A ládák droppolását nem tudtam elég behatóan tesztelni a kevés skin miatt. Ha hibás, jelezzétek!
			*A plugin nincs ékezetesítve!
			*Köszönet mforce-nak a CS:GO-s gránát hangok pluginért. :)
			*Szükséges .zip fájl linkje: https://www.dropbox.com/s/e9t2waz9lqud3u1/csgo.zip?dl=0
*/

/*[Changelog]
v2.0.1 - SQL adatok külső fájlból való olvasása
v2.0.0 - Skinek és ládák .ini fájlból való betöltése. Mellékelt alap skinek. CS:GO-s gránát hangok. Mentésben elírás javítása.
v1.0.5 - Minimális teljesítményjavítás via mforce
v1.0.4 - Összetettebb dropp rendszer
v1.0.3 - Minden ládának saját kulcs
v1.0.2 - Több láda
v1.0.1 - SQL mentés és még pár bug javítása
v1.0.0 - Alap ötlet
*/

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>
#include <fakemeta>
#include <sqlx>
#include <colorchat>

//Köszönet mforce-nak :) (Fegyver lekérés, rádió hangok.)
const m_pPlayer = 41
const XO_WEAPON = 4
#define get_weapon_owner(%1)		get_pdata_cbase(%1, m_pPlayer, XO_WEAPON)

const MSGARG_SENDER_ID = 2;
const MSGARG_SENDER_NAME = 4;
const MSGARG_PRINT_RADIO = 5;
const MSGARG_AUDIO_CODE = 2;
 
#define MAX_SOUND_PATH_LENGTH   32
#define MAX_SOUNDS              4   // 4 + 4 + 4 = 12
 
// default audio file format: WAVE(PCM), 8-bit, 22.05 KHz, Mono
// converted: WAVE(PCM), 16-bit, 24.0 KHz, Mono
new const g_szSmokeSounds[MAX_SOUNDS][MAX_SOUND_PATH_LENGTH] = {
	"radio/custom/smoke01.wav",
	"radio/custom/smoke02.wav",
	"radio/custom/smoke03.wav",
	"radio/custom/smoke04.wav"
}
 
new const g_szFlashSounds[MAX_SOUNDS][MAX_SOUND_PATH_LENGTH] = {
	"radio/custom/flashbang01.wav",
	"radio/custom/flashbang02.wav",
	"radio/custom/flashbang03.wav",
	"radio/custom/flashbang04.wav"
}
 
new const g_szHegrenSounds[MAX_SOUNDS][MAX_SOUND_PATH_LENGTH] = {
	"radio/custom/grenade01.wav",
	"radio/custom/grenade02.wav",
	"radio/custom/grenade03.wav",
	"radio/custom/grenade04.wav"
}

new const Author[] = {"LyleChriss"}
new const Version[] = {"2.0.1"}
new const Plugin[] = {"CS:GO Mod"}

//SQL
new SQL_INFO[4][32]
new Handle:g_SqlTuple

//Skinezendő fegyverek
new const Weapons[][] = {
	"weapon_p228",
	"weapon_scout",
	"weapon_xm1014",
	"weapon_mac10",
	"weapon_aug",
	"weapon_elite",
	"weapon_fiveseven",
	"weapon_ump45",
	"weapon_sg550",
	"weapon_galil",
	"weapon_famas",
	"weapon_usp",
	"weapon_glock18",
	"weapon_awp",
	"weapon_mp5navy",
	"weapon_m249",
	"weapon_m3",
	"weapon_m4a1",
	"weapon_tmp",
	"weapon_g3sg1",
	"weapon_deagle",
	"weapon_sg552",
	"weapon_ak47",
	"weapon_knife",
	"weapon_p90"
}

//Egyéb skinezendő dolgok
new const Others[][] = {
	"weapon_hegrenade",
	"weapon_smokegrenade",
	"weapon_c4",
	"weapon_flashbang"
}

//Alap skinek
new const DefaultSkins[][] = {
	{"weapon_p228", "models/g_offen/v_p228.mdl"},
	{"weapon_scout", "models/g_offen/v_scout.mdl"},
	{"weapon_xm1014", "models/g_offen/v_xm1014.mdl"},
	{"weapon_mac10", "models/g_offen/v_mac10.mdl"},
	{"weapon_aug", "models/g_offen/v_aug.mdl"},
	{"weapon_elite", "models/g_offen/v_elite.mdl"},
	{"weapon_fiveseven", "models/g_offen/v_fiveseven.mdl"},
	{"weapon_ump45", "models/g_offen/v_ump45.mdl"},
	{"weapon_galil", "models/g_offen/v_galil.mdl"},
	{"weapon_famas", "models/g_offen/v_famas.mdl"},
	{"weapon_usp", "models/g_offen/v_usp.mdl"},
	{"weapon_glock18", "models/g_offen/v_glock18.mdl"},
	{"weapon_awp", "models/g_offen/v_awp.mdl"},
	{"weapon_mp5navy", "models/g_offen/v_mp5navy.mdl"},
	{"weapon_m249", "models/g_offen/v_m249.mdl"},
	{"weapon_m3", "models/g_offen/v_m3.mdl"},
	{"weapon_m4a1", "models/g_offen/v_m4a1.mdl"},
	{"weapon_tmp", "models/g_offen/v_tmp.mdl"},
	{"weapon_g3sg1", "models/g_offen/v_g3sg1.mdl"},
	{"weapon_deagle", "models/g_offen/v_deagle.mdl"},
	{"weapon_sg552", "models/g_offen/v_sg552.mdl"},
	{"weapon_ak47", "models/g_offen/vak47.mdl"},
	{"weapon_knife", "models/g_offen/v_knife.mdl"},
	{"weapon_p90", "models/g_offen/v_p90.mdl"},
	{"weapon_sg550", "models/g_offen/v_sg550.mdl"},
	{"weapon_hegrenade", "models/g_offen/v_hegrenade.mdl"},
	{"weapon_smokegrenade", "models/g_offen/v_smokegrenade.mdl"},
	{"weapon_c4", "models/g_offen/v_c4.mdl"},
	{"weapon_flashbang", "models/g_offen/v_flashbang.mdl"}
}

//Ideiglenes tömb a skineknek
enum _:DATA
{
	EntName[32],
	Drop_from,
	Rarity,
	InSQL[32],
	Name[32],
	Model[64]
}

new tmp_Skins[DATA]

//Dinamikus tömb a skineknek és ládáknak
new Array:Skins, Array:Cases

//Birtokol cuccok
new Array:Owned[33], Array:OwnedKeys[33], Array:OwnedCases[33]

//Kiválasztott skin
new chosen[33][sizeof(Weapons)]

//Arany
new arany[33]

//Küldés menü
new send[33][8], target[33]

//Piac
enum _:Market
{
	bool:Stuff,
	Put_out,
	Value
}

new Market_Things[33][Market]

//Cvarok
new cvar_Prefix, cvar_KeyDrop, cvar_CaseDrop
new Prefix[32]

//Egyéb
new name[33][32], authid[33][32]

public plugin_init() {
	register_plugin(Plugin, Version, Author)
	register_cvar("public_csgo", Version, FCVAR_SERVER | FCVAR_SPONLY)
	
	//Fegyver modellcserék
	for(new i; i<sizeof(Weapons); i++)
		RegisterHam(Ham_Item_Deploy, Weapons[i], "ItemDeploy_Weapon", 1)
	for(new i; i<sizeof(Others);i++)
		RegisterHam(Ham_Item_Deploy, Others[i], "ItemDeploy_Other", 1)
	
	//Menü parancsok
	register_impulse(201, "FoMenu")
	register_clcmd("say /fomenu", "FoMenu")
	register_clcmd("say_team /fomenu", "FoMenu")
	register_clcmd("say /menu", "FoMenu")
	register_clcmd("say_team /menu", "FoMenu")
	
	//Say módok
	register_clcmd("DARAB", "Kuldes")
	register_clcmd("ARANY", "Ellenorzes")
	
	//Halál
	register_event("DeathMsg", "eDeathMsg", "a")
	
	//Cvarok
	cvar_Prefix = register_cvar("csgo_prefix", "CS:GO")
	cvar_KeyDrop = register_cvar("csgo_keydrop", "7.0")
	cvar_CaseDrop = register_cvar("csgo_casedrop", "25.0")
	get_pcvar_string(cvar_Prefix, Prefix, charsmax(Prefix))
	
	//Gránát cuccmók
	register_message(get_user_msgid("SendAudio"), "Message_SendAudio");
	register_message(get_user_msgid("TextMsg"), "Message_TextMsg");
	
	get_cvar_string("amx_sql_host", SQL_INFO[0], charsmax(SQL_INFO[]))
	get_cvar_string("amx_sql_user", SQL_INFO[1], charsmax(SQL_INFO[]))
	get_cvar_string("amx_sql_pass", SQL_INFO[2], charsmax(SQL_INFO[]))
	get_cvar_string("amx_sql_db", SQL_INFO[3], charsmax(SQL_INFO[]))
}

/*==========PRECACHE==========*/
public plugin_precache()
{
	Skins = ArrayCreate(DATA)
	Cases = ArrayCreate(DATA)
	for(new i; i<34; i++)
	{
		Owned[i] = ArrayCreate()
		OwnedCases[i] = ArrayCreate()
		OwnedKeys[i] = ArrayCreate()
	}
	
	new Buffer[256], pFile = fopen("addons/amxmodx/configs/g_offen.ini", "rt")
	
	if(pFile)
	{
		while(!feof(pFile))
		{
			fgets(pFile, Buffer, charsmax(Buffer))
			if(Buffer[0] && Buffer[0] != ';' || Buffer[0] && Buffer[0] != '/' && Buffer[1] != '/')
			{
				parse(Buffer, tmp_Skins[EntName], charsmax(tmp_Skins[EntName]), tmp_Skins[Drop_from], charsmax(tmp_Skins[Drop_from]), tmp_Skins[Rarity], charsmax(tmp_Skins[Rarity]), tmp_Skins[InSQL], charsmax(tmp_Skins[InSQL]), tmp_Skins[Name], charsmax(tmp_Skins[Name]), tmp_Skins[Model], charsmax(tmp_Skins[Model]))
				if(equal(tmp_Skins[EntName], "lada"))
					ArrayPushArray(Cases, tmp_Skins)
				else
					ArrayPushArray(Skins, tmp_Skins)
			}
		}
		fclose(pFile)
	}
	else fprintf(pFile, ";^"entitásnév^" ^"Láda ID^" ^"Ritkaság^" ^"Neve az SQL-ben^" ^"Neve a játékbanv^" ^"modell^"^n;Példa egy AK skinre^n;^"weapon_ak47^" ^"0^" ^"1^" ^"elso_ak^" ^"AK47 | Első skin^" ^"models/g_offen/v_ak47_1.mdl^"^n;Példa egy ládára^n;^"lada^" ^"^" ^"^" ^"elso_lada^" ^"Operation Wildfire^" ^"^"^n");
	
	
	for(new i; i<sizeof(DefaultSkins);i++)
		precache_model(DefaultSkins[i][1])
		
	for(new i; i<ArraySize(Skins);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		precache_model(tmp_Skins[Model])
	}
	
	//Gránát hangok
	for(new i; i< MAX_SOUNDS; i++)
	{
		precache_sound(g_szSmokeSounds[i])
		precache_sound(g_szFlashSounds[i])
		precache_sound(g_szHegrenSounds[i])
	}
}

/*==========SQL MENTÉS==========*/
//Ne piszkáld, tökéletes!
public plugin_cfg()
{
	static Query[5120], Len
	g_SqlTuple = SQL_MakeDbTuple(SQL_INFO[0],SQL_INFO[1],SQL_INFO[2],SQL_INFO[3])
	
	Len += formatex(Query[Len], charsmax(Query), "CREATE TABLE IF NOT EXISTS `g_offen` (`authid` varchar(32) NOT NULL, `username` varchar(32) NOT NULL")
	for(new i; i<ArraySize(Skins);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		Len += formatex(Query[Len], charsmax(Query)-Len, ", `%s` int(11) NOT NULL", tmp_Skins[InSQL])
	}
	for(new i; i<ArraySize(Cases);i++)
	{
		ArrayGetArray(Cases, i, tmp_Skins)
		Len += formatex(Query[Len], charsmax(Query)-Len, ", `%s` int(11) NOT NULL, `%s_k` int(11) NOT NULL", tmp_Skins[InSQL], tmp_Skins[InSQL])
	}
	Len += formatex(Query[Len], charsmax(Query)-Len, ", `gold` int(11) NOT NULL, `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY)")
	SQL_ThreadQuery(g_SqlTuple,"createTableThread", Query)
}
     
public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
{
	if(FailState == TQUERY_CONNECT_FAILED)
		set_fail_state("Nem lehet csatlakozni az adatbazishoz.")
	else if(FailState == TQUERY_QUERY_FAILED)
		set_fail_state("Query Error")
	if(Errcode)
		log_amx("Hiba: %s",Error)
}

public client_putinserver(id)
{
	if(!is_user_bot(id) && !is_user_hltv(id))
	{
		get_user_name(id, name[id], charsmax(name))
		get_user_authid(id, authid[id], charsmax(authid))
		if(contain(authid[id], "_ID_LAN") != -1) get_user_ip(id, authid[id], charsmax(authid), 1)
		Load_SQL(id)
	}
}

public client_disconnect(id)
{
	if(!is_user_bot(id) && !is_user_hltv(id))
		Update_SQL(id)
	
	ArrayClear(Owned[id])
	ArrayClear(OwnedKeys[id])
	ArrayClear(OwnedCases[id])
	arrayset(chosen[id], 0, sizeof(Weapons))
	authid[id][0] = EOS;
	name[id][0] = EOS;
}

public client_infochanged(id)
{
	if(!is_user_connected(id))
		return PLUGIN_HANDLED
	
	get_user_info(id, "name", name[id], charsmax(name[]))
	
	return PLUGIN_CONTINUE
}

public Load_SQL(id)
{
	static Query[5120], Data[1]; Data[0] = id
	
	formatex(Query, charsmax(Query), "SELECT * FROM `g_offen` WHERE authid = ^"%s^";", authid[id])
	SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", Query, Data, 1)
}

public QuerySelectData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
{
	if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
	{
		log_amx("%s", Error)
		return
	}
	else
	{
		new id = Data[0];
		new kname[32], stg
 
		if(SQL_NumRows(Query) > 0)
		{
			for(new i; i<ArraySize(Skins);i++)
			{
				ArrayGetArray(Skins, i, tmp_Skins)
				stg = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, tmp_Skins[InSQL]))
				ArrayPushCell(Owned[id], stg)
			}
			for(new i; i<ArraySize(Cases);i++)
			{
				ArrayGetArray(Cases, i, tmp_Skins)
				formatex(kname, charsmax(kname), "%s_k", tmp_Skins[InSQL])
				stg = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, kname))
				ArrayPushCell(OwnedKeys[id], stg)
				stg = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, tmp_Skins[InSQL]))
				ArrayPushCell(OwnedCases[id], stg)
				
			}
			arany[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "gold"))
		}
		else
		{
			Save_SQL(id)
		}
	}
}

public Save_SQL(id)
{
	static Query[5120], Len
	Len += formatex(Query[Len], charsmax(Query), "INSERT INTO `g_offen` (`authid`, `username`")
	for(new i; i<ArraySize(Skins);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		Len += formatex(Query[Len], charsmax(Query)-Len, ", `%s`", tmp_Skins[InSQL])
	}
	for(new i; i<ArraySize(Cases); i++)
	{
		ArrayGetArray(Cases, i, tmp_Skins)
		Len += formatex(Query[Len], charsmax(Query)-Len, ", `%s`, `%s_k`", tmp_Skins[InSQL], tmp_Skins[InSQL])
	}
	Len += formatex(Query[Len], charsmax(Query)-Len, ", `gold`) VALUES (^"%s^", ^"%s^"", authid[id], name[id])
	for(new i;i<ArraySize(Skins);i++)
	{
		Len += formatex(Query[Len], charsmax(Query)-Len, ", ^"0^"")
	}
	for(new i; i<ArraySize(Cases); i++)
	{
		Len += formatex(Query[Len], charsmax(Query)-Len, ", ^"0^", ^"0^"")
	}
	Len += formatex(Query[Len], charsmax(Query)-Len, ", ^"0^");")
	SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query)
}

public QuerySetData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
{
	if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
	{
		log_amx("%s", Error)
		return
	}
}

public Update_SQL(id)
{
	static Query[5120], Len
	Len += formatex(Query[Len], charsmax(Query), "UPDATE `g_offen` SET `username` = ^"%s^"", name[id])
	for(new i;i<ArraySize(Skins);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		Len += formatex(Query[Len], charsmax(Query)-Len, ", `%s` = %d", tmp_Skins[InSQL], ArrayGetCell(Owned[id], i))
	}
	for(new i;i<ArraySize(Cases);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		Len += formatex(Query[Len], charsmax(Query)-Len, ", `%s` = %d, `%s_k` = %d", tmp_Skins[InSQL], ArrayGetCell(OwnedCases[id], i), tmp_Skins[InSQL], ArrayGetCell(OwnedKeys[id], i))
	}
	Len += formatex(Query[Len], charsmax(Query)-Len, ", `gold` = %d WHERE `authid` = ^"%s^";", arany[id], authid[id])
	
	SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query)
}

public plugin_end()
{
	SQL_FreeHandle(g_SqlTuple)
	for(new i; i<34; i++)
	{
		ArrayDestroy(Owned[i])
		ArrayDestroy(OwnedCases[i])
		ArrayDestroy(OwnedKeys[i])
	}
	ArrayDestroy(Skins)
	ArrayDestroy(Cases)
}

/*==========MENÜK==========*/
//Tökéletes, de ha akarsz, belenyúlsz.
//Javaslom, hogy csak a menük neveit módosítsd, a ciklusokba és handlerekbe ne nyúlj bele.
public FoMenu(id)
{
	new txt[128]
	formatex(txt, charsmax(txt), "\r%s\w%s^nby \y%s^nFőMenü", Plugin, Version, Author)
	new menu = menu_create(txt, "FoMenu_h")
	
	menu_additem(menu, "Raktár", "", 0)
	menu_additem(menu, "Láda nyitás", "", 0)
	menu_additem(menu, "Lomtár", "", 0)
	menu_additem(menu, "Küldés", "", 0)
	menu_additem(menu, "Piac", "", 0)
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public FoMenu_h(id, menu, item)
{
	switch(item)
	{
		case 0:Raktar_M(id)
		case 1:Lada_M(id)
		case 2:Lomtar_M(id)
		case 3:Kuldes_M(id)
		case 4:Piac_M(id)
		case MENU_EXIT:{
			menu_destroy(menu)
			return PLUGIN_HANDLED
		}
	}
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public Raktar_M(id)
{
	new txt[128], num[8]
	formatex(txt, charsmax(txt), "\r%s\w%s^nRaktár", Plugin, Version)
	new menu = menu_create(txt, "Raktar_h")
	
	for(new i; i<ArraySize(Skins);i++)
	{
		if(ArrayGetCell(Owned[id], i) > 0)
		{
			ArrayGetArray(Skins, i, tmp_Skins)
			num_to_str(i, num, charsmax(num))
			formatex(txt, charsmax(txt), "%s [%d DB]", tmp_Skins[Name], ArrayGetCell(Owned[id], i))
			menu_additem(menu, txt, num, 0)
		}
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_BACKNAME, "Vissza")
	menu_setprop(menu, MPROP_NEXTNAME, "Előre")
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Raktar_h(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new data[9], access, callback, szName[64]
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	new key = str_to_num(data)
	
	for(new i; i<sizeof(Weapons);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		if(equal(tmp_Skins[EntName], Weapons[i]) != -1)
		{
			chosen[id][i] = key+1
			ColorChat(id, NORMAL, "^4[%s]^1 Kiválasztottad a(z) ^3%s ^1skint!", Prefix, tmp_Skins[Name])
			
			break;
		}
	}
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public Lada_M(id)
{
	new txt[128]
	formatex(txt, charsmax(txt), "\r%s\w%s^nLáda nyitás", Plugin, Version)
	new menu = menu_create(txt, "Lada_h")
	
	for(new i; i<ArraySize(Cases);i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		formatex(txt, charsmax(txt), "%s [%d DB] | [%d DB Kulcs]", tmp_Skins[Name], ArrayGetCell(OwnedCases[id], i), ArrayGetCell(OwnedKeys[id], i))
		menu_additem(menu, txt, "", 0)
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Lada_h(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	if(ArrayGetCell(OwnedKeys[id], item) > 0 && ArrayGetCell(OwnedCases[id], item) > 0)
	{
		ArraySetCell(OwnedKeys[id], item, ArrayGetCell(OwnedKeys[id], item)-1)
		ArraySetCell(OwnedCases[id], item, ArrayGetCell(OwnedCases[id], item)-1)
		weapon_drop(id, item)
	}
	else
	{
		ArrayGetArray(Skins, item, tmp_Skins)
		if(ArrayGetCell(OwnedKeys[id], item) == 0)
			ColorChat(id, NORMAL, "^4[%s]^1 Nincs elég ^4%s Kulcsod^1!", Prefix, tmp_Skins[Name])
		else
			ColorChat(id, NORMAL, "^4[%s]^1 Nincs elég ^4%s Ládád^1!", Prefix, tmp_Skins[Name])
	}
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public Lomtar_M(id)
{
	new txt[128], num[8]
	formatex(txt, charsmax(txt), "\r%s\w%s^nLomtár", Plugin, Version)
	new menu = menu_create(txt, "Lomtar_h")
	
	for(new i; i<ArraySize(Skins);i++)
	{
		if(ArrayGetCell(Owned[id], i) > 0)
		{
			ArrayGetArray(Skins, i, tmp_Skins)
			num_to_str(i, num, charsmax(num))
			formatex(txt, charsmax(txt), "%s [%d DB]", tmp_Skins[Name], ArrayGetCell(Owned[id], i))
			menu_additem(menu, txt, num, 0)
		}
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_BACKNAME, "Vissza")
	menu_setprop(menu, MPROP_NEXTNAME, "Előre")
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Lomtar_h(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new data[9], access, callback, szName[64]
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	new key = str_to_num(data)
	
	ArraySetCell(Owned[id], key, ArrayGetCell(Owned[id], key)-1)
	ArrayGetArray(Skins, key, tmp_Skins)
	ColorChat(id, NORMAL, "^4[%s]^1 Eldobtál egy ^3%s ^1skint!", Prefix, tmp_Skins[Name])
	Update_SQL(id)
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public Kuldes_M(id)
{
	new txt[128], num[8]
	formatex(txt, charsmax(txt), "\r%s\w%s^nKüldés", Plugin, Version)
	new menu = menu_create(txt, "Kuldes_h")
	
	formatex(txt, charsmax(txt), "Arany: %d", arany[id])
	menu_additem(menu, txt, "Arany", 0)
	
	for(new i; i<ArraySize(Skins);i++)
	{
		if(ArrayGetCell(Owned[id], i) > 0)
		{
			ArrayGetArray(Skins, i, tmp_Skins)
			num_to_str(i, num, charsmax(num))
			formatex(txt, charsmax(txt), "%s [%d DB]", tmp_Skins[Name], ArrayGetCell(Owned[id], i))
			menu_additem(menu, txt, num, 0)
		}
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_BACKNAME, "Vissza")
	menu_setprop(menu, MPROP_NEXTNAME, "Előre")
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Kuldes_h(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new data[9], access, callback, szName[64]
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	
	copy(send[id], charsmax(send[]), data)
	JatekosValaszt(id)
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public JatekosValaszt(id)
{
	new txt[128], userID[32]
	formatex(txt, charsmax(txt), "\r%s\w%s^nVálassz játékost!", Plugin, Version)
	new menu = menu_create(txt, "JatekosValaszt_h")
	
	new players[32], pnum
	get_players(players, pnum, "c")
	
	for(new i; i<pnum; i++)
	{
		if(!is_user_connected(players[i])) 
				continue;
		
		formatex(userID, charsmax(userID), "%d", get_user_userid(players[i]))
		menu_additem(menu, name[players[i]], userID, 0)
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_BACKNAME, "Vissza")
	menu_setprop(menu, MPROP_NEXTNAME, "Előre")
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public JatekosValaszt_h(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new data[9], access, callback, szName[64]
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	new userID = str_to_num(data)
	target[id] = find_player("k", userID)
	
	if(!is_user_connected(target[id]))
	{
		ColorChat(id, NORMAL, "^4[%s]^1 Sajnálom, lecsatlakozott akit kiválasztottál!", Prefix)
		menu_display(id, menu, 0)
		return PLUGIN_HANDLED
	}
	
	client_cmd(id, "messagemode DARAB"); 
	menu_destroy(menu); 
	return PLUGIN_HANDLED;
}

public Kuldes(id)
{
	new txt[128], num
	read_args(txt, charsmax(txt))
	remove_quotes(txt)
	
	if(is_str_num(txt))
	{
		num = str_to_num(txt)
		
		if(equal(send[id], "Arany"))
		{
			if(arany[id] >= num)
			{
				arany[target[id]] += num
				arany[id] -= num
				
				ColorChat(target[id], NORMAL, "^4[%s]^1 Kaptál ^3%d^1 ^4arany^1at!", Prefix, num)
				ColorChat(id, NORMAL, "^4[%s]^1 Elküldtél ^3%d^1 ^4arany^1at!", Prefix, num)
				Update_SQL(id)
				Update_SQL(target[id])
			}
			else
				ColorChat(id, NORMAL, "^4[%s]^1 Nincs elég ^4arany^1ad!", Prefix)
		}
		else
		{
			new i = str_to_num(send[id])
			
			if(ArrayGetCell(Owned[id], i) >= num)
			{
				ArraySetCell(Owned[target[id]], i, ArrayGetCell(Owned[target[id]], i)+1)
				ArraySetCell(Owned[id], i, ArrayGetCell(Owned[id], i)-1)
				ArrayGetArray(Skins, i, tmp_Skins)
				
				ColorChat(target[id], NORMAL, "^4[%s]^1 Kaptál ^3%d ^4%s^1-t!", Prefix, num, tmp_Skins[Name])
				ColorChat(id, NORMAL, "^4[%s]^1 Elküldtél ^3%d ^4%s^1-t!", Prefix, num, tmp_Skins[Name])
				Update_SQL(id)
				Update_SQL(target[id])
			}
			else
			{
				ArrayGetArray(Skins, i, tmp_Skins)
				ColorChat(id, NORMAL, "^4[%s]^1 Nincs ennyi^4%s^1-ed!", Prefix, tmp_Skins[Name])
			}
		}
	}
	else
		ColorChat(id, NORMAL, "^4[%s]^1 A megadott szöveg (%s) nem csak számokat tartalmazott! Érvénytelen!", Prefix, txt)

	return PLUGIN_CONTINUE;
}

public Piac_M(id)
{
	new txt[128]
	formatex(txt, charsmax(txt), "\r%s\w%s^nPiac", Plugin, Version)
	new menu = menu_create(txt, "Piac_h")
	
	menu_additem(menu, "Eladás", "", 0)
	menu_additem(menu, "Vásárlás", "", 0)
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Piac_h(id, menu, item)
{
	switch(item)
	{
		case 0: Eladas_M(id)
		case 1: Vasarlas_M(id)
		case MENU_EXIT:{
			menu_destroy(menu)
			return PLUGIN_HANDLED
		}
	}
	
	menu_destroy(menu); 
	return PLUGIN_HANDLED;
}

public Eladas_M(id)
{
	new txt[128]
	formatex(txt, charsmax(txt), "\r%s\w%s^nPiac eladás", Plugin, Version)
	new menu = menu_create(txt, "Eladas_h")
	
	if(!Market_Things[id][Stuff])
	{
		if(Market_Things[id][Put_out] != -1)
		{
			ArrayGetArray(Skins, Market_Things[id][Put_out], tmp_Skins)
			formatex(txt, charsmax(txt), "%s", tmp_Skins[Name])
			menu_additem(menu, txt, "0", 0)
		}
		else
			menu_additem(menu, "Válaszd ki a tárgyat!", "", 0)
			
		formatex(txt, charsmax(txt), "Ár: %d arany", Market_Things[id][Value])
		menu_additem(menu, txt, "1", 0)
		
		if(Market_Things[id][Value])
			menu_additem(menu, "Mehet a Piacra!", "2", 0)
	}
	else
	{
		if(Market_Things[id][Value])
			menu_additem(menu, "Ajánlat visszavonása", "-1", 0)
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Eladas_h(id, menu, item)			
{
	if( item == MENU_EXIT )
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	new data[9], szName[64], access, callback, weapon[32]
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	new key = str_to_num(data)
	
	switch(key)
	{
		case -1:
		{
			Market_Things[id][Value] = 0
			Market_Things[id][Stuff] = false
			ArraySetCell(Owned[id], Market_Things[id][Put_out], ArrayGetCell(Owned[id], Market_Things[id][Put_out])+1)
			Market_Things[id][Put_out] = -1
		}
		case 0:
		{
			TargyValaszt(id)
		}
		case 1:
		{
			client_cmd(id, "messagemode ARANY")
		}
		case 2:
		{
			if(Market_Things[id][Put_out] != -1)
			{
				Market_Things[id][Stuff] = true
				ArraySetCell(Owned[id], Market_Things[id][Put_out], ArrayGetCell(Owned[id], Market_Things[id][Put_out])-1)
				copy(weapon, charsmax(weapon), weapon_now(id))
				if(weapon[0]) weapon_set_default(id, weapon)
				ArrayGetArray(Skins, Market_Things[id][Put_out], tmp_Skins)
				
				ColorChat(0, NORMAL, "^4[%s] ^3%s ^1kirakott egy ^4%s^1-t a piacra ^3%d ^4arany^1ért!", Prefix, name[id], tmp_Skins[Name], Market_Things[id][Value])
			}
			else
			{
				ColorChat(0, NORMAL, "^4[%s] ^1Nem választottál ki semmit!", Prefix)
				menu_display(id, menu, 0)
				return PLUGIN_HANDLED
			}
		}
	}
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public Ellenorzes(id)
{
	new num, txt[32]
	read_args(txt, charsmax(txt))
	remove_quotes(txt)
		
	num = str_to_num(txt)
		
	if(strlen(txt) > 7)
	{
		client_cmd(id, "messagemode ARANY")
	}
	else if(num < 500)
	{
		ColorChat(0, NORMAL, "^4[%s] ^1Nem tudsz eladni ^3500 ^4arany^1 alattt!", Prefix)
		Eladas_M(id)
	}
	else
	{
		Market_Things[id][Value] = num
		Eladas_M(id)
	}
}

public TargyValaszt(id)
{
	new txt[128], num[8]
	formatex(txt, charsmax(txt), "\r%s\w%s^nVálaszd ki a tárgyat!", Plugin, Version)
	new menu = menu_create(txt, "TargyValaszt_h")
	
	for(new i;i<ArraySize(Skins);i++)
	{
		if(ArrayGetCell(Owned[id], i) > 0)
		{
			ArrayGetArray(Skins, i, tmp_Skins)
			num_to_str(i, num, charsmax(num))
			formatex(txt, charsmax(txt), "%s (%d DB)", tmp_Skins[Name], ArrayGetCell(Owned[id], i))
			menu_additem(menu, txt, num, 0)
		}
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_BACKNAME, "Vissza")
	menu_setprop(menu, MPROP_NEXTNAME, "Előre")
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public TargyValaszt_h(id, menu, item)
{
	if( item == MENU_EXIT )
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	new data[9], szName[64], access, callback
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	new key = str_to_num(data)
	
	Market_Things[id][Put_out] = key
	Eladas_M(id)
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public Vasarlas_M(id)
{
	new txt[128], userID[32]
	formatex(txt, charsmax(txt), "\r%s\w%s^nPiac vásárlás", Plugin, Version)
	new menu = menu_create(txt, "Vasarlas_h")
	
	new players[32], pnum
	get_players(players, pnum, "c")
	
	for(new i; i<pnum;i++)
	{
		if(Market_Things[players[i]][Stuff])
		{
			ArrayGetArray(Skins, Market_Things[players[i]][Put_out], tmp_Skins)
			formatex(userID, charsmax(userID), "%d", get_user_userid(players[i]))
			formatex(txt, charsmax(txt), "%s (Eladó: %s | Ára: %d)", tmp_Skins[Name], Market_Things[players[i]][Value])
			menu_additem(menu, txt, userID, 0)
		}
	}
	
	menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
	menu_setprop(menu, MPROP_BACKNAME, "Vissza")
	menu_setprop(menu, MPROP_NEXTNAME, "Előre")
	menu_setprop(menu, MPROP_EXITNAME, "Kilépés")
     
	menu_display(id, menu, 0)
	return PLUGIN_HANDLED
}

public Vasarlas_h(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED
	}
	new data[6] ,szName[64],access,callback
	new name[32]
		
	menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback)
	new userID = str_to_num(data)
	new userId = find_player("k", userID)
	
	if(arany[id] >= Market_Things[userId][Value] && Market_Things[userId][Stuff])
	{
		Market_Things[userId][Stuff] = false
		
		ArrayGetArray(Skins, Market_Things[userId][Put_out], tmp_Skins)
		ColorChat(id, NORMAL, "^4[%s] ^1Vettél egy ^3%s^1-t ^4%s^1-től ^3%d ^4arany^1ért!", Prefix, tmp_Skins[Name], name[userId], Market_Things[userId][Value])
		ColorChat(userID, NORMAL, "^4[%s] ^4%s^1 vett tőled ^3%s^1-t ^3%d ^4arany^1ért!", Prefix, name[id], tmp_Skins[Name], Market_Things[userId][Value])
		arany[userId] += Market_Things[userId][Value]
		arany[id] -= Market_Things[userId][Value]
		Market_Things[userId][Value] = 0
		ArraySetCell(Owned[userId], Market_Things[userId][Put_out], ArrayGetCell(Owned[userId], Market_Things[userId][Put_out])-1)
		ArraySetCell(Owned[id], Market_Things[userId][Put_out], ArrayGetCell(Owned[id], Market_Things[userId][Put_out])+1)
		Market_Things[id][Put_out] = -1
		Update_SQL(userID)
		Update_SQL(id)
	}
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

/*==========DROPP==========*/
//Jól droppol, az esélyt a plugin elején állítod.
public eDeathMsg()
{
	new attacker = read_data(1)
	
	if(attacker != read_data(2) && is_user_alive(attacker))
	{
		set_hudmessage(random(255), random(255), random(255), -1.0, 0.20, 0, 6.0, 12.0)
		if(read_data(3))
		{
			new mennyiseg = random_num(100, 200)
			arany[attacker] += mennyiseg
			show_hudmessage(attacker, "[ +%d Arany ]", mennyiseg)
		}
		else
		{
			new mennyiseg = random_num(50, 100)
			arany[attacker] += mennyiseg
			show_hudmessage(attacker, "[ +%d Arany ]", mennyiseg)
		}
		
		new Float:num = random_float(0.0, 100.0)
		if(num <= get_pcvar_float(cvar_KeyDrop))
		{
			new drp = random_num(0, ArraySize(Cases)-1)
			ArraySetCell(OwnedKeys[attacker], drp, ArrayGetCell(OwnedKeys[attacker], drp)+1)
			ArrayGetArray(Cases, drp, tmp_Skins)
			ColorChat(attacker, NORMAL, "^4[%s] ^1Találtál egy ^3%s Kulcsot^1!", Prefix, tmp_Skins[Name])
		}
		else if(num <= get_pcvar_float(cvar_CaseDrop))
		{
			new drp = random_num(0, ArraySize(Cases)-1)
			ArraySetCell(OwnedCases[attacker], drp, ArrayGetCell(OwnedCases[attacker], drp)+1)
			ArrayGetArray(Cases, drp, tmp_Skins)
			ColorChat(attacker, NORMAL, "^4[%s] ^1Találtál egy ^3%s Ládát^1!", Prefix, tmp_Skins[Name])
		}	
		Update_SQL(attacker)
	}
	return PLUGIN_HANDLED		
}

/*==========SKIN CSERE==========*/
//Nem belenyúlni, mert könnyen összekavarodnak a dolgok!!!!
public ItemDeploy_Weapon(ent)
{
	if(ent <=0)
		return HAM_IGNORED;
	
	new id = get_weapon_owner(ent)
	new wpn[32]; pev(ent, pev_classname, wpn, charsmax(wpn))
	
	for(new i; i<sizeof(Weapons);i++)
	{
		if(chosen[id][i] == 0)
		{
			for(new j; j<sizeof(DefaultSkins);j++)
			{
				if(equal(DefaultSkins[j][0], wpn))
				{
					set_pev(id, pev_viewmodel2, DefaultSkins[j][1])
					return HAM_IGNORED;
				}
			}
		}
		else
		{
			for(new j; j<ArraySize(Skins);j++)
			{
				ArrayGetArray(Skins, j, tmp_Skins)
				if(equal(tmp_Skins[EntName], wpn) != -1 && chosen[id][i] == j+1)
				{
					set_pev(id, pev_viewmodel2, tmp_Skins[Model])
					return HAM_IGNORED;
				}
			}
		}
	}
	return HAM_IGNORED;
}

 public ItemDeploy_Other(ent)
{
 	if(ent <=0)
		return HAM_IGNORED;
	
	new id = get_weapon_owner(ent)
	new wpn[32]; pev(ent, pev_classname, wpn, charsmax(wpn))
	
	for(new i = 25; i<sizeof(DefaultSkins);i++)
	{
		if(equal(DefaultSkins[i][0], wpn))
		{
			set_pev(id, pev_viewmodel2, DefaultSkins[i][1])
			return HAM_IGNORED;
		}
	}
	return HAM_IGNORED;
}

/*==========STOCKOK==========*/
//Nem piszkálni!
stock weapon_set_default(id, weapon[])
{
 	for(new i; i<sizeof(Weapons);i++)
	{
		if(containi(Weapons[i], weapon) != -1)
		{
			chosen[id][i] = 0
			return 1
		}
	}
	return 0
}

stock weapon_now(id)
{
	new wpn[32]; get_weaponname(get_user_weapon(id), wpn, charsmax(wpn))
	replace(wpn, charsmax(wpn), "weapon_", "")
	
	for(new i; i<sizeof(Weapons);i++)
	{
		if(chosen[id][i] == Market_Things[id][Put_out]+1 && ArrayGetCell(Owned[id], Market_Things[id][Put_out]) < 2)
			return wpn;
	}
	wpn[0] = EOS
	return wpn;
}

stock weapon_drop(id, num)
{
	new Float:rarity = random_float(0.0, 100.0)
	new how_rare, count, skins[16]
	
	if(rarity < 35.0)	how_rare = 0
	else if(rarity >= 35.0 && rarity < 50.0) how_rare = 1
	else if(rarity >= 50.0 && rarity < 65.0) how_rare = 2
	else if(rarity >= 65.0 && rarity < 80.0) how_rare = 3
	else if(rarity >= 80.0 && rarity < 92.5) how_rare = 4
	else if(rarity >= 92.5 && rarity < 97.5) how_rare = 5
	else if(rarity >= 97.5 && rarity <= 100.0) how_rare = 6
	
	for(new i; i<ArraySize(Skins); i++)
	{
		ArrayGetArray(Skins, i, tmp_Skins)
		if(tmp_Skins[Rarity] == how_rare && tmp_Skins[Drop_from] == num)
		{
			skins[count] = i
			count++
		}
	}
	
	new dropped = random_num(0, count)
	
	ArraySetCell(Owned[id], skins[dropped], ArrayGetCell(Owned[id], skins[dropped])+1)
	ArrayGetArray(Skins, skins[dropped], tmp_Skins)
	ColorChat(id, NORMAL, "^4[%s]^1 Egy ^3%s ^1skint nyitottál!", Prefix, tmp_Skins[Name])
}

/*==========CS:GO-S GRÁNÁT HANGOK==========*/
public Message_TextMsg(iMsgId, iMsgType, iMsgEnt) {
	if(get_msg_arg_int(1) != MSGARG_PRINT_RADIO)
		return PLUGIN_CONTINUE;
 
	static szMsg[32]; get_msg_arg_string(MSGARG_PRINT_RADIO, szMsg, charsmax(szMsg));
   
	if(equal(szMsg, "#Fire_in_the_hole")) {
		static Sender[4], SenderName[32], szSound[MAX_SOUND_PATH_LENGTH], SenderId;
		get_msg_arg_string(MSGARG_SENDER_ID, Sender, charsmax(Sender));
		get_msg_arg_string(MSGARG_SENDER_NAME, SenderName, charsmax(SenderName));
 
		SenderId = str_to_num(Sender);
		switch(get_user_weapon(SenderId)) {
			case CSW_HEGRENADE: szSound = g_szHegrenSounds[random(sizeof(g_szHegrenSounds))];
			case CSW_SMOKEGRENADE: szSound = g_szSmokeSounds[random(sizeof(g_szSmokeSounds))];
			case CSW_FLASHBANG: szSound = g_szFlashSounds[random(sizeof(g_szFlashSounds))];
			default: return PLUGIN_CONTINUE;
		}
       
		emit_sound(SenderId, CHAN_VOICE, szSound, VOL_NORM, ATTN_STATIC, 0, PITCH_NORM);
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}
 
public Message_SendAudio(iMsgId, iMsgType, iMsgEnt) {
	static szSound[22]
	get_msg_arg_string(MSGARG_AUDIO_CODE, szSound, charsmax(szSound))
	return equal(szSound, "%!MRAD_FIREINHOLE") ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}
