/******************************************************************************/
// If you change one of the following settings, do not forget to recompile
// the plugin and to install the new .
amx file on your server.
// You can find the list of admin flags in the
amx/examples/include/amxconst.inc file.
//Defines font color in the motd, you can also use hexadecimal colors
#define FONT_COLOR "yellow"
//Defines background color of the motd, you can also use hexadecimal colors
#define BG_COLOR "black"
//Defines a size of font in the motd
#define FONT_SIZE 4
//Admin flag for "ranks_reload" command
#define ADMIN_FLAG ADMIN_CFG
//Defines directory of the configuration file
#define FILE_DIR "addons/amxmodx/configs/ranks.ini"
// Uncomment the following line to enable the
AMX logs for this plugin.
#define USE_LOGS
// File name where the logs are stored (will be put in the "
amx/logs" directory).
#if defined USE_LOGS
new const g_szLogFile[] = "ranks.log"
#endif
// Defines hard limit how many ranks can be read from the "ranks.ini" file.
#define MAX_RANKS 25
// Defines how long can be rank name.
#define MAX_NAME_RANK 33
/******************************************************************************/
#include <amxmodx>
#include <engine>
#include <csstats>
#include <amxmisc>
#define PLUGIN "Ranks"
#define VERSION "2.1.1"
#define AUTHOR "Ni3znajomy"
new g_pCvarRank, g_pCvarDiff;
#define TASK 3929
new g_iKills[33];
new g_szMotd[1012];
new g_szRanks[MAX_RANKS][MAX_NAME_RANK]
new g_iRanks[MAX_RANKS];
new g_szPlayerRank[33][MAX_NAME_RANK]
new g_iPlayerLevel[33];
new g_iLoaded;
new ShowStats;
new g_iPos[33];
new g_iAllPos;
#define NoShowSet(%1) (ShowStats |= (1<<(%1-1)))
#define NoShowCheck(%1) (ShowStats & (1<<(%1-1)))
#define NoShowRemove(%1) (ShowStats &= ~(1<<(%1-1)))
#define SetVip(%1) (
Vip |= (1<<(%1-1)))
#define CheckVip(%1) (
Vip & (1<<(%1-1)))
#define RemoveVip(%1) (
Vip &= ~(1<<(%1-1)))
#define VIP_FLAG ADMIN_LEVEL_H
#define ADMINS_RELOAD 30.0
#define MaxLevel g_iLoaded - 1
new g_hSync;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("ranks_version", VERSION, FCVAR_SPONLY|FCVAR_SERVER, 2.10);
register_clcmd("say /rangi", "ShowRanks", -1, "- pokazuje motd z rangami");
register_clcmd("say_team /rangi", "ShowRanks", -1, "- pokazuje motd z rangami");
register_concmd("ranks_reload", "ReloadRanks", ADMIN_FLAG, "- przeladowuje rangi");
g_pCvarDiff = register_cvar("ranks_diffrence", "0", _, 0.0);
g_pCvarRank = register_cvar("ranks_show_dead", "1", _, 1.0);
register_event("DeathMsg", "DeathMsg_event", "a", "1!0");
register_event("ResetHUD", "ResetHUD_event", "bef");
g_hSync = CreateHudSyncObj(1);
set_task(ADMINS_RELOAD, "Reload", 5435, _, _, "b");
LoadRanks();
CreateMotd();
}
public Reload(tid)
{
server_cmd("amx_reloadadmins");
server_exec();
}
public ReloadRanks(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED;
LoadRanks();
CreateMotd();
new szName[33];
get_user_name(id, szName, charsmax(szName));
#if defined USE_LOGS
new szSID[42], szIP[25];
new userid = 0;
if(id)
{
get_user_authid(id, szSID, charsmax(szSID));
userid = get_user_userid(id);
}
get_user_ip(id, szIP, charsmax(szIP), 24);
log_to_file(g_szLogFile, "<%s><%d><%s><%s> przeladowal rangi.", szName, userid, szIP, (id) ? szSID : "Brak");
#endif
console_print(id, "Przeladowanie rang...");
client_print(id, print_chat, "ADMIN %s: Przeladowal rangi.", szName);
new players[32], num;
get_players(players, num, "ch");
for(new i=0;i<num;i++)
{
new player = players[i];
CheckLevel(player);
}
return PLUGIN_HANDLED
}
public ResetHUD_event(id)
{
if(!task_exists(TASK+id))
{
SetTask(id);
}
}
public plugin_cfg()
{
g_iAllPos = get_statsnum();
}
public CreateMotd()
{
new iLen;
iLen += formatex(g_szMotd, 1011, "<
html><body bgcolor=^"%s^"><center><font color=^"%s^" size=^"%d^">", BG_COLOR, FONT_COLOR, FONT_SIZE);
for(new i=0;i<g_iLoaded;i++)
{
if(!i)
iLen += formatex(g_szMotd[iLen], 1011-iLen, "%s -> ... - %d<br>", g_szRanks[i], g_iRanks[i]-1); //First rank
else if(i+1 == g_iLoaded)
iLen += formatex(g_szMotd[iLen], 1011-iLen, "%s -> %d - ...", g_szRanks[i], g_iRanks[i-1]); //Last rank
else
iLen += formatex(g_szMotd[iLen], 1011-iLen, "%s -> %d - %d<br>", g_szRanks[i], g_iRanks[i-1], g_iRanks[i]-1);
}
formatex(g_szMotd[iLen], 1011-iLen, "</font></center></body></
html>");
}
public ShowRanks(id)
{
show_motd(id, g_szMotd, "Rangi");
return PLUGIN_HANDLED_MAIN
}
public DeathMsg_event()
{
new attacker = read_data(1);
new victim = read_data(2);
static stats[8], body[8];
g_iPos[attacker] = get_user_stats(attacker, stats, body);
g_iAllPos = get_statsnum();
if(attacker == victim)
return;
++g_iKills[attacker];
if(is_user_connected(attacker) && g_iPlayerLevel[attacker] < MaxLevel)
{
if(g_iKills[attacker] >= g_iRanks[g_iPlayerLevel[attacker]])
{
formatex(g_szPlayerRank[attacker], MAX_NAME_RANK-1, g_szRanks[++g_iPlayerLevel[attacker]]);
}
}
if(!get_pcvar_num(g_pCvarDiff))
return;
new level = g_iPlayerLevel[victim];
if(is_user_connected(victim) && --g_iKills[victim] < g_iRanks[--level] && g_iPlayerLevel[victim])
{
formatex(g_szPlayerRank[victim], MAX_NAME_RANK-1, g_szRanks[--g_iPlayerLevel[victim]]);
}
}
public client_putinserver(id)
{
if(is_user_bot(id) || is_user_hltv(id))
{
NoShowSet(id);
return;
}
set_task(1.0, "LoadPlayerStats", id);
}
public client_authorized(id)
{
if(get_user_flags(id) & VIP_FLAG)
{
SetVip(id);
}
}
public LoadPlayerStats(id)
{
static stats[8], body[8];
g_iPos[id] = get_user_stats(id, stats, body);
g_iKills[id] = (get_pcvar_num(g_pCvarDiff)) ? stats[0]-stats[1] : stats[0];
CheckLevel(id);
SetTask(id);
}
public client_disconnect(id)
{
if(task_exists(TASK+id))
remove_task(TASK+id)
if(task_exists(id))
remove_task(id);
if(NoShowCheck(id))
NoShowRemove(id);
if(CheckVip(id))
RemoveVip(id);
}
public showRank(param[], tid)
{
new id = param[0], iVar;
iVar = get_pcvar_num(g_pCvarRank);
if(iVar && !is_user_alive(id))
{
new id2 = entity_get_int(id, EV_INT_iuser2);
if(!id2 || NoShowCheck(id2))
{
return;
}
set_hudmessage(255, 255, 255, 0.03, 0.25, 0, 6.0, 2.0, 0.1, 0.2, 3);
ShowSyncHudMsg(id, g_hSync, "Ranga: %s^nZabojstw: %d^nVIP: %s^nForum: PokazSkilla.eu, (CheckVip(id2)) ? "Tak" : "Nie", g_iPos[id2], g_iAllPos);
return;
}
else if(!iVar && !is_user_alive(id))
{
ClearSyncHud(id, g_hSync);
remove_task(TASK+id);
return;
}
set_hudmessage(255, 255, 255, 0.03, 0.25, 0, 6.0, 2.0, 0.1, 0.2, 3);
ShowSyncHudMsg(id, g_hSync, "Ranga: %s^nZabojstw: %d^nVIP: %s^nForum: PokazSkilla.eu, (CheckVip(id)) ? "Tak" : "Nie", g_iPos[id], g_iAllPos);
}
CheckLevel(id)
{
g_iPlayerLevel[id] = 0;
for(new i=0;i<g_iLoaded;i++)
{
if(g_iKills[id] >= g_iRanks[i] && g_iPlayerLevel[id] < MaxLevel)
++g_iPlayerLevel[id];
else
break;
}
formatex(g_szPlayerRank[id], MAX_NAME_RANK-1, g_szRanks[g_iPlayerLevel[id]])
}
LoadRanks()
{
g_iLoaded = 0;
new szDir[64];
formatex(szDir, charsmax(szDir), FILE_DIR);
#if defined USE_LOGS
log_amx("[Ranks] Szukanie pliku...");
#endif
if(!file_exists(szDir))
{
set_fail_state("[Rangi] Nie znaleziono pliku konfiguracyjnego.");
return;
}
#if defined USE_LOGS
log_amx("[Rangi] Znaleziono plik! Wczytywanie rang...");
#endif
new szLine[64], iLen, szName[MAX_NAME_RANK], szKills[33];
for(new i=0;read_file(szDir, i, szLine, 63, iLen);i++)
{
trim(szLine);
parse(szLine, szName, MAX_NAME_RANK-1, szKills, 32);
if(!szLine[0] || szLine[0] == ';' || szLine[0] == '/')
continue;
formatex(g_szRanks[g_iLoaded], MAX_NAME_RANK-1, szName);
g_iRanks[g_iLoaded] = str_to_num(szKills)
if(++g_iLoaded >= MAX_RANKS)
{
#if defined AMX_LOGS
log_amx("[Rangi] Limit zostal osiagniety (%d). Zwieksz wartosc ^"MAX_RANKS^" zeby wczytac wiecej rang.", MAX_RANKS);
#endif
break;
}
#if defined USE_LOGS
log_amx("[Rangi] Wczytano range ^"%s^".", szName);
#endif
}
#if defined USE_LOGS
log_amx("[Rangi] Wczytano %d rang(i).", g_iLoaded);
#endif
}
SetTask(id)
{
new param[1]; param[0] = id;
set_task(1.0, "showRank", TASK+id, param, 1, "b")
}