Официалният форум на iPlay.bg 

  • Плъгин за нова rank-system-а.

  • Искате да ви намерим определен плъгин, или пък да ви изработим такъв? Пишете тук!
Искате да ви намерим определен плъгин, или пък да ви изработим такъв? Пишете тук!
 #407678  от NOVAK_A_7
 нед яну 15, 2017 11:35 am
1.Ранксистема от такъв вид :

[Newbie] 0-150 xp
[Killer] 151-350 xp
[Pro] 351-700 xp
[Mega] 701-1200 xp
[Freak] 1201-2000 xp
[MAJOR] 2001-4000 xp
[COLONEL] 4001-7000 xp
[GENERAL] 70001-12000 xp
[ASSASSIN-IMMUNITY] 12001-20000 xp
[CONSIGLIERE-VIP] 20001 - 30000 xp
[THE BOSS-ADMIN] 30001-300000 xp

2.XP
Убийство: 1xp;
Убийство в главата: 2xp;
Убийство с граната: 2xp;
Убийство с нож: 4xp;

3.Искам да има HUD съобщение, вляво, горе, под радара със бял цвят, без да премигва, с подредба,
пример:
Rank: [NewBie]
XP: [0/50]

4.При вдигане на левел да изписва в чата само на играча, който е вдигнал левела.

5.Не искам админ префикси(достатъчни са така наредените звания).

6.Когато някой напише /showrank да, излиза ранка му и до колко килове ще е другия ранк!

7.По възможност да не бъгва плъгина, който блокира "/",и да няма съобщения за всеки "килл".

p.s. Подобни плъгини, но не с тази подредба, съм виждал в други сайтове. Моля, трябва ми amxx-файла, а не sma !
БЛАГОДАРЯ !
Последна промяна от NOVAK_A_7 на нед яну 15, 2017 8:56 pm, променено общо 2 пъти.
 #407687  от sムd?Yes?mムybe???
 нед яну 15, 2017 2:18 pm
Виж този показва им над главите ранговете, също е няква глезотийка - https://forums.alliedmods.net/showthread.php?t=171364
 #407693  от NOVAK_A_7
 нед яну 15, 2017 3:11 pm
Ми аз не съм много наясно като вас с това кое как е... Ще се опитам да го пробвам,
но мисля , че от сма-файла се вижда , че минаването от едно на други "ниво" е през някакви
си 20-30 "килл"-а.. А иначе , може да е интересен , сега ще видя и ще споделя...

Мда , наистина интересен и много добър плъгин( не товари..???) , можете ли обаче просто да ми го редактирате и пратите
само редактирания амхх-файл с фраговете които съм написал. Той също е на 12 "нива"мисля ?
А ако не е , кажете ми да променя нещо си там ...

p.s. Ми те за 20 минути игра в сървъра половината станаха "позлатени" :))) Много е готин но много моля ако може,
някой да го "настрои" с горепосочените стойности?
 #407696  от sムd?Yes?mムybe???
 нед яну 15, 2017 3:37 pm
memberlist.php?mode=viewprofile&u=1622 това е единия пичака, който може да го направи, това е другия memberlist.php?mode=viewprofile&u=1462 , те могат да ти помогнат със тази задачка.
 #407701  от NOVAK_A_7
 нед яну 15, 2017 3:54 pm
не знам аз опитах да го компилирам , но ми дава , че плъгина е с обхват до 1000 кила...
ЖАЛКО , ИНАЧЕ БЕ ИНТЕРЕСЕН :) Може да им хареса на "книферите"?
Но при мене не става :( Дано го направи OciXCrom™ ? за него съм сигурен , че ще е играчка :)
 #407733  от dbnZ ``
 пон яну 16, 2017 1:05 am
Код: Избери всички
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <colorchat>
#include <fvault>

#define MaxLevels 11
#define IsPlayer(%1) (1 <= %1 <=  g_iMaxPlayers)

#define CHAT_ACCESS ADMIN_ALL

new gMaxPlayers, gMsgSayText, syncObj, Level[11], eXP[11]
new ranks_hud, knife_xp, he_xp, hs_xp, kill_xp, kill_msg

new const g_vault_name[] = "levelsz";
//new const rprefix[]= "Ranks";
new iCvarPrefix;

new const Levels[MaxLevels] =
{
    0,
    150, 
    350,
    700,  
    1200,
    2000,
    4000,
    7000,
    12000,
    20000,
    30000,
}

new const Prefix[MaxLevels][] =
{
    "[Newbie]", 
    "[Killer]", 
    "[Pro]", 
    "[Mega]", 
    "[Freak]", 
    "[MAJOR]", 
    "[COLONEL]", 
    "[GENERAL]", 
    "[ASSASSIN-IMMUNITY]", 
    "[CONSIGLIERE-VIP]", 
    "[THE-BOSS-ADMIN]", 
}

public plugin_init()
{
register_plugin("RankSystem", "1.0a", "alt.nick")

register_event("DeathMsg","client_death","a")
register_clcmd("say", "hook_say")
register_clcmd("say_team", "hook_teamsay")

register_clcmd("say /rank", "cmdRank")
register_clcmd("say_team /rank", "cmdRank")


ranks_hud = register_cvar("ranks_hud", "1")     // Äàëè äà ñå ïîÿâÿâà õúä ïðè âëèçàíå â ñúðâúðà. Âêëþ÷åíî 1/0 Èçêëþ÷åíî
knife_xp = register_cvar("knife_xp", "4")     // Êîëêî ÕРäà äàâà çà óáèéñòâî ñ íîæ.
he_xp = register_cvar("he_xp", "2")        // Êîëêî ÕРäà äàâà çà óáèéñòâî ñ Granata (HE).
hs_xp = register_cvar("hs_xp", "2")        // Êîëêî ÕРäà äàâà çà óáèéñòâî ñ Headshot.
kill_xp = register_cvar("kill_xp", "1")        // Êîëêî ÕРäà äàâà çà íîðìàëíî óáèéñòâî.   
kill_msg = register_cvar("kill_msg", "1")    // Äàëè äà ïîêàçâà êîé ñòå óáèëè è êîëêî ÕРñòå ïîëó÷èëè. Âêëþ÷åíî 1/0 Èçêëþ÷åíî

register_concmd ("amx_give_xp", "CmdAddXP", ADMIN_LEVEL_A, "<nick | @ct | @t | @all> <xp>")

iCvarPrefix = register_cvar("amx_rank_prefix", "Ranks");

gMaxPlayers = get_maxplayers()
gMsgSayText = get_user_msgid("SayText")

syncObj     = CreateHudSyncObj()

fvault_load(g_vault_name)
}

public ShowHud(id)
{
set_hudmessage(185, 239, 251, -1.0, 0.01, 0, 6.0, 1.0, 0.0, 0.0, -1)
ShowSyncHudMsg(id, syncObj,"Rank: %s | XP: %i | Level: %i", Prefix[Level[id]], eXP[id], Level[id])
}

public client_putinserver(id)
{
if(get_pcvar_num(ranks_hud) == 1)
set_task(1.0, "ShowHud", id, _, _, "b")

if(Level[id] < MaxLevels-1)
    while(eXP[id] >= Levels[Level[id]])
        Level[id] += 1
}

public client_death(killer, victim, weapon, hitgroup, TK)
{       
    if(killer == victim)
        return PLUGIN_HANDLED
    
    new headshot = (hitgroup == HIT_HEAD) ? 1 : 0
    
    new rprefix[64];
    get_pcvar_string(iCvarPrefix, rprefix, sizeof rprefix - 1);
    
    switch(weapon)
    {
        case CSW_HEGRENADE:
        {
            eXP[killer] += get_pcvar_num(he_xp)
            CheckLevel(killer)
            SaveData(killer)
            if(get_pcvar_num(kill_msg) == 1)
                ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1 poradi ubiistwoto s^4 HE^1.", rprefix,  get_pcvar_num(he_xp))
            
            return PLUGIN_CONTINUE
        }
        case CSW_KNIFE:
        {
            eXP[killer] += get_pcvar_num(knife_xp)
            CheckLevel(killer)
            SaveData(killer)
            if(get_pcvar_num(kill_msg) == 1)
                ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1 poradi ubiistwoto s^4 noj^1.",rprefix, get_pcvar_num(knife_xp))
            
            return PLUGIN_CONTINUE
        }
    }
    
    if(headshot)
    {
        eXP[killer] += get_pcvar_num(hs_xp)
        CheckLevel(killer)
        SaveData(killer)
        if(get_pcvar_num(kill_msg) == 1)
            ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1 poradi ubiistwoto s^4 HS^1.",rprefix, get_pcvar_num(hs_xp))
        
        return PLUGIN_CONTINUE
    }
    
    else
    {
        eXP[killer] += get_pcvar_num(kill_xp)
        CheckLevel(killer)
        SaveData(killer)
        if(get_pcvar_num(kill_msg) == 1)
            ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1.", rprefix, get_pcvar_num(kill_xp))
        
        return PLUGIN_CONTINUE
    }
    
    CheckLevel(killer)
    SaveData(killer)
    return PLUGIN_CONTINUE
}

public CheckLevel(id)
{
    if(Level[id] < MaxLevels-1)
        while(eXP[id] >= Levels[Level[id]])
        Level[id] += 1
}

public client_connect(id)
{
    LoadData(id)
}


public client_disconnect(id)
{
    SaveData(id)
    eXP[id] = 0
    Level[id] = 0
    remove_task(id)
}



public cmdRank(id)
{
    new rprefix[64];
    get_pcvar_string(iCvarPrefix, rprefix, sizeof rprefix - 1);
    if(is_user_connected(id))
        ColorChat(id, NORMAL, "^4[%s]^1 Rank:^4 %s^1 | XP:^4 %d^1 | Level:^4 %d^1.", rprefix, Prefix[Level[id]], eXP[id], Level[id])
}

public CmdAddXP (iPlayer, level, cid)
{
    if(!cmd_access(iPlayer, level, cid, 3)) return PLUGIN_HANDLED;
    
    new arg [32]
    read_argv (1, arg, 31)
    
    new AddXP [32]
    read_argv (2, AddXP, charsmax (AddXP))
    
    new XPtoGive = str_to_num (AddXP)
    
    new AdminName [32]
    new TargetName [32]
    get_user_name (iPlayer, AdminName, charsmax (AdminName))
    
    new rprefix[64];
    get_pcvar_string(iCvarPrefix, rprefix, sizeof rprefix - 1);
    
    if(arg[0]=='@')
    {
        if(equali(arg[1],"All") || equali(arg[1],"ALL"))
        {
            new players[32], totalplayers, All
            get_players(players, totalplayers)
            
            for (new i = 0; i < totalplayers; i++)
            {
                All = players[i]
                
                eXP[All] += XPtoGive
            }
            
            CheckLevel(All)
            ColorChat(0, NORMAL, "^4[%s]^1 ^3%s^1 dade^4 %i^1 XP na vsichki ^4igrachi^1!", rprefix, AdminName, XPtoGive)
        }
        else if(equali(arg[1],"T") || equali(arg[1],"t"))
        {
            new players[32], totalplayers, T
            get_players(players, totalplayers)
            
            
            for (new i = 0; i < totalplayers; i++)
            {
                if (get_user_team(players[i]) == 1)
                {
                    T = players[i]
                    
                    eXP[T] += XPtoGive
                }
            }
            
            CheckLevel(T)
            ColorChat(0, RED, "^4[%s] ^1%s dade^4 %i^1 XP na vsichki ^3 Teroristi^1.", rprefix, AdminName, XPtoGive)
        }
        else if(equali(arg[1],"CT") || equali(arg[1],"ct"))
        {
            new players[32], totalplayers, CT
            get_players(players, totalplayers)
            
            for(new i = 0; i < totalplayers; i++)
            {
                if(get_user_team(players[i]) == 2)
                {
                    CT = players[i]
                    
                    eXP[CT] += XPtoGive
                }
            }
            
            CheckLevel(CT)
            ColorChat(0, BLUE, "^4[%s]^1 %s^1 dade^4 %i^1 XP na wsichki ^3 Kontra-Teroristi^1!", rprefix, AdminName, XPtoGive)
        }
    }
    else
    {
        new iTarget = cmd_target(iPlayer, arg, 3)
        get_user_name (iTarget, TargetName, charsmax (TargetName))
        
        if(iTarget)
        {
            eXP[iTarget] += XPtoGive
            
            CheckLevel(iTarget)
            ColorChat(0, NORMAL, "^4[%s]^1 ^3%s^1 dade^4 %i^1 XP na^4 %s^1.", rprefix, AdminName, XPtoGive, TargetName)
        }
    }
    return PLUGIN_HANDLED
}

bool:IsValidMessage( szMessage[ ], iLen )
{
read_args( szMessage, iLen )
remove_quotes( szMessage )

new iPos, cChar
while( 0 <= ( cChar = szMessage[ iPos++ ] ) <= 255 )
{
    if( cChar != ' ' && cChar != '%' )
    {
        return true
    }
}

return false
}

public hook_say(id)
{
    if(!is_user_connected(id))
    return PLUGIN_HANDLED_MAIN
    
    new szArgs[192]
    
    if( !IsValidMessage(szArgs, charsmax(szArgs)))
        return PLUGIN_HANDLED_MAIN
    
    if(equal(szArgs,"")) return PLUGIN_HANDLED_MAIN
    
    
    new szName[32]
    get_user_name(id, szName, sizeof szName-1)
    
    new alive = is_user_alive(id)
    
    if(contain(szArgs,"@") >= 0)
        return  PLUGIN_HANDLED_MAIN
    
    if(get_user_flags(id) & CHAT_ACCESS)
        format(szArgs, 191,"^x04[%s] ^x03%s^x01:^x04  %s", Prefix[Level[id]], szName, szArgs)
    else
        format(szArgs, 191, "^x04[%s] ^x03%s^x01:  %s",  Prefix[Level[id]], szName, szArgs)
    
    for(new i = 1; i <= gMaxPlayers; i++)
    {
        if(!is_user_connected(i))
            continue
        
        if(alive && is_user_alive(i))
        {
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(szArgs)
            message_end()
        }
        else if(!alive && !is_user_alive(i))
        {
            new format[192]
            formatex(format,191,"^1*^4DEAD^1* %s",szArgs)
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(format)
            message_end()
        }
    }
    
    return PLUGIN_HANDLED_MAIN
}

public hook_teamsay(id) {
    if(!is_user_connected(id)) {
        return PLUGIN_HANDLED_MAIN
    }
    
    new szArgs[192]
    
    if(!IsValidMessage(szArgs, charsmax(szArgs))) {
        return PLUGIN_HANDLED_MAIN
    }
    if(equal(szArgs,"")) return PLUGIN_HANDLED_MAIN
    new alive = is_user_alive(id)
    new CsTeams:team = cs_get_user_team(id)
    
    new iPlayers[32], iNum
    get_players(iPlayers, iNum)
    
    new szName[32]
    get_user_name(id, szName, sizeof szName-1)
    

    new const szPrefixes[2][CsTeams][] = {
        {
            "^4(^3Spectator^4)",
            "^4(^3Terrorist^4)",
            "^4(^3Counter-Terrorist^4)",
            "^4(^3Spectator^4)"
        },
        {
            "^4(^3Spectator^4)",
            "^4(^3Terrorist^4)",
            "^4(^3Counter-Terrorist^4)",
            "^4(^3Spectator^4)"
        }
    }
    
    if(contain(szArgs,"@") >= 0)
    return  PLUGIN_HANDLED_MAIN
    
    if(get_user_flags(id) & CHAT_ACCESS)
        format(szArgs, 191,"^1%s ^x04[%s] ^x03%s^x01:^x04  %s",szPrefixes[alive][team], Prefix[Level[id]], szName, szArgs)
    else
        format(szArgs, 191, "^1%s ^x04[%s] ^x03%s^x01:  %s",szPrefixes[alive][team],  Prefix[Level[id]], szName, szArgs)
    
    for(new i = 1; i <= gMaxPlayers; i++)
    {
        if(!is_user_connected(i))
            continue
        
        if(alive && is_user_alive(i))
        {
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(szArgs)
            message_end()
        }
        else if(!alive && !is_user_alive(i))
        {
            new format[192]
            formatex(format,191,"^1*^4DEAD^1* %s",szArgs)
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(format)
            message_end()
        }
    }
    
    return PLUGIN_HANDLED_MAIN
}
        
public SaveData(id)
{
    new name[32];
    get_user_name(id,name,31);
    new vaultkey[64],vaultdata[256];
    
    format(vaultkey,63,"%s", name);
    format(vaultdata,255,"%i#%i#",eXP[id],Level[id]);
    fvault_set_data(g_vault_name,vaultkey,vaultdata);
    
    return PLUGIN_CONTINUE;
}
public LoadData(id)
{
    new name[32];
    get_user_name(id,name,31);
    new vaultkey[64],vaultdata[256];
    
    format(vaultkey,63,"%s",name);
    format(vaultdata,255,"%i#%i#",eXP[id],Level[id]);
    fvault_get_data(g_vault_name,vaultkey,vaultdata,charsmax(vaultdata));
    
    replace_all(vaultdata, 255, "#", " ");
    new playerxp[32], playerlevel[32];
    parse(vaultdata, playerxp, 31, playerlevel, 31);
    
    eXP[id] = str_to_num(playerxp);
    Level[id] = str_to_num(playerlevel);
    
    return PLUGIN_CONTINUE;
} 
 #407776  от NOVAK_A_7
 пон яну 16, 2017 6:05 pm
Ммм , благодаря , ама не мога да го компилирам, нов съм ? Дава ми eror:\
Error: Cannot read from file: "colorchat" on line 4 ???
Моля , може ли амхх файла , за да го пробвам ?
 #407800  от OciXCrom™
 пон яну 16, 2017 8:25 pm
  • Често срещани грешки:
    • при грешка от типа на "cannot read from file: colorchat" - липсва ви нужната библиотека (в случая colorchat.inc). Трябва да я изтеглите и сложите в папката scripting/include. Можете да изтеглите почти всички библиотеки от тук.
 #407814  от NOVAK_A_7
 пон яну 16, 2017 9:21 pm
МИ ,благодаря , но така и не успях да го компилирам , явно ще ми е нужно много време
за да се науча(сега започнах...) , или пък съм доста прост ?
Просто, помоля за амхх- файла на плъгина който пожелах най-горе ? Ако е възможно ???
Благодаря !


p.s. То практически всички инклуде файлове сложих , после ми даде ерор на някакъв ред под реда за
кииловете... не знам , просто ако може работещ плъгин за ранкстатса , а за ученето ще продължавам да се опитвам.
(Имам един компилиран вече амхх-файл... преработих плъгина който ми предложи $ąȡ?¥ƹȿ?ʍą¥þƹ? ( https://forums.alliedmods.net/showthread.php?t=171364) СТАНА, НО МИ ЗАБИВА
СЪРВЪРА с някакъв ерор...)
 #407823  от OciXCrom™
 пон яну 16, 2017 9:46 pm
Дава грешка защото не са премахнати запетайките в края на ред 31 и 46. Опитай така:
Код: Избери всички
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <colorchat>
#include <fvault>

#define MaxLevels 11
#define IsPlayer(%1) (1 <= %1 <=  g_iMaxPlayers)

#define CHAT_ACCESS ADMIN_ALL

new gMaxPlayers, gMsgSayText, syncObj, Level[11], eXP[11]
new ranks_hud, knife_xp, he_xp, hs_xp, kill_xp, kill_msg

new const g_vault_name[] = "levelsz";
//new const rprefix[]= "Ranks";
new iCvarPrefix;

new const Levels[MaxLevels] =
{
    0,
    150, 
    350,
    700,  
    1200,
    2000,
    4000,
    7000,
    12000,
    20000,
    30000
}

new const Prefix[MaxLevels][] =
{
    "[Newbie]", 
    "[Killer]", 
    "[Pro]", 
    "[Mega]", 
    "[Freak]", 
    "[MAJOR]", 
    "[COLONEL]", 
    "[GENERAL]", 
    "[ASSASSIN-IMMUNITY]", 
    "[CONSIGLIERE-VIP]", 
    "[THE-BOSS-ADMIN]"
}

public plugin_init()
{
register_plugin("RankSystem", "1.0a", "alt.nick")

register_event("DeathMsg","client_death","a")
register_clcmd("say", "hook_say")
register_clcmd("say_team", "hook_teamsay")

register_clcmd("say /rank", "cmdRank")
register_clcmd("say_team /rank", "cmdRank")


ranks_hud = register_cvar("ranks_hud", "1")     // Äàëè äà ñå ïîÿâÿâà õúä ïðè âëèçàíå â ñúðâúðà. Âêëþ÷åíî 1/0 Èçêëþ÷åíî
knife_xp = register_cvar("knife_xp", "4")     // Êîëêî ÕРäà äàâà çà óáèéñòâî ñ íîæ.
he_xp = register_cvar("he_xp", "2")        // Êîëêî ÕРäà äàâà çà óáèéñòâî ñ Granata (HE).
hs_xp = register_cvar("hs_xp", "2")        // Êîëêî ÕРäà äàâà çà óáèéñòâî ñ Headshot.
kill_xp = register_cvar("kill_xp", "1")        // Êîëêî ÕРäà äàâà çà íîðìàëíî óáèéñòâî.   
kill_msg = register_cvar("kill_msg", "1")    // Äàëè äà ïîêàçâà êîé ñòå óáèëè è êîëêî ÕРñòå ïîëó÷èëè. Âêëþ÷åíî 1/0 Èçêëþ÷åíî

register_concmd ("amx_give_xp", "CmdAddXP", ADMIN_LEVEL_A, "<nick | @ct | @t | @all> <xp>")

iCvarPrefix = register_cvar("amx_rank_prefix", "Ranks");

gMaxPlayers = get_maxplayers()
gMsgSayText = get_user_msgid("SayText")

syncObj     = CreateHudSyncObj()

fvault_load(g_vault_name)
}

public ShowHud(id)
{
set_hudmessage(185, 239, 251, -1.0, 0.01, 0, 6.0, 1.0, 0.0, 0.0, -1)
ShowSyncHudMsg(id, syncObj,"Rank: %s | XP: %i | Level: %i", Prefix[Level[id]], eXP[id], Level[id])
}

public client_putinserver(id)
{
if(get_pcvar_num(ranks_hud) == 1)
set_task(1.0, "ShowHud", id, _, _, "b")

if(Level[id] < MaxLevels-1)
    while(eXP[id] >= Levels[Level[id]])
        Level[id] += 1
}

public client_death(killer, victim, weapon, hitgroup, TK)
{       
    if(killer == victim)
        return PLUGIN_HANDLED
    
    new headshot = (hitgroup == HIT_HEAD) ? 1 : 0
    
    new rprefix[64];
    get_pcvar_string(iCvarPrefix, rprefix, sizeof rprefix - 1);
    
    switch(weapon)
    {
        case CSW_HEGRENADE:
        {
            eXP[killer] += get_pcvar_num(he_xp)
            CheckLevel(killer)
            SaveData(killer)
            if(get_pcvar_num(kill_msg) == 1)
                ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1 poradi ubiistwoto s^4 HE^1.", rprefix,  get_pcvar_num(he_xp))
            
            return PLUGIN_CONTINUE
        }
        case CSW_KNIFE:
        {
            eXP[killer] += get_pcvar_num(knife_xp)
            CheckLevel(killer)
            SaveData(killer)
            if(get_pcvar_num(kill_msg) == 1)
                ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1 poradi ubiistwoto s^4 noj^1.",rprefix, get_pcvar_num(knife_xp))
            
            return PLUGIN_CONTINUE
        }
    }
    
    if(headshot)
    {
        eXP[killer] += get_pcvar_num(hs_xp)
        CheckLevel(killer)
        SaveData(killer)
        if(get_pcvar_num(kill_msg) == 1)
            ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1 poradi ubiistwoto s^4 HS^1.",rprefix, get_pcvar_num(hs_xp))
        
        return PLUGIN_CONTINUE
    }
    
    else
    {
        eXP[killer] += get_pcvar_num(kill_xp)
        CheckLevel(killer)
        SaveData(killer)
        if(get_pcvar_num(kill_msg) == 1)
            ColorChat(killer, NORMAL, "^4[%s]^1 poluchihte^4 %d XP^1.", rprefix, get_pcvar_num(kill_xp))
        
        return PLUGIN_CONTINUE
    }
    
    CheckLevel(killer)
    SaveData(killer)
    return PLUGIN_CONTINUE
}

public CheckLevel(id)
{
    if(Level[id] < MaxLevels-1)
        while(eXP[id] >= Levels[Level[id]])
        Level[id] += 1
}

public client_connect(id)
{
    LoadData(id)
}


public client_disconnect(id)
{
    SaveData(id)
    eXP[id] = 0
    Level[id] = 0
    remove_task(id)
}



public cmdRank(id)
{
    new rprefix[64];
    get_pcvar_string(iCvarPrefix, rprefix, sizeof rprefix - 1);
    if(is_user_connected(id))
        ColorChat(id, NORMAL, "^4[%s]^1 Rank:^4 %s^1 | XP:^4 %d^1 | Level:^4 %d^1.", rprefix, Prefix[Level[id]], eXP[id], Level[id])
}

public CmdAddXP (iPlayer, level, cid)
{
    if(!cmd_access(iPlayer, level, cid, 3)) return PLUGIN_HANDLED;
    
    new arg [32]
    read_argv (1, arg, 31)
    
    new AddXP [32]
    read_argv (2, AddXP, charsmax (AddXP))
    
    new XPtoGive = str_to_num (AddXP)
    
    new AdminName [32]
    new TargetName [32]
    get_user_name (iPlayer, AdminName, charsmax (AdminName))
    
    new rprefix[64];
    get_pcvar_string(iCvarPrefix, rprefix, sizeof rprefix - 1);
    
    if(arg[0]=='@')
    {
        if(equali(arg[1],"All") || equali(arg[1],"ALL"))
        {
            new players[32], totalplayers, All
            get_players(players, totalplayers)
            
            for (new i = 0; i < totalplayers; i++)
            {
                All = players[i]
                
                eXP[All] += XPtoGive
            }
            
            CheckLevel(All)
            ColorChat(0, NORMAL, "^4[%s]^1 ^3%s^1 dade^4 %i^1 XP na vsichki ^4igrachi^1!", rprefix, AdminName, XPtoGive)
        }
        else if(equali(arg[1],"T") || equali(arg[1],"t"))
        {
            new players[32], totalplayers, T
            get_players(players, totalplayers)
            
            
            for (new i = 0; i < totalplayers; i++)
            {
                if (get_user_team(players[i]) == 1)
                {
                    T = players[i]
                    
                    eXP[T] += XPtoGive
                }
            }
            
            CheckLevel(T)
            ColorChat(0, RED, "^4[%s] ^1%s dade^4 %i^1 XP na vsichki ^3 Teroristi^1.", rprefix, AdminName, XPtoGive)
        }
        else if(equali(arg[1],"CT") || equali(arg[1],"ct"))
        {
            new players[32], totalplayers, CT
            get_players(players, totalplayers)
            
            for(new i = 0; i < totalplayers; i++)
            {
                if(get_user_team(players[i]) == 2)
                {
                    CT = players[i]
                    
                    eXP[CT] += XPtoGive
                }
            }
            
            CheckLevel(CT)
            ColorChat(0, BLUE, "^4[%s]^1 %s^1 dade^4 %i^1 XP na wsichki ^3 Kontra-Teroristi^1!", rprefix, AdminName, XPtoGive)
        }
    }
    else
    {
        new iTarget = cmd_target(iPlayer, arg, 3)
        get_user_name (iTarget, TargetName, charsmax (TargetName))
        
        if(iTarget)
        {
            eXP[iTarget] += XPtoGive
            
            CheckLevel(iTarget)
            ColorChat(0, NORMAL, "^4[%s]^1 ^3%s^1 dade^4 %i^1 XP na^4 %s^1.", rprefix, AdminName, XPtoGive, TargetName)
        }
    }
    return PLUGIN_HANDLED
}

bool:IsValidMessage( szMessage[ ], iLen )
{
read_args( szMessage, iLen )
remove_quotes( szMessage )

new iPos, cChar
while( 0 <= ( cChar = szMessage[ iPos++ ] ) <= 255 )
{
    if( cChar != ' ' && cChar != '%' )
    {
        return true
    }
}

return false
}

public hook_say(id)
{
    if(!is_user_connected(id))
    return PLUGIN_HANDLED_MAIN
    
    new szArgs[192]
    
    if( !IsValidMessage(szArgs, charsmax(szArgs)))
        return PLUGIN_HANDLED_MAIN
    
    if(equal(szArgs,"")) return PLUGIN_HANDLED_MAIN
    
    
    new szName[32]
    get_user_name(id, szName, sizeof szName-1)
    
    new alive = is_user_alive(id)
    
    if(contain(szArgs,"@") >= 0)
        return  PLUGIN_HANDLED_MAIN
    
    if(get_user_flags(id) & CHAT_ACCESS)
        format(szArgs, 191,"^x04[%s] ^x03%s^x01:^x04  %s", Prefix[Level[id]], szName, szArgs)
    else
        format(szArgs, 191, "^x04[%s] ^x03%s^x01:  %s",  Prefix[Level[id]], szName, szArgs)
    
    for(new i = 1; i <= gMaxPlayers; i++)
    {
        if(!is_user_connected(i))
            continue
        
        if(alive && is_user_alive(i))
        {
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(szArgs)
            message_end()
        }
        else if(!alive && !is_user_alive(i))
        {
            new format[192]
            formatex(format,191,"^1*^4DEAD^1* %s",szArgs)
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(format)
            message_end()
        }
    }
    
    return PLUGIN_HANDLED_MAIN
}

public hook_teamsay(id) {
    if(!is_user_connected(id)) {
        return PLUGIN_HANDLED_MAIN
    }
    
    new szArgs[192]
    
    if(!IsValidMessage(szArgs, charsmax(szArgs))) {
        return PLUGIN_HANDLED_MAIN
    }
    if(equal(szArgs,"")) return PLUGIN_HANDLED_MAIN
    new alive = is_user_alive(id)
    new CsTeams:team = cs_get_user_team(id)
    
    new iPlayers[32], iNum
    get_players(iPlayers, iNum)
    
    new szName[32]
    get_user_name(id, szName, sizeof szName-1)
    

    new const szPrefixes[2][CsTeams][] = {
        {
            "^4(^3Spectator^4)",
            "^4(^3Terrorist^4)",
            "^4(^3Counter-Terrorist^4)",
            "^4(^3Spectator^4)"
        },
        {
            "^4(^3Spectator^4)",
            "^4(^3Terrorist^4)",
            "^4(^3Counter-Terrorist^4)",
            "^4(^3Spectator^4)"
        }
    }
    
    if(contain(szArgs,"@") >= 0)
    return  PLUGIN_HANDLED_MAIN
    
    if(get_user_flags(id) & CHAT_ACCESS)
        format(szArgs, 191,"^1%s ^x04[%s] ^x03%s^x01:^x04  %s",szPrefixes[alive][team], Prefix[Level[id]], szName, szArgs)
    else
        format(szArgs, 191, "^1%s ^x04[%s] ^x03%s^x01:  %s",szPrefixes[alive][team],  Prefix[Level[id]], szName, szArgs)
    
    for(new i = 1; i <= gMaxPlayers; i++)
    {
        if(!is_user_connected(i))
            continue
        
        if(alive && is_user_alive(i))
        {
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(szArgs)
            message_end()
        }
        else if(!alive && !is_user_alive(i))
        {
            new format[192]
            formatex(format,191,"^1*^4DEAD^1* %s",szArgs)
            message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i)
            write_byte(id)
            write_string(format)
            message_end()
        }
    }
    
    return PLUGIN_HANDLED_MAIN
}
        
public SaveData(id)
{
    new name[32];
    get_user_name(id,name,31);
    new vaultkey[64],vaultdata[256];
    
    format(vaultkey,63,"%s", name);
    format(vaultdata,255,"%i#%i#",eXP[id],Level[id]);
    fvault_set_data(g_vault_name,vaultkey,vaultdata);
    
    return PLUGIN_CONTINUE;
}
public LoadData(id)
{
    new name[32];
    get_user_name(id,name,31);
    new vaultkey[64],vaultdata[256];
    
    format(vaultkey,63,"%s",name);
    format(vaultdata,255,"%i#%i#",eXP[id],Level[id]);
    fvault_get_data(g_vault_name,vaultkey,vaultdata,charsmax(vaultdata));
    
    replace_all(vaultdata, 255, "#", " ");
    new playerxp[32], playerlevel[32];
    parse(vaultdata, playerxp, 31, playerlevel, 31);
    
    eXP[id] = str_to_num(playerxp);
    Level[id] = str_to_num(playerlevel);
    
    return PLUGIN_CONTINUE;
}