#include <amxmodx>
#include <reapi>
#if AMXX_VERSION_NUM < 183
#define client_disconnected client_disconnect
#endif
#define FFA_MODE // Поддержка CSDM FFA.
#define HP_BODY 10.0 // Кол-во hp за убийство.
#define HP_HS 15.0 // Кол-во hp за убийство в голову.
#define HP_MAX 100.0 // Максимальное Кол-во hp. (Выше этого значения hp прибавлять не будет)
#define KILL_SOUND // Звук при убийстве противника.
#define HUD_MESSAGE // HUD Сообщение о прибавке hp. (Если у игрока hp = HP_MAX то сообщения не будет)
#define SCREEN_FADE // Мерцание экрана при убийстве. (Если игрок слепой то мерцать не будет)
#define USE_FADE_MESSAGE 1 // Метод доставки. 0 - MSG_ONE. 1 - MSG_ONE_UNRELIABLE.
//#define FLAG_ACCESS ADMIN_LEVEL_H // Выдавать только указанным флагам. Можно выдавать сразу нескольким (ADMIN_BAN|ADMIN_LEVEL_H) Если не нужно то закомментируйте.
//#define BLOCK_MAPS // Блокировка вампира на определённых картах. Создайте фаил vampire_block_maps.ini и запишите туда карты. (Блокировка накладывается только на выдачу HP и сообщение! Остальные функции плагина будут работать без изменений)
new g_Connected
#define IsUserValid(%1) (1 <= %1 <= 32)
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) (%1 |= (1 << (%2 & 31)))
#define reset_bit(%1,%2) (%1 &= ~(1 << (%2 & 31)))
#if defined SCREEN_FADE
new g_MsgScreenFade
#endif
#if defined BLOCK_MAPS
new bool:gBlockMaps
public plugin_precache()
{
if (IsBlockMap())
{
gBlockMaps = true
return
}
}
#endif
public plugin_init()
{
register_plugin("RE Vampire", "1.0.9", "MakapoH, AcE, REVO")
RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true)
#if defined SCREEN_FADE
g_MsgScreenFade = get_user_msgid("ScreenFade")
#endif
}
public client_putinserver(id) return set_bit(g_Connected, id)
public client_disconnected(id) return reset_bit(g_Connected, id)
public CBasePlayer_Killed_Post(const victim, killer, iGib)
{
static live
live = is_user_alive(killer)
if (!get_bit(g_Connected, killer) && !live && is_user_ignore(killer))
return
if (!IsUserValid(killer) || !IsUserValid(victim) || killer == victim || get_member(victim, m_bKilledByBomb))
return
#if !defined FFA_MODE
if (get_member(victim, m_iTeam) == get_member(killer, m_iTeam))
return
#endif
#if defined FLAG_ACCESS
if (!(get_user_flags(killer) & FLAG_ACCESS))
return
#endif
#if defined BLOCK_MAPS
if (gBlockMaps)
{
#endif
static Float:killer_HP, Float:TempHP
killer_HP = get_entvar(killer, var_health)
TempHP = get_member(victim, m_bHeadshotKilled) ? HP_HS : HP_BODY
#if defined HUD_MESSAGE
if (killer_HP < HP_MAX)
{
static SyncHudMsg
if (!SyncHudMsg) SyncHudMsg = CreateHudSyncObj()
set_hudmessage(0, 255, 0, -1.0, 0.15, 0, 6.0, 2.0)
ShowSyncHudMsg(killer, SyncHudMsg, "Добавлено +%.0f ХП", TempHP)
}
#endif
set_entvar(killer, var_health, ((killer_HP += TempHP) > HP_MAX) ? HP_MAX : killer_HP)
#if defined BLOCK_MAPS
}
#endif
#if defined KILL_SOUND
client_cmd(killer, "spk buttons/bell1")
#endif
#if defined SCREEN_FADE
if (get_gametime() >= Float:get_member(killer, m_blindStartTime) + Float:get_member(killer, m_blindFadeTime))
{
#if USE_FADE_MESSAGE == 0
message_begin(MSG_ONE, g_MsgScreenFade, .player = killer)
#endif
#if USE_FADE_MESSAGE == 1
message_begin(MSG_ONE_UNRELIABLE, g_MsgScreenFade, .player = killer)
#endif
write_short(1<<10); write_short(1<<11); write_short(0x0000); write_byte(0)
write_byte(0); write_byte(200); write_byte(75); message_end()
}
#endif
}
#if defined BLOCK_MAPS
stock IsBlockMap()
{
new got_line, line_num, len
new cfgdir[400], cfgpath[400], mapname[40], txt[400]
get_localinfo("amxx_configsdir", cfgdir, charsmax(cfgdir))
rh_get_mapname(mapname, 40 -1)
format(cfgpath, 400, "%s/vampire_block_maps.ini", cfgdir)
if (file_exists(cfgpath))
{
got_line = read_file(cfgpath, line_num, txt, 400 -1, len)
while(got_line > 0)
{
if (!strcmp(txt, mapname))
return 0
line_num ++
got_line = read_file(cfgpath, line_num, txt, 400 -1, len)
}
}
return 1
}
#endif
is_user_ignore(id)
return is_user_bot(id) || is_user_hltv(id)