#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <sqlx>
#include <ColorChat>

#define PLUGIN "Fegyver Skin Menu"
#define VERSION "1.0"
#define AUTHOR "RaZzoR"

#define DICTIONARY "fegyver_skin_menu.txt"

//#define HOOK_P_MODELS
#define HOOK_V_MODELS
//#define HOOK_W_MODELS
new bool:Belepve[33], bool:Beirtjelszot[33], bool:Beirtjelszot1[33], bool:Beirtfelhasznalot[33], bool:Beirtfelhasznalot1[33], Regisztralt[33], Felhasznalonev[33][100], Jelszo[33][100], regJelszo[33][100], regFh[33][100], AutoB[33]
new name[33][32], Dollar[33]
new weapon_select[33]
new const Website[] = "www.facebook.com/groups/rtdteam/"; //MenÃ¼kben megjelenÅ‘ elÃ©rhetÅ‘sÃ©g
new const SQLINFO[][] = { "-", "cheat462", "-", "cheat462" };
new Oles[33]
new Handle:g_SqlTuple;
new Temp[192];
new const Prefix[] = "[Magyar \dOnlyDust2]"; //MenÃ¼ben megjelenÅ‘ prefix
new const C_Prefix[] = "^3[^4Magyar^3]"; //Chat Prefix

new const menu_item_names[][][] = {
	{ "Alap Csomag",	"0",	"" 	    },
	{ "CSGO Csomag",		"30",	"magyard2/cs_skins" },
	{ "Bronz Csomag",		"60",	"magyard2/brz_skins" },
	{ "Ezüst Csomag",		"110",	"magyard2/ez_skins" },
	{ "Metál Csomag",		"250",	"magyard2/mt_skins" },
	{ "Arany Csomag",		"460",	"magyard2/ar_skins" },
	{ "Neon Csomag",		"672",	"magyard2/eo_skins" },
	{ "Rozsdás Csomag",		"50",	"magyard2/rz_skins" },
	{ "Karácsony Csomag",		"1000",	"magyard2/kr_skins" },
	{ "Tűz Csomag",		"1300",	"magyard2/tz_skins" },
	{ "Barcelona Csomag",		"2000",	"magyard2/br_skins" },
	{ "Szuperhős Csomag",		"2500",	"magyard2/sz_skins" },
	{ "Ultra Csomag",		"3400",	"magyard2/ul_skins" },
	{ "Sztár Csomag",		"4000",	"magyard2/szt_skins" },
	{ "Végzős Csomag",		"10000",	"magyard2/vip_skins" }
	
}

new const models_name[][] = {
	"ak47.mdl",                  
	"m4a1.mdl",                    
	"deagle.mdl",
	"awp.mdl"
} 

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_dictionary(DICTIONARY)
	
	register_impulse(201, "clcmd_menu")
	register_clcmd("say /menu", "clcmd_menu")
	register_event("CurWeapon","Hook_P_V_Model","be","1=1")
	
	#if defined HOOK_W_MODELS
	register_forward(FM_SetModel, "Hook_W_Model", 1)
	#endif
}

public plugin_precache() {
	for(new i = 0; i < sizeof(models_name); i++) {
		for(new j = 1; j < sizeof(menu_item_names); j++) {
			#if defined HOOK_P_MODELS
			new precache_p[256]
			format(precache_p, sizeof(precache_p), "models/%s/p_%s", menu_item_names[j][2], models_name[i])
			
			precache_model(precache_p)
			#endif
			
			#if defined HOOK_V_MODELS
			new precache_v[256]
			format(precache_v, sizeof(precache_v), "models/%s/v_%s", menu_item_names[j][2], models_name[i])
			
			precache_model(precache_v)
			#endif
			
			#if defined HOOK_W_MODELS
			new precache_w[256]
			format(precache_w, sizeof(precache_w), "models/%s/w_%s", menu_item_names[j][2], models_name[i])
			
			precache_model(precache_w)
			#endif
		}
	}
}
	
public W_Model_Hook(ent, model[]) {
	if(!pev_valid(ent)) return FMRES_IGNORED

	new owner = pev(ent, pev_owner)

	for(new i = 0; i < sizeof(models_name); i++) {
		new old_w[256]
		format(old_w, sizeof(old_w), "models/w_%s", models_name[i])

		new new_w[256]			
		format(new_w, sizeof(new_w), "models/%s/w_%s", menu_item_names[weapon_select[owner]][2], models_name[i])
		
		if(equali(model, old_w) || equali(model, new_w)) {
			if(weapon_select[owner] >= 1) engfunc(EngFunc_SetModel, ent, new_w)
			else engfunc(EngFunc_SetModel, ent, old_w)
				
			return FMRES_SUPERCEDE
		}
	}
	
	return FMRES_IGNORED
}

public Hook_P_V_Model(id) {
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static v_model[32], p_model[32]
	pev(id, pev_viewmodel2, v_model, 31)
	pev(id, pev_weaponmodel2, p_model,31)
	
	for(new i = 0; i < sizeof(models_name); i++) {
		#if defined HOOK_V_MODELS
		new old_v[256]
		format(old_v, sizeof(old_v), "models/v_%s", models_name[i])

		new new_v[256]
		format(new_v, sizeof(new_v), "models/%s/v_%s", menu_item_names[weapon_select[id]][2], models_name[i])
		
		if(equali(v_model, old_v) || equali(v_model, new_v)) {
			if(weapon_select[id] >= 1) set_pev(id, pev_viewmodel2, new_v)			
			else set_pev(id, pev_viewmodel2, old_v)

			break
		}
		#endif
		
		#if defined HOOK_P_MODELS
		new old_p[256]
		format(old_p, sizeof(old_p), "models/p_%s", models_name[i])

		new new_p[256]
		format(new_p, sizeof(new_p), "models/%s/p_%s", menu_item_names[weapon_select[id]][2], models_name[i])

		if(equali(p_model, old_p) || equali(p_model, new_p)) {
			if(weapon_select[id] >= 1) set_pev(id, pev_weaponmodel2, new_p)		
			else set_pev(id, pev_weaponmodel2, old_p)

			break
		}
		#endif
	}
	
	return PLUGIN_CONTINUE
}

public clcmd_menu(id) {
	new menu_line[64], menu_newline[64], i_data[64], String[121]
	formatex(String, charsmax(String), "\y[\wĐØŇ VÏŢØ\y - \dOnlyDust2 Skinrendszer\y]^n\rÖléseid: \y%d", Oles[id]);
	
	new menu = menu_create(String, "clcmd_menu_handler")
	
	for(new  i = 0; i < sizeof(menu_item_names); i++) {
		new convert_num = str_to_num(menu_item_names[i][1])
		num_to_str(i, i_data, sizeof(i_data))
		
		if(Oles[id] < convert_num)
	formatex(String, charsmax(String), "\w%s \y(\d%d \wÖlés\y)", menu_item_names[i][0], convert_num);
	menu_additem(menu, String, "1",0);
		}
	else
	{
	formatex(String, charsmax(String), "\w%s \y(\d%d \wKiválasztva\y)", menu_item_names[i][0]);
	menu_additem(menu, String, "2",0);
	}
	
	menu_display(id, menu, 0)
	
	return PLUGIN_HANDLED
}

public clcmd_menu_handler(id, menu, item) {
	if(item == MENU_EXIT) {
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new data[64], szName[64]
	new access, callback
	menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
	
	new key = str_to_num(data)
	new convert_num = str_to_num(menu_item_names[key][1])
	
	if(Oles[id] < convert_num) {
	ColorChat(id, GREEN, "^3[^4ĐØŇ VÏŢØ^3]^1 Ezt a csomagot ^3(^4%s^3) nem használhatod, mert nincs ^3%d^1 ölésed!", menu_item_names[key][0], convert_num)
		return PLUGIN_HANDLED
	}
	
	else {
		weapon_select[id] = key
		ColorChat(id, GREEN, "^3[^4ĐØŇ VÏŢØ^3]^1 Ezt a csomagot választottad: ^4%s!", menu_item_names[key][0], convert_num)
		Hook_P_V_Model(id)
	}
	
	return PLUGIN_CONTINUE
}
new const REGMENU[][][] = { { "\w[Státusz]: \dNem Regisztrált", "\w[Státusz]: \dKijelentkezve" } };
public Menu_Regisztracio(id)
{
    new String[121], Nev[32];
    get_user_name(id, Nev, 31);
    formatex(String, charsmax(String), "%s \r- \dRegisztráciÃ³^n%s", Prefix, REGMENU[0][Regisztralt[id]]);
    new menu = menu_create(String, "Menu_Regisztracio_h");
   
    if(Regisztralt[id] == 0)
    {
        formatex(String, charsmax(String), "\wFelhasználÃ³nÃ©v: \r%s^n", regFh[id]);
        menu_additem(menu, String, "1",0);
        formatex(String, charsmax(String), "\wJelszÃ³: \r%s^n", regJelszo[id]);
        menu_additem(menu, String, "2",0);
    }
    else
    {
        formatex(String, charsmax(String), "\rNÃ©v: \d%s^n\wTe már regisztráltál a szerverre.", Nev, regFh[id]);
        menu_additem(menu, String, "",0);
    }
   
    if(Beirtfelhasznalot[id] == true && Beirtjelszot[id] == true)
    {
        formatex(String, charsmax(String), "\yRegisztráciÃ³");
        menu_additem(menu, String, "3",0);
    }
   
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}
public Menu_Regisztracio_h(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return;
    }
   
    new data[9], szName[64];
    new access, callback;
    menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
    new key = str_to_num(data);
   
    switch(key)
    {
        case 1:
        {
            client_cmd(id, "messagemode Reg_Felhasznalonev");
        }
        case 2:
        {
            client_cmd(id, "messagemode Reg_Jelszo");
        }
        case 3:
        {
            Regisztralt[id] = 1;
            ColorChat(id, GREEN, "%s^1Sikeresen regisztráltál a szerverre.", C_Prefix);
            SQL_Update_Reg(id);
        }
    }
}
public Menu_Bejelentkezes(id)
{
    new String[121];
    formatex(String, charsmax(String), "%s \r- \dBejelentkezÃ©s^n%s", Prefix, REGMENU[0][Regisztralt[id]]);
    new menu = menu_create(String, "Menu_Bejelentkezes_h");
   
    formatex(String, charsmax(String), "FelhasználÃ³nÃ©v: \r%s^n", Felhasznalonev[id]);
    menu_additem(menu, String, "1",0);
    formatex(String, charsmax(String), "JelszÃ³: \r%s^n", Jelszo[id]);
    menu_additem(menu, String, "2",0);
   
    formatex(String, charsmax(String), "\yBejelentkezÃ©s^n");
    menu_additem(menu, String, "3",0);
   
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}
public Menu_Bejelentkezes_h(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return;
    }
   
    new data[9], szName[64], Nev[32];
    get_user_name(id, Nev, 31);
    new access, callback;
    menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
    new key = str_to_num(data);
   
    switch(key)
    {
        case 1:
        {
            client_cmd(id, "messagemode Log_Felhasznalonev");
        }
        case 2:
        {
            client_cmd(id, "messagemode Log_Jelszo");
        }
        case 3:
        {
            if(equali(Jelszo[id], regJelszo[id]) && (equali(Felhasznalonev[id], regFh[id])))
            {
                Belepve[id] = true;
                ColorChat(id, GREEN, "%s ^1Ãœdv Ãºjra itt ^4%s ^1!", C_Prefix, Nev);
            }
            else
            {
                ColorChat(id, GREEN, "%s ^1Hibás FelhasználÃ³nÃ©v vagy JelszÃ³.", C_Prefix);
            }
        }
    }
}
public Menu_Fo(id)
{
    new String[121];
    formatex(String, charsmax(String), "%s \r- \dRegisztráciÃ³s rendszer^n%s", Prefix, REGMENU[0][Regisztralt[id]]);
    new menu = menu_create(String, "Menu_Fo_h");
   
    formatex(String, charsmax(String), "RegisztáciÃ³^n");
    menu_additem(menu, String, "2",0);
    formatex(String, charsmax(String), "BejelentkezÃ©s^n^n\d-------------------------------^n%s^n-------------------------------", Website);
    menu_additem(menu, String, "1",0);
   
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}
public Menu_Fo_h(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return;
    }
   
    new data[9], szName[64];
    new access, callback;
    menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
    new key = str_to_num(data);
   
    switch(key)
    {
        case 1: Menu_Bejelentkezes(id);
            case 2: Menu_Regisztracio(id);
        }
}
public regisztralas_felh(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5)
    {
        regFh[id] = adat;
        Beirtfelhasznalot[id] = true;
        Menu_Regisztracio(id);
    }
    else
    {
        regFh[id] = adat;
        Beirtfelhasznalot[id] = true;
        Menu_Regisztracio(id);
    }
    return PLUGIN_CONTINUE;
}
public regisztralas_jelszo(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5) {
        regJelszo[id] = adat;
        Beirtjelszot[id] = true;
        Menu_Regisztracio(id);
    }
    else {
        regJelszo[id] = adat;
        Beirtjelszot[id] = true;
        Menu_Regisztracio(id);
    }
    return PLUGIN_CONTINUE;
}
public bejelentkezes_jelszo(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5) {
        Jelszo[id] = adat;
        Beirtjelszot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    else {
        Jelszo[id] = adat;
        Beirtjelszot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    return PLUGIN_CONTINUE;
}
public bejelentkezes_felh(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5)
    {
        Felhasznalonev[id] = adat;
        Beirtfelhasznalot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    else
    {
        Felhasznalonev[id] = adat;
        Beirtfelhasznalot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    return PLUGIN_CONTINUE;
}
public client_disconnect(id)
{
    if(!is_user_bot(id))
    {
        Update(id);
    }
    Belepve[id] = false;
    Beirtjelszot[id] = false;
    Beirtjelszot1[id] = false;
    Beirtfelhasznalot[id] = false;
    Beirtfelhasznalot1[id] = false;
   
    regFh[id][0] = EOS;
    regJelszo[id][0] = EOS;
    Felhasznalonev[id][0] = EOS;
    Jelszo[id][0] = EOS;
   
    Dollar[id] = 0;
    Oles[id] = 0;
    Regisztralt[id] = 0;
   
    copy(name[id], charsmax(name[]), "");
}
public client_putinserver(id)
{
    if(!is_user_bot(id))
    {
        get_user_name(id, name[id], charsmax(name));
        Load(id);
    }
    Belepve[id] = false;
    Felhasznalonev[id] = "";
    Jelszo[id] = "";
}
public plugin_cfg()
{
    g_SqlTuple = SQL_MakeDbTuple(SQLINFO[0], SQLINFO[1], SQLINFO[2], SQLINFO[3]);
   
    static Query[10048];
    new Len;
   
    Len += formatex(Query[Len], charsmax(Query), "CREATE TABLE IF NOT EXISTS `rtd_new`");
    Len += formatex(Query[Len], charsmax(Query)-Len, "(`Nev` varchar(32) NOT NULL, ");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Felhasznalonev` varchar(32) NOT NULL,");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Jelszo` varchar(32) NOT NULL,");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Regisztralt` int(11) NOT NULL,");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Oles` int(11) NOT NULL,");
   
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Do` int(11) NOT NULL, `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY)");
   
    SQL_ThreadQuery(g_SqlTuple, "createTableThread", Query);
}
public Load(id) {
    static Query[10048];
    new Data[1], Name[32];
    get_user_name(id, Name, 31);
    Data[0] = id;
   
    formatex(Query, charsmax(Query), "SELECT * FROM `rtd_new` WHERE Nev = ^"%s^";", name[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];
       
        if(SQL_NumRows(Query) > 0) {
            Dollar[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "do"));
           
           
           Oles[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Oles"));
            }
        else
        {
            Save(id);
        }
    }
}
public Save(id)
{
    static Query[256];
   
    formatex(Query, charsmax(Query), "INSERT INTO `rtd_new` (`Nev`) VALUES (^"%s^");", name[id]);
    SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query);
}
public SQL_Update_Reg(id)
{
    static Query[10048];
    new Len;
   
    Len += formatex(Query[Len], charsmax(Query), "UPDATE `rtd_new` SET Felhasznalonev = ^"%s^", ", regFh[id]);
    Len += formatex(Query[Len], charsmax(Query)-Len, "Jelszo = ^"%s^", ", regJelszo[id]);
    Len += formatex(Query[Len], charsmax(Query)-Len, "Regisztralt = ^"%i^" WHERE Nev = ^"%s^";", Regisztralt[id], name[id]);
   
    SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query);
}
public Update(id)
{
    static Query[10048];
    new Len;
   
    Len += formatex(Query[Len], charsmax(Query), "UPDATE `rtd_new` SET do = ^"%i^", ",Dollar[id]);
   
    Len += formatex(Query[Len], charsmax(Query)-Len, "Oles = ^"%i^" WHERE Nev = ^"%s^";", Oles[id], name[id]);
   
    SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query);
}
public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
    if(FailState == TQUERY_CONNECT_FAILED)
        set_fail_state("[HIBA*] NEM TUDTAM CSATLAKOZNI AZ ADATBAZISHOZ!");
    else if(FailState == TQUERY_QUERY_FAILED)
        set_fail_state("Query Error");
    if(Errcode)
        log_amx("[HIBA*] HIBAT DOBTAM: %s",Error);
}
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 plugin_end() {
    SQL_FreeHandle(g_SqlTuple);
}