#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <xs>
#define PLUGIN "Defuse Progress Bar"
#define VERSION "1.0"
#define AUTHOR "R3X"
new const gszModel[] = "sprites/progress.spr";
new giBars[33];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_event("BarTime", "eventBarTime", "be");
register_think("progress_bar", "thinkProgressBar");
register_forward(FM_PlayerPostThink, "fwPlayerPostThink", 1);
register_forward(FM_AddToFullPack, "fwAddToFullPack", 1);
}
public plugin_precache()
{
precache_model( gszModel );
}
public client_putinserver(id)
{
createPublicBar(id);
}
public client_disconnect(id)
{
createPublicBar(id);
}
public eventBarTime(id)
{
createPublicBar(id, read_data(1) );
}
public fwAddToFullPack(es_handle, e, ENT, HOST, hostflags, player, set)
{
if(!player && pev_valid(ENT))
{
new owner = pev(ENT, pev_owner);
if(is_user_alive(owner) && giBars[owner] == ENT)
{
new CsTeams:team = cs_get_user_team(HOST);
if(team != CS_TEAM_SPECTATOR && cs_get_user_team(owner) != team)
{
set_es(es_handle, ES_RenderAmt, 0);
return FMRES_HANDLED;
}
}
}
return FMRES_IGNORED;
}
public fwPlayerPostThink(id)
{
new ent = giBars[id];
if(isValidBarEntity(id, ent))
{
if(is_user_alive(id))
{
setBarEntityPos(id, ent);
}
else
{
removeBarEntity(id, ent);
}
}
}
public thinkProgressBar(ent)
{
new Float:fNow = get_gametime();
new Float:fLTime;
pev(ent, pev_ltime, fLTime);
if(fLTime <= fNow)
removeBarEntity(pev(ent, pev_owner), ent);
else
{
new Float:fFrameRate;
pev(ent, pev_framerate, fFrameRate);
set_pev(ent, pev_nextthink, get_gametime() + 1.0/fFrameRate);
new Float:fFrame;
pev(ent, pev_frame, fFrame);
fFrame += 1.0;
set_pev(ent, pev_frame, fFrame);
}
}
new giSerials[33];
createPublicBar(id, bartime = 0)
{
new ent = giBars[id];
if(isValidBarEntity(id, ent))
{
if(bartime == 0)
{
removeBarEntity(id, ent);
}
else
{
removeBarEntity(id, ent);
ent = createBarEntity(id, bartime);
}
}
else
{
if(bartime == 0)
{
return;
}
else
{
ent = createBarEntity(id, bartime);
}
}
giBars[id] = ent;
}
isValidBarEntity(id, ent)
{
return (pev_valid(ent) && giSerials[id] == pev_serial(ent));
}
createBarEntity(id, bartime)
{
new const iFrames = 16;
//Life of ent
new Float:fLifeTime = float(bartime);
//Animation frame rating
new Float:fFrameRate = float(iFrames) / fLifeTime;
new ent = create_entity("env_sprite");
giSerials[id] = pev_serial(ent);
set_pev(ent, pev_classname, "progress_bar");
set_pev(ent, pev_solid, SOLID_NOT);
set_pev( ent, pev_movetype, MOVETYPE_FLY );
entity_set_model(ent, gszModel);
entity_set_size(ent, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});
set_rendering(ent, kRenderFxNone, 255, 255, 255, kRenderTransAdd, 255);
set_pev(ent, pev_scale, 0.7);
set_pev(ent, pev_owner, id);
set_pev(ent, pev_framerate, fFrameRate);
set_pev(ent, pev_ltime, get_gametime()+fLifeTime);
set_pev(ent, pev_nextthink, get_gametime() + 1.0/fFrameRate);
setBarEntityPos(id, ent);
return ent;
}
removeBarEntity(id, ent)
{
giBars[id] = giSerials[id] = 0;
set_pev(ent, pev_flags, FL_KILLME);
}
setBarEntityPos(id, ent)
{
static Float:fAntySpam = 0.0;
new Float:fNow = get_gametime();
if((fNow - fAntySpam) > 0.3)
{
fAntySpam = fNow;
}
static Float:fOrigin[3];
static Float:fTemp[3];
pev(id, pev_origin, fOrigin);
pev(id, pev_view_ofs, fTemp);
xs_vec_add(fOrigin, fTemp, fOrigin);
fOrigin[2] += 32.0;
set_pev(ent, pev_origin, fOrigin);
}