Участник
Пользователь
- Сообщения
- 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