/*[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>
    
    //Prefix
    new const gMenuPrefix[] = "\w[.:*[\rDarK*_*DemonS]*:.\w]";
    new const gChatPrefix[] = "[.:*[DarK*_*DemonS]*:.]";
     
    //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 const SQL_INFO[][] = {
    "mysql8.srkhost.eu",
    "",
    "",
    ""
    }
    new Handle:g_SqlTuple
     
    enum _:eDefault
    {
        EntName[32],
        Model[121]
    };
     
    //Skinezendő fegyverek
    new const weapons[][] = {
        "weapon_m4a1",
        "weapon_ak47",
        "weapon_awp",
        "weapon_scout",
        "weapon_famas",
        "weapon_galil",
        "weapon_aug",
        "weapon_m3",
        "weapon_xm1014",
        "weapon_knife",
        "weapon_deagle",
        "weapon_usp",
        "weapon_glock18"
    }
     
    //Egyéb skinezendő dolgok
    new const Others[][] = {
        "weapon_hegrenade",
        "weapon_smokegrenade",
        "weapon_c4",
        "weapon_flashbang"
    }
     
    //Alap skinek
    new const DefaultSkins[][eDefault] = {
        {"weapon_m4a1", "models/v_m4a1.mdl"},
        {"weapon_ak47", "models/v_ak47.mdl"},
        {"weapon_awp", "models/v_awp.mdl"},
        {"weapon_scout", "models/v_scout.mdl"},
        {"weapon_aug", "models/v_aug.mdl"},
        {"weapon_galil", "models/v_galil.mdl"},
        {"weapon_aug", "models/v_aug.mdl"},
        {"weapon_m3", "models/v_m3.mdl"},
        {"weapon_xm1014", "models/v_xm1014.mdl"},
        {"weapon_knife", "models/v_knife.mdl"},
        {"weapon_deagle", "models/v_deagle.mdl"},
        {"weapon_usp", "models/v_usp.mdl"},
        {"weapon_glock18", "models/v_glock18.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_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_KeyDrop = register_cvar("csgo_keydrop", "7.0")
        cvar_CaseDrop = register_cvar("csgo_casedrop", "25.0")
       
        //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][Model])
           
        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_disconnected(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), "%s \y[ \rFőmenü \y]", gMenuPrefix);
        new menu = menu_create(txt, "FoMenu_h")
       
        menu_additem(menu, "\r[\wRaktár\r]", "", 0)
        menu_additem(menu, "\r[\wLáda nyitás\r]", "", 0)
        menu_additem(menu, "\r[\wLomtár\r]", "", 0)
        menu_additem(menu, "\r[\wKüldés\r]", "", 0)
        menu_additem(menu, "\r[\wPiac\r]", "", 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), "%s \y[ \rRaktár \y]", gMenuPrefix);
        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
                client_print_color(id, print_team_default, "^4[%s]^1 Kiválasztottad a(z) ^3%s ^1skint!", gChatPrefix, tmp_Skins[Name])
               
                break;
            }
        }
       
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }
     
    public Lada_M(id)
    {
        new txt[128]
        formatex(txt, charsmax(txt), "%s \y[ \rLáda nyitás \y]", gMenuPrefix);
        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)
                client_print_color(id, print_team_default, "^4[%s]^1 Nincs elég ^4%s Kulcsod^1!", gChatPrefix, tmp_Skins[Name])
            else
                client_print_color(id, print_team_default, "^4[%s]^1 Nincs elég ^4%s Ládád^1!", gChatPrefix, tmp_Skins[Name])
        }
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }
     
    public Lomtar_M(id)
    {
        new txt[128], num[8]
        formatex(txt, charsmax(txt), "%s \y[ \rLomtár \y]", gMenuPrefix);
        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)
        client_print_color(id, print_team_default, "^4[%s]^1 Eldobtál egy ^3%s ^1skint!", gChatPrefix, 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), "%s\y[ \rKüldés \y]", gMenuPrefix);
        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), "%s\y[ \rVálassz játékost! \y]", gMenuPrefix);
        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]))
        {
            client_print_color(id, print_team_default, "^4[%s]^1 Sajnálom, lecsatlakozott akit kiválasztottál!", gChatPrefix)
            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
                   
                    client_print_color(target[id], print_team_default, "^4[%s]^1 Kaptál ^3%d^1 ^4arany^1at!", gChatPrefix, num)
                    client_print_color(id, print_team_default, "^4[%s]^1 Elküldtél ^3%d^1 ^4arany^1at!", gChatPrefix, num)
                    Update_SQL(id)
                    Update_SQL(target[id])
                }
                else
                    client_print_color(id, print_team_default, "^4[%s]^1 Nincs elég ^4arany^1ad!", gChatPrefix)
            }
            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)
                   
                    client_print_color(target[id], print_team_default, "^4[%s]^1 Kaptál ^3%d ^4%s^1-t!", gChatPrefix, num, tmp_Skins[Name])
                    client_print_color(id, print_team_default, "^4[%s]^1 Elküldtél ^3%d ^4%s^1-t!", gChatPrefix, num, tmp_Skins[Name])
                    Update_SQL(id)
                    Update_SQL(target[id])
                }
                else
                {
                    ArrayGetArray(Skins, i, tmp_Skins)
                    client_print_color(id, print_team_default, "^4[%s]^1 Nincs ennyi^4%s^1-ed!", gChatPrefix, tmp_Skins[Name])
                }
            }
        }
        else
            client_print_color(id, print_team_default, "^4[%s]^1 A megadott szöveg (%s) nem csak számokat tartalmazott! Érvénytelen!", gChatPrefix, txt)
     
        return PLUGIN_CONTINUE;
    }
     
    public Piac_M(id)
    {
        new txt[128]
        formatex(txt, charsmax(txt), "%s \y[ \rPiac \y]", gMenuPrefix);
        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), "%s \y[ \rPiac eladás \y]", gMenuPrefix);
        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)
                   
                    client_print_color(0, print_team_default, "^4[%s] ^3%s ^1kirakott egy ^4%s^1-t a piacra ^3%d ^4arany^1ért!", gChatPrefix, name[id], tmp_Skins[Name], Market_Things[id][Value])
                }
                else
                {
                    client_print_color(0, print_team_default, "^4[%s] ^1Nem választottál ki semmit!", gChatPrefix)
                    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)
        {
            client_print_color(0, print_team_default, "^4[%s] ^1Nem tudsz eladni ^3500 ^4arany^1 alatt!", gChatPrefix)
            Eladas_M(id)
        }
        else
        {
            Market_Things[id][Value] = num
            Eladas_M(id)
        }
    }
     
    public TargyValaszt(id)
    {
        new txt[128], num[8]
        formatex(txt, charsmax(txt), "%s \dVálaszd ki a tárgyat! \y]", 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), "%s\y[ \rPiac vásárlás \y]", gMenuPrefix);
        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)
            client_print_color(id, print_team_default, "^4[%s] ^1Vettél egy ^3%s^1-t ^4%s^1-től ^3%d ^4arany^1ért!", gChatPrefix, tmp_Skins[Name], name[userId], Market_Things[userId][Value])
            client_print_color(userID, print_team_default, "^4[%s] ^4%s^1 vett tőled ^3%s^1-t ^3%d ^4arany^1ért!", gChatPrefix, 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)
                client_print_color(attacker, print_team_default, "^4[%s] ^1Találtál egy ^3%s Kulcsot^1!", gChatPrefix, 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)
                client_print_color(attacker, print_team_default, "^4[%s] ^1Találtál egy ^3%s Ládát^1!", gChatPrefix, 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][EntName], wpn))
                    {
                        set_pev(id, pev_viewmodel2, DefaultSkins[j][Model])
                        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][EntName], wpn))
            {
                set_pev(id, pev_viewmodel2, DefaultSkins[i][Model])
                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)
        client_print_color(id, print_team_default, "^4[%s]^1 Egy ^3%s ^1skint nyitottál!", gChatPrefix, 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;
    }