Код:
#include <amxmodx>
#include <fakemeta>
#include <reapi>
// Показ спрайта только для тиммейтов
//#define ONLY_TEAMMATES
#define rg_get_user_team(%0) get_member(%0, m_iTeam)
#define SPRITE "sprites/flash_sprite.spr"
#define SPRITE_CLASSNAME "func_flash"
#define SPRITE_IMPULSE 1337
#define SPRITE_SCALE 0.15
new g_iSprite[MAX_PLAYERS + 1];
new Float: g_fBlindtime[MAX_PLAYERS + 1];
new Float: g_fFinishFlash[MAX_PLAYERS + 1];
new g_iBlindNum;
new g_fwdFullpack;
public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, SPRITE);
}
public plugin_init()
{
register_plugin("Flash Sprite", "0.3", "Denzer & Garey");
RegisterHookChain(RG_PlayerBlind, "PlayerBlind");
}
public PlayerPack(es_handle, e, ent, host, hostflags, player, pset)
{
if(pev_valid(ent)
&& get_entvar(ent, var_impulse) == SPRITE_IMPULSE)
{
new blind_id = get_entvar(ent, var_aiment);
#if defined ONLY_TEAMMATES
if(blind_id == host || rg_get_user_team(host) != rg_get_user_team(blind_id))
#else
if(blind_id == host)
#endif
{
set_es(es_handle, ES_Effects, EF_NODRAW);
}
else
{
new Float: gametime = get_gametime();
/* If not null aiment and movetype then rendermode will be as player attached :-(
NULLING:
*/
set_es(es_handle, ES_AimEnt, 0);
set_es(es_handle, ES_MoveType, MOVETYPE_NOCLIP);
/* obojau skobo4ki )))))))))) */
new alpha = g_fBlindtime[blind_id] > gametime ? 255 : floatround((1.0-((gametime-g_fBlindtime[blind_id])/(g_fFinishFlash[blind_id]-g_fBlindtime[blind_id])))*255.0);
set_es(es_handle, ES_RenderAmt, alpha);
set_es(es_handle, ES_RenderMode, kRenderTransAlpha);
}
}
return FMRES_IGNORED;
}
public PlayerBlind(const index, const inflictor, const attacker, const Float:fadeTime, const Float:fadeHold, const alpha, Float:color[3])
{
new Float: gametime = get_gametime();
g_fBlindtime[index] = gametime + fadeHold;
g_fFinishFlash[index] = gametime + (fadeTime-fadeHold);
if(!g_iSprite[index])
{
new iEnt = rg_create_entity("info_target", true);
if(iEnt) {
set_entvar(iEnt, var_classname, SPRITE_CLASSNAME);
set_entvar(iEnt, var_impulse, SPRITE_IMPULSE);
set_entvar(iEnt, var_movetype, MOVETYPE_FOLLOW);
set_entvar(iEnt, var_aiment, index);
engfunc(EngFunc_SetModel, iEnt, SPRITE);
set_entvar(iEnt, var_scale, SPRITE_SCALE);
SetThink(iEnt, "SpriteThink");
set_entvar(iEnt, var_nextthink, g_fFinishFlash[index]);
if(!g_iBlindNum && !g_fwdFullpack)
{
g_fwdFullpack = register_forward(FM_AddToFullPack, "PlayerPack", 1);
}
g_iBlindNum++;
}
g_iSprite[index] = iEnt;
}
else
{
set_entvar(g_iSprite[index], var_nextthink, g_fFinishFlash[index]);
}
}
public SpriteThink(iEnt)
{
if(iEnt)
{
new index = get_entvar(iEnt, var_aiment)
set_entvar(iEnt, var_flags, FL_KILLME);
g_iBlindNum--;
if(!g_iBlindNum && g_fwdFullpack)
{
unregister_forward(FM_AddToFullPack, g_fwdFullpack, 1);
g_fwdFullpack = 0;
}
g_iSprite[index] = 0;
}
}