#include <amxmodx>
#include <fvault>
#include <hamsandwich>
#include <zombieplague>

new const g_vault_kill[] = "zp_kill_vault";
new const g_vault_infect[] = "zp_infect_vault";
new const g_vault_time[] = "zp_time_vault";

#define is_user_valid(%1) (!is_user_bot(%1) && is_user_connected(%1))

new sorted_players[MAX_PLAYERS];

const LEVELS = 9;

new const g_iLevelMinKills[] = {0, 250, 500, 750, 1250, 1800, 2250, 3000, 5000};
new const g_szLevelName[][] = {"Bronz", "Gümüs", "Altin", "Platin", "Zümrüt", "Elmas", "Usta", "Üstat", "Sampiyon"};

new g_iKills[33];
new g_iLevel[33];
new g_iInfects[33];
new g_iTimes[33];

public plugin_init() {
    register_plugin("Zp Ranks", "1.0", "Confessa");

    RegisterHam(Ham_Killed, "player", "fw_Killed", 1)

    register_clcmd("say /ranks", "rank_motd");
    register_clcmd("say .ranks", "rank_motd");
}

public plugin_end() {
    for (new id = 1; id <= MaxClients; id++) {
        if (is_user_valid(id))
            SaveVault(id);
    }
}

public client_disconnect(id) {
    if (is_user_valid(id)) {
        g_iTimes[id] = g_iTimes[id] + (get_user_time(id) / 60);
        SaveVault(id);

        remove_task(id);
    }
}

public client_putinserver(id) {
    if (is_user_valid(id)) {
        LoadVault(id);

        g_iTimes[id] += (get_user_time(id) / 60); // Toplam geçen süreyi güncelle

        set_task(1.0, "RankHud", id, _, _, "b");
    }
}

public fw_Killed(victim, attacker, shouldgib) {
    if (is_user_connected(attacker) && attacker != victim) {
        g_iLevel[attacker] = GetLevel(++g_iKills[attacker]);
    }
}

public zp_user_infected_post(iVictim, iInfector) {
    g_iInfects[iInfector]++;
}

public RankHud(id) {
    if (zp_get_user_zombie(id))
        set_hudmessage(200, 25, 0, 0.01, 0.22, 0, 6.0, 1.0);
    else
        set_hudmessage(0, 100, 255, 0.01, 0.22, 0, 6.0, 1.0);

    show_hudmessage(id, "[Rütbe: %s]^n[Kill: %d]^n[Enfekte: %d]^n[Süre: %i]", g_szLevelName[g_iLevel[id]], g_iKills[id], g_iInfects[id], g_iTimes[id]);
}

public rank_motd(id) {
    new iLen, xMotd[2048];
    iLen = formatex(xMotd, charsmax(xMotd), "<head><meta charset=UTF-8>\
    <style>body{background: #000 url(^'http://i.imgur.com/FDiuoIk.jpg^') no-repeat fixed center;}table, th, td{border: 1px solid black;border-collapse: collapse;}</style></head>\
    <body><table width=100%% cellpadding=2 cellspacing=0 border=1>\
    <tr align=center bgcolor=#eeeeee><th width=5%%>Sira.<th width=40%%>Nick<th width=20%%>Kill<th width=20%%>Enfekte<th width=15%>Sure</tr>");

    new player_count = 0;

    for (new i = 1; i <= MaxClients && player_count < 15; i++) {
        if (is_user_connected(i) && !is_user_bot(i)) {
            sorted_players[player_count] = i;
            player_count++;
        }
    }

    SortPlayersByKills(sorted_players, player_count);

    for (new i = 0; i < player_count && i < 15; i++) {
        new iName[64];
        get_user_name(sorted_players[i], iName, 63);

        iLen += formatex(xMotd[iLen], charsmax(xMotd) - iLen, "<tr align=center style='color:#fff'>");
        iLen += formatex(xMotd[iLen], charsmax(xMotd) - iLen, "<td>%d", i + 1); // Sıra numarası
        iLen += formatex(xMotd[iLen], charsmax(xMotd) - iLen, "<td>%s", iName);
        iLen += formatex(xMotd[iLen], charsmax(xMotd) - iLen, "<td>%d", g_iKills[sorted_players[i]]);
        iLen += formatex(xMotd[iLen], charsmax(xMotd) - iLen, "<td>%d", g_iInfects[sorted_players[i]]);
        iLen += formatex(xMotd[iLen], charsmax(xMotd) - iLen, "<td>%i", g_iTimes[sorted_players[i]]);
    }

    show_motd(id, xMotd, "Top 15 Rank");
}

public SortPlayersByKills(players[], count) {
    new temp;
    new swapped;

    for (new i = 0; i < count - 1; i++) {
        swapped = 0;

        for (new j = 0; j < count - i - 1; j++) {
            if (g_iKills[players[j]] < g_iKills[players[j + 1]]) {
                temp = players[j];
                players[j] = players[j + 1];
                players[j + 1] = temp;

                swapped = 1;
            }
        }

        if (!swapped) break;
    }
}


GetLevel(iKills) {
    for (new i = LEVELS - 1; i >= 0; i--) {
        if (iKills >= g_iLevelMinKills[i]) {
            return i;
        }
    }

    return 0;
}

LoadVault(id) {
    new authid[35];
    get_user_authid(id, authid, sizeof(authid) - 1);

    if (equal(authid, "STEAM_ID_LAN") || equal(authid, "VALVE_ID_LAN"))
        return PLUGIN_HANDLED;

    new data_kills[16], data_infects[16], data_time[16];
    fvault_get_data(g_vault_kill, authid, data_kills, sizeof(data_kills) - 1);
    fvault_get_data(g_vault_infect, authid, data_infects, sizeof(data_infects) - 1);
    fvault_get_data(g_vault_time, authid, data_time, sizeof(data_time) - 1);

    g_iKills[id] = str_to_num(data_kills);
    g_iInfects[id] = str_to_num(data_infects);
    g_iLevel[id] = GetLevel(g_iKills[id]);
    g_iTimes[id] = str_to_num(data_time);

    return PLUGIN_CONTINUE;
}

SaveVault(id) {
    new authid[35];
    get_user_authid(id, authid, sizeof(authid) - 1);

    if (equal(authid, "STEAM_ID_LAN") || equal(authid, "VALVE_ID_LAN"))
        return PLUGIN_HANDLED;

    new data_kills[16], data_infects[16], data_time[16];
    num_to_str(g_iKills[id], data_kills, sizeof(data_kills) - 1);
    num_to_str(g_iInfects[id], data_infects, sizeof(data_infects) - 1);
    num_to_str(g_iTimes[id], data_time, sizeof(data_time) - 1);

    fvault_set_data(g_vault_kill, authid, data_kills);
    fvault_set_data(g_vault_infect, authid, data_infects);
    fvault_set_data(g_vault_time, authid, data_time);

    return PLUGIN_CONTINUE;
}
