#include <amxmodx>
#include <amxmisc>
#include <fvault>
#include <colorchat>
 
#define PLUGIN "plugin"
#define VERSION "1.0"
#define AUTHOR "author"
 
#define MAXPLAYERS 32
#define MAX_BUFFER_LENGTH 2047
 
new szVault[] = "Time";
 
new iTotalLevels = 6;
 
new szLevels[][64] = {
    "Kezdő, 0 óra játékidő.",
    "Haladó, 5 óra játékidő.",
    "Kocka, 1 nap (24 óra) játékidő.",
    "Hős, 1 hét (168 óra) játékidő.",
    "Legenda, 2 hét (336 óra) játékidő.",
    "Isten, 4 hét (672 óra) játékidő."
};
 
new szTimes[][64] = {
    "0",
    "5",
    "24",
    "168",
    "336",
    "672"
};
 
new Trie:SaveTime;
new Trie:Rank;
new Trie:Name;
 
new TotalRanks;
 
new iCurrentTime[MAXPLAYERS+1];
 
new sBuffer[MAX_BUFFER_LENGTH + 1]  
 
public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    register_clcmd("say /ido2", "CmdTimeTop"); 
    register_clcmd("say /ido", "CmdTime");
    register_clcmd("say /rangok", "CmdLevels");
}
 
public plugin_cfg()
{
    SaveTime = TrieCreate();
    Rank = TrieCreate()
    Name = TrieCreate()
    LoadData();
}
 
public plugin_end()
{
    TrieDestroy(SaveTime); 
    TrieDestroy(Rank);
}
 
LoadData()
{
    new iTotal = fvault_size(szVault);
 
    new szSteamId[32], szName[32], szTime[32], szData[64], szKey[32];
    for( new i = 0; i < iTotal; i++ )
    {
        fvault_get_keyname(szVault, i, szSteamId, sizeof(szSteamId) - 1); 
        fvault_get_data(szVault, szSteamId, szData, sizeof(szData) - 1);
        
        parse(szData, szName, sizeof(szName) - 1, szTime, sizeof(szTime) - 1)
        
        TrieSetCell(SaveTime, szSteamId, str_to_num(szTime)) 
        
        num_to_str(TotalRanks, szKey, sizeof(szKey) - 1)
        
        TrieSetString(Name, szKey, szName)
        TrieSetCell(Rank, szKey, str_to_num(szTime))
        TotalRanks++
    }
}
 
SaveData(id)
{
    new szSteamId[32], szName[32], szTime[32], szData[64];
    get_user_authid(id, szSteamId, 31) 
    get_user_name(id, szName, 31)
    
    TrieSetCell(SaveTime, szSteamId, iCurrentTime[id]) 
    
    num_to_str(iCurrentTime[id], szTime, sizeof(szTime) - 1) 
    formatex(szData, sizeof(szData) - 1, "^"%s^" %s", szName, szTime)
    
    fvault_set_data(szVault, szSteamId, szData) 
}
 
public client_authorized(id)
{
    new szSteamId[32];
    get_user_authid(id, szSteamId, sizeof(szSteamId) - 1) 
    
    TrieGetCell(SaveTime, szSteamId, iCurrentTime[id]); 
}
 
public client_disconnect(id)
{
    new iAddTime = get_user_time(id); 
    
    iCurrentTime[id] += iAddTime; 
    
    SaveData(id)
}
 
public CmdTimeTop(id)
{
    new iRanks[10], iRanking[10], szKey[5], iTemp, z
    
    for(new x; x < 10; x++)
    {
        for(new i=0; i <= TotalRanks; i++)
        {
            num_to_str(i, szKey, sizeof(szKey) - 1)
            TrieGetCell(Rank, szKey, iTemp)
            
            if(x == 0)
            {
                if(iRanks[x] < iTemp)
                {
                    iRanks[x] = iTemp
                    iRanking[x] = i
                    
                    if(z<x)
                        z=x
                }
            }
            else
            {
                if(iRanks[x] < iTemp && iRanks[x-1] > iTemp)
                {
                    iRanks[x] = iTemp
                    iRanking[x] = i
                    
                    if(z<x)
                        z=x
                }
            }
        }
    }
        
    new szName[32]
    new iLen
    
    iLen = format(sBuffer, MAX_BUFFER_LENGTH, "<body bgcolor=#000000><font color=#FFB000><pre>")
    iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "#%s             %s              %s^n", "Rank", "Nev", "Jatekido")
    
    for(new y; y <= z; y++)
    {
        num_to_str(iRanking[y], szKey, sizeof(szKey) - 1)
        TrieGetCell(Rank, szKey, iTemp)
        TrieGetString(Name, szKey, szName, sizeof(szName) - 1)
    
        iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "#%i              %s                              %i ^n", y + 1, szName, iTemp)
    }
    
    show_motd(id, sBuffer, "Top 10 Jatekido")
}
 
 
 
public CmdTime(id)
{
    new iSecTempTime, iLevel, iRank, iTime, szKey[5];
    
    iSecTempTime = (iCurrentTime[id] + get_user_time(id)) 
    
    for(new i; i < iTotalLevels; i++)
    {
        if((iSecTempTime/3600) >= str_to_num(szTimes[i])) 
        {
            iLevel++ 
        }
    }
    
    iRank=1
    
    for(new i; i < TotalRanks + 1; i++)
    {
        num_to_str(i, szKey, sizeof(szKey) - 1)
        TrieGetCell(Rank, szKey, iTime)
        
        if(iCurrentTime[id] < iTime)
        {
            iRank++
        }
    }
    
    ColorChat(id,RED,"^x04[WorldDustII]^x03 A te játékidőd ^x04%i ^x03 óra, Rank :^x04 %i/%i ^x03[%i Másodperc].", iSecTempTime/3600, iRank, TotalRanks, iSecTempTime);
    ColorChat(id,RED,"^x04[WorldDustII] ^x03%s", szLevels[iLevel])
}
 
public CmdLevels(id)
{
    ColorChat(id,RED,"^x04[WorldDustII] ^x03 Kérlek nézd meg a ^x04játék konzolt. ^x03Nyomd meg a nullát.");
    
    for(new i; i < iTotalLevels; i++) 
    {
        console_print(id, "%s", szLevels[i]) 
    }
}