InName Combo Kills

Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
Обновлен ресурс InName Combo Kills новой записью:

Обновлено до 0.0.2

  • FIX: Исправлен вылет клиента с сервера при суициде (или смерти от wolrdspawn entity); (#2)
    Благодарность за выявленный баг: xZenon и kontakt
  • Незначительные правки кода. (благодарность Garey )
Узнать больше об этом обновлении...
 
Сообщения
35
Реакции
8
L 08/31/2018 - 15:31:31: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20180831.log")
L 08/31/2018 - 15:31:31: [AMXX] Displaying debug trace (plugin "InName_Combo_Kills.amxx", version "0.0.2")
L 08/31/2018 - 15:31:31: [AMXX] Run time error 4: index out of bounds
L 08/31/2018 - 15:31:31: [AMXX] [0] InName_Combo_Kills.sma::CBasePlayer_Killed (line 42)
это не критично? но плагин работает исправно как и задумано, или подскажите чтоб исправить чтоб не сыпало в логи)
 
Сообщения
35
Реакции
8
Sonyx, спасибо добрый человек) вроде чистые логи но понаблюдаю ещё) (благодарочку не могу тыкнуть не высвечивается нигде)
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
Sekret, а вы почаще полезное пишите на форуме и появится)
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
wopox1337,
for(new i; i < 4; i++) write_long(0);
это боль...:sorry:

зачем цикл то?
причем с постоянным созданием новой переменной?
 
Сообщения
287
Реакции
223
Помог
6 раз(а)
neygomon, чо? Переменная создалась, три раза проитерировалась и все
Код:
for(new i; i < 4; i++) write_long(0);
То же самое, что и:
Код:
write_long(0);
write_long(0);
write_long(0);
ADD: А, так ты про форвард убийства. Ну тут ничего страшного все равно нет
 
Последнее редактирование:
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
shadow, мой пост был:
1. не для пояснения от других как работает цикл
2. для автора, чтобы пояснил почему именно цикл, а не дублирование строк...
цикл по 32 игрокам > каждый раз создаем переменную I > 3 лишних итерации того самого цикла внутри другого цикла​

ps Это все микрооптимизации, но все же...
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
wopox1337, из нескольких таких микрооптимизаций складываются довольно приличные сейвы ресурсов и повышение производительности
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
neygomon, а если посмотреть как выделяется память под переменную то можно понять что времени это не занимает.
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
wopox1337, время занимает любое действие.
абсолютно любое...
 
Сообщения
47
Реакции
6
Помог
1 раз(а)
Sekret,
C++:
public CBasePlayer_Killed(pPlayer, pKiller)
{
    if(!CHECK_PLAYER(pKiller) || g_iComboKills[pKiller] < MIN_KILLS)
        return;

    reset_user_info(pKiller);
}
Точно такая-же ошибка.
Не понимаю абсолютно в какую часть кода ставить эту таблетку.

Ставлю так и не компилит.
Код:
#include <amxmodx>
#include <fakemeta>     // for fake name change
#include <hamsandwich>  // for player hooks

/* Settings */
    // Minimum kills need to show counter in name.
const MIN_KILLS = 2;
    // Enable CSDM FFA kills support.
// #define FFA_MODE
/*          */

new g_iComboKills[MAX_PLAYERS + 1] = { 0, ... };

public plugin_init()
{
    register_plugin("InName Combo Kills", "0.0.2", "wopox1337");

    RegisterHam(Ham_Killed, "player", "CBasePlayer_Killed_Pre", .Post = false, .specialbot = true);
    RegisterHam(Ham_Killed, "player", "CBasePlayer_Killed", .Post = true, .specialbot = true);

    RegisterHam(Ham_Spawn, "player", "CBasePlayer_Spawn", .Post = true, .specialbot = true);
}

public CBasePlayer_Killed_Pre(pPlayer, pKiller)
{
    if(!IsValidKill(pPlayer, pKiller))
        return;
    
    if(++g_iComboKills[pKiller] < MIN_KILLS)
        return;
    
    static szKillerName[MAX_NAME_LENGTH];
    get_user_name(pKiller, szKillerName, charsmax(szKillerName));

// ' [+100]' = 7 + 1(nullterm) = 8chars; MAX_NAME_LENGTH - 8 = 24
    formatex(szKillerName, charsmax(szKillerName), "%.24s [+%i]",szKillerName, g_iComboKills[pKiller]);
    set_user_fake_name(pKiller, szKillerName);
}

public CBasePlayer_Killed(pPlayer, pKiller)
{
    if(g_iComboKills[pKiller] < MIN_KILLS)
        return;

    reset_user_info(pKiller);
}

public CBasePlayer_Spawn(pPlayer)
    g_iComboKills[pPlayer] = 0;

// From: https://dev-cs.ru/resources/189/ (cuz i need fastest usage)
stock set_user_fake_name(const id, const name[])
{
    for(new i = 1; i <= MaxClients; i++)
    {
        if(is_user_connected(i) && !is_user_hltv(i))
        {
            message_begin(MSG_ONE, SVC_UPDATEUSERINFO, _, i);
            write_byte(id - 1);
            write_long(get_user_userid(id));
            write_char('\');
            write_char('n');
            write_char('a');
            write_char('m');
            write_char('e');
            write_char('\');
            write_string(name);
            for(new i; i < 4; i++) write_long(0);
            message_end();
        }
    }
}

stock reset_user_info(id)
{
    static szUserInfo[256];
    copy_infokey_buffer(engfunc(EngFunc_GetInfoKeyBuffer, id), szUserInfo, charsmax(szUserInfo));

    for(new i = 1; i <= MaxClients; i++)
    {
        if(is_user_connected(i) && !is_user_hltv(i))
        {
            message_begin(MSG_ONE, SVC_UPDATEUSERINFO, _, i);
            write_byte(id - 1);
            write_long(get_user_userid(id));
            write_string(szUserInfo);
            for(new i; i < 4; i++) write_long(0);
            message_end();
        }
    }
}

stock bool: IsValidKill(pPlayer, pKiller)
{   
    if(pPlayer == pKiller)
        return false;

    if(!is_user_alive(pKiller))
        return false;

#if !defined FFA_MODE
    if(get_user_team(pPlayer) == get_user_team(pKiller))
        return false;
#endif

    return true;
}



/* API?! */
public plugin_natives()
{
    enum { oldstyle };
    register_native("combo_GetKills", "native__combo_GetKills", .style = oldstyle);
}

stock CHECK_PLAYER(id)
{
    if(id < 1 || id > MaxClients)
    {
        log_error(AMX_ERR_NATIVE, "Player out of range (%i)", id);
        return 0;
    } else return 1;
}

/**
* Set count of combo kills to player.
*
* @note Usage examples:
*       combo_SetKills(id, .count = 5);
*
* @param index  Client index
* @param count  Count combo kills.   
*
* @noreturn
*/
    // native combo_SetKills(id, count)
public native__combo_SetKills(plugin_id, argc)
{
    enum { arg_index = 1, arg_count };

    new index = get_param(arg_index);
    if(!CHECK_PLAYER(index)) return 0;

    new count = get_param(arg_count);
    g_iComboKills[index] = count;

    return 1;
}
{
public CBasePlayer_Killed(pPlayer, pKiller)
{
    if(!CHECK_PLAYER(pKiller) || g_iComboKills[pKiller] < MIN_KILLS)
        return;

    reset_user_info(pKiller);
}
}
/**
* Retrieves count of combo kills from player.
*
* @note Usage examples:
*       combo_GetKills(id);
*
* @param index  Client index
*
* @return Combo kills count from player.
*/
    // native combo_GetKills(id)
public native__combo_GetKills(plugin_id, argc)
{
    enum { arg_index = 1 };

    new index = get_param(arg_index);
    if(!CHECK_PLAYER(index)) return 0;

    return g_iComboKills[index];
}
3 Окт 2018
Точно такая-же ошибка.
Не понимаю абсолютно в какую часть кода ставить эту таблетку.

Ставлю так и не компилит.
Код:
#include <amxmodx>
#include <fakemeta>     // for fake name change
#include <hamsandwich>  // for player hooks

/* Settings */
    // Minimum kills need to show counter in name.
const MIN_KILLS = 2;
    // Enable CSDM FFA kills support.
// #define FFA_MODE
/*          */

new g_iComboKills[MAX_PLAYERS + 1] = { 0, ... };

public plugin_init()
{
    register_plugin("InName Combo Kills", "0.0.2", "wopox1337");

    RegisterHam(Ham_Killed, "player", "CBasePlayer_Killed_Pre", .Post = false, .specialbot = true);
    RegisterHam(Ham_Killed, "player", "CBasePlayer_Killed", .Post = true, .specialbot = true);

    RegisterHam(Ham_Spawn, "player", "CBasePlayer_Spawn", .Post = true, .specialbot = true);
}

public CBasePlayer_Killed_Pre(pPlayer, pKiller)
{
    if(!IsValidKill(pPlayer, pKiller))
        return;
   
    if(++g_iComboKills[pKiller] < MIN_KILLS)
        return;
   
    static szKillerName[MAX_NAME_LENGTH];
    get_user_name(pKiller, szKillerName, charsmax(szKillerName));

// ' [+100]' = 7 + 1(nullterm) = 8chars; MAX_NAME_LENGTH - 8 = 24
    formatex(szKillerName, charsmax(szKillerName), "%.24s [+%i]",szKillerName, g_iComboKills[pKiller]);
    set_user_fake_name(pKiller, szKillerName);
}

public CBasePlayer_Killed(pPlayer, pKiller)
{
    if(g_iComboKills[pKiller] < MIN_KILLS)
        return;

    reset_user_info(pKiller);
}

public CBasePlayer_Spawn(pPlayer)
    g_iComboKills[pPlayer] = 0;

// From: https://dev-cs.ru/resources/189/ (cuz i need fastest usage)
stock set_user_fake_name(const id, const name[])
{
    for(new i = 1; i <= MaxClients; i++)
    {
        if(is_user_connected(i) && !is_user_hltv(i))
        {
            message_begin(MSG_ONE, SVC_UPDATEUSERINFO, _, i);
            write_byte(id - 1);
            write_long(get_user_userid(id));
            write_char('\');
            write_char('n');
            write_char('a');
            write_char('m');
            write_char('e');
            write_char('\');
            write_string(name);
            for(new i; i < 4; i++) write_long(0);
            message_end();
        }
    }
}

stock reset_user_info(id)
{
    static szUserInfo[256];
    copy_infokey_buffer(engfunc(EngFunc_GetInfoKeyBuffer, id), szUserInfo, charsmax(szUserInfo));

    for(new i = 1; i <= MaxClients; i++)
    {
        if(is_user_connected(i) && !is_user_hltv(i))
        {
            message_begin(MSG_ONE, SVC_UPDATEUSERINFO, _, i);
            write_byte(id - 1);
            write_long(get_user_userid(id));
            write_string(szUserInfo);
            for(new i; i < 4; i++) write_long(0);
            message_end();
        }
    }
}

stock bool: IsValidKill(pPlayer, pKiller)
{  
    if(pPlayer == pKiller)
        return false;

    if(!is_user_alive(pKiller))
        return false;

#if !defined FFA_MODE
    if(get_user_team(pPlayer) == get_user_team(pKiller))
        return false;
#endif

    return true;
}



/* API?! */
public plugin_natives()
{
    enum { oldstyle };
    register_native("combo_GetKills", "native__combo_GetKills", .style = oldstyle);
}

stock CHECK_PLAYER(id)
{
    if(id < 1 || id > MaxClients)
    {
        log_error(AMX_ERR_NATIVE, "Player out of range (%i)", id);
        return 0;
    } else return 1;
}

/**
* Set count of combo kills to player.
*
* @note Usage examples:
*       combo_SetKills(id, .count = 5);
*
* @param index  Client index
* @param count  Count combo kills.  
*
* @noreturn
*/
    // native combo_SetKills(id, count)
public native__combo_SetKills(plugin_id, argc)
{
    enum { arg_index = 1, arg_count };

    new index = get_param(arg_index);
    if(!CHECK_PLAYER(index)) return 0;

    new count = get_param(arg_count);
    g_iComboKills[index] = count;

    return 1;
}
{
public CBasePlayer_Killed(pPlayer, pKiller)
{
    if(!CHECK_PLAYER(pKiller) || g_iComboKills[pKiller] < MIN_KILLS)
        return;

    reset_user_info(pKiller);
}
}
/**
* Retrieves count of combo kills from player.
*
* @note Usage examples:
*       combo_GetKills(id);
*
* @param index  Client index
*
* @return Combo kills count from player.
*/
    // native combo_GetKills(id)
public native__combo_GetKills(plugin_id, argc)
{
    enum { arg_index = 1 };

    new index = get_param(arg_index);
    if(!CHECK_PLAYER(index)) return 0;

    return g_iComboKills[index];
}
всё, дошло)
 
Сообщения
7
Реакции
0
It makes a bug, that when a player kills an enemy (2+ kills in a row), on scoreboard it shows +2/3 etc near his name for a second (instead of in the top right only)
 
Сообщения
81
Реакции
9
Помог
3 раз(а)
wopox1337, После установки стала некорректно работать запись демо, а точнее его воспроизведение через viewdemo, начинается просмотр, проходит 1 секунда и крашит клиент
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
TwinG4_20, в курсе. Из за того, что метод "подмены ника" - костыль.
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
TwinG4_20, нет. Исправить невозможно. На этой подмене и базируется плагин
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу