AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Translation Request (https://forums.alliedmods.net/forumdisplay.php?f=25)
-   -   Translate Polish to English (https://forums.alliedmods.net/showthread.php?t=327802)

GaBy96 10-11-2020 01:22

Translate Polish to English
 
Code:

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <nvault>
#include <sqlx>
#include <fun>
#include <engine>
#include <unixtime>

#define PLUGIN  "Ultimate Stats"
#define VERSION "1.3"
#define AUTHOR  "O'Zone"

#pragma dynamic 32768

#define CSW_SHIELD          2

#define WEAPONS_END        CSW_P90 + 1
#define HIT_END            HIT_RIGHTLEG + 1
#define STATS_END          STATS_RANK + 1
#define KILLER_END          KILLER_DISTANCE + 1

#define MAX_MONEY          16000

#define TASK_LOAD          5449
#define TASK_TIME          6701
#define TASK_HUD            7834

#define get_bit(%2,%1)      (%1 & (1<<(%2&31)))
#define set_bit(%2,%1)      (%1 |= (1<<(%2&31)))
#define rem_bit(%2,%1)      (%1 &= ~(1 <<(%2&31)))

#define is_user_valid(%1)  (1 <= %1 <= MAX_PLAYERS)
#define is_weapon_valid(%1) (0 < %1 < WEAPONS_END)

#define get_skill(%1,%2)      (1.0 / (1.0 + floatpower(10.0, ((%1 - %2) / 400.0))))
#define set_skill(%1,%2,%3)  (%1 + 20.0 * (%2 - %3))

#define stat(%1)            (%1 - HIT_END - 2)

new const body[][] = { "cialo", "glowa", "klatka piersiowa", "brzuch", "lewe ramie", "prawe ramie", "lewa noga", "prawa noga" };

enum _:forwards { FORWARD_DAMAGE, FORWARD_DEATH, FORWARD_ASSIST, FORWARD_REVENGE, FORWARD_PLANTING,
        FORWARD_PLANTED, FORWARD_EXPLODE, FORWARD_DEFUSING, FORWARD_DEFUSED, FORWARD_THROW, FORWARD_LOADED };
enum _:statsMenus { MENU_STATS, MENU_RANKSTATS };
enum _:winer { THIRD, SECOND, FIRST };
enum _:save { NORMAL = -1, ROUND, FINAL, MAP_END };
enum _:types { STATS, ROUND_STATS, WEAPON_STATS, WEAPON_ROUND_STATS, ATTACKER_STATS, VICTIM_STATS };
enum _:formulas { FORMULA_KD, FORMULA_KILLS, FORMULA_KILLS_HS };
enum _:statsData { STATS_KILLS = HIT_END, STATS_DEATHS, STATS_HS, STATS_TK, STATS_SHOTS, STATS_HITS, STATS_DAMAGE, STATS_RANK };
enum _:killerData { KILLER_ID = STATS_END, KILLER_HEALTH, KILLER_ARMOR, KILLER_TEAM, KILLER_DISTANCE };
enum _:playerData{ BOMB_DEFUSIONS = STATS_END, BOMB_DEFUSED, BOMB_PLANTED, BOMB_EXPLODED, SPECT, HUD_INFO, PLAYER_ID,
        FIRST_VISIT, LAST_VISIT, TIME, STATS_MENU, CONNECTS, ASSISTS, REVENGE, REVENGES, ROUNDS, ROUNDS_CT, ROUNDS_T, WIN_CT, WIN_T,
        BRONZE, SILVER, GOLD, MEDALS, BEST_STATS, BEST_KILLS, BEST_DEATHS, BEST_HS, CURRENT_STATS, CURRENT_KILLS,
        CURRENT_DEATHS, CURRENT_HS, ADMIN, ALIVE, Float:SKILL, NAME[32], SAFE_NAME[64], STEAMID[32], IP[16] };

new const commands[][][] = {
        { "cmd_menu", "\yMenu \rStatystyk", "menustaty", "say /menustaty", "say_team /menustaty", "say /statsmenu", "say_team /statsmenu", "say /statymenu", "say_team /statymenu", "", "" },
        { "cmd_hp", "\wHP", "hp", "say /hp", "say_team /hp", "", "", "", "", "", "" },
        { "cmd_me", "\wMe", "me", "say /me", "say_team /me", "", "", "", "", "", "" },
        { "cmd_stats", "\wStats", "stats", "say /stats", "say_team /stats", "", "", "", "", "", "" },
        { "cmd_statsme", "\wStats \rMe", "statsme", "say /statsme", "say_team /statsme", "", "", "", "", "", "" },
        { "cmd_rank", "\wRank", "rank", "say /rank", "say_team /rank", "", "", "", "", "", "" },
        { "cmd_rankstats", "\wRank \rStats", "rankstats", "say /rankstats", "say_team /rankstats", "", "", "", "", "", "" },
        { "cmd_top15", "\wTop15", "top15", "say /top15", "say_team /top15", "", "", "", "", "", "" },
        { "cmd_topme", "\wTop \rMe", "topme", "say /topme", "say_team /topme", "", "", "", "", "", "" },
        { "cmd_time", "\wCzas \rGry", "czas", "say /czas", "say_team /czas", "say /time", "say_team /time", "", "", "", "" },
        { "cmd_time_admin", "\wCzas \rAdminow", "czasadmin", "say /czasadmin", "say_team /czasadmin", "say /timeadmin", "say_team /timeadmin", "say /adminczas", "say_team /adminczas", "", "" },
        { "cmd_time_top15", "\wCzas \rTop15", "czastop15", "say /ctop15", "say_team /ctop15", "say /czastop15", "say_team /czastop15", "say /ttop15", "say_team /ttop15", "say /topczas", "say_team /topczas" },
        { "cmd_skill", "\wPunkty \rELO", "skill", "say /skill", "say_team /skill", "say /elo", "say_team /elo", "", "", "", "" },
        { "cmd_skill_top15", "\wELO \rTop15", "elotop15", "say /etop15", "say_team /etop15", "say /elotop15", "say_team /elotop15", "say /skilltop15", "say_team /skilltop15", "say /topskill", "say_team /topskill" },
        { "cmd_topstats", "\wNajlepsze \rStaty", "najlepszestaty", "say /staty", "say_team /staty", "say /beststats", "say_team /beststats", "say /najlepszestaty", "say_team /najlepszestaty", "", "" },
        { "cmd_topstats_top15", "\wStaty \rTop15", "statytop15", "say /stop15", "say_team /stop15", "say /statstop15", "say_team /statstop15", "say /statytop15", "say_team /statytop15", "say /topstaty", "say_team /topstaty" },
        { "cmd_medals", "\wZdobyte \rMedale", "medale", "say /medal", "say_team /medal", "say /medale", "say_team /medale", "say /medals", "say_team /medals", "", "" },
        { "cmd_medals_top15", "\wMedale \rTop15", "medaletop15", "say /mtop15", "say_team /mtop15", "say /medalstop15", "say_team /medalstop15", "say /medaletop15", "say_team /medaletop15", "say /topmedale", "say_team /topmedale" },
        { "cmd_sounds", "\wUstawienia \rDziekow", "dzwieki", "say /dzwiek", "say_team /dzwiek", "say /dzwieki", "say_team /dzwieki", "say /sound", "say_team /sound", "", "" },
};

new playerStats[MAX_PLAYERS + 1][playerData], playerRStats[MAX_PLAYERS + 1][playerData], playerWStats[MAX_PLAYERS + 1][WEAPONS_END][STATS_END], playerWRStats[MAX_PLAYERS + 1][WEAPONS_END][STATS_END],
        playerAStats[MAX_PLAYERS + 1][MAX_PLAYERS + 1][KILLER_END], playerVStats[MAX_PLAYERS + 1][MAX_PLAYERS + 1][KILLER_END], weaponsAmmo[MAX_PLAYERS + 1][WEAPONS_END], statsForwards[forwards], statsNum,
        Handle:sql, Handle:connection, bool:sqlConnection, bool:oneAndOnly, bool:block, bool:mapChange, round, sounds, statsLoaded, weaponStatsLoaded, visit, soundMayTheForce, soundOneAndOnly, soundPrepare,
        soundHumiliation, soundLastLeft, ret, planter, defuser, hudSpectRank, hudEndRound;

new sqlHost[64], sqlUser[64], sqlPassword[64], sqlDatabase[64], rankSaveType, rankFormula, assistEnabled, revengeEnabled, assistMinDamage, assistMoney, revengeMoney, assistInfoEnabled, revengeInfoEnabled,
        leaderInfoEnabled, killerInfoEnabled, victimInfoEnabled, medalsEnabled, prefixEnabled, xvsxEnabled, soundsEnabled, hpEnabled, meEnabled, statsEnabled, statsMeEnabled, rankEnabled, rankStatsEnabled,
        top15Enabled, topMeEnabled, skillEnabled, timeEnabled, spectRankEnabled, victimHudEnabled, attackerHudEnabled, hsHudEnabled, disruptiveHudEnabled, bestScoreHudEnabled;

public plugin_init()
{
        register_plugin(PLUGIN, VERSION, AUTHOR);

        register_cvar("stats_version", VERSION, FCVAR_SERVER);

        bind_pcvar_string(create_cvar("ultimate_stats_host", "localhost", FCVAR_SPONLY | FCVAR_PROTECTED), sqlHost, charsmax(sqlHost));
        bind_pcvar_string(create_cvar("ultimate_stats_user", "user", FCVAR_SPONLY | FCVAR_PROTECTED), sqlUser, charsmax(sqlUser));
        bind_pcvar_string(create_cvar("ultimate_stats_pass", "password", FCVAR_SPONLY | FCVAR_PROTECTED), sqlPassword, charsmax(sqlPassword));
        bind_pcvar_string(create_cvar("ultimate_stats_db", "database", FCVAR_SPONLY | FCVAR_PROTECTED), sqlDatabase, charsmax(sqlDatabase));

        bind_pcvar_num(create_cvar("ultimate_stats_rank_save_type", "0"), rankSaveType); // 0 - nick | 1 - steamid | 2 - ip
        bind_pcvar_num(create_cvar("ultimate_stats_rank_formula", "0"), rankFormula); // 0 - kills- deaths - tk | 1 - kills | 2 - kills + hs
        bind_pcvar_num(create_cvar("ultimate_stats_assist_enabled", "1"), assistEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_assist_min_damage", "65"), assistMinDamage);
        bind_pcvar_num(create_cvar("ultimate_stats_assist_money", "300"), assistMoney);
        bind_pcvar_num(create_cvar("ultimate_stats_assist_info_enabled", "1"), assistInfoEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_revenge_enabled", "0"), revengeEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_revenge_money", "300"), revengeMoney);
        bind_pcvar_num(create_cvar("ultimate_stats_revenge_info_enabled", "1"), revengeInfoEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_leader_info_enabled", "1"), leaderInfoEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_killer_info_enabled", "1"), killerInfoEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_victim_info_enabled", "1"), victimInfoEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_medals_enabled", "1"), medalsEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_skill_enabled", "1"), skillEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_time_enabled", "1"), timeEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_prefix_enabled", "1"), prefixEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_xvsx_enabled", "1"), xvsxEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_sounds_enabled", "1"), soundsEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_hp_enabled", "1"), hpEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_me_enabled", "1"), meEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_stats_enabled", "1"), statsEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_statsme_enabled", "1"), statsMeEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_rank_enabled", "1"), rankEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_rankstats_enabled", "1"), rankStatsEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_top15_enabled", "1"), top15Enabled);
        bind_pcvar_num(create_cvar("ultimate_stats_topme_enabled", "1"), topMeEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_spectrank_enabled", "1"), spectRankEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_victim_hud_enabled", "1"), victimHudEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_attacker_hud_enabled", "1"), attackerHudEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_hs_hud_enabled", "1"), hsHudEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_disruptive_hud_enabled", "1"), disruptiveHudEnabled);
        bind_pcvar_num(create_cvar("ultimate_stats_bestscore_hud_enabled", "1"), bestScoreHudEnabled);

        for (new i; i < sizeof(commands); i++) {
                for (new j = 2; j < sizeof(commands[]); j++) {
                        if (commands[i][j][0]) register_clcmd(commands[i][j], commands[i][0]);
                }
        }

        register_clcmd("say", "weapons_top15_handle");
        register_clcmd("say_team", "weapons_top15_handle");

        statsForwards[FORWARD_DAMAGE] = CreateMultiForward("client_damage", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
        statsForwards[FORWARD_DEATH] =  CreateMultiForward("client_death", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
        statsForwards[FORWARD_ASSIST] = CreateMultiForward("client_assist", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL);
        statsForwards[FORWARD_REVENGE] = CreateMultiForward("client_revenge", ET_IGNORE, FP_CELL, FP_CELL);
        statsForwards[FORWARD_PLANTING] = CreateMultiForward("bomb_planting", ET_IGNORE, FP_CELL);
        statsForwards[FORWARD_PLANTED] = CreateMultiForward("bomb_planted", ET_IGNORE, FP_CELL);
        statsForwards[FORWARD_EXPLODE] = CreateMultiForward("bomb_explode", ET_IGNORE, FP_CELL, FP_CELL);
        statsForwards[FORWARD_DEFUSING] = CreateMultiForward("bomb_defusing", ET_IGNORE, FP_CELL);
        statsForwards[FORWARD_DEFUSED] = CreateMultiForward("bomb_defused", ET_IGNORE, FP_CELL);
        statsForwards[FORWARD_THROW] = CreateMultiForward("grenade_throw", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL);
        statsForwards[FORWARD_LOADED] = CreateMultiForward("stats_loaded", ET_IGNORE, FP_CELL);

        RegisterHam(Ham_Spawn, "player", "player_spawned", 1);

        register_logevent("round_end", 2, "1=Round_End");
        register_logevent("planted_bomb", 3, "2=Planted_The_Bomb");
        register_logevent("defused_bomb", 3, "2=Defused_The_Bomb");
        register_logevent("defusing_bomb", 3, "2=Begin_Bomb_Defuse_Without_Kit");
        register_logevent("defusing_bomb", 3, "2=Begin_Bomb_Defuse_With_Kit");
        register_logevent("explode_bomb", 6, "3=Target_Bombed");

        register_event("HLTV", "new_round", "a", "1=0", "2=0");
        register_event("TextMsg", "round_restart", "a", "2&#Game_C", "2&#Game_w");
        register_event("TextMsg", "spectator_mode", "bd", "2&ec_Mod")
        register_event("SendAudio", "win_t" , "a", "2&%!MRAD_terwin");
        register_event("SendAudio", "win_ct", "a", "2&%!MRAD_ctwin");
        register_event("23", "planted_bomb_no_round", "a", "1=17", "6=-105", "7=17");
        register_event("BarTime", "planting_bomb", "be", "1=3");
        register_event("CurWeapon", "cur_weapon", "b" ,"1=1");
        register_event("Damage", "damage", "b", "2!0");
        register_event("StatusValue", "show_rank", "bd", "1=2");

        register_forward(FM_SetModel, "set_model", true);

        register_message(SVC_INTERMISSION, "message_intermission");
        register_message(get_user_msgid("SayText"), "say_text");

        hudEndRound = CreateHudSyncObj();
        hudSpectRank = CreateHudSyncObj();

        sounds = nvault_open("stats_sound");
}

public plugin_natives()
{
        register_library("ultimate_stats");

        register_native("get_statsnum", "native_get_statsnum");
        register_native("get_stats", "native_get_stats");
        register_native("get_stats2", "native_get_stats2");
        register_native("get_user_stats", "native_get_user_stats");
        register_native("get_user_stats2", "native_get_user_stats2");
        register_native("get_user_rank", "native_get_user_rank");
        register_native("get_user_wstats", "native_get_user_wstats");
        register_native("get_user_rstats", "native_get_user_rstats");
        register_native("get_user_wrstats", "native_get_user_wrstats");
        register_native("get_user_vstats", "native_get_user_vstats");
        register_native("get_user_astats", "native_get_user_astats");
        register_native("reset_user_wstats", "native_reset_user_wstats");

        register_native("get_map_objectives", "native_get_map_objectives");
        register_native("xmod_get_maxweapons", "native_xmod_get_maxweapons");
        register_native("xmod_get_stats_size", "native_xmod_get_stats_size");
        register_native("xmod_is_melee_wpn", "native_xmod_is_melee_wpn");
        register_native("xmod_is_custom_wpn", "native_xmod_is_custom_wpn");
        register_native("xmod_get_wpnname", "native_xmod_get_wpnname");
        register_native("xmod_get_wpnlogname", "native_xmod_get_wpnlogname");
        register_native("custom_weapon_add", "native_not_supported");
        register_native("custom_weapon_dmg", "native_not_supported");
        register_native("custom_weapon_shot", "native_not_supported");
        register_native("register_statsfwd", "native_not_supported");
        register_native("ts_weaponspawn", "native_not_supported");

        register_native("get_user_total_time", "native_get_user_total_time");
        register_native("get_user_elo", "native_get_user_elo");
        register_native("add_user_elo", "native_add_user_elo");
}

public plugin_cfg()
{
        new configPath[64];

        get_localinfo("amxx_configsdir", configPath, charsmax(configPath));

        server_cmd("exec %s/ultimate_stats.cfg", configPath);
        server_exec();

        sql_init();
}

public plugin_precache()
{
        precache_sound("misc/maytheforce.wav");
        precache_sound("misc/oneandonly.wav");
        precache_sound("misc/prepare.wav");
        precache_sound("misc/humiliation.wav");
        precache_sound("misc/lastleft.wav");
}

public plugin_end()
{
        SQL_FreeHandle(sql);
        SQL_FreeHandle(connection);
}

public client_connect(id)
{
        clear_stats(id);

        if (is_user_bot(id) || is_user_hltv(id)) return;

        set_task(1.0, "load_stats", id + TASK_LOAD);
}

public client_putinserver(id)
        playerStats[id][CONNECTS]++;

public client_authorized(id)
        playerStats[id][ADMIN] = get_user_flags(id) & ADMIN_BAN ? 1 : 0;

public client_disconnected(id)
{
        remove_task(id + TASK_LOAD);
        remove_task(id + TASK_TIME);

        save_stats(id, mapChange ? MAP_END : FINAL);
}

public amxbans_admin_connect(id)
        client_authorized(id, "");

public player_spawned(id)
{
        if (!get_bit(id, visit)) set_task(3.0, "check_time", id + TASK_TIME);

        playerStats[id][ALIVE] = true;
}

public check_time(id)
{
        id -= TASK_TIME;

        if (!get_bit(id, visit)) return;

        if (!get_bit(id, statsLoaded)) {
                set_task(3.0, "check_time", id + TASK_TIME);

                return;
        }

        set_bit(id, visit);

        new time = get_systime(), visitYear, Year, visitMonth, Month, visitDay, Day, visitHour, visitMinutes, visitSeconds;

        UnixToTime(time, visitYear, visitMonth, visitDay, visitHour, visitMinutes, visitSeconds);

        client_print_color(id, id, "* Aktualnie jest godzina^x03 %02d:%02d:%02d (Data: %02d.%02d.%02d)^x01. *", visitHour, visitMinutes, visitSeconds, visitDay, visitMonth, visitYear);

        if (playerStats[id][FIRST_VISIT] == playerStats[id][LAST_VISIT]) client_print_color(id, id, "* To twoja^x04 pierwsza wizyta^x01 na serwerze. Zyczymy milej gry! *");
        else {
                UnixToTime(playerStats[id][LAST_VISIT], Year, Month, Day, visitHour, visitMinutes, visitSeconds);

                if (visitYear == Year && visitMonth == Month && visitDay == Day) client_print_color(id, id, "* Twoja ostatnia wizyta miala miejsce^x03 dzisiaj^x01 o^x03 %02d:%02d:%02d^x01. Zyczymy milej gry! *", visitHour, visitMinutes, visitSeconds);
                else if (visitYear == Year && visitMonth == Month && (visitDay - 1) == Day) client_print_color(id, id, "* Twoja ostatnia wizyta miala miejsce^x03 wczoraj^x01 o^x03 %02d:%02d:%02d^x01. Zyczymy milej gry! *", visitHour, visitMinutes, visitSeconds);
                else client_print_color(id, id, "* Twoja ostatnia wizyta:^x03 %02d:%02d:%02d (Data: %02d.%02d.%02d)^x01. Zyczymy milej gry! *", visitHour, visitMinutes, visitSeconds, Day, Month, Year);
        }
}

public round_end()
{
        for (new id = 1; id <= MAX_PLAYERS; id++) {
                if (!is_user_connected(id)) continue;

                if (get_user_team(id) == 1 || get_user_team(id) == 2) {
                        playerStats[id][ROUNDS]++;
                        playerStats[id][get_user_team(id) == 1 ? ROUNDS_T : ROUNDS_CT]++;
                }

                save_stats(id, ROUND);
        }

        set_task(0.5, "show_hud_info", TASK_HUD);
}

public first_round()
        block = false;

public round_restart()
        round = 0;

public new_round()
{
        remove_task(TASK_HUD);

        show_hud_info(true);

        clear_stats();

        planter = 0;
        defuser = 0;

        oneAndOnly = false;

        if (!round) {
                set_task(30.0, "first_round");

                block = true;
        }

        round++;

        if (!leaderInfoEnabled) return;

        new bestId, bestFrags, tempFrags, bestDeaths, tempDeaths;

        for (new id = 1; id <= MAX_PLAYERS; id++) {
                if (!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) continue;

                tempFrags = get_user_frags(id);
                tempDeaths = get_user_deaths(id);

                if (tempFrags > 0 && (tempFrags > bestFrags || (tempFrags == bestFrags && tempDeaths < bestDeaths))) {
                        bestFrags = tempFrags;
                        bestDeaths = tempDeaths;
                        bestId = id;
                }
        }

        if (is_user_connected(bestId)) client_print_color(0, bestId, "*^x03 %s^x01 prowadzi w grze z^x04 %i^x01 zabojstwami i^x04 %i^x01 zgonami. *", playerStats[bestId][NAME], bestFrags, bestDeaths);
}

public spectator_mode(id)
{
        new spectData[12];

        read_data(2, spectData, charsmax(spectData));

        playerStats[id][SPECT] = (spectData[10] == '2');
}

public show_rank(id)
{
        if (!spectRankEnabled || !playerStats[id][SPECT]) return;

        new player = read_data(2);

        if (is_user_connected(player)) {
                set_hudmessage(255, 255, 255, 0.02, 0.96, 2, 0.05, 0.1, 0.01, 3.0, -1);

                ShowSyncHudMsg(id, hudSpectRank, "Ranking %s wynosi %d na %d", playerStats[player][NAME], playerStats[player][STATS_RANK], statsNum);
        }
}

public planting_bomb(planter)
        ExecuteForward(statsForwards[FORWARD_PLANTING], ret, planter);

public planted_bomb()
{
        planter = get_loguser_index();

        playerStats[planter][BOMB_PLANTED]++;

        ExecuteForward(statsForwards[FORWARD_PLANTED], ret, planter);

        if (!soundsEnabled) return;

        for (new i = 1; i <= MAX_PLAYERS; i++) {
                if(!is_user_connected(i)) continue;

                if(((is_user_alive(i) && get_user_team(i) == 2) || (!is_user_alive(i) && get_user_team(pev(i, pev_iuser2)) == 2)) && get_bit(i, soundPrepare)) client_cmd(i, "spk misc/prepare");
        }
}

public planted_bomb_no_round(planter)
{
        playerStats[planter][BOMB_PLANTED]++;

        ExecuteForward(statsForwards[FORWARD_PLANTED], ret, planter);
}

public defused_bomb()
{
        defuser = get_loguser_index();

        playerStats[defuser][BOMB_DEFUSED]++;

        ExecuteForward(statsForwards[FORWARD_DEFUSED], ret, defuser);
}

public defusing_bomb()
{
        defuser = get_loguser_index();

        playerStats[defuser][BOMB_DEFUSIONS]++;
}

public explode_bomb()
{
        if (is_user_connected(planter)) playerStats[planter][BOMB_EXPLODED]++;

        ExecuteForward(statsForwards[FORWARD_EXPLODE], ret, planter, defuser);
}

public cur_weapon(id)
{
        static weapon, ammo;

        weapon = read_data(2);
        ammo = read_data(3);

        if (weaponsAmmo[id][weapon] != ammo) {
                if (weaponsAmmo[id][weapon] > ammo) {
                        playerStats[id][STATS_SHOTS]++;
                        playerRStats[id][STATS_SHOTS]++;
                        playerWStats[id][weapon][STATS_SHOTS]++;
                        playerWRStats[id][weapon][STATS_SHOTS]++;
                }

                weaponsAmmo[id][weapon] = ammo;
        }
}

public damage(victim)
{
        if (!playerStats[victim][ALIVE]) return;

        static damage, inflictor;

        damage = read_data(2);

        inflictor = pev(victim, pev_dmg_inflictor);

        if (!pev_valid(inflictor)) return;

        new attacker, weapon, hitPlace, sameTeam;

        attacker = get_user_attacker(victim, weapon, hitPlace);

        if (!(0 <= attacker <= MAX_PLAYERS)) return;

        sameTeam = get_user_team(victim) == get_user_team(attacker) ? true : false;

        if (!(0 < inflictor <= MAX_PLAYERS)) weapon = CSW_HEGRENADE;

        if (0 <= hitPlace < HIT_END) {
                ExecuteForward(statsForwards[FORWARD_DAMAGE], ret, attacker, victim, damage, weapon, hitPlace, sameTeam);

                playerStats[attacker][STATS_DAMAGE] += damage;
                playerRStats[attacker][STATS_DAMAGE] += damage;
                playerWStats[attacker][weapon][STATS_DAMAGE] += damage;
                playerWRStats[attacker][weapon][STATS_DAMAGE] += damage;
                playerVStats[attacker][victim][STATS_DAMAGE] += damage;
                playerAStats[victim][attacker][STATS_DAMAGE] += damage;
                playerVStats[attacker][0][STATS_DAMAGE] += damage;
                playerAStats[victim][0][STATS_DAMAGE] += damage;

                playerStats[attacker][STATS_HITS]++;
                playerRStats[attacker][STATS_HITS]++;
                playerWStats[attacker][weapon][STATS_HITS]++;
                playerWRStats[attacker][weapon][STATS_HITS]++;
                playerVStats[attacker][victim][STATS_HITS]++;
                playerAStats[victim][attacker][STATS_HITS]++;
                playerVStats[attacker][0][STATS_HITS]++;
                playerAStats[victim][0][STATS_HITS]++;

                playerStats[attacker][HIT_GENERIC]++;
                playerRStats[attacker][HIT_GENERIC]++;
                playerWStats[attacker][weapon][HIT_GENERIC]++;
                playerWRStats[attacker][weapon][HIT_GENERIC]++;
                playerVStats[attacker][victim][HIT_GENERIC]++;
                playerAStats[victim][attacker][HIT_GENERIC]++;
                playerVStats[attacker][0][HIT_GENERIC]++;
                playerAStats[victim][0][HIT_GENERIC]++;

                playerVStats[attacker][victim][STATS_RANK] = weapon;
                playerAStats[victim][attacker][STATS_RANK] = weapon;

                if (hitPlace) {
                        playerStats[attacker][hitPlace]++;
                        playerRStats[attacker][hitPlace]++;
                        playerWStats[attacker][weapon][hitPlace]++;
                        playerWRStats[attacker][weapon][hitPlace]++;
                        playerVStats[attacker][victim][hitPlace]++;
                        playerAStats[victim][attacker][hitPlace]++;
                        playerVStats[attacker][0][hitPlace]++;
                        playerAStats[victim][0][hitPlace]++;
                }

                if (!is_user_alive(victim)) {
                        playerStats[victim][ALIVE] = false;

                        death(attacker, victim, weapon, hitPlace, sameTeam);
                }
        }
}

public death(killer, victim, weapon, hitPlace, teamKill)
{
        ExecuteForward(statsForwards[FORWARD_DEATH], ret, killer, victim, weapon, hitPlace, teamKill);

        playerStats[victim][CURRENT_DEATHS]++;
        playerStats[victim][STATS_DEATHS]++;
        playerRStats[victim][STATS_DEATHS]++;
        playerWStats[victim][weapon][STATS_DEATHS]++;
        playerWRStats[victim][weapon][STATS_DEATHS]++;

        if (is_user_connected(killer)) playerAStats[victim][0][KILLER_TEAM] = get_user_team(killer);

        save_stats(victim, NORMAL);

        if (is_user_connected(killer) && killer != victim) {
                new killerOrigin[3], victimOrigin[3];

                playerStats[victim][REVENGE] = killer;

                playerStats[killer][SKILL] = _:set_skill(playerStats[killer][SKILL], 1.0, get_skill(playerStats[victim][SKILL], playerStats[killer][SKILL]));
                playerStats[victim][SKILL] = floatmax(1.0, set_skill(playerStats[victim][SKILL], 0.0, get_skill(playerStats[killer][SKILL], playerStats[victim][SKILL])));

                playerAStats[victim][0][KILLER_ID] = killer;
                playerAStats[victim][0][KILLER_HEALTH] = get_user_health(killer);
                playerAStats[victim][0][KILLER_ARMOR] = get_user_armor(killer);

                playerAStats[killer][victim][KILLER_DISTANCE] = playerVStats[victim][0][KILLER_DISTANCE] = get_distance(victimOrigin, killerOrigin);

                playerStats[killer][CURRENT_KILLS]++;
                playerStats[killer][STATS_KILLS]++;
                playerRStats[killer][STATS_KILLS]++;
                playerWStats[killer][weapon][STATS_KILLS]++;
                playerWRStats[killer][weapon][STATS_KILLS]++;
                playerVStats[killer][victim][STATS_KILLS]++;
                playerAStats[victim][killer][STATS_KILLS]++;
                playerVStats[killer][0][STATS_KILLS]++;
                playerAStats[victim][0][STATS_KILLS]++;

                if (hitPlace == HIT_HEAD) {
                        playerStats[killer][CURRENT_HS]++;
                        playerStats[killer][STATS_HS]++;
                        playerRStats[killer][STATS_HS]++;
                        playerWStats[killer][weapon][STATS_HS]++;
                        playerWRStats[killer][weapon][STATS_HS]++;
                        playerVStats[killer][victim][STATS_HS]++;
                        playerAStats[victim][killer][STATS_HS]++;
                        playerVStats[killer][0][STATS_HS]++;
                        playerAStats[victim][0][STATS_HS]++;
                }

                if (teamKill) {
                        playerStats[killer][STATS_TK]++;
                        playerRStats[killer][STATS_TK]++;
                        playerWStats[killer][weapon][STATS_TK]++;
                        playerWRStats[killer][weapon][STATS_TK]++;
                        playerVStats[killer][victim][STATS_TK]++;
                        playerAStats[victim][killer][STATS_TK]++;
                        playerVStats[killer][0][STATS_TK]++;
                        playerAStats[victim][0][STATS_TK]++;
                }

                save_stats(killer, NORMAL);

                if (killerInfoEnabled) client_print_color(killer, victim, "* Zabiles^x03 %s^x01. *", playerStats[victim][NAME]);
                if (victimInfoEnabled) client_print_color(victim, killer, "* Zostales zabity przez^x03 %s^x01, ktoremu zostalo^x04 %i^x01 HP. *", playerStats[killer][NAME], get_user_health(killer));

                if (assistEnabled) {
                        new assistKiller, assistDamage;

                        for (new i = 1; i <= MAX_PLAYERS; i++) {
                                if(!is_user_connected(i) || i == killer || i == victim) continue;

                                if(playerAStats[victim][i][STATS_DAMAGE] >= assistMinDamage && playerAStats[victim][i][STATS_DAMAGE] > assistDamage) {
                                        assistKiller = i;
                                        assistDamage = playerAStats[victim][i][STATS_DAMAGE];
                                }
                        }

                        if (assistKiller) {
                                playerStats[assistKiller][STATS_KILLS]++;
                                playerStats[assistKiller][CURRENT_KILLS]++;
                                playerStats[assistKiller][ASSISTS]++;

                                ExecuteForward(statsForwards[FORWARD_ASSIST], ret, killer, victim, assistKiller);

                                save_stats(assistKiller, NORMAL);

                                set_user_frags(assistKiller, get_user_frags(assistKiller) + 1);
                                cs_set_user_deaths(assistKiller, cs_get_user_deaths(assistKiller));

                                new money = min(cs_get_user_money(assistKiller) + assistMoney, MAX_MONEY);

                                cs_set_user_money(assistKiller, money);

                                if (is_user_alive(assistKiller)) {
                                        static msgMoney;

                                        if (!msgMoney) msgMoney = get_user_msgid("Money");

                                        message_begin(MSG_ONE_UNRELIABLE, msgMoney, _, assistKiller);
                                        write_long(money);
                                        write_byte(1);
                                        message_end();
                                }

                                if (assistInfoEnabled) client_print_color(assistKiller, killer, "* Pomogles^x04 %s^x01 w zabiciu^x04 %s^x01. *", playerStats[killer][NAME], playerStats[victim][NAME]);
                        }
                }

                if (playerStats[killer][REVENGE] == victim && revengeEnabled) {
                        playerStats[killer][STATS_KILLS]++;
                        playerStats[killer][CURRENT_KILLS]++;
                        playerStats[killer][REVENGES]++;

                        playerStats[killer][REVENGE] = 0;

                        ExecuteForward(statsForwards[FORWARD_REVENGE], ret, killer, victim);

                        save_stats(killer, NORMAL);

                        set_user_frags(killer, get_user_frags(killer) + 1);
                        cs_set_user_deaths(killer, cs_get_user_deaths(killer));

                        new money = min(cs_get_user_money(killer) + revengeMoney, MAX_MONEY);

                        cs_set_user_money(killer, money);

                        if (is_user_alive(killer)) {
                                static msgMoney;

                                if (!msgMoney) msgMoney = get_user_msgid("Money");

                                message_begin(MSG_ONE_UNRELIABLE, msgMoney, _, killer);
                                write_long(money);
                                write_byte(1);
                                message_end();
                        }

                        if (revengeInfoEnabled) client_print_color(killer, victim, "* Zemsciles sie zabijajac^x04 %s^x01. *", playerStats[victim][NAME]);
                }
        }

        show_user_hud_info(victim, false);

        if (!soundsEnabled && !xvsxEnabled) return;

        if (weapon == CSW_KNIFE && soundsEnabled) {
                for (new i = 1; i <= MAX_PLAYERS; i++) {
                        if (!is_user_connected(i)) continue;

                        if ((pev(i, pev_iuser2) == victim || i == victim) && get_bit(i, soundHumiliation)) client_cmd(i, "spk misc/humiliation");
                }
        }

        if (block) return;

        new tCount, ctCount, lastT, lastCT;

        for (new i = 1; i <= MAX_PLAYERS; i++) {
                if (!is_user_alive(i)) continue;

                switch(get_user_team(i)) {
                        case 1: {
                                tCount++;
                                lastT = i;
                        } case 2: {
                                ctCount++;
                                lastCT = i;
                        }
                }
        }

        if (tCount == 1 && ctCount == 1) {
                if (soundsEnabled) {
                        for (new i = 1; i <= MAX_PLAYERS; i++) {
                                if (!is_user_connected(i)) continue;

                                if ((pev(i, pev_iuser2) == lastT || pev(i, pev_iuser2) == lastCT || i == lastT || i == lastCT) && get_bit(i, soundMayTheForce)) client_cmd(i, "spk misc/maytheforce");
                        }
                }

                if (xvsxEnabled) {
                        new nameT[32], nameCT[32];

                        get_user_name(lastT, nameT, charsmax(nameT));
                        get_user_name(lastCT, nameCT, charsmax(nameCT));

                        set_dhudmessage(255, 128, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.5, 0.15);
                        show_dhudmessage(0, "%s vs. %s", nameT, nameCT);
                }
        }

        if (tCount == 1 && ctCount > 1) {
                if (!oneAndOnly && soundsEnabled) {
                        for (new i = 1; i <= MAX_PLAYERS; i++) {
                                if (!is_user_connected(i)) continue;

                                if (((is_user_alive(i) && get_user_team(i) == 2) || (!is_user_alive(i) && pev(i, pev_iuser2) != lastT)) && get_bit(i, soundLastLeft)) client_cmd(i, "spk misc/lastleft");

                                if ((pev(i, pev_iuser2) == lastT || i == lastT) && get_bit(i, soundOneAndOnly)) client_cmd(i, "spk misc/oneandonly");
                        }
                }

                oneAndOnly = true;

                if (xvsxEnabled) {
                        set_dhudmessage(255, 128, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.5, 0.15);
                        show_dhudmessage(0, "%i vs %i", tCount, ctCount);
                }
        }

        if (tCount > 1 && ctCount == 1) {
                if (!oneAndOnly && soundsEnabled) {
                        for (new i = 1; i <= MAX_PLAYERS; i++) {
                                if (!is_user_connected(i)) continue;

                                if (((is_user_alive(i) && get_user_team(i) == 1) || (!is_user_alive(i) && pev(i, pev_iuser2) != lastCT)) && get_bit(i, soundLastLeft)) client_cmd(i, "spk misc/lastleft");

                                if ((pev(i, pev_iuser2) == lastCT || i == lastCT) && get_bit(i, soundOneAndOnly)) client_cmd(i, "spk misc/oneandonly");
                        }
                }

                oneAndOnly = true;

                if (xvsxEnabled) {
                        set_dhudmessage(255, 128, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.5, 0.15);
                        show_dhudmessage(0, "%i vs %i", ctCount, tCount);
                }
        }
}

public win_t()
        round_winner(1);

public win_ct()
        round_winner(2);

public round_winner(team)
{
        for (new id = 1; id <= MAX_PLAYERS; id++) {
                if (!is_user_connected(id) || get_user_team(id) != team) continue;

                playerStats[id][team == 1 ? WIN_T : WIN_CT]++;
        }
}

public set_model(ent, model[])
{
        static className[32], id, weapon; id = pev(ent, pev_owner);

        if (!is_user_connected(id)) return FMRES_IGNORED;

        pev(ent, pev_classname, className, charsmax(className));

        if (strcmp(className, "grenade") != 0) return FMRES_IGNORED;

        switch (model[9]) {
                case 'f': weapon = CSW_FLASHBANG;
                case 'h': weapon = CSW_HEGRENADE;
                case 's': weapon = CSW_SMOKEGRENADE;
        }

        ExecuteForward(statsForwards[FORWARD_THROW], ret, id, ent, weapon);

        return FMRES_IGNORED;
}

public message_intermission()
{
        mapChange = true;

        if (medalsEnabled) {
                new playerName[32], winnersId[3], winnersFrags[3], tempFrags, swapFrags, swapId;

                for (new id = 1; id <= MAX_PLAYERS; id++) {
                        if (!is_user_connected(id) || is_user_hltv(id) || is_user_bot(id)) continue;

                        tempFrags = get_user_frags(id);

                        if (tempFrags > winnersFrags[THIRD]) {
                                winnersFrags[THIRD] = tempFrags;
                                winnersId[THIRD] = id;

                                if (tempFrags > winnersFrags[SECOND]) {
                                        swapFrags = winnersFrags[SECOND];
                                        swapId = winnersId[SECOND];
                                        winnersFrags[SECOND] = tempFrags;
                                        winnersId[SECOND] = id;
                                        winnersFrags[THIRD] = swapFrags;
                                        winnersId[THIRD] = swapId;

                                        if (tempFrags > winnersFrags[FIRST]) {
                                                swapFrags = winnersFrags[FIRST];
                                                swapId = winnersId[FIRST];
                                                winnersFrags[FIRST] = tempFrags;
                                                winnersId[FIRST] = id;
                                                winnersFrags[SECOND] = swapFrags;
                                                winnersId[SECOND] = swapId;
                                        }
                                }
                        }
                }

                if (!winnersId[FIRST]) return PLUGIN_CONTINUE;

                new const medals[][] = { "Brazowy", "Srebrny", "Zloty" };

                client_print_color(0, 0, "* Gratulacje dla^x03 Najlepszych Graczy^x01! *");

                for (new i = 2; i >= 0; i--) {
                        switch(i) {
                                case THIRD: playerStats[winnersId[i]][BRONZE]++;
                                case SECOND: playerStats[winnersId[i]][SILVER]++;
                                case FIRST: playerStats[winnersId[i]][GOLD]++;
                        }

                        save_stats(winnersId[i], FINAL);

                        get_user_name(winnersId[i], playerName, charsmax(playerName));

                        client_print_color(0, 0, "* ^x03 %s^x01 -^x03 %i^x01 Zabojstw - %s Medal. *", playerName, winnersFrags[i], medals[i]);
                }
        }

        for (new id = 1; id <= MAX_PLAYERS; id++) {
                if (!is_user_connected(id) || is_user_hltv(id) || is_user_bot(id)) continue;

                save_stats(id, FINAL);
        }

        return PLUGIN_CONTINUE;
}

public say_text(msgId, msgDest, msgEnt)
{
        new id = get_msg_arg_int(1);

        if (is_user_connected(id)) {
                new tempMessage[192], message[192], chatPrefix[16];

                get_msg_arg_string(2, tempMessage, charsmax(tempMessage));

                if (playerStats[id][STATS_RANK] > 3 || !prefixEnabled) return PLUGIN_CONTINUE;

                switch (playerStats[id][STATS_RANK]) {
                        case 1: formatex(chatPrefix, charsmax(chatPrefix), "^x04[TOP1]");
                        case 2: formatex(chatPrefix, charsmax(chatPrefix), "^x04[TOP2]");
                        case 3: formatex(chatPrefix, charsmax(chatPrefix), "^x04[TOP3]");
                }

                if (!equal(tempMessage, "#Cstrike_Chat_All")) {
                        add(message, charsmax(message), chatPrefix);
                        add(message, charsmax(message), " ");
                        add(message, charsmax(message), tempMessage);
                } else {
                get_msg_arg_string(4, tempMessage, charsmax(tempMessage));
                set_msg_arg_string(4, "");

                add(message, charsmax(message), chatPrefix);
                add(message, charsmax(message), "^x03 ");
                add(message, charsmax(message), playerStats[id][NAME]);
                add(message, charsmax(message), "^x01 :  ");
                add(message, charsmax(message), tempMessage);
                }

                set_msg_arg_string(2, message);
        }

        return PLUGIN_CONTINUE;
}

public show_hud_info(start)
{
        static hudInfo[512], hudTemp[256];

        hudInfo = "";

        if (disruptiveHudEnabled) {
                new disruptiveId, disruptiveDamage, disruptiveHits;

                for (new player = 1; player <= MAX_PLAYERS; player++) {
                        if (!is_user_connected(player)) continue;

                        if (playerRStats[player][STATS_DAMAGE] >= disruptiveDamage && (playerRStats[player][STATS_DAMAGE] > disruptiveDamage || playerRStats[player][STATS_HITS] > disruptiveHits)) {
                                disruptiveId = player;
                                disruptiveDamage = playerRStats[player][STATS_DAMAGE];
                                disruptiveHits = playerRStats[player][STATS_HITS];
                        }
                }

                if (disruptiveId) {
                        formatex(hudTemp, charsmax(hudTemp), "Najwiecej obrazen: %s^n%d trafien / %d obrazen -- %0.2f%% efe. / %0.2f%% cel.^n", playerStats[disruptiveId][NAME], disruptiveHits, disruptiveDamage,
                                effec(playerRStats[disruptiveId][STATS_KILLS], playerRStats[disruptiveId][STATS_DEATHS]), accuracy(playerRStats[disruptiveId][STATS_SHOTS], playerRStats[disruptiveId][STATS_HITS]));

                        add(hudInfo, charsmax(hudInfo), hudTemp);
                }
        }

        if (bestScoreHudEnabled) {
                new bestScoreId, bestScoreKills, bestScoreHS;

                for (new player = 1; player <= MAX_PLAYERS; player++) {
                        if (!is_user_connected(player)) continue;

                        if (playerRStats[player][STATS_KILLS] >= bestScoreKills && (playerRStats[player][STATS_KILLS] > bestScoreKills || playerRStats[player][STATS_HS] > bestScoreHS)) {
                                bestScoreId = player;
                                bestScoreKills = playerRStats[player][STATS_KILLS];
                                bestScoreHS = playerRStats[player][STATS_HS];
                        }
                }

                if (bestScoreId) {
                        formatex(hudTemp, charsmax(hudTemp), "Najlepszy wynik: %s^n%d zabojstw / %d hs -- %0.2f%% efe. / %0.2f%% cel.^n", playerStats[bestScoreId][NAME], bestScoreKills, bestScoreHS,
                                effec(playerRStats[bestScoreId][STATS_KILLS], playerRStats[bestScoreId][STATS_DEATHS]), accuracy(playerRStats[bestScoreId][STATS_SHOTS], playerRStats[bestScoreId][STATS_HITS]));

                        add(hudInfo, charsmax(hudInfo), hudTemp);
                }
        }

        if (hudInfo[0]) {
                set_hudmessage(100, 200, 0, 0.05, 0.55, 0, 0.0, 6.0, start ? 0.0 : 1.0, 1.0);
                ShowSyncHudMsg(0, hudEndRound, "%s", hudInfo);
        }

        for (new id = 1; id <= MAX_PLAYERS; id++) {
                if (!is_user_connected(id)) continue;

                show_user_hud_info(id, start);
        }
}

public show_user_hud_info(id, start)
{
        if (playerStats[id][HUD_INFO]) return;

        static hudInfo[1024], weaponName[32], stats[8], hits[8], length;

        new const victims[] = "Ofiary:^n", attackers[] = "Atakujacy:^n";

        playerStats[id][HUD_INFO] = true;

        if (victimHudEnabled) {
                hudInfo = "";

                copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, 0);
                copy_stats(id, stats, charsmax(stats), HIT_END, VICTIM_STATS, _, 0);

                if (stats[stat(STATS_SHOTS)]) length = formatex(hudInfo, charsmax(hudInfo), "Ofiary -- %0.2f%% cel.:^n", accuracy(stats[stat(STATS_SHOTS)], stats[stat(STATS_HITS)]));
                else length = formatex(hudInfo, charsmax(hudInfo), victims);

                for (new player = 1; player <= MAX_PLAYERS; player++) {
                        if (!is_user_connected(player) || is_user_hltv(player)) continue;

                        copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, player);

                        if (!hits[HIT_GENERIC]) continue;

                        copy_stats(id, stats, sizeof(stats), HIT_END, VICTIM_STATS, _, player);

                        if (stats[stat(STATS_DEATHS)]) {
                                if (stats[stat(STATS_RANK)] > 0) {
                                        get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));

                                        replace_all(weaponName, charsmax(weaponName), "weapon_", "");

                                        length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d trafien / %d obrazen / %s%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], weaponName, (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
                                } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d trafien / %d obrazen%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
                        } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d trafien / %d obrazen^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)]);
                }

                if (strlen(hudInfo) > strlen(victims)) {
                        set_hudmessage(0, 80, 220, 0.55, 0.60, 0, 0.0, 6.0, start ? 0.0 : 1.0, 1.0, -1);
                        show_hudmessage(id, "%s", hudInfo);
                }
        }

        if (attackerHudEnabled) {
                hudInfo = "";

                copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, 0);
                copy_stats(id, stats, charsmax(stats), HIT_END, ATTACKER_STATS, _, 0);

                if (stats[stat(STATS_SHOTS)]) length = formatex(hudInfo, charsmax(hudInfo), "Atakujacy -- %0.2f%% cel.:^n", accuracy(stats[stat(STATS_SHOTS)], stats[stat(STATS_HITS)]));
                else length = formatex(hudInfo, charsmax(hudInfo), attackers);

                for (new player = 1; player <= MAX_PLAYERS; player++) {
                        if (!is_user_connected(player) || is_user_hltv(player)) continue;

                        copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, player);

                        if (!hits[HIT_GENERIC]) continue;

                        copy_stats(id, stats, sizeof(stats), HIT_END, ATTACKER_STATS, _, player);

                        if (stats[stat(STATS_KILLS)]) {
                                if (stats[stat(STATS_RANK)] > 0) {
                                        get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));

                                        replace_all(weaponName, charsmax(weaponName), "weapon_", "");

                                        length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d trafien / %d obrazen / %s%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], weaponName, (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
                                } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d trafien / %d obrazen%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
                        } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d trafien / %d obrazen^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)]);
                }

                if (strlen(hudInfo) > strlen(attackers)) {
                        set_hudmessage(220, 80, 0, 0.55, 0.35, 0, 0.0, 6.0, start ? 0.0 : 1.0, 1.0, -1);
                        show_hudmessage(id, "%s", hudInfo);
                }
        }
}

public cmd_menu(id)
{
        new menuData[64], weaponName[32], shortWeaponName[32], weaponCommand[32],
                menu = menu_create("\yMenu \rStatystyk\w:", "cmd_menu_handle");

        for (new i = 1; i < sizeof(commands); i++) {
                if (equal(commands[i][0], "cmd_time_admin") && !(get_user_flags(id) & ADMIN_BAN)) continue;

                formatex(menuData, charsmax(menuData), "%s \y(%s)", commands[i][1], commands[i][3]);

                replace_all(menuData, charsmax(menuData), "say ", "");

                menu_additem(menu, menuData, commands[i][2]);
        }

        for (new i = 1; i < WEAPONS_END; i++) {
                if (i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) continue;

                get_weaponname(i, weaponName, charsmax(weaponName));
                copy(shortWeaponName, charsmax(shortWeaponName), weaponName);

                if (i == CSW_HEGRENADE) replace_all(weaponName, charsmax(weaponName), "hegrenade", "he");
                else if (i == CSW_UMP45) replace_all(weaponName, charsmax(weaponName), "mp5navy", "mp5");
                else if (i == CSW_MP5NAVY) replace_all(weaponName, charsmax(weaponName), "ump45", "ump");

                replace_all(shortWeaponName, charsmax(shortWeaponName), "weapon_", "");

                formatex(weaponCommand, charsmax(weaponCommand), "/%stop15", shortWeaponName);

                ucfirst(shortWeaponName);

                formatex(menuData, charsmax(menuData), "%s \rTop15 \y(%s)", shortWeaponName, weaponCommand);

                menu_additem(menu, menuData, weaponName);
        }

        menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
        menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
        menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");

        menu_display(id, menu);

        return PLUGIN_HANDLED;
}

public cmd_menu_handle(id, menu, item)
{
        if (!is_user_connected(id)) return PLUGIN_HANDLED;

        if (item == MENU_EXIT) {
                menu_destroy(menu);

                return PLUGIN_HANDLED;
        }

        new itemData[32], itemAccess, menuCallback;

        menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, menuCallback);

        if (contain(itemData, "weapon_") != -1) {
                cmd_weapon_top15(id, get_weaponid(itemData));
        } else {
                cmd_execute(id, itemData);
        }

        menu_destroy(menu);

        return PLUGIN_HANDLED;
}

public cmd_hp(id)
{
        if (!hpEnabled) return PLUGIN_CONTINUE;

        new killer = playerAStats[id][0][KILLER_ID];

        static message[192];

        if (killer && killer != id) {
                new weaponName[32], stats[8], hits[8], length;

                copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, killer);
                copy_stats(id, stats, sizeof(stats), HIT_END, ATTACKER_STATS, _, killer);

                if (stats[stat(STATS_RANK)] > 0) {
                        get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));

                        replace_all(weaponName, charsmax(weaponName), "weapon_", "");

                        length = formatex(message, charsmax(message), "Zabity przez^x03 %s^x01 z %s z odleglosci %0.0fm (^x04 %d HP^x01,^x04 %d AP^x01). Szczegoly: ", playerStats[killer][NAME], weaponName, distance(playerAStats[id][0][KILLER_DISTANCE]), playerAStats[id][0][KILLER_HEALTH], playerAStats[id][0][KILLER_ARMOR]);
                } else length = formatex(message, charsmax(message), "Zabity przez^x03 %s^x01 z odleglosci %0.0fm (^x04 %d HP^x01,^x04 %d AP^x01). Szczegoly: ", playerStats[killer][NAME], distance(playerAStats[id][0][KILLER_DISTANCE]), playerAStats[id][0][KILLER_HEALTH], playerAStats[id][0][KILLER_ARMOR]);

                if (stats[stat(STATS_HITS)]) {
                        for (new i = 1, hit = 0; i < sizeof(hits); i++) {
                                if (!hits[i]) continue;

                                if (hit) length += formatex(message[length], charsmax(message) - length, ", ");

                                length += formatex(message[length], charsmax(message) - length, "%s: %d", body[i], hits[i]);

                                hit++;
                        }
                } else length += formatex(message[length], charsmax(message) - length, "zadnych trafien");
        } else formatex(message, charsmax(message), "Nie masz zadnego zabojcy");

        client_print_color(id, killer, "* %s. *", message);

        return PLUGIN_HANDLED;
}

public cmd_me(id)
{
        if (!meEnabled) return PLUGIN_CONTINUE;

        static message[192];

        new stats[8], hits[8], length;

        copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, 0);
        copy_stats(id, stats, charsmax(stats), HIT_END, VICTIM_STATS, _, 0);

        length = formatex(message, charsmax(message), "Ostatni rezultat:^x04 %d^x01 trafien,^x04 %d^x01 obrazen. Szczegoly: ", stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)]);

        if (stats[stat(STATS_HITS)]) {
                for (new i = 1, hit = 0; i < sizeof(hits); i++) {
                        if (!hits[i]) continue;

                        if (hit) length += formatex(message[length], charsmax(message) - length, ", ");

                        length += formatex(message[length], charsmax(message) - length, "%s: %d", body[i], hits[i]);

                        hit++;
                }
        } else length += formatex(message[length], charsmax(message) - length, "zadnych trafien");

        client_print_color(id, id, "* %s. *", message);

        return PLUGIN_HANDLED;
}

public cmd_stats(id)
{
        if (!statsEnabled) return PLUGIN_CONTINUE;

        new tempId[3], menu = menu_create("\yStatystyki \rGraczy\w:", "cmd_stats_handle");

        menu_additem(menu, playerStats[id][STATS_MENU] ? "Tryb: \yRank Stats" : "Tryb: \yStats");
        menu_addblank(menu, false);

        for (new i = 1; i <= MAX_PLAYERS; i++) {
                if (!is_user_connected(i)) continue;

                num_to_str(i, tempId, charsmax(tempId));

                menu_additem(menu, playerStats[i][NAME], tempId);
        }

        menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
        menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
        menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");

        menu_display(id, menu);

        return PLUGIN_HANDLED;
}

public cmd_stats_handle(id, menu, item)
{
        if (!is_user_connected(id)) return PLUGIN_HANDLED;

        if (item == MENU_EXIT) {
                menu_destroy(menu);

                return PLUGIN_HANDLED;
        }

        new itemData[3], itemAccess, menuCallback;

        menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, menuCallback);

        if (!strlen(itemData)) {
                playerStats[id][STATS_MENU] = !playerStats[id][STATS_MENU];
        } else {
                new player = str_to_num(itemData);

                if (!is_user_connected(player)) {
                        client_print_color(id, id, "* Wybranego gracza nie ma juz na serwerze. *");

                        return PLUGIN_HANDLED;
                }

                if (!playerStats[id][STATS_MENU]) {
                        cmd_statsme(id, player);
                } else {
                        cmd_rankstats(id, player);
                }
        }

        menu_destroy(menu);

        cmd_stats(id);

        return PLUGIN_CONTINUE;
}

public cmd_statsme(id, player)
{
        if (!statsMeEnabled) return PLUGIN_CONTINUE;

        static motdData[2048], weaponName[32], motdLength, target;

        motdLength = 0;

        target = player ? player : id;

        motdLength = formatex(motdData, charsmax(motdData), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>");

        motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "%16s: %d (%d z HS)^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %0.2f%%^n%16s: %0.2f%%^n^n", "Zabojstwa", playerStats[target][STATS_KILLS], playerStats[target][STATS_HS], "Zgony", playerStats[target][STATS_DEATHS], "Trafienia",
                playerStats[target][STATS_HITS], "Strzaly", playerStats[target][STATS_SHOTS], "Obrazenia", playerStats[target][STATS_DAMAGE], "Efektywnosc", effec(playerStats[target][STATS_KILLS], playerStats[target][STATS_DEATHS]), "Celnosc", accuracy(playerStats[target][STATS_SHOTS], playerStats[target][STATS_HITS]));

        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%8s %6s %7s %2s %6s %4s %4s %4s^n", "Bron", "Zabojstwa", "Zgony", "HS", "Trafienia", "Strzaly", "Efe.", "Cel.");

        for (new i = 1; i < WEAPONS_END; i++) {
                if ((i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) || (!playerWStats[target][i][STATS_SHOTS] && !playerWStats[target][i][STATS_DEATHS])) continue;

                get_weaponname(i, weaponName, charsmax(weaponName));

                replace_all(weaponName, charsmax(weaponName), "weapon_", "");

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%8s %6d %6d %5d %7d %9d %3.0f%% %3.0f%%^n", weaponName, playerWStats[target][i][STATS_KILLS], playerWStats[target][i][STATS_DEATHS], playerWStats[target][i][STATS_HS],
                        playerWStats[target][i][STATS_HITS], playerWStats[target][i][STATS_SHOTS], effec(playerWStats[target][i][STATS_KILLS], playerWStats[target][i][STATS_DEATHS]), accuracy(playerWStats[target][i][STATS_SHOTS], playerWStats[target][i][STATS_HITS]));
        }

        show_motd(id, motdData, playerStats[target][NAME]);

        return PLUGIN_HANDLED;
}

public cmd_rank(id)
{
        if (!rankEnabled) return PLUGIN_CONTINUE;

        client_print_color(id, id, "* Masz^x04 %d^x01 zabojstw,^x04 %d^x01 trafien,^x04 %.2f^x01%% efektywnosci i^x04 %.2f^x01%% celnosci. *", playerStats[id][STATS_KILLS], playerStats[id][STATS_HITS], effec(playerStats[id][STATS_KILLS], playerStats[id][STATS_DEATHS]), accuracy(playerStats[id][STATS_SHOTS], playerStats[id][STATS_HITS]));
        client_print_color(id, id, "* Twoj ranking wynosi^x03 %d^x01 na^x03 %d^x01. *", playerStats[id][STATS_RANK], statsNum);

        return PLUGIN_HANDLED;
}

public cmd_rankstats(id, player)
{
        if (!rankStatsEnabled) return PLUGIN_CONTINUE;

        static motdData[4096], motdLength, target;

        motdLength = 0;

        target = player ? player : id;

        motdLength = formatex(motdData, charsmax(motdData), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>");

        if (player) motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "Ranking gracza %s wynosi %i na %i^n^n", playerStats[target][NAME], playerStats[target][STATS_RANK], statsNum);
        else motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "Twoj ranking wynosi %i na %i^n^n", playerStats[target][STATS_RANK], statsNum);

        motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "%16s: %d (%d z HS)^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %0.2f%%^n%16s: %0.2f%%^n^n", "Zabojstwa", playerStats[target][STATS_KILLS], playerStats[target][STATS_HS], "Zgony", playerStats[target][STATS_DEATHS], "Trafienia",
                playerStats[target][STATS_HITS], "Strzaly", playerStats[target][STATS_SHOTS], "Obrazenia", playerStats[target][STATS_DAMAGE], "Efektywnosc", effec(playerStats[target][STATS_KILLS], playerStats[target][STATS_DEATHS]), "Celnosc", accuracy(playerStats[target][STATS_SHOTS], playerStats[target][STATS_HITS]));

        motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "TRAFIENIA^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d", body[HIT_HEAD], playerStats[target][HIT_HEAD], body[HIT_CHEST], playerStats[target][HIT_CHEST],
                body[HIT_STOMACH], playerStats[target][HIT_STOMACH], body[HIT_LEFTARM], playerStats[target][HIT_LEFTARM], body[HIT_RIGHTARM], playerStats[target][HIT_RIGHTARM], body[HIT_LEFTLEG], playerStats[target][HIT_LEFTLEG], body[HIT_RIGHTLEG], playerStats[target][HIT_RIGHTLEG]);

        show_motd(id, motdData, playerStats[target][NAME]);

        return PLUGIN_HANDLED;
}

public cmd_top15(id)
{
        if (!top15Enabled) return PLUGIN_CONTINUE;

        new queryData[256], queryTemp[96], playerId[1];

        playerId[0] = id;

        get_rank_formula(queryTemp, charsmax(queryTemp), false);

        formatex(queryData, charsmax(queryData), "SELECT a.name, a.kills, a.deaths, a.hs_kills, a.shots, a.hits, a.skill FROM `ultimate_stats` a ORDER BY %s LIMIT 15", queryTemp);

        SQL_ThreadQuery(sql, "show_top15", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Top15 SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], motdLength, place, kills, deaths, hs, shots, hits;

        motdLength = 0, place = 0;

        new id = playerId[0];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");

        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %5s %7s %2s %6s %4s %4s %4s^n", "#", "Nick", "Zabojstwa", "Zgony", "HS", "Trafienia", "Strzaly", "Efe.", "Cel.");

        while (SQL_MoreResults(query)) {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                kills = SQL_ReadResult(query, 1);
                deaths = SQL_ReadResult(query, 2);
                hs = SQL_ReadResult(query, 3);
                shots = SQL_ReadResult(query, 4);
                hits = SQL_ReadResult(query, 5);

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2d %-22.22s %6d %7d %6d %7d %7d %3.0f%% %3.0f%%^n", place, name, kills, deaths, hs, hits, shots, effec(kills, deaths), accuracy(shots, hits));

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Top15");

        return PLUGIN_HANDLED;
}

public cmd_topme(id)
{
        if (!topMeEnabled) return PLUGIN_CONTINUE;

        new queryData[256], queryTemp[96], playerId[2], start = 0;

        if (playerStats[id][STATS_RANK] > 7) start = max(0, playerStats[id][STATS_RANK] - 7);
        else if (playerStats[id][STATS_RANK] + 8 >= statsNum) start = max(0, statsNum - 15);

        playerId[0] = id;
        playerId[1] = start;

        get_rank_formula(queryTemp, charsmax(queryTemp), false);

        formatex(queryData, charsmax(queryData), "SELECT a.name, a.kills, a.deaths, a.hs_kills, a.shots, a.hits, a.skill FROM `ultimate_stats` a ORDER BY %s LIMIT %i, 15", queryTemp, start);

        SQL_ThreadQuery(sql, "show_topme", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_topme(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "TopMe SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], motdLength, kills, deaths, hs, shots, hits;

        motdLength = 0;

        new id = playerId[0], place = playerId[1];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");

        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %5s %7s %2s %6s %4s %4s %4s^n", "#", "Nick", "Zabojstwa", "Zgony", "HS", "Trafienia", "Strzaly", "Efe.", "Cel.");

        while (SQL_MoreResults(query)) {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                kills = SQL_ReadResult(query, 1);
                deaths = SQL_ReadResult(query, 2);
                hs = SQL_ReadResult(query, 3);
                shots = SQL_ReadResult(query, 4);
                hits = SQL_ReadResult(query, 5);

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2d %-22.22s %6d %7d %6d %7d %7d %3.0f%% %3.0f%%^n", place, name, kills, deaths, hs, hits, shots, effec(kills, deaths), accuracy(shots, hits));

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Top15");

        return PLUGIN_HANDLED;
}

public cmd_weapon_top15(id, weapon)
{
        if (!top15Enabled) return PLUGIN_CONTINUE;

        new queryData[512], weaponName[32], playerId[2];

        get_weaponname(weapon, weaponName, charsmax(weaponName));

        playerId[0] = id;
        playerId[1] = weapon;

        if(weapon == CSW_KNIFE) formatex(queryData, charsmax(queryData), "SELECT a.name, b.kills, b.hs_kills FROM `ultimate_stats` a JOIN `ultimate_stats_weapons` b ON a.id = b.player_id WHERE b.weapon = 'weapon_knife' ORDER BY b.kills DESC, b.hs_kills DESC LIMIT 15");
        else if(weapon == CSW_HEGRENADE) formatex(queryData, charsmax(queryData), "SELECT a.name, b.kills FROM `ultimate_stats` a JOIN `ultimate_stats_weapons` b ON a.id = b.player_id WHERE b.weapon = 'weapon_hegrenade' ORDER BY b.kills DESC LIMIT 15");
        else {
                new queryTemp[96];

                get_rank_formula(queryTemp, charsmax(queryTemp), false);

                formatex(queryData, charsmax(queryData), "SELECT b.name, a.kills, a.deaths, a.hs_kills, a.shots, a.hits FROM `ultimate_stats` b JOIN `ultimate_stats_weapons` a ON b.id = a.player_id WHERE a.weapon = '%s' ORDER BY %s LIMIT 15", weaponName, queryTemp);
        }

        SQL_ThreadQuery(sql, "show_weapon_top15", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_weapon_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Weapon Top15 SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], topName[64], name[32], motdLength, place, kills, deaths, hs, shots, hits;

        motdLength = 0, place = 0;

        new id = playerId[0], weapon = playerId[1];

        get_weaponname(weapon, topName, charsmax(topName));

        replace_all(topName, charsmax(topName), "weapon_", "");

        ucfirst(topName);

        add(topName, charsmax(topName), " Top15");

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");

        if(weapon == CSW_KNIFE) {
                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %10s %13s^n", "#", "Nick", "Zabojstwa", "HS");

                while (SQL_MoreResults(query)) {
                        place++;

                        SQL_ReadResult(query, 0, name, charsmax(name));

                        replace_all(name, charsmax(name), "<", "");
                        replace_all(name, charsmax(name), ">", "");

                        kills = SQL_ReadResult(query, 1);
                        hs = SQL_ReadResult(query, 2);

                        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %5d %7d^n", place, name, kills, hs);

                        SQL_NextRow(query);
                }
        } else if(weapon == CSW_HEGRENADE) {
                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %13s^n", "#", "Nick", "Zabojstwa");

                while (SQL_MoreResults(query)) {
                        place++;

                        SQL_ReadResult(query, 0, name, charsmax(name));

                        replace_all(name, charsmax(name), "<", "");
                        replace_all(name, charsmax(name), ">", "");

                        kills = SQL_ReadResult(query, 1);

                        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %6d^n", place, name, kills);

                        SQL_NextRow(query);
                }
        } else {
                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %5s %7s %2s %6s %4s %4s %4s^n", "#", "Nick", "Zabojstwa", "Zgony", "HS", "Trafienia", "Strzaly", "Efe.", "Cel.");

                while (SQL_MoreResults(query)) {
                        place++;

                        SQL_ReadResult(query, 0, name, charsmax(name));

                        replace_all(name, charsmax(name), "<", "");
                        replace_all(name, charsmax(name), ">", "");

                        kills = SQL_ReadResult(query, 1);
                        deaths = SQL_ReadResult(query, 2);
                        hs = SQL_ReadResult(query, 3);
                        shots = SQL_ReadResult(query, 4);
                        hits = SQL_ReadResult(query, 5);

                        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2d %-22.22s %6d %7d %6d %7d %7d %3.0f%% %3.0f%%^n", place, name, kills, deaths, hs, hits, shots, effec(kills, deaths), accuracy(shots, hits));

                        SQL_NextRow(query);
                }
        }

        show_motd(id, motdData, topName);

        return PLUGIN_HANDLED;
}

public cmd_time(id)
{
        if (!timeEnabled) return PLUGIN_CONTINUE;

        new queryData[192], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE time > %i ORDER BY time DESC) b", playerStats[id][TIME] + get_user_time(id));

        SQL_ThreadQuery(sql, "show_time", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_time(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Time SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1), seconds = (playerStats[id][TIME] + get_user_time(id)), minutes, hours;

        while (seconds >= 60) {
                seconds -= 60;
                minutes++;
        }

        while (minutes >= 60) {
                minutes -= 60;
                hours++;
        }

        client_print_color(id, id, "* Spedziles na serwerze lacznie^x04 %i h %i min %i s^x01. *", hours, minutes, seconds);
        client_print_color(id, id, "* Zajmujesz^x03 %i^x01 na^x03 %i^x01 miejsce w rankingu czasu gry. *", rank, players);

        return PLUGIN_HANDLED;
}

public cmd_time_admin(id)
{
        if (!(get_user_flags(id) & ADMIN_BAN) || !timeEnabled) return PLUGIN_CONTINUE;

        new queryData[128], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT name, time FROM `ultimate_stats` WHERE admin = 1 ORDER BY time DESC");

        SQL_ThreadQuery(sql, "show_time_admin", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_time_admin(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Time Admin SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], motdLength, place, seconds, minutes, hours;

        motdLength = 0, place = 0;

        new id = playerId[0];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %9s^n", "#", "Nick", "Czas Gry");

        while (SQL_MoreResults(query)) {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                seconds = SQL_ReadResult(query, 1);
                minutes = 0;
                hours = 0;

                while (seconds >= 60) {
                        seconds -= 60;
                        minutes++;
                }

                while (minutes >= 60) {
                        minutes -= 60;
                        hours++;
                }

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %0ih %1imin %1is^n", place, name, hours, minutes, seconds);

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Czas Gry Adminow");

        return PLUGIN_HANDLED;
}

public cmd_time_top15(id)
{
        if (!timeEnabled) return PLUGIN_CONTINUE;

        new queryData[128], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT name, time FROM `ultimate_stats` ORDER BY time DESC LIMIT 15");

        SQL_ThreadQuery(sql, "show_time_top15", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_time_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Time Top15 SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], motdLength, place, seconds, minutes, hours;

        motdLength = 0, place = 0;

        new id = playerId[0];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %9s^n", "#", "Nick", "Czas Gry");

        while (SQL_MoreResults(query)) {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                seconds = SQL_ReadResult(query, 1);
                minutes = 0;
                hours = 0;

                while (seconds >= 60) {
                        seconds -= 60;
                        minutes++;
                }

                while (minutes >= 60) {
                        minutes -= 60;
                        hours++;
                }

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %0ih %1imin %1is^n", place, name, hours, minutes, seconds);

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Top15 Czasu Gry");

        return PLUGIN_HANDLED;
}

public cmd_skill(id)
{
        if (!skillEnabled) return PLUGIN_CONTINUE;

        new queryData[192], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE skill > %f ORDER BY time DESC) b", playerStats[id][SKILL]);

        SQL_ThreadQuery(sql, "show_skill", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_skill(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Skill SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1);

        client_print_color(id, id, "* Aktualnie posiadasz^x04 %.2f^x01 skilla (punktow ELO). *", playerStats[id][SKILL]);
        client_print_color(id, id, "* Zajmujesz^x03 %i^x01 na^x03 %i^x01 miejsce w rankingu skilla. *", rank, players);

        return PLUGIN_HANDLED;
}

public cmd_skill_top15(id)
{
        if (!skillEnabled) return PLUGIN_CONTINUE;

        new queryData[128], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT name, skill FROM `ultimate_stats` ORDER BY skill DESC LIMIT 15");

        SQL_ThreadQuery(sql, "show_skill_top15", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_skill_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Skill Top15 SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], Float:elo, motdLength, place;

        motdLength = 0, place = 0;

        new id = playerId[0];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %9s^n", "#", "Nick", "Skill (ELO)");

        while (SQL_MoreResults(query)) {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));
                SQL_ReadResult(query, 1, elo);

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %.2f^n", place, name, elo);

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Top15 Skilla");

        return PLUGIN_HANDLED;
}

public cmd_topstats(id)
{
        new queryData[192], playerId[1];

        playerId[0] = id;

        playerStats[id][CURRENT_STATS] = playerStats[id][CURRENT_KILLS] * 2 + playerStats[id][CURRENT_HS] - playerStats[id][CURRENT_DEATHS] * 2;

        formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE best_stats > %i ORDER BY `best_stats` DESC) b",
        playerStats[id][CURRENT_STATS] > playerStats[id][BEST_STATS] ? playerStats[id][CURRENT_STATS] : playerStats[id][BEST_STATS]);

        SQL_ThreadQuery(sql, "show_topstats", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_topstats(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "TopStats SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1);

        if (playerStats[id][CURRENT_STATS] > playerStats[id][BEST_STATS]) client_print_color(id, id, "* Twoje najlepsze staty to^x03 %i^x01 zabic (w tym^x03 %i^x01 z HS) i^x03 %i^x01 zgonow^x01. *", playerStats[id][CURRENT_KILLS], playerStats[id][CURRENT_HS], playerStats[id][CURRENT_DEATHS]);
        else client_print_color(id, id, "* Twoje najlepsze staty to^x03 %i^x01 zabic (w tym^x03 %i^x01 z HS) i^x03 %i^x01 zgonow^x01. *", playerStats[id][BEST_KILLS], playerStats[id][BEST_HS], playerStats[id][BEST_DEATHS]);

        client_print_color(id, id, "* Zajmujesz^x03 %i^x01 na^x03  %i^x01 miejsce w rankingu najlepszych statystyk. *", rank, players);

        return PLUGIN_HANDLED;
}

public cmd_topstats_top15(id)
{
        new queryData[128], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT name, best_kills, best_hs, best_deaths FROM `ultimate_stats` ORDER BY best_stats DESC LIMIT 15");

        SQL_ThreadQuery(sql, "show_topstats_top15", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_topstats_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "TopStats Top15 SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], motdLength, place, kills, headShots, deaths;

        motdLength = 0, place = 0;

        new id = playerId[0];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %19s %4s^n", "#", "Nick", "Zabojstwa", "Zgony");

        while (SQL_MoreResults(query))
        {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                kills = SQL_ReadResult(query, 1);
                headShots = SQL_ReadResult(query, 2);
                deaths = SQL_ReadResult(query, 3);

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %1d (%i HS) %12d^n", place, name, kills, headShots, deaths);

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Top15 Statystyk");

        return PLUGIN_HANDLED;
}

public cmd_medals(id)
{
        if (!medalsEnabled) return PLUGIN_CONTINUE;

        new queryData[192], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE medals > %i ORDER BY `medals` DESC) b", playerStats[id][MEDALS]);

        SQL_ThreadQuery(sql, "show_medals", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_medals(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Medals SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1);

        client_print_color(id, id, "* Twoje medale:^x04 %i Zlote^x01,^x04 %i Srebre^x01,^x04 %i Brazowe^x01. *", playerStats[id][GOLD], playerStats[id][SILVER], playerStats[id][BRONZE]);
        client_print_color(id, id, "* Zajmujesz^x03 %i^x01 na^x03 %i^x01 miejsce w rankingu medalowym. *", rank, players);

        return PLUGIN_HANDLED;
}

public cmd_medals_top15(id)
{
        if (!medalsEnabled) return PLUGIN_CONTINUE;

        new queryData[128], playerId[1];

        playerId[0] = id;

        formatex(queryData, charsmax(queryData), "SELECT name, gold, silver, bronze, medals FROM `ultimate_stats` ORDER BY medals DESC LIMIT 15");

        SQL_ThreadQuery(sql, "show_medals_top15", queryData, playerId, sizeof(playerId));

        return PLUGIN_HANDLED;
}

public show_medals_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Medals Top15 SQL Error: %s (%d)", error, errorNum);

                return PLUGIN_HANDLED;
        }

        static motdData[2048], name[32], motdLength, place, gold, silver, bronze, medals;

        motdLength = 0, place = 0;

        new id = playerId[0];

        motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
        motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %6s %8s %8s %5s^n", "#", "Nick", "Zlote", "Srebrne", "Brazowe", "Suma");

        while (SQL_MoreResults(query)) {
                place++;

                SQL_ReadResult(query, 0, name, charsmax(name));

                replace_all(name, charsmax(name), "<", "");
                replace_all(name, charsmax(name), ">", "");

                gold = SQL_ReadResult(query, 1);
                silver = SQL_ReadResult(query, 2);
                bronze = SQL_ReadResult(query, 3);
                medals = SQL_ReadResult(query, 4);

                motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %2d %7d %8d %7d^n", place, name, gold, silver, bronze, medals);

                SQL_NextRow(query);
        }

        show_motd(id, motdData, "Top15 Medali");

        return PLUGIN_HANDLED;
}

public cmd_sounds(id)
{
        if (!soundsEnabled) return PLUGIN_HANDLED;

        new menuData[64], menu = menu_create("\yUstawienia \rDzwiekow\w:", "cmd_sounds_handle");

        formatex(menuData, charsmax(menuData), "\wThe Force Will Be With You \w[\r%s\w]", get_bit(id, soundMayTheForce) ? "Wlaczony" : "Wylaczony");
        menu_additem(menu, menuData);

        formatex(menuData, charsmax(menuData), "\wI Am The One And Only \w[\r%s\w]", get_bit(id, soundOneAndOnly) ? "Wlaczony" : "Wylaczony");
        menu_additem(menu, menuData);

        formatex(menuData, charsmax(menuData), "\wDziabnal Mnie \w[\r%s\w]", get_bit(id, soundHumiliation) ? "Wlaczony" : "Wylaczony");
        menu_additem(menu, menuData);

        formatex(menuData, charsmax(menuData), "\wKici Kici Tas Tas \w[\r%s\w]", get_bit(id, soundLastLeft) ? "Wlaczony" : "Wylaczony");
        menu_additem(menu, menuData);

        formatex(menuData, charsmax(menuData), "\wNie Obijac Sie \w[\r%s\w]", get_bit(id, soundPrepare) ? "Wlaczony" : "Wylaczony");
        menu_additem(menu, menuData);

        menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");

        menu_display(id, menu);

        return PLUGIN_HANDLED;
}

public cmd_sounds_handle(id, menu, item)
{
        if (!is_user_connected(id)) return PLUGIN_HANDLED;

        if (item == MENU_EXIT) {
                menu_destroy(menu);

                return PLUGIN_HANDLED;
        }

        switch (item) {
                case 0: get_bit(id, soundMayTheForce) ? rem_bit(id, soundMayTheForce) : set_bit(id, soundMayTheForce);
                case 1: get_bit(id, soundOneAndOnly) ? rem_bit(id, soundOneAndOnly) : set_bit(id, soundOneAndOnly);
                case 2: get_bit(id, soundHumiliation) ? rem_bit(id, soundHumiliation) : set_bit(id, soundHumiliation);
                case 3: get_bit(id, soundLastLeft) ? rem_bit(id, soundLastLeft) : set_bit(id, soundLastLeft);
                case 4: get_bit(id, soundPrepare) ? rem_bit(id, soundPrepare) : set_bit(id, soundPrepare);
        }

        save_sounds(id);

        cmd_sounds(id);

        menu_destroy(menu);

        return PLUGIN_HANDLED;
}

public weapons_top15_handle(id)
{
        if (!top15Enabled) return PLUGIN_CONTINUE;

        static message[32], command[32], weaponName[32];

        read_argv(1, message, charsmax(message));
        trim(message);

        if (message[0] != '/') return PLUGIN_CONTINUE;

        for (new i = 1; i < WEAPONS_END; i++) {
                if (i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) continue;

                get_weaponname(i, weaponName, charsmax(weaponName));

                if (i == CSW_HEGRENADE) replace_all(weaponName, charsmax(weaponName), "hegrenade", "he");
                else if (i == CSW_UMP45) replace_all(weaponName, charsmax(weaponName), "mp5navy", "mp5");
                else if (i == CSW_MP5NAVY) replace_all(weaponName, charsmax(weaponName), "ump45", "ump");

                replace_all(weaponName, charsmax(weaponName), "weapon_", "");

                formatex(command, charsmax(command), "/%stop15", weaponName);

                if (equali(message, command)) {
                        cmd_weapon_top15(id, i);

                        return PLUGIN_HANDLED;
                }
        }

        return PLUGIN_CONTINUE;
}

public sql_init()
{
        new error[128], errorNum;

        sql = SQL_MakeDbTuple(sqlHost, sqlUser, sqlPassword, sqlDatabase);

        connection = SQL_Connect(sql, errorNum, error, charsmax(error));

        if (errorNum) {
                log_to_file("ultimate_stats.log", "SQL Query Error: %s", error);

                return;
        }

        new queryData[2048];

        formatex(queryData, charsmax(queryData), "CREATE TABLE IF NOT EXISTS `ultimate_stats` (`id` INT(11) AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, `steamid` VARCHAR(32) NOT NULL, `ip` VARCHAR(16) NOT NULL, `admin` INT NOT NULL DEFAULT 0, `kills` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`deaths` INT NOT NULL DEFAULT 0, `hs_kills` INT NOT NULL DEFAULT 0, `assists` INT NOT NULL DEFAULT 0, `revenges` INT NOT NULL DEFAULT 0, `team_kills` INT NOT NULL DEFAULT 0, `shots` INT NOT NULL DEFAULT 0, `hits` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`damage` INT NOT NULL DEFAULT 0, `rounds` INT NOT NULL DEFAULT 0, `rounds_ct` INT NOT NULL DEFAULT 0, `rounds_t` INT NOT NULL DEFAULT 0, `wins_ct` INT NOT NULL DEFAULT 0, `wins_t` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`connects` INT NOT NULL DEFAULT 0, `time` INT NOT NULL DEFAULT 0, `gold` INT NOT NULL DEFAULT 0, `silver` INT NOT NULL DEFAULT 0, `bronze` INT NOT NULL DEFAULT 0, `medals` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`best_kills` INT NOT NULL DEFAULT 0, `best_deaths` INT NOT NULL DEFAULT 0, `best_hs` INT NOT NULL DEFAULT 0, `best_stats` INT NOT NULL DEFAULT 0, `defusions` INT NOT NULL DEFAULT 0, `defused` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`planted` INT NOT NULL DEFAULT 0, `exploded` INT NOT NULL DEFAULT 0, `skill` DOUBLE NOT NULL DEFAULT 100, `h_0` INT NOT NULL DEFAULT 0, `h_1` INT NOT NULL DEFAULT 0, `h_2` INT NOT NULL DEFAULT 0, `h_3` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`h_4` INT NOT NULL DEFAULT 0, `h_5` INT NOT NULL DEFAULT 0, `h_6` INT NOT NULL DEFAULT 0, `h_7` INT NOT NULL DEFAULT 0, `first_visit` BIGINT NOT NULL DEFAULT 0, `last_visit` BIGINT NOT NULL DEFAULT 0,  PRIMARY KEY(`id`), UNIQUE KEY `name` (`name`));");

        new Handle:query = SQL_PrepareQuery(connection, queryData);

        SQL_Execute(query);

        formatex(queryData, charsmax(queryData), "CREATE TABLE IF NOT EXISTS `ultimate_stats_weapons` (`player_id` INT(11), `weapon` VARCHAR(32) NOT NULL, `kills` INT NOT NULL DEFAULT 0, `deaths` INT NOT NULL DEFAULT 0, `hs_kills` INT NOT NULL DEFAULT 0, `team_kills` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`shots` INT NOT NULL DEFAULT 0, `hits` INT NOT NULL DEFAULT 0, `damage` INT NOT NULL DEFAULT 0, `h_0` INT NOT NULL DEFAULT 0, `h_1` INT NOT NULL DEFAULT 0, `h_2` INT NOT NULL DEFAULT 0, ");
        add(queryData,  charsmax(queryData), "`h_3` INT NOT NULL DEFAULT 0, `h_4` INT NOT NULL DEFAULT 0, `h_5` INT NOT NULL DEFAULT 0, `h_6` INT NOT NULL DEFAULT 0, `h_7` INT NOT NULL DEFAULT 0, PRIMARY KEY(`player_id`, `weapon`));");

        query = SQL_PrepareQuery(connection, queryData);

        SQL_Execute(query);

        formatex(queryData, charsmax(queryData), "SELECT COUNT(*) FROM `ultimate_stats`");

        query = SQL_PrepareQuery(connection, queryData);

        SQL_Execute(query);

        if (SQL_NumResults(query)) statsNum = SQL_ReadResult(query, 0);

        SQL_FreeHandle(query);

        sqlConnection = true;
}

public ignore_handle(failState, Handle:query, error[], errorCode, data[], dataSize)
{
        if (failState == TQUERY_CONNECT_FAILED) log_to_file("ultimate_stats.log", "Could not connect to SQL database. [%d] %s", errorCode, error);
        else if (failState == TQUERY_QUERY_FAILED) log_to_file("ultimate_stats.log", "Query failed. [%d] %s", errorCode, error);
}

public load_stats(id)
{
        id -= TASK_LOAD;

        if (!sqlConnection) {
                set_task(1.0, "load_stats", id + TASK_LOAD);

                return;
        }

        get_user_name(id, playerStats[id][NAME], charsmax(playerStats[][NAME]));
        get_user_authid(id, playerStats[id][STEAMID], charsmax(playerStats[][STEAMID]));
        get_user_ip(id, playerStats[id][IP], charsmax(playerStats[][IP]), 1);

        sql_safe_string(playerStats[id][NAME], playerStats[id][SAFE_NAME], charsmax(playerStats[][SAFE_NAME]));

        new playerId[1], queryData[256], queryTemp[96];

        playerId[0] = id;

        get_rank_formula(queryTemp, charsmax(queryTemp));

        formatex(queryData, charsmax(queryData), "SELECT a.*, (SELECT COUNT(*) FROM `ultimate_stats` WHERE %s) + 1 AS `rank` FROM `ultimate_stats` a WHERE ", queryTemp);

        switch (rankSaveType) {
                case 0: formatex(queryTemp, charsmax(queryTemp), "`name` = ^"%s^"", playerStats[id][SAFE_NAME]);
                case 1: formatex(queryTemp, charsmax(queryTemp), "`steamid` = ^"%s^"", playerStats[id][STEAMID]);
                case 2: formatex(queryTemp, charsmax(queryTemp), "`ip` = ^"%s^"", playerStats[id][IP]);
        }

        add(queryData, charsmax(queryData), queryTemp);

        SQL_ThreadQuery(sql, "load_stats_handle", queryData, playerId, sizeof(playerId));
}

public load_stats_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Load SQL Error: %s (%d)", error, errorNum);

                return;
        }

        new id = playerId[0];

        if (SQL_NumResults(query)) {
                playerStats[id][PLAYER_ID] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "id"));
                playerStats[id][STATS_KILLS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "kills"));
                playerStats[id][STATS_DEATHS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "deaths"));
                playerStats[id][STATS_HS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hs_kills"));
                playerStats[id][STATS_TK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "team_kills"));
                playerStats[id][STATS_SHOTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "shots"));
                playerStats[id][STATS_HITS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hits"));
                playerStats[id][STATS_DAMAGE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "damage"));
                playerStats[id][STATS_RANK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rank"));
                playerStats[id][HIT_GENERIC] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_0"));
                playerStats[id][HIT_HEAD] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_1"));
                playerStats[id][HIT_CHEST] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_2"));
                playerStats[id][HIT_STOMACH] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_3"));
                playerStats[id][HIT_LEFTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_4"));
                playerStats[id][HIT_RIGHTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_5"));
                playerStats[id][HIT_LEFTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_6"));
                playerStats[id][HIT_RIGHTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_7"));
                playerStats[id][BOMB_DEFUSIONS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "defusions"));
                playerStats[id][BOMB_DEFUSED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "defused"));
                playerStats[id][BOMB_PLANTED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "planted"));
                playerStats[id][BOMB_EXPLODED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "exploded"));
                playerStats[id][ROUNDS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rounds"));
                playerStats[id][ROUNDS_CT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rounds_ct"));
                playerStats[id][ROUNDS_T] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rounds_t"));
                playerStats[id][WIN_CT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "wins_ct"));
                playerStats[id][WIN_T] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "wins_t"));
                playerStats[id][TIME] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "time"));
                playerStats[id][CONNECTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "connects"));
                playerStats[id][ASSISTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "assists"));
                playerStats[id][REVENGES] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "revenges"));
                playerStats[id][BRONZE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "bronze"));
                playerStats[id][SILVER] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "silver"));
                playerStats[id][GOLD] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "gold"));
                playerStats[id][MEDALS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "medals"));
                playerStats[id][BEST_STATS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_stats"));
                playerStats[id][BEST_KILLS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_kills"));
                playerStats[id][BEST_HS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_hs"));
                playerStats[id][BEST_DEATHS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_deaths"));
                playerStats[id][FIRST_VISIT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "first_visit"));
                playerStats[id][LAST_VISIT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "last_visit"));

                SQL_ReadResult(query, SQL_FieldNameToNum(query, "skill"), playerStats[id][SKILL]);
        } else {
                statsNum++;

                new queryData[256];

                formatex(queryData, charsmax(queryData), "INSERT IGNORE INTO `ultimate_stats` (`name`, `steamid`, `ip`, `first_visit`) VALUES (^"%s^", '%s', '%s', UNIX_TIMESTAMP())", playerStats[id][SAFE_NAME], playerStats[id][STEAMID], playerStats[id][IP]);

                SQL_ThreadQuery(sql, "ignore_handle", queryData);

                get_rank(id);
        }

        set_bit(id, statsLoaded);

        set_task(0.1, "load_weapons_stats", id + TASK_LOAD);
}

public get_rank(id)
{
        new queryData[256], queryTemp[96], playerId[1];

        playerId[0] = id;

        get_rank_formula(queryTemp, charsmax(queryTemp));

        formatex(queryData, charsmax(queryData), "SELECT (SELECT COUNT(*) FROM `ultimate_stats` WHERE %s) + 1 AS `rank` FROM `ultimate_stats` a WHERE ", queryTemp);

        switch (rankSaveType) {
                case 0: formatex(queryTemp, charsmax(queryTemp), "name = ^"%s^"", playerStats[id][SAFE_NAME]);
                case 1: formatex(queryTemp, charsmax(queryTemp), "steamid = ^"%s^"", playerStats[id][STEAMID]);
                case 2: formatex(queryTemp, charsmax(queryTemp), "ip = ^"%s^"", playerStats[id][IP]);
        }

        add(queryData, charsmax(queryData), queryTemp);

        SQL_ThreadQuery(sql, "get_rank_handle", queryData, playerId, sizeof(playerId));
}

public get_rank_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Get Rank SQL Error: %s (%d)", error, errorNum);

                return;
        }

        new id = playerId[0];

        if (SQL_NumResults(query)) playerStats[id][STATS_RANK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rank"));
}

public load_weapons_stats(id)
{
        id -= TASK_LOAD;

        new queryData[256], queryTemp[96], playerId[1];

        playerId[0] = id;

        if (!playerStats[id][PLAYER_ID]) playerStats[id][PLAYER_ID] = get_player_id(id);

        if (!playerStats[id][PLAYER_ID]) {
                set_task(0.5, "load_weapons_stats", id + TASK_LOAD);

                return;
        }

        get_rank_formula(queryTemp, charsmax(queryTemp));

        formatex(queryData, charsmax(queryData), "SELECT a.*, (SELECT COUNT(*) FROM `ultimate_stats_weapons` WHERE %s AND weapon = a.weapon) + 1 AS `rank` FROM `ultimate_stats_weapons` a WHERE `player_id` = '%i'", queryTemp, playerStats[id][PLAYER_ID]);

        SQL_ThreadQuery(sql, "load_weapons_stats_handle", queryData, playerId, sizeof(playerId));
}

public load_weapons_stats_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
{
        if (failState) {
                log_to_file("ultimate_stats.log", "Load Weapons SQL Error: %s (%d)", error, errorNum);

                return;
        }

        new id = playerId[0], weaponName[32], weapon, ret;

        while (SQL_MoreResults(query)) {
                SQL_ReadResult(query, SQL_FieldNameToNum(query, "weapon"), weaponName, charsmax(weaponName));

                weapon = get_weaponid(weaponName);

                playerWStats[id][weapon][STATS_KILLS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "kills"));
                playerWStats[id][weapon][STATS_DEATHS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "deaths"));
                playerWStats[id][weapon][STATS_TK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "team_kills"));
                playerWStats[id][weapon][STATS_HS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hs_kills"));
                playerWStats[id][weapon][STATS_SHOTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "shots"));
                playerWStats[id][weapon][STATS_HITS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hits"));
                playerWStats[id][weapon][STATS_DAMAGE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "damage"));
                playerWStats[id][weapon][STATS_RANK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rank"));
                playerWStats[id][weapon][HIT_GENERIC] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_0"));
                playerWStats[id][weapon][HIT_HEAD] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_1"));
                playerWStats[id][weapon][HIT_CHEST] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_2"));
                playerWStats[id][weapon][HIT_STOMACH] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_3"));
                playerWStats[id][weapon][HIT_LEFTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_4"));
                playerWStats[id][weapon][HIT_RIGHTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_5"));
                playerWStats[id][weapon][HIT_LEFTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_6"));
                playerWStats[id][weapon][HIT_RIGHTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_7"));

                SQL_NextRow(query);
        }

        set_bit(id, weaponStatsLoaded);

        ExecuteForward(statsForwards[FORWARD_LOADED], ret, id);
}

stock save_stats(id, type = 0)
{
        if (!get_bit(id, statsLoaded)) return;

        new queryData[2048], queryTemp[256];

        formatex(queryData, charsmax(queryData), "UPDATE `ultimate_stats` SET name = ^"%s^", steamid = ^"%s^", ip = ^"%s^", admin = %d, kills = %d, deaths = %d, hs_kills = %d, ",
        playerStats[id][SAFE_NAME], playerStats[id][STEAMID], playerStats[id][IP], playerStats[id][ADMIN], playerStats[id][STATS_KILLS], playerStats[id][STATS_DEATHS], playerStats[id][STATS_HS]);

        formatex(queryTemp, charsmax(queryTemp), "assists = %d, revenges = %d, team_kills = %d, shots = %d, hits = %d, damage = %d, rounds = %d, rounds_ct = %d, rounds_t = %d, ",
        playerStats[id][ASSISTS], playerStats[id][REVENGES], playerStats[id][STATS_TK], playerStats[id][STATS_SHOTS], playerStats[id][STATS_HITS], playerStats[id][STATS_DAMAGE], playerStats[id][ROUNDS], playerStats[id][ROUNDS_CT], playerStats[id][ROUNDS_T]);
        add(queryData, charsmax(queryData), queryTemp);

        formatex(queryTemp, charsmax(queryTemp), "wins_ct = %d, wins_t = %d, connects = %d, time = %d, defusions = %d, defused = %d, planted = %d, exploded = %d, ",
        playerStats[id][WIN_CT], playerStats[id][WIN_T], playerStats[id][CONNECTS], playerStats[id][TIME] + get_user_time(id), playerStats[id][BOMB_DEFUSIONS], playerStats[id][BOMB_DEFUSED], playerStats[id][BOMB_PLANTED], playerStats[id][BOMB_EXPLODED]);
        add(queryData, charsmax(queryData), queryTemp);

        formatex(queryTemp, charsmax(queryTemp), "skill = %.2f, h_0 = %d, h_1 = %d, h_2 = %d, h_3 = %d, h_4 = %d, h_5 = %d, h_6 = %d, h_7 = %d, last_visit = UNIX_TIMESTAMP()",
        playerStats[id][SKILL], playerStats[id][HIT_GENERIC], playerStats[id][HIT_HEAD], playerStats[id][HIT_CHEST], playerStats[id][HIT_STOMACH], playerStats[id][HIT_RIGHTARM], playerStats[id][HIT_LEFTARM], playerStats[id][HIT_RIGHTLEG], playerStats[id][HIT_LEFTLEG]);
        add(queryData, charsmax(queryData), queryTemp);

        playerStats[id][CURRENT_STATS] = playerStats[id][CURRENT_KILLS] * 2 + playerStats[id][CURRENT_HS] - playerStats[id][CURRENT_DEATHS] * 2;

        if (playerStats[id][CURRENT_STATS] > playerStats[id][BEST_STATS]) {
                formatex(queryTemp, charsmax(queryTemp), ", best_stats = %d, best_kills = %d, best_hs = %d, best_deaths = %d",
                playerStats[id][CURRENT_STATS], playerStats[id][CURRENT_KILLS], playerStats[id][CURRENT_HS], playerStats[id][CURRENT_DEATHS]);
                add(queryData, charsmax(queryData), queryTemp);
        }

        new medals = playerStats[id][GOLD] * 3 + playerStats[id][SILVER] * 2 + playerStats[id][BRONZE];

        if (medals > playerStats[id][MEDALS]) {
                formatex(queryTemp, charsmax(queryTemp), ", gold = %d, silver = %d, bronze = %d, medals = '%d'",
                playerStats[id][GOLD], playerStats[id][SILVER], playerStats[id][BRONZE], medals);
                add(queryData, charsmax(queryData), queryTemp);
        }

        switch(rankSaveType) {
                case 0: formatex(queryTemp, charsmax(queryTemp), " WHERE name = ^"%s^"", playerStats[id][SAFE_NAME]);
                case 1: formatex(queryTemp, charsmax(queryTemp), " WHERE steamid = ^"%s^"", playerStats[id][STEAMID]);
                case 2: formatex(queryTemp, charsmax(queryTemp), " WHERE ip = ^"%s^"", playerStats[id][IP]);
        }

        add(queryData, charsmax(queryData), queryTemp);

        if (type == MAP_END) {
                static error[128], errorNum, Handle:query;

                query = SQL_PrepareQuery(connection, queryData);

                if (!SQL_Execute(query)) {
                        errorNum = SQL_QueryError(query, error, charsmax(error));

                        log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
                }

                SQL_FreeHandle(query);
        } else SQL_ThreadQuery(sql, "ignore_handle", queryData);

        if (type == ROUND) get_rank(id);
        else if (type > ROUND) rem_bit(id, statsLoaded);

        save_weapons_stats(id, type);
}

stock save_weapons_stats(id, type = 0)
{
        if (!get_bit(id, weaponStatsLoaded)) return;

        new queryData[4096], queryTemp[512], weaponName[32];
        queryData = "";

        for (new i = 1; i < WEAPONS_END; i++) {
                if ((i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) || (!playerWRStats[id][i][STATS_SHOTS] && !playerWRStats[id][i][STATS_DEATHS])) continue;

                get_weaponname(i, weaponName, charsmax(weaponName));

                formatex(queryTemp, charsmax(queryTemp), "INSERT INTO `ultimate_stats_weapons` VALUES (%d, '%s', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d) ON DUPLICATE KEY UPDATE kills = %d, deaths = %d, hs_kills = %d, team_kills = %d, shots = %d, hits = %d, damage = %d, h_0 = %d, h_1 = %d, h_2 = %d, h_3 = %d, h_4 = %d, h_5 = %d, h_6 = %d, h_7 = %d; ",
                playerStats[id][PLAYER_ID], weaponName, playerWStats[id][i][STATS_KILLS], playerWStats[id][i][STATS_DEATHS], playerWStats[id][i][STATS_HS], playerWStats[id][i][STATS_TK], playerWStats[id][i][STATS_SHOTS], playerWStats[id][i][STATS_HITS], playerWStats[id][i][STATS_DAMAGE], playerWStats[id][i][HIT_GENERIC], playerWStats[id][i][HIT_HEAD], playerWStats[id][i][HIT_CHEST],
                playerWStats[id][i][HIT_STOMACH], playerWStats[id][i][HIT_LEFTARM], playerWStats[id][i][HIT_RIGHTARM], playerWStats[id][i][HIT_LEFTLEG], playerWStats[id][i][HIT_RIGHTLEG], playerWStats[id][i][STATS_KILLS], playerWStats[id][i][STATS_DEATHS], playerWStats[id][i][STATS_HS], playerWStats[id][i][STATS_TK], playerWStats[id][i][STATS_SHOTS], playerWStats[id][i][STATS_HITS],
                playerWStats[id][i][STATS_DAMAGE], playerWStats[id][i][HIT_GENERIC], playerWStats[id][i][HIT_HEAD], playerWStats[id][i][HIT_CHEST], playerWStats[id][i][HIT_STOMACH], playerWStats[id][i][HIT_LEFTARM], playerWStats[id][i][HIT_RIGHTARM], playerWStats[id][i][HIT_LEFTLEG], playerWStats[id][i][HIT_RIGHTLEG]);

                add(queryData, charsmax(queryData), queryTemp);
        }

        if (queryData[0]) {
                if (type == MAP_END) {
                        static error[128], errorNum, Handle:query;

                        query = SQL_PrepareQuery(connection, queryData);

                        if (!SQL_Execute(query)) {
                                errorNum = SQL_QueryError(query, error, charsmax(error));

                                log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
                        }

                        SQL_FreeHandle(query);
                } else SQL_ThreadQuery(sql, "ignore_handle", queryData);
        }

        if (type > ROUND) {
                rem_bit(id, weaponStatsLoaded);

                clear_stats(id);
        }
}

public load_sounds(id)
{
        if (!soundsEnabled) return;

        new vaultKey[64], vaultData[16], soundsData[5][5];

        formatex(vaultKey, charsmax(vaultKey), "%s-sounds", playerStats[id][NAME]);

        if (nvault_get(sounds, vaultKey, vaultData, charsmax(vaultData))) {
                parse(vaultData, soundsData[0], charsmax(soundsData), soundsData[1], charsmax(soundsData), soundsData[2], charsmax(soundsData), soundsData[3], charsmax(soundsData), soundsData[4], charsmax(soundsData));

                if (str_to_num(soundsData[0])) set_bit(id, soundMayTheForce);
                if (str_to_num(soundsData[1])) set_bit(id, soundOneAndOnly);
                if (str_to_num(soundsData[2])) set_bit(id, soundHumiliation);
                if (str_to_num(soundsData[3])) set_bit(id, soundPrepare);
                if (str_to_num(soundsData[4])) set_bit(id, soundLastLeft);
        }
}

public save_sounds(id)
{
        if (!soundsEnabled) return;

        new vaultKey[64], vaultData[16];

        formatex(vaultKey, charsmax(vaultKey), "%s-sounds", playerStats[id][NAME]);
        formatex(vaultData, charsmax(vaultData), "%d %d %d %d %d", get_bit(id, soundMayTheForce), get_bit(id, soundOneAndOnly), get_bit(id, soundHumiliation), get_bit(id, soundPrepare), get_bit(id, soundLastLeft));

        nvault_set(sounds, vaultKey, vaultData);
}

stock get_player_id(id)
{
        new queryData[128], error[128], Handle:query, errorNum, playerId;

        switch (rankSaveType) {
                case 0: formatex(queryData, charsmax(queryData), "SELECT id FROM `ultimate_stats` WHERE name = ^"%s^"", playerStats[id][SAFE_NAME]);
                case 1: formatex(queryData, charsmax(queryData), "SELECT id FROM `ultimate_stats` WHERE steamid = ^"%s^"", playerStats[id][STEAMID]);
                case 2: formatex(queryData, charsmax(queryData), "SELECT id FROM `ultimate_stats` WHERE ip = ^"%s^"", playerStats[id][IP]);
        }

        query = SQL_PrepareQuery(connection, queryData);

        if (SQL_Execute(query)) {
                if (SQL_NumResults(query)) playerId = SQL_ReadResult(query, 0);
        } else {
                errorNum = SQL_QueryError(query, error, charsmax(error));

                log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
        }

        SQL_FreeHandle(query);

        return playerId;
}

stock get_rank_formula(dest[], length, where = true)
{
        switch (rankFormula) {
                case FORMULA_KD: formatex(dest, length, "(a.kills - a.deaths - a.team_kills)%s", where ? " < (kills - deaths - team_kills)" : " DESC, a.kills DESC, a.hs_kills DESC");
                case FORMULA_KILLS: formatex(dest, length, "(a.kills)%s", where ? " < (kills)" : " DESC, a.kills, a.hs_kills DESC");
                case FORMULA_KILLS_HS: formatex(dest, length, "(a.kills + a.hs_kills)%s", where ? " < (kills + hs_kills)" : " DESC, a.kills, a.hs_kills DESC");
        }
}

stock clear_stats(player = 0, reset = 0)
{
        new limit = player ? player : MAX_PLAYERS;

        if (reset) {
                new queryData[128];

                formatex(queryData, charsmax(queryData), "DELETE FROM `ultimate_stats_weapons` WHERE player_id = '%i'", playerStats[player][PLAYER_ID]);

                SQL_ThreadQuery(sql, "ignore_handle", queryData);
        }

        if (player && !reset) {
                rem_bit(player, statsLoaded);
                rem_bit(player, weaponStatsLoaded);
                rem_bit(player, soundMayTheForce);
                rem_bit(player, soundOneAndOnly);
                rem_bit(player, soundHumiliation);
                rem_bit(player, soundLastLeft);
                rem_bit(player, soundPrepare);
                rem_bit(player, visit);
        }

        for (new id = player; id <= limit; id++) {
                playerStats[id][HUD_INFO] = false;

                if (player) playerStats[id][SKILL] = _:100.0;

                for (new i = HIT_GENERIC; i <= CURRENT_HS; i++) {
                        if (player) playerStats[id][i] = 0;
                        if (!reset) playerRStats[id][i] = 0;
                }

                for (new i = 0; i < WEAPONS_END; i++) {
                        for (new j = 0; j < STATS_END; j++) {
                                if (player) playerWStats[id][i][j] = 0;

                                playerWRStats[id][i][j] = 0;
                        }
                }

                for (new i = 0; i <= MAX_PLAYERS; i++) {
                        for (new j = 0; j < KILLER_END; j++) {
                                playerAStats[id][i][j] = 0;
                                playerVStats[id][i][j] = 0;
                        }
                }
        }

        if (reset) save_stats(player);
}

stock copy_stats(id, dest[], length, stats = 0, type = 0, weapon = 0, player = 0)
{
        for (new i = 0; i < length; i++) {
                switch (type) {
                        case STATS: dest[i] = playerStats[id][i + stats];
                        case ROUND_STATS: dest[i] = playerRStats[id][i + stats];
                        case WEAPON_STATS: dest[i] = playerWStats[id][weapon][i + stats];
                        case WEAPON_ROUND_STATS: dest[i] = playerWRStats[id][weapon][i + stats];
                        case ATTACKER_STATS: dest[i] = playerAStats[id][player][i + stats];
                        case VICTIM_STATS: dest[i] = playerVStats[id][player][i + stats];
                }
        }
}

stock Float:accuracy(shots, hits)
{
        if (!shots) return (0.0);

        return (100.0 * float(hits) / float(shots));
}

stock Float:effec(kills, deaths)
{
        if (!kills) return (0.0);

        return (100.0 * float(kills) / float(kills + deaths));
}

stock Float:distance(distance)
        return float(distance) * 0.0254;

stock get_loguser_index()
{
        new userLog[96], userName[32];

        read_logargv(0, userLog, charsmax(userLog));
        parse_loguser(userLog, userName, charsmax(userName));

        return get_user_index(userName);
}

stock sql_safe_string(const source[], dest[], length)
{
        copy(dest, length, source);

        replace_all(dest, length, "\\", "\\\\");
        replace_all(dest, length, "\0", "\\0");
        replace_all(dest, length, "\n", "\\n");
        replace_all(dest, length, "\r", "\\r");
        replace_all(dest, length, "\x1a", "\Z");
        replace_all(dest, length, "'", "\'");
        replace_all(dest, length, "`", "\`");
        replace_all(dest, length, "^"", "\^"");
}

stock cmd_execute(id, const text[], any:...)
{
        message_begin(MSG_ONE, SVC_DIRECTOR, _, id);
        write_byte(strlen(text) + 2);
        write_byte(10);
        write_string(text);
        message_end();

        #pragma unused text

        new message[256];

        format_args(message, charsmax(message), 1);

        message_begin(id == 0 ? MSG_ALL : MSG_ONE, 51, _, id);
        write_byte(strlen(message) + 2);
        write_byte(10);
        write_string(message);
        message_end();
}

public native_get_statsnum()
        return statsNum;

public native_get_stats(plugin, params)
{
        if (params < 5) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 5, passed %d.", params);

                return 0;
        } else if (params > 5 && params != 7) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 7, passed %d.", params);

                return 0;
        }

        new index = get_param(1);

        static queryData[256], error[128], queryTemp[96], name[32], steamId[32], stats[8], hits[8], Handle:query, errorNum;

        get_rank_formula(queryTemp, charsmax(queryTemp), false);

        formatex(queryData, charsmax(queryData), "SELECT kills, deaths, hs_kills, team_kills, shots, hits, damage, assists, h_0, h_1, h_2, h_3, h_4, h_5, h_6, h_7, name, steamid FROM `ultimate_stats` ORDER BY %s LIMIT %d, %d", queryTemp, index, index);

        query = SQL_PrepareQuery(connection, queryData);

        if (SQL_Execute(query)) {
                if (SQL_NumResults(query)) {
                        for (new i = 0; i < 8; i++) stats[i] = SQL_ReadResult(query, i);
                        for (new i = 0; i < 8; i++) hits[i] = SQL_ReadResult(query, i + 8);

                        SQL_ReadResult(query, SQL_FieldNameToNum(query, "name"), name, charsmax(name));
                        SQL_ReadResult(query, SQL_FieldNameToNum(query, "steamid"), steamId, charsmax(steamId));
                }
        } else {
                errorNum = SQL_QueryError(query, error, charsmax(error));

                log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
        }

        SQL_FreeHandle(query);

        set_array(2, stats, sizeof(stats));
        set_array(3, hits, sizeof(stats));

        set_string(4, name, charsmax(name));

        if (params == 5) set_string(4, steamId, charsmax(steamId));

        return max(0, index - 1);
}

public native_get_stats2(plugin, params)
{
        if (params < 5) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 5, passed %d.", params);

                return 0;
        } else if (params > 5 && params != 7) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 7, passed %d.", params);

                return 0;
        }

        new index = get_param(1);

        static queryData[192], error[128], queryTemp[96], steamId[32], objectives[4], Handle:query, errorNum;

        get_rank_formula(queryTemp, charsmax(queryTemp), false);

        formatex(queryData, charsmax(queryData), "SELECT defusions, defused, planted, exploded, steamid FROM `ultimate_stats` ORDER BY %s LIMIT %d, %d", queryTemp, index, index);

        query = SQL_PrepareQuery(connection, queryData);

        if (SQL_Execute(query)) {
                if (SQL_NumResults(query)) {
                        for (new i = 0; i < 4; i++) objectives[i] = SQL_ReadResult(query, i);

                        SQL_ReadResult(query, SQL_FieldNameToNum(query, "steamid"), steamId, charsmax(steamId));
                }
        } else {
                errorNum = SQL_QueryError(query, error, charsmax(error));

                log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
        }

        SQL_FreeHandle(query);

        set_array(2, objectives, sizeof(objectives));

        if (params == 3) set_string(3, steamId, charsmax(steamId));

        return max(0, index - 1);
}

public native_get_user_stats(plugin, params)
{
        if (params < 3) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 3, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        static stats[8], hits[8];

        copy_stats(id, hits, sizeof(hits), _, STATS);
        copy_stats(id, stats, sizeof(stats), HIT_END, STATS);

        set_array(2, stats, sizeof(stats));
        set_array(3, hits, sizeof(hits));

        return playerStats[id][STATS_RANK];
}

public native_get_user_stats2(plugin, params)
{
        if (params < 2) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 2, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        static objectives[4];

        copy_stats(id, objectives, sizeof(objectives), STATS_END, STATS);

        set_array(2, objectives, sizeof(objectives));

        return playerStats[id][STATS_RANK];
}

public native_get_user_rank(plugin, params)
{
        if (params < 1) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        return playerStats[id][STATS_RANK];
}

public native_get_user_wstats(plugin, params)
{
        if (params < 4) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);

                return 0;
        }

        new id = get_param(1), weapon = get_param(2);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        } else if (!is_weapon_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid weapon - %i.", weapon);

                return 0;
        }

        static stats[8], hits[8];

        copy_stats(id, hits, sizeof(hits), _, WEAPON_STATS, weapon);
        copy_stats(id, stats, charsmax(stats), HIT_END, WEAPON_STATS, weapon);

        set_array(3, stats, sizeof(stats));
        set_array(4, hits, sizeof(stats));

        return 1;
}

public native_get_user_rstats(plugin, params)
{
        if (params < 3) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 3, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        static stats[8], hits[8];

        copy_stats(id, hits, sizeof(hits), _, ROUND_STATS);
        copy_stats(id, stats, charsmax(stats), HIT_END, ROUND_STATS);

        set_array(2, stats, sizeof(stats));
        set_array(3, hits, sizeof(stats));

        return 1;
}

public native_get_user_wrstats(plugin, params)
{
        if (params < 4) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);

                return 0;
        }

        new id = get_param(1), weapon = get_param(2);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        } else if (!is_weapon_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid weapon - %i.", weapon);

                return 0;
        }

        static stats[8], hits[8];

        copy_stats(id, hits, sizeof(hits), _, WEAPON_ROUND_STATS, weapon);
        copy_stats(id, stats, charsmax(stats), HIT_END, WEAPON_ROUND_STATS, weapon);

        set_array(3, stats, sizeof(stats));
        set_array(4, hits, sizeof(stats));

        return 1;
}

public native_get_user_astats(plugin, params)
{
        if (params < 4) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);

                return 0;
        } else if (params > 4 && params < 6) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 6, passed %d.", params);

                return 0;
        }

        new id = get_param(1), player = get_param(2);

        if (!is_user_valid(id) || (!is_user_valid(player) && player != 0)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", is_user_valid(id) ? player : id);

                return 0;
        }

        static weaponName[32], stats[8], hits[8];

        copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, player);
        copy_stats(id, stats, sizeof(stats), HIT_END, ATTACKER_STATS, _, player);

        set_array(3, stats, sizeof(stats));
        set_array(4, hits, sizeof(hits));

        if (params > 4) {
                get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));

                set_string(5, weaponName, get_param(6));
        }

        return hits[HIT_GENERIC];
}

public native_get_user_vstats(plugin, params)
{
        if (params < 4) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);

                return 0;
        } else if (params > 4 && params < 6) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 6, passed %d.", params);

                return 0;
        }

        new id = get_param(1), player = get_param(2);

        if (!is_user_valid(id) || (!is_user_valid(player) && player != 0)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", is_user_valid(id) ? player : id);

                return 0;
        }

        static weaponName[32], stats[8], hits[8];

        copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, player);
        copy_stats(id, stats, sizeof(stats), HIT_END, VICTIM_STATS, _, player);

        set_array(3, stats, sizeof(stats));
        set_array(4, hits, sizeof(hits));

        if (params > 4) {
                get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));

                set_string(5, weaponName, get_param(6));
        }

        return hits[HIT_GENERIC];
}

public native_get_map_objectives(plugin, params)
{
        if (params != 0) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return 0;
        }

        enum  { MapObjective_Bomb = (1<<0), MapObjective_Hostage = (1<<1) };

        new const bombSites[][] = { "func_bomb_target", "info_bomb_target" };

        new bombSite = -1;

        for (new i = 0; i < sizeof bombSites; i++) {
                bombSite = find_ent_by_class(-1, bombSites[i]);

                if (bombSite != -1) {
                        return MapObjective_Bomb;
                }
        }

        new const hostZones[][] = { "func_hostage_rescue", "info_hostage_rescue" };

        new hostZone = -1;

        for (new i = 0; i < sizeof hostZones; i++) {
                hostZone = find_ent_by_class(-1, hostZones[i]);

                if (hostZone != -1) {
                        return MapObjective_Hostage;
                }
        }

        return 0;
}

public native_get_user_total_time(plugin, params)
{
        if (params < 1) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        return playerStats[id][TIME] + get_user_time(id);
}

public Float:native_get_user_elo(plugin, params)
{
        if (params < 1) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);

                return 0.0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0.0;
        }

        return playerStats[id][SKILL];
}

public native_add_user_elo(plugin, params)
{
        if (params < 2) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 2, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        playerStats[id][SKILL] += get_param_f(2);

        save_stats(id, NORMAL);

        return 1;
}

public native_reset_user_wstats(plugin, params)
{
        if (params != 1) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);

                return 0;
        }

        new id = get_param(1);

        if (!is_user_valid(id) || !is_user_connected(id)) {
                log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);

                return 0;
        }

        clear_stats(id, 1);

        return 1;
}

public native_not_supported(plugin, params)
{
        log_error(AMX_ERR_NATIVE, "Native not supported!");

        return 0;
}

public native_xmod_get_maxweapons(plugin, params)
{
        if (params != 0) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return 0;
        }

        return WEAPONS_END;
}

public native_xmod_get_stats_size(plugin, params)
{
        if (params != 0) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return 0;
        }

        return HIT_END;
}

public native_xmod_is_melee_wpn(plugin, params)
{
        if (params != 0) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return 0;
        }

        new weapon = get_param(1);

        if (weapon >= WEAPONS_END) {
                log_error(AMX_ERR_NATIVE, "Invalid weapon index.");

                return 0;
        }

        return weapon == CSW_KNIFE ? 1 : 0;
}

public native_xmod_is_custom_wpn(plugin, params)
{
        if (params != 1) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return 0;
        }

        return 0;
}

public native_xmod_get_wpnname(plugin, params)
{
        if (params != 0) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return;
        }

        new weapon = get_param(1);

        if (weapon >= WEAPONS_END) {
                log_error(AMX_ERR_NATIVE, "Invalid weapon index.");

                return;
        }

        static weaponName[32];

        get_weaponname(weapon, weaponName, charsmax(weaponName));

        replace(weaponName, charsmax(weaponName), "weapon_", "");

        set_string(2, weaponName, get_param(3));
}

public native_xmod_get_wpnlogname(plugin, params)
{
        if (params != 0) {
                log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);

                return;
        }

        new weapon = get_param(1);

        if (weapon >= WEAPONS_END) {
                log_error(AMX_ERR_NATIVE, "Invalid weapon index.");

                return;
        }

        static weaponName[32];

        get_weaponname(weapon, weaponName, charsmax(weaponName));

        set_string(2, weaponName, get_param(3));
}



All times are GMT -4. The time now is 02:55.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.