ReHLDS/ReAPI Top damage round

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#1
Решил поделиться плагином так как многим нужен по наблюдениям, писал давненько для себя)

Автор: Dager* *.* -G- (ник Coder на форуме)
Текущая версия:
1.0.4


Краткое описание плагина:
Данный плагин предназначен для вывода списка лучших N игроков за раунд по урону. На данный момент 2 версии (вывод просто урона и вывод урона + убийства рядом). Все необходимые настройки смотреть ниже или в самом исходнике плагина, также прикреплены скрины работы плагина.

Благодарность:
Vaqtincha - за куски кода, идею и советы по коду
Ссылка на оригинал плагина: Best Damage Bonus

Возможности:
1. Настроить сколько игроков выводить в список
2. Настроить минимальное количество игроков для вывода
3. Настроить с какого раунда выводить
4. Время показа
5. Мгновенное закрытие меню по нажатию на клавиши цифр
6. Отключение показа через команду /damage
7. Помимо урона рядом выводит также количество убийств (в версии урон + убийства)
8. Префикс перед сообщением в чате
9. Настроить сколько денег давать лучшему игроку раунда
10. Возможность отключения выдачи награды

Настройки:
C++:
#define CHAT_PREFIX     "^4[Сервер]"  // префикс
#define TOP_PLAYERS     5             // количество выводимых игроков в топ по дамагу [больше 10 нет смысла указывать]
#define MIN_PLAYERS     2             // минимальное количество игроков для вывода топа
#define ROUND_NUMBER    1             // с какого раунда выводить
#define SHOW_TIME       5             // через сколько секунд закроется меню лучших игроков по дамагу за раунд [целое число]
#define GIVE_MONEY      500           // сколько денег давать лучшему игроку
#define GIVE_AWARD                    // закомментируйте если не хотите давать награду лучшему игроку
 

Вложения

Последнее редактирование: Coder

Andrey777best

Пользователь
Регистрация
10 Июн 2017
Сообщения
66
Симпатии
9
Пол
Мужской
#2
Добавьте денежное вознаграждение лучшему игроку
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#3

To be or not to be

Постоялец
Регистрация
9 Июн 2017
Сообщения
945
Симпатии
215
#4
Coder, где описание? читая Возможности плагина, я не понял абсолютно ничего. Благо, есть скриншоты, но описание быть должно !
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#5

pr0dukt.ekb

Пользователь
Регистрация
9 Июн 2017
Сообщения
24
Симпатии
4
Пол
Мужской
#7
А с 4х значными числами конфликтов не будет? К примеру выдал 3 головы с awр.
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#8
А с 4х значными числами конфликтов не будет? К примеру выдал 3 головы с awр.
просто это значение будет писаться 4х значным числом, а остальные 3х значным, на пабликах такое не часто возникает.
13 Май 2018
вот скрин примера с 4х значным числом
 

Вложения

  • 79,8 KB 45

hyrik

Постоялец
Регистрация
18 Июл 2017
Сообщения
151
Симпатии
31
Пол
Мужской
#9
в версии 1.0.1 ошибки в логах пишет
05/13/2018 - 14:40:22: [ReAPI] rg_add_account: invalid player index 0 [arg_index]

05/13/2018 - 14:40:22: [AMXX] Displaying debug trace (plugin "damage_round.amxx", version "1.0.1 ReAPI")

05/13/2018 - 14:40:22: [AMXX] Run time error 10: native error (native "rg_add_account")

05/13/2018 - 14:40:22: [AMXX] [0] damage_round.sma::fnCompareDamage (line 164)
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#10
в версии 1.0.1 ошибки в логах пишет
05/13/2018 - 14:40:22: [ReAPI] rg_add_account: invalid player index 0 [arg_index]

05/13/2018 - 14:40:22: [AMXX] Displaying debug trace (plugin "damage_round.amxx", version "1.0.1 ReAPI")

05/13/2018 - 14:40:22: [AMXX] Run time error 10: native error (native "rg_add_account")

05/13/2018 - 14:40:22: [AMXX] [0] damage_round.sma::fnCompareDamage (line 164)
как часто происходит примерно?
 

hyrik

Постоялец
Регистрация
18 Июл 2017
Сообщения
151
Симпатии
31
Пол
Мужской
#11
после смены карты примерно через 1.5 минуты начинается
 

d3m37r4

Постоялец
Регистрация
8 Июн 2017
Сообщения
384
Симпатии
171
Пол
Мужской
#12
Coder, дело не в частоте ошибки, а в валидности игроки (с) кэп
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#13
после смены карты примерно через 1.5 минуты начинается
залил себе версию 1.0.1 и 3ю карту нету ошибок. Попробуй вот этой код
13 Май 2018
Coder, дело не в частоте ошибки, а в валидности игроки (с) кэп
это по логу ясно, тогда ответь мне на вопрос почему у меня ее не выдает, а у него сразу после смены? А судя по этому
C++:
/*
* Adds money to player's account.
*
* @param index          Client index
* @param amount         The amount of money
* @param bTrackChange   If bTrackChange is 1, the amount of money added will also be displayed.
*
* @noreturn
*
* native rg_add_account(const index, amount, AccountSet:typeSet = AS_ADD, const bool:bTrackChange = true);
*/
cell AMX_NATIVE_CALL rg_add_account(AMX *amx, cell *params)
{
    enum args_e { arg_count, arg_index, arg_amount, arg_typeSet, arg_track_change };

    CHECK_ISPLAYER(arg_index);

    CBasePlayer *pPlayer = UTIL_PlayerByIndex(params[arg_index]);
    CHECK_CONNECTED(pPlayer, arg_index);

    if (static_cast<AccountSet>(params[arg_typeSet]) == AS_SET) {
        pPlayer->m_iAccount = 0;
    }

    pPlayer->CSPlayer()->AddAccount(params[arg_amount], RT_NONE, params[arg_track_change] != 0);
    return TRUE;
}
как видно так уже юзаются проверки CHECK_ISPLAYER(arg_index); и CHECK_CONNECTED(pPlayer, arg_index);
Или я что-то не понимаю, тогда прошу объясни.
 

Вложения

hyrik

Постоялец
Регистрация
18 Июл 2017
Сообщения
151
Симпатии
31
Пол
Мужской
#14
залил себе версию 1.0.1 и 3ю карту нету ошибок. Попробуй вот этой код
13 Май 2018

это по логу ясно, тогда ответь мне на вопрос почему у меня ее не выдает, а у него сразу после смены? А судя по этому
C++:
/*
* Adds money to player's account.
*
* @param index          Client index
* @param amount         The amount of money
* @param bTrackChange   If bTrackChange is 1, the amount of money added will also be displayed.
*
* @noreturn
*
* native rg_add_account(const index, amount, AccountSet:typeSet = AS_ADD, const bool:bTrackChange = true);
*/
cell AMX_NATIVE_CALL rg_add_account(AMX *amx, cell *params)
{
    enum args_e { arg_count, arg_index, arg_amount, arg_typeSet, arg_track_change };

    CHECK_ISPLAYER(arg_index);

    CBasePlayer *pPlayer = UTIL_PlayerByIndex(params[arg_index]);
    CHECK_CONNECTED(pPlayer, arg_index);

    if (static_cast<AccountSet>(params[arg_typeSet]) == AS_SET) {
        pPlayer->m_iAccount = 0;
    }

    pPlayer->CSPlayer()->AddAccount(params[arg_amount], RT_NONE, params[arg_track_change] != 0);
    return TRUE;
}
как видно так уже юзаются проверки CHECK_ISPLAYER(arg_index); и CHECK_CONNECTED(pPlayer, arg_index);
Или я что-то не понимаю, тогда прошу объясни.
с час все ок ошибок не наблюдается
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#15

Andrey777best

Пользователь
Регистрация
10 Июн 2017
Сообщения
66
Симпатии
9
Пол
Мужской
#16
А зачем выводятся игроки у которых 0 0?
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#17
А зачем выводятся игроки у которых 0 0?
а почему бы и нет, если например ты выставишь показ 10 игроков, а на серваке например 7 игроков, то выведет всех семь, независимо от того, попали они или нет. Если не надо выводить, то нужно поменять условие, но я не вижу смысла не выводить таких игроков)
 

Andrey777best

Пользователь
Регистрация
10 Июн 2017
Сообщения
66
Симпатии
9
Пол
Мужской
#18
А почему они должны быть на местах в топе? Если стоит топ 10 за раунд а играет 5 ну и пусть выводит тех, кто нанес урон. Смысла в пустых игроках нет
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
178
Симпатии
70
Пол
Мужской
#19
А почему они должны быть на местах в топе? Если стоит топ 10 за раунд а играет 5 ну и пусть выводит тех, кто нанес урон. Смысла в пустых игроках нет
ну по сути ты выводишь топ игроков и они попадают в топ с 0 дамагом, по причине нехватки игроков, выставишь показ 10 и будет на серваке 15 тел, то 5 не покажет, логично же
13 Май 2018
нужно в циклах дописать проверку
Код:
if(g_arrData[i][DAMAGE] <= 0.0)
    continue;
Участок кода
Код:
public fnShowStats(id)
{
    if(!g_isSwitch[id])
        return PLUGIN_CONTINUE;
    
    new iPlayers[MAX_PLAYERS], iNum, szMenu[512], szName[MAX_NAME_LENGTH], iLen;
    get_players(iPlayers, iNum, "h");
    
    iLen = formatex(szMenu, charsmax(szMenu), "\w#. \r[\yУрон\r] [\yФраги\r] \wза раунд:^n^n");
    
    if(iNum < MIN_PLAYERS)
        return PLUGIN_CONTINUE;
    
    if(iNum < TOP_PLAYERS)
    {
        for(new i = 0; i < iNum; i++)
        {
            if(g_arrData[i][DAMAGE] <= 0.0)
                continue;
            
            get_user_name(g_arrData[i][PLAYER_ID], szName, charsmax(szName));
            
            if(0.0 <= g_arrData[i][DAMAGE] < 10.0)
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y00%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
            else if(10.0 <= g_arrData[i][DAMAGE] < 100.0)
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y0%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
            else
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
        }
    }
    else
    {
        for(new i = 0; i < TOP_PLAYERS; i++)
        {
            if(g_arrData[i][DAMAGE] <= 0.0)
                continue;
            
            get_user_name(g_arrData[i][PLAYER_ID], szName, charsmax(szName));
            
            if(0.0 <= g_arrData[i][DAMAGE] < 10.0)
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y00%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
            else if(10.0 <= g_arrData[i][DAMAGE] < 100.0)
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y0%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
            else
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
        }
    }
    
    show_menu(id, Keys, szMenu, SHOW_TIME, "TopDmg");
    return PLUGIN_HANDLED;
}
не проверял, но должно работать
 

Andrey777best

Пользователь
Регистрация
10 Июн 2017
Сообщения
66
Симпатии
9
Пол
Мужской
#20
Coder, Ты либо попал в топ раунда, либо не попал, вот это логично