Русское сообщество по скриптингу

Помощь с плагином CSX Easy Stats

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

Помощь с плагином CSX Easy Stats

Сообщение praccprefere » 30 мар 2020, 14:52

Доброго времени суток.
Пытаюсь с плагином CSX Easy Stats by neugomon выставить значение скилла как к примеру в AES, но при этом ни в какую не хочет это значение корректно отображаться.
Исход прикладываю ниже. У кого есть свободное время подскажите как это можно сделать.
Если быть точнее то нужно сделать отображение живой цифры в /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 = 15;                     // количество игроков в топе 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]) ? -: 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(== 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(!(<= 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(&& g_arrItemSkills[i] > skill) 
            return i 
- 1;
        else if((!&& 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)); 
Аватара пользователя
praccprefere
 
Сообщения: 2
Зарегистрирован: 31 май 2016, 17:45
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8