Иконка ресурса

Best player of the round/map 0.2

Нет прав для скачивания
Сообщения
316
Реакции
131
Помог
4 раз(а)
Сообщения
271
Реакции
347
Помог
15 раз(а)
Что там с циклами происходит?

и проверки в HC_CBasePlayer_TakeDamage_Pre замени на rg_is_player_can_takedamage
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
alabamaster1337, тестирование проводилось? Работает?
Смотря на то, что g_damag[][] никогда не обнуляется, не представляю как фича "лучший в раунде" будет работать.
Код:
    for(new i = 1; i < 33; i++) // что это? ниже i нигде нет
    {
        for(new j = 1; j < 33; j++)
        {
            if( !is_user_connected(j) )
                continue;
            if( max_dam <= g_damag[j][0] )
            {
                max_dam = g_damag[j][0];
                max_dam_id = j;
            }
        }
    }
Код:
    if( get_member(attacker, m_iTeam) == CS_TEAM_T && get_member(victim, m_iTeam) == CS_TEAM_CT )
    {
        g_damag[attacker][0] += floatround(fDamage,floatround_round);
        g_damag[attacker][1]++;
    } else if( get_member(attacker, m_iTeam) == CS_TEAM_CT && get_member(victim, m_iTeam) == CS_TEAM_T ){
        g_damag[attacker][0] += floatround(fDamage,floatround_round);
        g_damag[attacker][1]++;
    }
В чем отличие между этими двумя if?
 
Сообщения
287
Реакции
223
Помог
6 раз(а)
if( max_dam <= g_damag[j][0] )
А если два или несколько игроков нанесут одинаковый максимальный урон? Оператор равенства не нужен. Хотя, судя по тому, что автор не ответил на замечания выше, кажется, плагин заброшен
 
Сообщения
316
Реакции
131
Помог
4 раз(а)
Ну короче попытался сделать так

Код:
#include <amxmodx>
#include <reapi>

new g_damag[33][2];

public plugin_init() {
    register_plugin("Best damage", "0.2", "maxee");

    register_clcmd("say /dmg","damag");

    RegisterHookChain(RG_RoundEnd, "HC_RoundEnd", true);
    RegisterHookChain(RG_CBasePlayer_TakeDamage,   "HC_CBasePlayer_TakeDamage_Pre",  true);
}

public client_disconnected(id)
{
    g_damag[id][0] = 0;
    g_damag[id][1] = 0;
}

public HC_RoundEnd()
{
    new max_dam = 0;
    new max_dam_id = 0;

    for(new i = 1; i < 33; i++)
    {
        for(new j = 1; j < 33; j++)
        {
            if( !is_user_connected(j) )
                continue;
            if( max_dam <= g_damag[j][0] )
            {
                max_dam = g_damag[j][0];
                max_dam_id = j;
            }
        }
    }
    new name[33];
    get_user_name(max_dam_id, name, 32);
    client_print_color(0, print_team_red, "^4* ^3Best player of the round: ^4%s ^1[^3%d hits ^1= ^3%d dmg^1]", name, g_damag[max_dam_id][1], g_damag[max_dam_id][0]);

    g_damag[max_dam_id][0] = 0;
    g_damag[max_dam_id][1] = 0;
}

public HC_CBasePlayer_TakeDamage_Pre(victim, weapon, attacker, Float:fDamage, damagebits)
{
    if( get_member(attacker, m_iTeam) == CS_TEAM_T && get_member(victim, m_iTeam) == CS_TEAM_CT )
    {
        g_damag[attacker][0] += floatround(fDamage,floatround_round);
        g_damag[attacker][1]++;
    }
    else if( get_member(attacker, m_iTeam) == CS_TEAM_CT && get_member(victim, m_iTeam) == CS_TEAM_T )
    {
        g_damag[attacker][0] += floatround(fDamage,floatround_round);
        g_damag[attacker][1]++;
    }
}

public damag(id)
{
    new max_dam = 0;
    new max_dam_id = 0;
   
    for(new i = 1; i < 33; i++)
    {
        for(new j = 1; j < 33; j++)
        {
            if( !is_user_connected(j) )
                continue;
            if( max_dam < g_damag[j][0] )
            {
                max_dam = g_damag[j][0];
                max_dam_id = j;
            }
        }
    }
    new name[33];
    get_user_name(max_dam_id,name, 32);
    client_print_color(0, print_team_red, "^4* ^3Best player of the map: ^4%s ^1[^3%d hits ^1= ^3%d dmg^1]", name, g_damag[max_dam_id][1], g_damag[max_dam_id][0]);
}
Сообщения стали дублироваться, в инфе за карту первое сообщение верное, а в инфе за раунд верное второе сообщение.
 

Вложения

Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
1. Хук назван пре но по факту пост. Зачем проверка TEM_CT и TEM_T если достаточно првоерить temaattacker != teamvictim. А еще лучше натив rg_is_player_can_takedamage (и так реапи подключеный). Также зачем использовать константы из модуля cstrike в мембере модуля reapi. Если там есть свои константы для комманд. Второй аргумент не weapon а inflictor. Если это оружие (а не граната/бомба или другая ентити) то он будет равен игроку. А оруже получается которое активное у игрока.
Код:
RegisterHookChain(RG_CBasePlayer_TakeDamage,   "HC_CBasePlayer_TakeDamage_Post",  true);

public HC_CBasePlayer_TakeDamage_Post(const victim, const inflictor, const attacker, const Float:dmg) {
    if (victim != attacker && is_user_connected(attacker) && rg_is_player_can_takedamage(victim, attacker)) {
        g_damag[attacker][0] += floatround(dmg, floatround_round);
        g_damag[attacker][1]++;
    }
}
2. Используйте enum-ы. Не понядно зачем вам массив на 2 ячейки если вторая нигде в коде не используйется. Также не указывайте магические 33. Для этого есть MAX_PLAYERS + 1. При входе игрока нет обнуление массива. Обнулять проще через arrayset.
Код:
enum _:player_s {
    DmgRound,
    DmgMap
};

new Players[MAX_PLAYERS + 1][player_s];

public client_putinserver(id) {
    arrayset(Players[id], 0, sizeof(Players[]));
}

public client_disconnected(id) {
    arrayset(Players[id], 0, sizeof(Players[]));
}
3. Зачем 2 вложеных цыкла. Что вы считаете? 32 раза лучшего игрока?
Код:
new max_dam = 0;
new max_dam_id = 0;

for (new player = 1; player <= MAX_PLAYERS; player++) {
    if (!is_user_connected(player)) {
        continue;
    }

    if (max_dam <= g_damag[player][0]) {
        max_dam = g_damag[player][0];
        max_dam_id = player;
    }
}
4. Как вообше все это должно работать если в конце раунда обнуляется игрок который нанес больше всех урона. А других обнулять кто будет. Также для подсчета лучшего игрока карты наоборот не нужно сбрасивать массив каждый раунд.
 

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

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