/*
* _______ _ _ __ __
* | _____/ | | | | \ \ __ / /
* | | | | | | | | / \ | |
* | | | |____| | | |/ __ \| |
* | | ___ | ______ | | / \ |
* | | |_ | | | | | | / \ |
* | | | | | | | | | | | |
* | |____| | | | | | | | | |
* |_______/ |_| |_| \_/ \_/
*
*
*
* Last Edited: 01-05-08
*
* ============
* Changelog:
* ============
*
* v1.0
* -Initial Release
*
*/
#define VERSION "1.0"
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#define SMOKE_SPRITES 50
new smokesprites[SMOKE_SPRITES]
new smokesprites_names[SMOKE_SPRITES][32]
new smokesprites_size[SMOKE_SPRITES]
new togglecvar, debugcvar
new bool:hault
new num
public plugin_init()
{
register_plugin("New Smokes","1.0","GHW_Chronic")
togglecvar = register_cvar("smokes_on","1")
debugcvar = register_cvar("smokes_debug","0")
register_touch("grenade","worldspawn","bounce")
}
public plugin_precache()
{
new configfile[200]
get_configsdir(configfile,199)
format(configfile,199,"%s/smoke_sprites.ini",configfile)
if(!file_exists(configfile))
{
hault=true
}
else
{
new read[64], left[64], trash, size2
new size=file_size(configfile,1)
for(new i=0;i<size;i++)
{
read_file(configfile,i,read,63,trash)
if(contain(read,";")!=0)
{
strbreak(read,left,63,read,63)
trim(left)
replace_all(left,63,"^"","")
if(contain(left,"sprites/")==0 && contain(left,".spr")==strlen(left)-4)
{
smokesprites[num] = precache_model(left)
format(smokesprites_names[num],31,"%s",left)
trim(read)
replace_all(read,63," ","")
replace_all(read,63," ","")
remove_quotes(read)
size2 = str_to_num(read)
if(!size2) size2=10
smokesprites_size[num] = size2
num++
}
}
}
}
}
public bounce(ent,worldspawn)
{
if(!hault && get_pcvar_num(togglecvar))
{
static model[32]
pev(ent,pev_model,model,31)
if(containi(model,"smoke")!=-1)
{
static Float:velocity[3]
pev(ent,pev_velocity,velocity)
if(vector_length(velocity)<=200.0)
{
new ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString, "info_target"))
set_pev(ent2,pev_classname,"fake_smokenade")
set_pev(ent2,pev_owner,33)
set_pev(ent2,pev_movetype,MOVETYPE_BOUNCE)
set_pev(ent2,pev_solid,SOLID_TRIGGER)
new Float:origin[3]
new Float:angles[3]
pev(ent,pev_origin,origin)
pev(ent,pev_angles,angles)
pev(ent,pev_model,model,31)
set_pev(ent2,pev_origin,origin)
set_pev(ent2,pev_angles,angles)
set_pev(ent2,pev_fixangle,1)
set_pev(ent2,pev_model,model)
engfunc(EngFunc_SetModel,ent2,model)
detonate(ent2)
set_pev(ent,pev_flags,FL_KILLME)
}
}
}
}
public detonate(ent)
{
set_pev(ent,pev_movetype,MOVETYPE_TOSS)
emit_sound(ent,CHAN_WEAPON,"weapons/sg_explode.wav",1.0,ATTN_NORM,0,PITCH_NORM)
new param[1]
param[0] = random_num(0,num-1)
set_task(0.6,"smoke_explode",ent,param,1,"a",34)
set_task(20.5,"smoke_delete",ent)
if(get_pcvar_num(debugcvar))
{
new players[32], num
get_players(players,num,"ch")
for(new i=0;i<num;i++)
{
if(get_user_flags(players[i]) & ADMIN_RCON) client_print(players[i],print_chat,"[GHW Smoke-Nades] %d. %s",param[0],smokesprites_names[param[0]])
}
}
}
public smoke_explode(param[1],ent)
{
if(pev_valid(ent))
{
static Float:origin2[3]
pev(ent,pev_origin,origin2)
static origin[3]
origin[0] = floatround(origin2[0]) + random_num(-75,75)
origin[1] = floatround(origin2[1]) + random_num(-75,75)
origin[2] = floatround(origin2[2]) + random_num(0,65)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY,origin)
write_byte(3)
write_coord(origin[0]) // start position
write_coord(origin[1])
write_coord(origin[2])
write_short(smokesprites[param[0]])
write_byte(smokesprites_size[param[0]]) // byte (scale in 0.1's) 188
write_byte(5) // byte (framerate)
write_byte(14) // byte flags
message_end()
}
}
public smoke_delete(ent) if(pev_valid(ent)) engfunc(EngFunc_RemoveEntity,ent)