#include <amxmodx>
    #include <amxmisc>
    #include <fun>
    #include <engine>
    #include <fakemeta>
    #include <hamsandwich>
    #include <fakemeta_util>
    #include <colorchat>
    #include <fvault>
 
 
    #define PLUGIN "Weapon Skin System [WSS]"
    #define VERSION "1.0"
    #define AUTHOR "6almasok"
 
    #define IsValidPlayers(%1,%2) ((1 <= %1 <= 32) && (1 <= %2 <= 32))
 
    new oles[33],csomag[33], kredit[33],switchbutton[33],knife[33],getfrag[3][33]
    new ModelData[40][64], ModelNum, MaximumBtton
 
    new const File[] = "addons/amxmodx/configs/algerian_clan_d2_models.ini"
    new const szVaultName[] = "algerian_clan_d2_vault"
    new const prefix[] = "Algerian Clan ~ D2"
 
    /*Rust Kills | Silver Kills | Gold Kills | Veteran Kills | Meglepetés | Knife Kredit*/
    new const need_kills[] = { 500, 1000, 2000, 4000, 500, 5000 }
 
    /*Pack Names*/
    new const csomagmsg[][] = { "Nincs","Rozsdás Csomag","Ezüst Csomag","Arany Csomag","Veterán Csomag","Meglepetés Csomag","Speed Knife" }
 
    new const knifedisenable[2][] = { "Kikapcsolva", "Bekapcsolva" }
 
    new const menuszoveg[][][] = {
        {"Rozsdás Csomag \r[Megszerezve]", "\dRozsdás Csomag \r[%i/%i Ölés]"}, //0
        {"Ezüst Csomag \r[Megszerezve]", "\dEzüst Csomag \r[%i/%i Ölés]"}, //1
        {"Arany Csomag \r[Megszerezve]", "\dArany Csomag \r[%i/%i Ölés]"}, //2
        {"Veterán Csomag \r[Megszerezve]", "\dVeterán Csomag \r[%i/%i Ölés]"}, //3
        {"Meglepetés Csomag \r[Megszerezve]", "\dMeglepetés Csomag\r[%i/%i Ölés]"}, //4
        {"Egyedi Knife \r[Megszerezve]^n", "\dEgyedi Knife \r[%i/%i Ölés]^n"}, //5
        {"\ySkin Csomagok \r[Kikapcsolva]", "\ySkin Csomagok \r[Bekapcsolva]"} //6
    }
    new const chatszoveg[10][] =
    {
        "^4[%s]^1 Fejlövés!^3 %s ^1megöléséért kaptál ^3+%i^1 ölést!",
        "^4[%s]^3 %s ^1megöléséért kaptál ^3+%i^1 ölést!",
        "^4[%s]^3 %s ^1kapott ^3+1 ^1ölést ember lesebzésért!",
        "^4[%s]^1 Találtál^3 +%i^1 kreditet a csomagból!",
        "^4[%s]^1 Kiválasztottad a(z)^3 %s^1-ot!",
        "^4[%s]^1 Sajnos nincs elég ölésed!",
        "^4[%s]^1 Kikapcsoltad a Skin Csomagokat!",
        "^4[%s]^1 Bekapcsoltad a Skin Csomagokat!",
        "^4[%s]^1 Skin rendszer előhívásához nyomd meg a ^4T ^1betűt!",
        "^4[%s]^1 Sajnos nincs elég kredited!"
    }
    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
 
        /* Client Command */
        register_clcmd("say /menu" , "fomenu")
        register_impulse(201, "fomenu")
        register_clcmd("say /addolas" , "addolas")
 
        /* Events */
        register_event("CurWeapon", "changeweapon", "be", "1=1")
        register_event("Damage", "sebzes_event", "be", "2!0", "3=0", "4!0")
        register_event("DeathMsg","Halal","a")
 
        /* Cvars */
        register_cvar("wss_hudenable", "1");
        register_cvar("wss_advertmp", "40.0");
        register_cvar("kill_recived", "1");
        register_cvar("hs_recived", "2");
        register_cvar("found_kredit", "1");
 
        /* Other */
        register_forward(FM_Touch,"ForwardTouch" );
        RegisterHam(Ham_Spawn, "player", "spawn_event", 1)
        set_task(1.0, "infohud", 0, _, _, "b")
        set_task(get_cvar_float("wss_advertmp"), "advertist", 0, "", 0, "b", 0)
 
        LoadModel();
    }
    public addolas(id)
    {
        if(access(id,ADMIN_IMMUNITY))
            oles[id] += 500;
    }
    public advertist(){
        ColorChat(0, GREEN, chatszoveg[8],prefix);
        return PLUGIN_HANDLED;
    }
    public plugin_precache() {
 
        new Len, btton[196], Data[64], Letoltes[40][64];
        MaximumBtton = file_size(File, 1);
 
        for(new Num = 0; Num < MaximumBtton; Num++){
            read_file(File, Num, btton, 196, Len);
            parse(btton, Data, 63);
            remove_quotes(btton);
            if(btton[0] == ';')
            {
                continue;
            }
            remove_quotes(Data);
            format(Letoltes[Num], 63, "%s", Data);
            precache_model(Letoltes[Num]);
        }
        precache_model("models/algerian_clan_d2/pack/kredit.mdl");
    }
    public LoadModel()
    {
        new Len, btton[196], Data[64];
        MaximumBtton = file_size(File, 1);
        for(new Num; Num < MaximumBtton; Num++){
            ModelNum++;
            read_file(File, Num, btton, 196, Len);
            parse(btton, Data, 63);
            remove_quotes(btton);
            if(btton[0] == ';')
            {
                continue;
            }
            remove_quotes(Data);
            format(ModelData[ModelNum], 63, "%s", Data);
        }
    }
    public changeweapon(id)
    {
        if(!is_user_alive(id) || !is_user_connected(id) || id < 1 || id > 32 || switchbutton[id] == 1)
        return
 
        new fegyver = get_user_weapon(id)
 
        switch(csomag[id])
        {
            case 1:
            {
                if(fegyver == CSW_AK47) set_pev(id, pev_viewmodel2, ModelData[1]) //Rozsdas ak
                if(fegyver == CSW_AWP) set_pev(id, pev_viewmodel2, ModelData[2]) //Rozsdas awp
                if(fegyver == CSW_DEAGLE) set_pev(id, pev_viewmodel2, ModelData[3]) //Rozsdas desi
                if(fegyver == CSW_M4A1) set_pev(id, pev_viewmodel2, ModelData[4]) //Rozsdas m4
            }
            case 2:
            {
                if(fegyver == CSW_AK47) set_pev(id, pev_viewmodel2, ModelData[5]) //ezust ak
                if(fegyver == CSW_AWP) set_pev(id, pev_viewmodel2, ModelData[6]) //ezust awp
                if(fegyver == CSW_DEAGLE) set_pev(id, pev_viewmodel2, ModelData[7]) //ezust desi
                if(fegyver == CSW_M4A1) set_pev(id, pev_viewmodel2, ModelData[8]) //ezust m4
            }
            case 3:
            {
                if(fegyver == CSW_AK47) set_pev(id, pev_viewmodel2, ModelData[9]) //arany ak
                if(fegyver == CSW_AWP) set_pev(id, pev_viewmodel2, ModelData[10]) //arany awp
                if(fegyver == CSW_DEAGLE) set_pev(id, pev_viewmodel2, ModelData[11]) //arany desi
                if(fegyver == CSW_M4A1)  set_pev(id, pev_viewmodel2, ModelData[12]) //arany m4
            }
            case 4:
            {
                if(fegyver == CSW_AK47) set_pev(id, pev_viewmodel2, ModelData[13]) //veteran ak
                if(fegyver == CSW_AWP) set_pev(id, pev_viewmodel2, ModelData[14]) //veteran awp
                if(fegyver == CSW_DEAGLE) set_pev(id, pev_viewmodel2, ModelData[15]) //veteran desi
                if(fegyver == CSW_M4A1) set_pev(id, pev_viewmodel2, ModelData[16]) //veteran m4
            }
            case 5:
            {
                if(fegyver == CSW_AK47) set_pev(id, pev_viewmodel2, ModelData[17]) //meglepetes ak
                if(fegyver == CSW_AWP) set_pev(id, pev_viewmodel2, ModelData[18]) //meglepetes awp
                if(fegyver == CSW_DEAGLE) set_pev(id, pev_viewmodel2, ModelData[19]) //meglepetes desi
                if(fegyver == CSW_M4A1) set_pev(id, pev_viewmodel2, ModelData[20]) //meglepetes m4
            }
        }
        if(knife[id] == 1 && fegyver == CSW_KNIFE){
 
            set_user_maxspeed(id, Float:320.0)
            set_pev(id, pev_viewmodel2, ModelData[21]) //knife
        }
 
    }
    public spawn_event(id){
        getfrag[0][id] = 0;
        getfrag[1][id] = 0;
        getfrag[2][id] = 0;
    }
    public sebzes_event(id)
    {
        new tamado = get_user_attacker(id);
        if(id == tamado  || !IsValidPlayers(id, tamado )) return;
        getfrag[1][tamado] += read_data(2);
 
        if(!getfrag[2][id] && getfrag[1][tamado] >= 50)
        {
            getfrag[0][tamado] = id;
            getfrag[2][id] = tamado;
        }
    }
    public Halal() {
 
        new attacker = read_data(1)
        new victim = read_data(2)
 
        new nev[32]
        get_user_name(victim, nev, charsmax(nev))
 
        if(attacker == victim || attacker == 0)
            return PLUGIN_HANDLED
 
        if(read_data( 3 )){
            oles[attacker] += get_cvar_num("hs_recived");
            ColorChat(attacker, GREEN, chatszoveg[0] ,prefix ,nev, get_cvar_num("hs_recived"))
        }
        else{
            oles[attacker] += get_cvar_num("kill_recived");
            ColorChat(attacker, GREEN, chatszoveg[1],prefix, nev, get_cvar_num("kill_recived"))
        }
        if(getfrag[2][victim] && getfrag[2][victim] != attacker){
            new fragetkap = getfrag[2][victim];
            new fragetkapneve[32];
            getfrag[0][fragetkap] = 0;
            getfrag[1][fragetkap] = 0;
            getfrag[2][victim] = 0;
            get_user_name(fragetkap, fragetkapneve, charsmax(fragetkapneve));
            oles[fragetkap]++
            ColorChat(0, GREEN, chatszoveg[2],prefix ,fragetkapneve);
        }
        switch(random_num(1,3)){
            case 1: dropdobas()
        }
        return PLUGIN_HANDLED;
    }
    public dropdobas()
    {
        new victim = read_data( 2 );
 
        static Float:origin[ 3 ];
        pev( victim, pev_origin, origin );
 
        new ent = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
        origin[ 2 ] -= 36;
        engfunc( EngFunc_SetOrigin, ent, origin );
 
        if( !pev_valid( ent ) )
        {
            return PLUGIN_HANDLED;
        }
 
        set_pev( ent, pev_classname, "kredit" );
        engfunc( EngFunc_SetModel, ent, "models/algerian_clan_d2/pack/kredit.mdl" );
        dllfunc( DLLFunc_Spawn, ent );
        set_pev( ent, pev_solid, SOLID_BBOX );
        set_pev( ent, pev_movetype, MOVETYPE_NONE );
        engfunc( EngFunc_SetSize, ent, Float:{ -23.160000, -13.660000, -0.050000 }, Float:{ 11.470000, 12.780000, 6.720000 } );
        engfunc( EngFunc_DropToFloor, ent );
 
        return PLUGIN_HANDLED;
    }
    public ForwardTouch( ent, id )
    {
        if(pev_valid(ent))
        {
        new classname[ 32 ];
        pev( ent, pev_classname, classname, charsmax( classname ) );
 
        if( !equal( classname, "kredit") )
        {
            return FMRES_IGNORED;
        }
 
        kredit[id] += get_cvar_num("found_kredit");
        ColorChat(id, GREEN, chatszoveg[3],prefix, get_cvar_num("found_kredit"));
 
        engfunc( EngFunc_RemoveEntity, ent );
        }
        return FMRES_IGNORED
    }
    public logevent_round_start()
    {
        new hkt = FM_NULLENT;
        while ( ( hkt = fm_find_ent_by_class( hkt, "kredit") ) )
        {
            engfunc( EngFunc_RemoveEntity, hkt );
        }
    }
    public fomenu(id)
    {
        new String[96]
        format(String, charsmax(String), "\r[\wAlgerian Clan ~ D2\r] \wFőmenü^n\yÖsszes Öléseid: \d%i \w|\y Összes Krediteid: \d%i", oles[id],kredit[id])
        new menu = menu_create(String, "fomenu_MyMenu");
 
        menu_additem(menu, "Fegyver Skin Csomagok", "0");
        menu_additem(menu, "Játékos Infók", "1");
        menu_additem(menu, "Pack Információk", "2");
        menu_additem(menu, "\rAdmin vásárlás", "3");
        menu_additem(menu, "\rV.I.P vásárlás", "4");
        menu_additem(menu, "\dSzerver Szabályzat", "5");
 
        menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
        menu_setprop(menu, MPROP_EXITNAME, "\rKilépés");
 
        menu_display(id, menu, 0);
 
        return PLUGIN_HANDLED;
    }
    public fomenu_MyMenu(id, menu, item)
    {
        if(item == MENU_EXIT)
        {
            menu_destroy(menu);
            return PLUGIN_HANDLED;
        }
 
        new command[6], name[64], access, callback;
        menu_item_getinfo(menu, item, access, command, sizeof command - 1, name, sizeof name - 1, callback);
 
        switch(item)
        {
            case 0: fegymenu(id)
            case 1: playerinfo(id)
            case 2: show_motd(id, "addons/amxmodx/configs/wssinfo.txt", "[Algerian Clan ~ D2] Információ")
            case 3: show_motd(id, "addons/amxmodx/configs/adminvasarlas.txt", "[Algerian Clan ~ D2] Információ")
            case 4: show_motd(id, "addons/amxmodx/configs/vipvarsarlas.txt", "[Algerian Clan ~ D2] Információ")
            case 5: show_motd(id, "addons/amxmodx/configs/szabaly.txt", "[Algerian Clan ~ D2] Információ")
        }
 
        menu_destroy(menu);
 
        return PLUGIN_HANDLED;
    }
    public playerinfo(id)
    {
        new some[256], menu
        static players[32],szTemp[10],pnum
        get_players(players,pnum,"ch");
 
        formatex(some,255,"\r[\wAlgerian Clan ~ D2\r]  \wJátékos \d|\w Ölés \d|\w Kredit");
        menu = menu_create(some,"pinfo_Handler");
 
        for (new i; i < pnum; i++)
        {
            formatex(some,256,"%s \r(\yÖsszes Ölése: \w%i \d| \yÖsszes Kreditje: \w%i\r)",get_player_name(players[i]), oles[players[i]],kredit[players[i]]);
            num_to_str(players[i],szTemp,charsmax(szTemp));
            menu_additem(menu, some, szTemp);
        }
 
        menu_setprop(menu, MPROP_EXIT, MEXIT_ALL );
        menu_setprop(menu, MPROP_EXITNAME, "Kilépés");
        menu_display(id, menu);
        return PLUGIN_HANDLED;
    }
    public pinfo_Handler(id,menu, item)
    {
        if(item == MENU_EXIT)
        {
            menu_destroy(menu);
            return;
        }
 
        playerinfo(id)
    }
    public fegymenu(id)
    {
        new String[96]
        format(String, charsmax(String), "\r[Algerian Clan ~ D2] \wSkin csomagok^n\yKiválasztott Csomagod: \d[%s]", csomagmsg[csomag[id]])
        new menu = menu_create(String, "fegymenu_handler" )
 
        format(String, charsmax(String), oles[id] >= need_kills[0] ? (menuszoveg[0][0]):(menuszoveg[0][1]), oles[id], need_kills[0]);
        menu_additem(menu, String, "0" );
        formatex(String, charsmax(String), oles[id] >= need_kills[1] ? (menuszoveg[1][0]):(menuszoveg[1][1]), oles[id], need_kills[1]);
        menu_additem(menu, String, "1");
        formatex(String, charsmax(String), oles[id] >= need_kills[2] ? (menuszoveg[2][0]):(menuszoveg[2][1]), oles[id], need_kills[2]);
        menu_additem(menu, String, "2");
        format(String, charsmax(String), oles[id] >= need_kills[3] ? (menuszoveg[3][0]):(menuszoveg[3][1]), oles[id], need_kills[3]);
        menu_additem(menu, String, "3");
        formatex(String, charsmax(String), kredit[id] >= need_kills[4] ? (menuszoveg[4][0]):(menuszoveg[4][1]), kredit[id], need_kills[4]);
        menu_additem(menu, String, "4");
        formatex(String, charsmax(String), kredit[id] >= need_kills[5] ? (menuszoveg[5][0]):(menuszoveg[5][1]), kredit[id], need_kills[5]);
        menu_additem(menu, String, "5");
        menu_additem(menu, switchbutton[id] == 1 ? (menuszoveg[6][0]):(menuszoveg[6][1]), "6");
 
        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 fegymenu_handler(id, menu, item)
    {
        if(item == MENU_EXIT)
        {
            menu_destroy(menu)
            return PLUGIN_HANDLED;
        }
 
        new command[6], name[64], access, callback;
        menu_item_getinfo(menu, item, access, command, sizeof command - 1, name, sizeof name - 1, callback);
 
        switch(item)
        {
            case 0: {
                if(oles[id] >= need_kills[0]) {
                csomag[id] = 1
                ColorChat(id, GREEN, chatszoveg[4],prefix, csomagmsg[csomag[id]]);
                }
                else  {
                ColorChat(id, GREEN, chatszoveg[5],prefix);
                }
            }
            case 1: {
                if(oles[id] >= need_kills[1]) {
                csomag[id] = 2
                ColorChat(id, GREEN, chatszoveg[4],prefix, csomagmsg[csomag[id]]);
                }
                else  {
                ColorChat(id, GREEN, chatszoveg[5],prefix);
                }
            }
            case 2: {
                if(oles[id] >= need_kills[2]) {
                csomag[id] = 3
                ColorChat(id, GREEN, chatszoveg[4],prefix, csomagmsg[csomag[id]]);
                }
                else  {
                ColorChat(id, GREEN, chatszoveg[5],prefix);
                }
            }
            case 3: {
                if(oles[id] >= need_kills[3]) {
                csomag[id] = 4
                ColorChat(id, GREEN, chatszoveg[4],prefix, csomagmsg[csomag[id]]);
                }
                else  {
                ColorChat(id, GREEN, chatszoveg[5],prefix);
                }
            }
            case 4: {
                if(oles[id] >= need_kills[4]) {
                csomag[id] = 5
                ColorChat(id, GREEN, chatszoveg[4],prefix, csomagmsg[csomag[id]]);
                }
                else  {
                ColorChat(id, GREEN, chatszoveg[5],prefix);
                }
            }
            case 5: {
                if(kredit[id] >= need_kills[5]) {
                knife[id] = 1
                ColorChat(id, GREEN, chatszoveg[4],prefix, csomagmsg[5]);
                }
                else  {
                ColorChat(id, GREEN, chatszoveg[9],prefix);
                }
            }
            case 6: {
                if(switchbutton[id] == 0){
                switchbutton[id] = 1
                csomag[id] = 0
                knife[id] = 0
                ColorChat(id, GREEN, chatszoveg[6],prefix);
                }
                else {
                switchbutton[id] = 0
                ColorChat(id, GREEN, chatszoveg[7],prefix);
                }
            }
            case 7: {
                ColorChat(id, GREEN, chatszoveg[5],prefix);
            }
            
        }
        fegymenu(id)
        return PLUGIN_HANDLED;
    }
 
    public infohud() {
 
        if(!get_cvar_num("wss_hudenable")) return PLUGIN_HANDLED
 
        static id
        for(id = 1; id <= get_maxplayers(); id++)
        {
            if(is_user_alive(id)){
                set_hudmessage(0, 127, 255, 0.01, 0.20, 0, 6.0, 1.0)
                show_hudmessage(id, "[Összes Ölésed: %i]^n[Összes Kredited: %i]^n[Kiválasztott Csomagod: %s]^n[Egyedi Kés: %s]", oles[id],kredit[id],csomagmsg[csomag[id]], knifedisenable[knife[id]])
            }
            else{
                new target = entity_get_int(id, EV_INT_iuser2);
 
                if(!target)
                return PLUGIN_CONTINUE;
 
                set_hudmessage(255, 255, 255, 0.01, 0.20, 0, 6.0, 1.0)
                show_hudmessage(id, "[Összes Ölésed: %i]^n[Összes Kredited: %i]^n[Kiválasztott Csomagod: %s]^n[Egyedi Kés: %s]", oles[target],kredit[target],csomagmsg[csomag[target]], knifedisenable[knife[target]])
            }
        }
        return PLUGIN_CONTINUE;
    }
    stock get_player_name(id){
        static szName[32];
        get_user_name(id,szName,31);
        return szName;
    }
    public client_disconnect(id){
        if(is_user_bot(id)) return;
 
        save(id);
    }
    public client_putinserver( id ) {
        if(is_user_bot(id)) return;
 
        oles[id] = 0;
        kredit[id] = 0;
        csomag[id] = 0;
        switchbutton[id] = 0;
        load(id);
    }
    load(id) {
        new szAuthid[32], szData[32];
        get_user_name( id, szAuthid, charsmax(szAuthid));
        new s1[16],s2[16],s3[16],s4[16]
        fvault_get_data( szVaultName, szAuthid, szData, 31 );
        parse( szData, s1, 15, s2, 15 , s3 , 15, s4 ,15);
        oles[id] = str_to_num(s1);
        kredit[id] = str_to_num(s2);
        csomag[id] = str_to_num(s3);
        switchbutton[id] = str_to_num(s4);
    }
    save(id) {
        new szAuthid[ 32 ], szData[ 32 ];
        get_user_name( id, szAuthid, charsmax(szAuthid));
 
        formatex( szData, 31, "%i %i %i %i", oles[id], kredit[id], csomag[id], switchbutton[id]);
        fvault_set_data( szVaultName, szAuthid, szData );
    }