Магическая работа плагина

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
654
Реакции
560
Помог
9 раз(а)
b0t., И правда. Когда-то сталкивался и нашел по цепочке событий на регейме
 
  • Нравится
Реакции: b0t.
Сообщения
397
Реакции
221
Помог
13 раз(а)
Vaqtincha,
Вообще он перебирает по всей длине массива. ТЫК
 
Сообщения
86
Реакции
2
daydreamind,

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

//new const g_szIP[] = "185.248.103.12:15555";

#define MAX_DMG_100 //Maximum damage dealt to one enemy = 100.
#define SHOT_A_GRENADE //Count grenade damage as a hit.
#define MAXPLAYERS 11 //Maximum number of slots on the server

enum any: DATA {
    damage,
    Shot
};

new
    e_InfoClient[DATA][MAXPLAYERS +1],
    bool:b_Chat;

public plugin_init() {
    register_plugin("GameInfo", "1.2", "b0t.");

    RegisterHookChain(RG_CBasePlayer_TakeDamage, "RG_CBasePlayerTakeDamage_Post", 1);
    RegisterHookChain(RG_RoundEnd,"RG_RoundEnd_Post", 1);

    register_clcmd("say /damageinfo", "Info_Menu");
}

public RG_CBasePlayerTakeDamage_Post(const pVictim, const iInflictor, const pAttacer, const Float:fDamage, const iBitDamage) {
    if(!is_user_connected(pAttacer) || fDamage <= 0.0 || !rg_is_player_can_takedamage(pVictim, pAttacer) || pVictim == pAttacer)
        return HC_CONTINUE;

    #if !defined SHOT_A_GRENADE
        if(iBitDamage & DMG_GRENADE)
            return HC_CONTINUE;
    #endif

    new iDemage = floatround(fDamage);

    #if defined MAX_DMG_100
        if((e_InfoClient[Demage][pAttacer] +iDemage) > 100)
            e_InfoClient[Demage][pAttacer] = 100;

        else e_InfoClient[Damage][pAttacer] += iDamage;
    #else
        e_InfoClient[Demage][pAttacer] += iDemage;
    #endif

    ++e_InfoClient[Shot][pAttacer];

    return HC_CONTINUE;
}

public RG_RoundEnd_Post() {
    RequestFrame("RequestFrame__PrintInfo");
}

public RequestFrame__PrintInfo() {
    for(new i = 1; i <= MAXPLAYERS; ++i) {
        if(!is_user_connected(i))
            continue;

        UTIL_ShowRoundInfo(s);
    }

    arrayset(e_InfoClient[_:0][0], 0, sizeof(e_InfoClient) * sizeof(e_InfoClient[]));
}

public Info_Menu(const pId) {
    new i_Menu = menu_create("\yMenu Informer", "Damager_Handler");

    menu_additem(i_Menu, "Show damage information in console", "1");
    menu_additem(i_Menu, "Show damage information in chat", "2");

    menu_setprop(i_Menu, MPROP_EXITNAME, "Exit");
    menu_display(pId, i_Menu);
}

public Damager_Handler(const pId, const iMenu, const iItem) {
    menu_destroy(iMenu);

    if(iItem != MENU_EXIT)
        b_Chat = bool:iItem;

    return PLUGIN_HANDLED;
}

stock UTIL_ShowRoundInfo(const id) {
    for(new i = 1; i <= MAXPLAYERS; ++i) {
        if(!is_user_connected(i) || i == id)
            continue;

        if(e_InfoClient[Demage][id] == 0 && e_InfoClient[Demage][i] == 0)
            continue;

        client_print(id, b_Chat ? print_chat : print_console,
                "You* -> |%i with %i|, Opponent -> |%i with %i|, %n -> |%.0fHP|",
                e_InfoClient[Demage][id], e_InfoClient[Shot][id],
                e_InfoClient[Demage][i], e_InfoClient[Shot][i],
                i, !is_user_alive(i) ? 0 : get_entvar(i, var_health)
            );

    }
}
b0t. Something is wrong and i don't know what. The plugin doesn't calculate correctely the hits... 1 SHOT and it says 12...

You* -> |100 with 12|, Opponent -> |0 with 0|, Dan -> |0HP|
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
claudiuandrei10, тебе нужно переделать двухмерный массив e_InfoClient[DATA][MAXPLAYERS +1], на трехмерный, так как у тебя в твой массив записывает урон и попадания в сумме от всех игроков, урон бы тоже отображало бы в разы больше, если закоментировать это - #define DAMAGE_DEFAULT
 
Последнее редактирование:
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Например так,
Код:
#include <amxmodx>
#include <reapi>

#define IS_TEAM(%0,%1) bool:(get_member(%0, m_iTeam) == %1)

/*---------------------------------Настройки-------------------------------------------*/
#define DAMAGE_DEFAULT        //Максимальный нанёсённый урон по одному противнику = 100.
#define SHOT_A_GRENADE        //Засчитывать урон от гранаты за попадание.
/*-------------------------------------------------------------------------------------*/

enum any: DATA {
    Float:DAMAGE,
    SHOTS
};

new
    e_Client[DATA][MAX_PLAYERS +1][MAX_PLAYERS +1],
    bool:b_ViewChat,
    gl_iMenu;

public plugin_init() {
    register_plugin("GameInfo", "24.01.24", "b0t.");

    RegisterHookChain(RG_CBasePlayer_TakeDamage, "RG_CBasePlayerTakeDamage_Post", 1);
    RegisterHookChain(RG_RoundEnd,"RG_RoundEnd_Post", 1);

    register_clcmd("say /damageinfo", "Info_Menu");

    CREATE_Mmenu();
}

public RG_CBasePlayerTakeDamage_Post(const pVictim, const iInflictor, const pAttacker, const Float:fDamage, const iBitDamage) {
    if(!is_user_connected(pAttacker) || !rg_is_player_can_takedamage(pVictim, pAttacker) || pVictim == pAttacker)
        return HC_CONTINUE;

    #if !defined SHOT_A_GRENADE
        if(iBitDamage & DMG_GRENADE)
            return HC_CONTINUE;
    #endif

    #if defined DAMAGE_DEFAULT
        if(e_Client[DAMAGE][pAttacker][pVictim] +fDamage > 100.0)
            e_Client[DAMAGE][pAttacker][pVictim] = 100.0;

        else e_Client[DAMAGE][pAttacker][pVictim] += fDamage;
    #else
        e_Client[DAMAGE][pAttacker][pVictim] += fDamage;
    #endif

    ++e_Client[SHOTS][pAttacker][pVictim];

    return HC_CONTINUE;
}

public RG_RoundEnd_Post()
    RequestFrame("RequestFrame_PrintInfo");

public RequestFrame_PrintInfo() {
    for(new id = 1; id <= MaxClients; ++id) {
        if(!is_user_connected(id))
            continue;

        UTIL_ShowRoundInfo(id);
    }

    arrayset(e_Client[_:0][0][0], 0, sizeof(e_Client) * sizeof(e_Client[]) * sizeof(e_Client[][]));
}

CREATE_Mmenu() {
    gl_iMenu = menu_create("\yИнформер меню", "Damager_Handler");

    menu_additem(gl_iMenu, "Показывать информацию об уроне в чате", "1");
    menu_additem(gl_iMenu, "Показывать информацию об уроне в консоли", "2");

    menu_setprop(gl_iMenu, MPROP_EXITNAME, "Выход");
}

public Info_Menu(const pId) {
    if(is_user_connected(pId))
        menu_display(pId, gl_iMenu);

    return PLUGIN_HANDLED;
}

public Damager_Handler(const pId, const iMenu, const iItem) {
    if(iItem != MENU_EXIT)
        b_ViewChat = bool:iItem;
}

stock UTIL_ShowRoundInfo(const id) {
    for(new pClient = 1; pClient <= MaxClients ; ++pClient) {
        if(!is_user_connected(pClient) || pClient == id || IS_TEAM(pClient, TEAM_UNASSIGNED) || IS_TEAM(pClient, TEAM_SPECTATOR))
            continue;

        if(e_Client[DAMAGE][id][pClient] == 0.0 && e_Client[DAMAGE][pClient][id] == 0.0)
            continue;

        client_print(id, !b_ViewChat ? print_chat : print_console,
            "Вы* -> |%.0f урон * %i попаданий|, Противник -> |%.0f урон * %i попаданий|, %n -> |%.0f HP остаток|",
            e_Client[DAMAGE][id][pClient], e_Client[SHOTS][id][pClient],
            e_Client[DAMAGE][pClient][id], e_Client[SHOTS][pClient][id],
            pClient, !is_user_alive(pClient) ? 0 : get_entvar(pClient, var_health)
        );
    }
}
Язык на английский, уже сменишь сам
 
Последнее редактирование:
Сообщения
86
Реакции
2
Например так,
Код:
#include <amxmodx>
#include <reapi>

#define IS_TEAM(%0,%1) bool:(get_member(%0, m_iTeam) == %1)

/*---------------------------------Настройки-------------------------------------------*/
#define DAMAGE_DEFAULT        //Максимальный нанёсённый урон по одному противнику = 100.
#define SHOT_A_GRENADE        //Засчитывать урон от гранаты за попадание.
const MAXPLAYERS = 11;        //Максимальное количество слотов на сервере
/*-------------------------------------------------------------------------------------*/

enum any: DATA {
    Float:DAMAGE,
    SHOTS
};

new
    e_Client[DATA][MAXPLAYERS +1][MAXPLAYERS +1],
    bool:b_ViewChat;

public plugin_init() {
    register_plugin("GameInfo", "24.01.24", "b0t.");

    RegisterHookChain(RG_CBasePlayer_TakeDamage, "RG_CBasePlayerTakeDamage_Post", 1);
    RegisterHookChain(RG_RoundEnd,"RG_RoundEnd_Post", 1);

    register_clcmd("say /damageinfo", "Info_Menu");
}

public RG_CBasePlayerTakeDamage_Post(const pVictim, const iInflictor, const pAttacker, const Float:fDamage, const iBitDamage) {
    if(!is_user_connected(pAttacker) || !rg_is_player_can_takedamage(pVictim, pAttacker) || pVictim == pAttacker)
        return HC_CONTINUE;

    #if !defined SHOT_A_GRENADE
        if(iBitDamage & DMG_GRENADE)
            return HC_CONTINUE;
    #endif

    #if defined DAMAGE_DEFAULT
        if(e_Client[DAMAGE][pAttacker][pVictim] +fDamage > 100.0)
            e_Client[DAMAGE][pAttacker][pVictim] = 100;

        else e_Client[DAMAGE][pAttacker][pVictim] += fDamage;
    #else
        e_Client[DAMAGE][pAttacker][pVictim] += fDamage;
    #endif

    ++e_Client[SHOTS][pAttacker][pVictim];

    return HC_CONTINUE;
}

public RG_RoundEnd_Post()
    RequestFrame("RequestFrame_PrintInfo");

public RequestFrame_PrintInfo() {
    for(new id = 1; id <= MAXPLAYERS; ++id) {
        if(!is_user_connected(id))
            continue;

        UTIL_ShowRoundInfo(id);
    }

    arrayset(e_Client[_:0][0][0], 0, sizeof(e_Client) * sizeof(e_Client[]) * sizeof(e_Client[][]));
}

public Info_Menu(const pId) {
    new i_Menu = menu_create("\yИнформер меню", "Damager_Handler");

    menu_additem(i_Menu, "Показывать информацию об уроне в чате", "1");
    menu_additem(i_Menu, "Показывать информацию об уроне в консоли", "2");

    menu_setprop(i_Menu, MPROP_EXITNAME, "Выход");
    menu_display(pId, i_Menu);

    return PLUGIN_HANDLED;
}

public Damager_Handler(const pId, const iMenu, const iItem) {
    menu_destroy(iMenu);

    if(iItem != MENU_EXIT)
        b_ViewChat = bool:iItem;
}

stock UTIL_ShowRoundInfo(const id) {
    for(new pClient = 1; pClient <= MAXPLAYERS; ++pClient) {
        if(!is_user_connected(pClient) || pClient == id || IS_TEAM(pClient, TEAM_UNASSIGNED) || IS_TEAM(pClient, TEAM_SPECTATOR))
            continue;

        if(e_Client[DAMAGE][id][pClient] == 0.0 && e_Client[DAMAGE][pClient][id] == 0.0)
            continue;

        client_print(id, !b_ViewChat ? print_chat : print_console,
            "Вы* -> |%.0f урон * %i попаданий|, Противник -> |%.0f урон * %i попаданий|, %n -> |%.0f HP остаток|",
            e_Client[DAMAGE][id][pClient], e_Client[SHOTS][id][pClient],
            e_Client[DAMAGE][pClient][id], e_Client[SHOTS][pClient][id],
            pClient, !is_user_alive(pClient) ? 0 : get_entvar(pClient, var_health)
        );
    }
}
25 Янв 2024
Язык на английский и количество игроков, уже смените сами
Ty. I will test and reply.
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
claudiuandrei10, замени 43 строку, прошу прощения не заметил, тип переменной сменил для более точного отображения урона на Float
Код:
-e_Client[DAMAGE][pAttacker][pVictim] = 100;
+e_Client[DAMAGE][pAttacker][pVictim] = 100.0;
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
и строку надо уменьшить
Вы* -> |0 урон * 1 попаданий|, Противник -> |0 урон * 0 попаданий|, Dan -> |0 HP оста�
А то по символам не влазят, обрезает, либо переведи на английский
25 Янв 2024
claudiuandrei10, компилируй компилятором 1.9.0 и выше
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Странно, даже онлайн компилятор без варнинга, впервые с таким встречаюсь
 

Вложения

Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Тут 2 варианта:
1. Это через структуру enum, но работать с целым числом, но результат не будет точным, так как будет дробное число урона округляться.
2. Сделать по раздельности массивы, один float другой int (Этот способ, больше подходит)
25 Янв 2024
claudiuandrei10
You* -> |100 with 2|, Opponent -> |0 with 0|, Misu -> |50HP|
что тут не так?
 
Последнее редактирование:
Сообщения
86
Реакции
2
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
claudiuandrei10, попробуй так:
Замени это
Код:
        client_print(id, !b_ViewChat ? print_chat : print_console,
            "Вы* -> |%.0f урон * %i попаданий|, Противник -> |%.0f урон * %i попаданий|, %n -> |%.0f HP остаток|",
            e_Client[DAMAGE][id][pClient], e_Client[SHOTS][id][pClient],
            e_Client[DAMAGE][pClient][id], e_Client[SHOTS][pClient][id],
            pClient, !is_user_alive(pClient) ? 0 : get_entvar(pClient, var_health)
        );
На это
Код:
        client_print(id, !b_ViewChat ? print_chat : print_console,
            "Вы* -> |%.0f урон * %i попаданий|, Противник -> |%.0f урон * %i попаданий|, %n -> |%.0f HP остаток|",
            e_Client[DAMAGE][id][pClient], e_Client[SHOTS][id][pClient],
            e_Client[DAMAGE][pClient][id], e_Client[SHOTS][pClient][id],
            pClient, !is_user_alive(pClient) ? 0.0 : get_entvar(pClient, var_health)
        );
Урон показывает точный, а ошибка была в том, что подставляли сюда %.0f целое число (0), а надо (0.0)
 
Статус
В этой теме нельзя размещать новые ответы.

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

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