Пользователь
- Сообщения
- 15
- Реакции
- -1
Доброго времени суток.
Пытаюсь в плагине CSX Easy Stats by neugomon выставить значение скилла как к примеру в AES или в stats_rbs от скальпеля, но при этом ни в какую не хочет это значение корректно отображаться.
Исход прикладываю ниже. У кого есть свободное время подскажите как это можно сделать.
Если быть точнее то нужно сделать отображение живой цифры в /top15 и так же в /rank. Заранее всем спасибо)
Пытаюсь в плагине CSX Easy Stats by neugomon выставить значение скилла как к примеру в AES или в stats_rbs от скальпеля, но при этом ни в какую не хочет это значение корректно отображаться.
Исход прикладываю ниже. У кого есть свободное время подскажите как это можно сделать.
Если быть точнее то нужно сделать отображение живой цифры в /top15 и так же в /rank. Заранее всем спасибо)
Код:
#include <amxmodx>
#include <csx>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define CSS_STYLE ""// ссылка на шаблон
#define SORTING_BY_DMG_TOP // показывать топ 10 игроков по урону за раунд
#define PRUNE_OLD_CONNECTION_PLRS 30 // если игрок не появлялся на сервере N дней - удалить из статистики. Так же удаляются игроки без смертей и фрагов
const MinDamageForAssist = 50; // минимальный урон для получения ассиста
const MaxUsersInTopByDmg = 5; // количество игроков в топе SORTING_BY_DMG_TOP
#define FRAGS 0
#define DEATHS 1
#define HS 2
#define TK 3
#define SHOTS 4
#define HITS 5
#define DAMAGE 6
#define RANK 7
#define ASSIST HIT_RIGHTLEG + 1
#define SKILL ASSIST + 1
#define GAMETIME SKILL + 1
#define LASTCON GAMETIME + 1
#define ARRSIZE_STATS RANK + 1
#define ARRSIZE_BODY LASTCON + 1
#if defined SORTING_BY_DMG_TOP
#tryinclude <reapi>
enum player_damage { p_index = 0, p_damage };
#endif
enum _:SayMeData
{
HpKiller,
ApKiller,
Distance,
KillerId,
KillerName[MAX_NAME_LENGTH]
};
enum GetStatsFunctions
{
StatsRank,
StatsRankStats,
StatsTop15,
StatsMe,
StatsHp,
StatsRs
};
new const g_arrViewSkills[][] =
{
"L-", "LS", "L+", "M-", "MS", "M+", "H-", "HS", "H+", "P-", "PS", "P+", "G"
};
new const g_arrItemSkills[] =
{
0, 60, 75, 85, 100, 115, 130, 140, 150, 165, 180, 195, 210
};
new const g_arrBodyParts[HIT_RIGHTLEG + 1][] =
{
"В тело", "B гoлoву", "B гpудь", "B живoт", "B лeвую pуку", "B пpaвую pуку", "B лeвую нoгу", "B пpaвую нoгу"
};
new const g_arrBodyMeParts[HIT_RIGHTLEG + 1][] =
{
"Тушка", "Башня", "Сиськи", "Брюхо", "Л. клешня", "П. клешня", "Л. костыль", "П. костыль"
};
new g_arrMeData[MAX_PLAYERS + 1][SayMeData];
public plugin_init()
{
register_plugin("CSX Easy Stats", "1.5", "neugomon");
register_clcmd("say /rank", "clCMD_SayRank");
register_clcmd("say /rankstats", "clCMD_SayRankStats");
register_clcmd("say /top", "clCMD_SayTop15");
register_clcmd("say /top15", "clCMD_SayTop15");
register_clcmd("say /me", "clCMD_SayMe");
register_clcmd("say /hp", "clCMD_SayHp");
register_clcmd("say /rs", "clCMD_SayRs");
#if defined SORTING_BY_DMG_TOP
#if defined _reapi_included
RegisterHookChain(RG_RoundEnd, "RoundEnd_Post", true);
#else
register_logevent("RoundEnd_Post", 2, "1=Round_End");
#endif
#endif
#if defined PRUNE_OLD_CONNECTION_PLRS
new rank, removed, st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
new minTime = get_systime() - PRUNE_OLD_CONNECTION_PLRS * 86400;
while((rank = get_stats(rank, st, bh, "", 0)))
{
if(bh[LASTCON] < minTime || (!st[FRAGS] && !st[DEATHS]))
{
if(remove_stats(rank-1))
removed++;
}
}
if(removed)
{
log_amx("Pruned %i players of csstats.dat", removed);
ForceSaveStats();
}
#endif
register_event("HLTV", "eventHLTV", "a", "1=0", "2=0");
set_task(60.0, "ForceSaveStats", .flags = "b");
}
public ForceSaveStats()
force_save_stats();
#if defined SORTING_BY_DMG_TOP
public RoundEnd_Post()
set_task(0.3, "ShowTopDamage");
public ShowTopDamage()
{
new arrPlayers[MAX_PLAYERS + 1][player_damage];
new players[MAX_PLAYERS], pnum;
get_players(players, pnum);
for(new i, st[ARRSIZE_STATS], bh[ARRSIZE_BODY]; i < pnum; ++i)
{
if(get_user_wrstats(players[i], 0, st, bh))
{
arrPlayers[i][p_index] = players[i];
arrPlayers[i][p_damage] = st[DAMAGE];
}
}
SortCustom2D(arrPlayers, sizeof(arrPlayers), "SortDamage");
new bool:bAllowShow,
szPlayers[512],
len = formatex(szPlayers, charsmax(szPlayers), "\dТоп по урону за раунд^n^n"),
iMaxNum = (MaxUsersInTopByDmg > pnum) ? pnum : MaxUsersInTopByDmg;
for(new i, name[MAX_NAME_LENGTH]; i < iMaxNum; ++i)
{
if(arrPlayers[i][p_damage])
{
get_user_name(arrPlayers[i][p_index], name, charsmax(name));
len += formatex(szPlayers[len], charsmax(szPlayers) - len, "\r%d \w- \d[%d] \w - \y%s^n", i+1, arrPlayers[i][p_damage], name);
bAllowShow = true;
}
}
if(bAllowShow)
{
for(new i, m, nm; i < pnum; ++i)
if(!player_menu_info(players[i], m, nm))
show_menu(players[i], MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9, szPlayers, 5);
}
}
public SortDamage(const elem1[], const elem2[])
return (elem1[p_damage] < elem2[p_damage]) ? 1 : (elem1[p_damage] > elem2[p_damage]) ? -1 : 0;
#endif
public eventHLTV()
{
for(new i = 1; i <= MaxClients; ++i)
arrayset(g_arrMeData[i], 0, SayMeData);
}
public client_putinserver(id)
{
new st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
get_user_stats(id, st, bh);
if(!bh[SKILL]) bh[SKILL] = 100;
set_user_stats(id, st, bh);
arrayset(g_arrMeData[id], 0, SayMeData);
}
public client_disconnected(id)
{
if(is_user_connected(id))
{
new st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
if(get_user_stats(id, st, bh))
{
bh[GAMETIME] += get_user_time(id, true);
bh[LASTCON] = get_systime();
set_user_stats(id, st, bh);
}
}
}
public client_death(killer, victim, wpnindex, hitplace, tk)
{
if(!killer || killer == victim)
return;
static Float:delta;
static st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
static st2[ARRSIZE_STATS], bh2[ARRSIZE_BODY];
get_user_stats(killer, st, bh);
get_user_stats(victim, st2, bh2);
delta = 1.0 / (1.0 + floatpower(10.0, (bh[SKILL] - bh2[SKILL]) / 100.0));
bh[SKILL] += (st[FRAGS] < 100) ? floatround(delta * 2.0) : floatround(delta * 1.5);
bh2[SKILL] -= (st2[FRAGS] < 100) ? floatround(delta * 2.0) : floatround(delta * 1.5);
set_user_stats(killer, st, bh);
set_user_stats(victim, st2, bh2);
/* #### */
static fOriginK[3], fOriginV[3];
get_user_origin(killer, fOriginK);
get_user_origin(victim, fOriginV);
g_arrMeData[victim][HpKiller] = get_user_health(killer);
g_arrMeData[victim][ApKiller] = get_user_armor(killer);
g_arrMeData[victim][Distance] = floatround(get_distance(fOriginK, fOriginV) * 0.0254);
g_arrMeData[victim][KillerId] = killer;
get_user_name(killer, g_arrMeData[victim][KillerName], charsmax(g_arrMeData[][KillerName]));
GetStats(victim, StatsMe);
GetStats(victim, StatsHp);
/* #### */
new iBestPlayer, maxDamage = MinDamageForAssist;
for(new i = 1, st[ARRSIZE_STATS], bh[ARRSIZE_BODY]; i <= MaxClients; ++i)
{
if(i == killer) continue;
if(!is_user_connected(i)) continue;
#if defined _reapi_included
if(!(TEAM_TERRORIST <= get_member(i, m_iTeam) <= TEAM_CT)) continue;
#else
if(!(1 <= get_user_team(i) <= 2)) continue;
#endif
if(get_user_vstats(i, victim, st, bh))
{
if(st[DAMAGE] > maxDamage)
{
maxDamage = st[DAMAGE];
iBestPlayer = i;
}
}
}
if(iBestPlayer != killer && is_user_connected(iBestPlayer))
{
new szNameVictim[32];
get_user_name(victim, szNameVictim, charsmax(szNameVictim));
client_print_color(
iBestPlayer,
print_team_default,
"^4• ^1Ты помог ^3%s ^1убить ^3%s ^1нанеся ^3%d^4dmg^1.",
g_arrMeData[victim][KillerName],
szNameVictim,
maxDamage
);
get_user_stats(iBestPlayer, st, bh);
bh[ASSIST]++;
set_user_stats(iBestPlayer, st, bh);
}
}
public clCMD_SayRank(id)
return GetStats(id, StatsRank);
public clCMD_SayRankStats(id)
return GetStats(id, StatsRankStats);
public clCMD_SayTop15(id)
return GetStats(id, StatsTop15);
public clCMD_SayMe(id)
return GetStats(id, StatsMe);
public clCMD_SayHp(id)
return GetStats(id, StatsHp);
public clCMD_SayRs(id)
return GetStats(id, StatsRs);
GetStats(id, GetStatsFunctions:type)
{
if(!is_user_connected(id))
return PLUGIN_HANDLED;
switch(type)
{
case StatsMe:
{
new st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
if(get_user_rstats(id, st, bh) && st[DAMAGE])
{
new szFormat[190], len = formatex(szFormat, charsmax(szFormat), "^4• ^1Ты нанес ^3%d ^1урона ^4>> ", st[DAMAGE]);
for(new i; i < sizeof g_arrBodyMeParts; ++i)
{
if(bh[i])
{
len += formatex(szFormat[len], charsmax(szFormat) - len, "^3%s^1: ^4%d^1, ", g_arrBodyMeParts[i], bh[i]);
}
}
szFormat[strlen(szFormat) - 2] = EOS;
client_print_color(id, print_team_default, szFormat);
}
else client_print_color(id, print_team_default, "^4• ^1Попаданий не зафиксировано!");
}
case StatsHp:
{
if(g_arrMeData[id][KillerId])
{
new st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
if(get_user_vstats(g_arrMeData[id][KillerId], id, st, bh))
{
new szFormat[190], len = formatex(szFormat, charsmax(szFormat), "^4• ^1Тебя убил ^3%s ^1[^3%d^4HP^1/^3%d^4AP^1] с ^3%d ^1метров ^4>> ", g_arrMeData[id][KillerName], g_arrMeData[id][HpKiller], g_arrMeData[id][ApKiller], g_arrMeData[id][Distance]);
for(new i; i < sizeof g_arrBodyMeParts; ++i)
{
if(bh[i])
{
len += formatex(szFormat[len], charsmax(szFormat) - len, "^3%s^1: ^4%d^1, ", g_arrBodyMeParts[i], bh[i]);
}
}
szFormat[strlen(szFormat) - 2] = EOS;
client_print_color(id, print_team_default, szFormat);
}
else client_print_color(id, g_arrMeData[id][KillerId], "^4• ^1Тебя убил ^3%s ^1с расстояния ^3%d ^1метров. У него осталось ^3%d^4HP ^1и ^3%d^4AP", g_arrMeData[id][KillerName], g_arrMeData[id][Distance], g_arrMeData[id][HpKiller], g_arrMeData[id][ApKiller]);
}
else client_print_color(id, print_team_default, "^4• ^1Ты еще не умер!");
}
case StatsTop15:
{
new statsNum = get_statsnum();
if(!statsNum)
client_print_color(id, print_team_default, "^4• ^1Нет данных!");
else
{
if(statsNum > 15)
statsNum = 15;
new OldLen, bool:IsCut, buff[1535], len = formatex(buff, charsmax(buff), "<META http-equiv=Content-Type content='text/html;charset=UTF-8'><link href='%s' rel=stylesheet type=text/css>", CSS_STYLE);
len += formatex(buff[len], charsmax(buff) - len, "<table><tr><th>#<th>Имя<th>Убил<th>Умер<th>В голову<th>Skill</tr>");
for(new i, st[ARRSIZE_STATS], bh[ARRSIZE_BODY], szName[32]; i < statsNum; ++i)
{
get_stats(i, st, bh, szName, charsmax(szName));
OldLen = len;
len += formatex(
buff[len],
charsmax(buff) - len,
"<tr><td>%d<td>%s<td>%d<td>%d<td>%d<td>%s</tr>",
i+1,
szName,
st[FRAGS],
st[DEATHS],
st[HS],
g_arrViewSkills[get_skill(bh[SKILL])]
);
if(len + 9 >= charsmax(buff))
{
buff[OldLen] = 0;
IsCut = true;
break;
}
}
formatex(buff[IsCut ? OldLen : len], charsmax(buff), "</table>");
show_motd(id, buff, "Top players");
}
}
case StatsRank:
{
new st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
new plRank = get_user_stats(id, st, bh);
if(!plRank)
client_print_color(id, print_team_default, "^4• ^1Нет данных!");
else
{
client_print_color(
id,
print_team_default,
"^4• ^1Ты занимаешь ^4%d ^1место из ^4%d^1 (Убил ^4%d^1, умер ^4%d ^1раз, Skill ^4%s^1)",
plRank,
get_statsnum(),
st[FRAGS],
st[DEATHS],
g_arrViewSkills[get_skill(bh[SKILL])]
);
}
}
case StatsRankStats:
{
new st[ARRSIZE_STATS], bh[ARRSIZE_BODY];
new plRank = get_user_stats(id, st, bh);
if(!plRank)
client_print_color(id, print_team_default, "^4• ^1Нет данных!");
else
{
new buff[1535], len;
len += formatex(buff[len], charsmax(buff) - len, "<META http-equiv=Content-Type content='text/html;charset=UTF-8'><link href='%s' rel=stylesheet type=text/css>", CSS_STYLE);
len += formatex(buff[len], charsmax(buff) - len, "<p>Oбщaя cтaтистикa игpoкa</p><table cellpadding=0><tr><td valign=top width=50%%><table cellspacing=0><tr><th colspan=2> Вы нa %d-oм мecтe из %d", plRank, get_statsnum());
len += formatex(buff[len], charsmax(buff) - len, "<tr><td>Убито<td>%d (в гoлoву: %d)<tr><td>Ассистов<td>%d<tr><td>Cмepтeй<td>%d<tr><td>Пoпaдaний<td>%d<tr><td>Bыcтpeлoв<td>%d<tr><td>Уpoн<td>%d<tr><td>Toчнocть<td>%0.2f%%<tr><td>Эффeктивнocть<td>%0.2f%%<tr><td>Cкилл<td>%s</table>",
st[FRAGS], st[HS], bh[ASSIST], st[DEATHS], st[HITS], st[SHOTS], st[DAMAGE], accuracy(st[HITS], st[SHOTS]), effec(st[FRAGS], st[DEATHS]), g_arrViewSkills[get_skill(bh[SKILL])]);
len += formatex(buff[len], charsmax(buff) - len, "<td valign=top width=50%%><table cellspacing=0><tr><th colspan=2>Cтaтиcтикa пoпaдaний");
for(new i; i < sizeof g_arrBodyParts; ++i)
len += formatex(buff[len], charsmax(buff) - len, "<tr><td>%s<td>%d", g_arrBodyParts[i], bh[i]);
formatex(buff[len], charsmax(buff) - len, "<tr><td height=15px><td></table>");
show_motd(id, buff, "Your stats");
}
}
case StatsRs:
{
set_user_score(id, 0, 0);
client_cmd(id, "spk buttons/blip1.wav");
client_print_color(id, print_team_default, "^4• ^1Учись играть, а не [^4/rs^1] писать!");
}
}
return PLUGIN_HANDLED;
}
stock get_skill(skill)
{
for(new i; i < sizeof g_arrViewSkills; ++i)
{
if(i && g_arrItemSkills[i] > skill)
return i - 1;
else if((!i && g_arrItemSkills[i] > skill) || i == charsmax(g_arrViewSkills))
return i;
}
return 0;
}
stock Float:effec(kills, deaths)
return !kills ? (0.0) : (100.0 * float(kills) / float(kills + deaths));
stock Float:accuracy(hits, shots)
return !shots ? (0.0) : (100.0 * float(hits) / float(shots));