Вывод hp игрока в dhud/hud

Сообщения
134
Реакции
40
Помог
2 раз(а)
Доброй ночи. Мне тут понадобился плагин для вывода информации о hp игрока в dhud/hud. Воспользовался данной реализацией, отвязал от нативов csdm и поправил микро моменты под себя. Собственно всё работает, но если у кого-то будет время, то не могли бы взглянуть, может где накосячил. Был бы очень признателен.


Код:
/*
    Спасибо Vaqtincha за многочисленные подсказки и предоставленное API для плагина.
*/

#include <amxmodx>
#include <reapi>

new const PLUGIN_NAME[]         = "CSDM Hud HP/AP";
new const PLUGIN_VERSION[]      = "1.2";
new const PLUGIN_AUTHOR[]       = "d3m37r4";

#define FIX_MESSAGE_OVERLAY     // Исправление наложения DHUD сообщений друг на друга.

#define PlayerTask(%1)          (%1 + PLAYER_HUD_TASK_ID)
#define GetPlayerByTaskID(%1)   (%1 - PLAYER_HUD_TASK_ID)

const PLAYER_HUD_TASK_ID        = 433794;
const Float:MAX_HOLDTIME        = 20.0;

enum Color { R, G, B };
enum Pos { Float:X, Float:Y };
enum HudTypes { HUD, DHUD };

new g_iHudColor[Color]          = { 255, 233, 0 };
new Float:g_fHudPosition[Pos]   = { 0.02, 0.96 };
new HudTypes:g_iHudType;
new g_iSyncPlayerHud;

new g_iHealth[MAX_CLIENTS + 1], g_iArmor[MAX_CLIENTS + 1];

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
    
    register_event("Health", "Event_Health", "be");

    RegisterHookChain(RG_CBasePlayer_Killed, "CSGameRules_PlayerKilled", .post = false)
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", .post = true)
    g_iHudType = DHUD
    g_iSyncPlayerHud = CreateHudSyncObj();
}

public CBasePlayer_Spawn(const pPlayer)
{
        if(!is_user_bot(pPlayer)){
        FixHealthMsgSend(pPlayer);
        set_task(MAX_HOLDTIME, "taskPlayerHud", PlayerTask(pPlayer), .flags = "b");
        }
}

public CSGameRules_PlayerKilled(const pVictim, const pKiller, const iGibs)
{
    if(task_exists(PlayerTask(pVictim)))
    {
        remove_task(PlayerTask(pVictim));
        if(g_iHudType == HUD)
        {
            ClearSyncHud(pVictim, g_iSyncPlayerHud);
        }
    }
}

public client_disconnected(pPlayer)
{
    remove_task(PlayerTask(pPlayer));
}

public client_putinserver(pPlayer)
{
    remove_task(PlayerTask(pPlayer));
}

public taskPlayerHud(iTaskId)
{
    UpdateHUD(GetPlayerByTaskID(iTaskId));
}

public Event_Health(pPlayer)
{
    g_iHealth[pPlayer] = read_data(1);
    UpdateHUD(pPlayer);
}

public Event_Battery(pPlayer)
{
    g_iArmor[pPlayer] = read_data(1);
    UpdateHUD(pPlayer);
}

UpdateHUD(pPlayer)
{
    switch(g_iHudType)
    {
        case HUD:
        {
            set_hudmessage(
                g_iHudColor[R], g_iHudColor[G], g_iHudColor[B],
                g_fHudPosition[X], g_fHudPosition[Y],
                .holdtime = MAX_HOLDTIME, .channel = next_hudchannel(pPlayer)
            );
            ShowSyncHudMsg(pPlayer, g_iSyncPlayerHud, "%i HP", g_iHealth[pPlayer]);
        }
        case DHUD:
        {
        #if defined FIX_MESSAGE_OVERLAY
            ClearDHUDMessages(pPlayer);
        #endif
            set_dhudmessage(
                g_iHudColor[R], g_iHudColor[G], g_iHudColor[B],
                g_fHudPosition[X], g_fHudPosition[Y],
                .holdtime = MAX_HOLDTIME
            );
            show_dhudmessage(pPlayer, "%i HP", g_iHealth[pPlayer]);
        }
    }
}

FixHealthMsgSend(pPlayer)
{
    static gmsgHealth;
    if(gmsgHealth > 0 || (gmsgHealth = get_user_msgid("Health")))
    {
        emessage_begin(MSG_ONE, gmsgHealth, .player = pPlayer);
        ewrite_byte(get_user_health(pPlayer));
        emessage_end();
    }
}

// Thx PRoSToTeM@.
// Link: http://amx-x.ru/viewtopic.php?f=9&t=4578&start=60
#if defined FIX_MESSAGE_OVERLAY
ClearDHUDMessages(pPlayer, iClear = 8)
{
    for(new iDHUD; iDHUD < iClear; iDHUD++)
    {
        show_dhudmessage(pPlayer, "");
    }
}
#endif
 
Сообщения
39
Реакции
7
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован

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

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