Thanks.
How do I make the sprite entity to move and be dynamic, not client spawned(not temp entity and not dllfunc_spawn) ? When I set the movetype the entity doesn't draw sprite. The (quake) gun ricochet is for debuging to indicate entity think :-).
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta_util>
#include <xs>
#define PLUGIN "Smoke Room"
#define AUTHOR "Voi"
#define VERSION "0.1"
#define SMOKE_THINKER 666
#define SMOKE_SPRITE 667
new const room_smoke_spr[] = "sprites/voi/smoke_room17.spr"
public plugin_init()
{
register_forward(FM_Think,"smoke_think",0)
//register_think("env_sprite", "sprite_think")
register_clcmd("say /test","fire")
register_plugin(PLUGIN, VERSION, AUTHOR)
// Add your own code here
}
public plugin_precache()
{
precache_model(room_smoke_spr)
}
public fire(id)
{
new Float:gunpos[3], stringClassname[24]
//ExecuteHam(Ham_Player_GetGunPosition, id, gunpos)
new Float:origin[3]
pev(id, pev_origin, origin)
new found, eIndex[2]
new entity = -1
client_print(id, print_chat, "DEBUG: fire!(CHECKING FOR SMOKE)")
while( (entity = fm_find_ent_in_sphere(entity, origin, 128.0)) > 0)
{
if(!fm_is_valid_ent(entity))
continue
//pev(entity, pev_classname, stringClassname, charsmax(stringClassname))
//client_print(id, print_chat, "DEBUG: CLASSNAME = %s", stringClassname)
//
//if( equali("info_target", stringClassname) && pev(entity, pev_iuser4) == 666 )
if(pev(entity, pev_iuser4) == SMOKE_THINKER )
{
/*new check
pev(entity, pev_iuser4, check)
if(check != 666)
continue*/
found += 1
if(found == 1)
eIndex[0] = entity
else if(found == 2)
eIndex[1] = entity
client_print(id, print_chat, "DEBUG: SMOKE FOUND! %i %s, eIndex[0] = %i, eIndex[1] = %i iuser4 =%i iuser2=%i found=%i", entity, stringClassname, eIndex[0],eIndex[1],pev(entity, pev_iuser4), pev(entity, pev_iuser2), found )
}
}
if(!found)
{
client_print(id, print_chat, "DEBUG: SMOKE NOT FOUND - CREATING NEW SMOKE!, found = %i",found)
create_room_smoke(id)
}
else
{
new Float:Eorigin1[3], Float:Eorigin2[3]
if(eIndex[0])
pev(eIndex[0], pev_origin, Eorigin1)
if(eIndex[1])
pev(eIndex[1], pev_origin, Eorigin2)
if(get_distance_f(origin, Eorigin1) > get_distance_f(origin, Eorigin2) && eIndex[1])
smoke_increase(id, eIndex[1])
else if(eIndex[0])
smoke_increase(id, eIndex[0])
}
}
public create_room_smoke(id)
{
new iEntO = fm_create_entity("info_target")
if(!pev_valid(iEntO))
{
return
}
new Float:origin[3]
pev(id, pev_origin, origin)
set_pev(iEntO, pev_classname, "info_target")
set_pev(iEntO, pev_origin, origin)
set_pev(iEntO, pev_movetype, MOVETYPE_BOUNCEMISSILE)
set_pev(iEntO, pev_solid, SOLID_TRIGGER)
set_pev(iEntO, pev_iuser4, SMOKE_THINKER )
set_pev(iEntO, pev_nextthink, get_gametime()+0.1)
//engfunc(EngFunc_SetSize, iEntO, Float:{64.0, 64.0, 64.0} , Float:{64.0, 64.0, 64.0})
new iEnt = fm_create_entity("env_sprite")
if(!pev_valid(iEnt))
{
server_print("DEBUG: qENTITY = %i", iEnt)
return
}
//
set_pev(iEntO, pev_iuser2, iEnt)
server_cmd("say DEBUG: iEnt = %i, valid = %i", pev(iEntO, pev_iuser2), pev_valid( pev(iEntO, pev_iuser2)))
engfunc(EngFunc_SetModel, iEnt, room_smoke_spr)
engfunc(EngFunc_SetSize, iEnt, Float:{0.0, 0.0, 0.0} , Float:{0.0, 0.0, 0.0})
set_pev(iEnt, pev_classname, "sprajt")
set_pev(iEnt, pev_spawnflags, SF_SPRITE_STARTON)
set_pev(iEnt, pev_origin, origin)
set_pev(iEnt, pev_scale, 0.3)
set_pev(iEnt, pev_aiment, iEntO)
set_pev(iEnt, pev_solid, SOLID_NOT)
set_pev(iEnt, pev_rendermode, kRenderTransAlpha)
set_pev(iEnt, pev_renderamt, 100.0)
set_pev(iEnt, pev_iuser4, SMOKE_SPRITE )
set_pev(iEnt, pev_velocity, {0.0, 0.0, 50.0})
set_pev(iEnt, pev_nextthink, get_gametime()+0.01)
set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW )
}
public smoke_increase(id, iEntO)
{
new Float:scale, Float:renderamt, Float:entityvelocity[3], Float:playervelocity[3], Float:gunvelocity[3]
pev(id, pev_velocity, playervelocity)
pev(iEntO, pev_velocity, entityvelocity)
velocity_by_aim(id, 1000, gunvelocity)
xs_vec_add(gunvelocity, playervelocity, playervelocity)
xs_vec_mul_scalar(playervelocity, 0.01, playervelocity)
xs_vec_add(entityvelocity, playervelocity, entityvelocity)
set_pev(iEntO, pev_velocity, entityvelocity)
client_print(id, print_chat, "DEBUG: SMOKE VELOCITY ADDED = %f %f %f", entityvelocity[0], entityvelocity[1], entityvelocity[2])
new iEnt = pev(iEntO, pev_iuser2)
if(!fm_is_valid_ent(iEnt))
return FMRES_IGNORED
client_print(id, print_chat, "DEBUG: SMOKE INCREASE, SPRITE ENTITY = %i", iEnt)
pev(iEnt, pev_scale, scale)
pev(iEnt, pev_renderamt, renderamt)
scale += 0.025
renderamt += 5.0
set_pev(iEnt, pev_scale, scale)
set_pev(iEnt, pev_renderamt, renderamt)
//set_pev(id, pev_velocity, entityvelocity)
return FMRES_IGNORED
}
public smoke_think(iEntO)
{
if(!fm_is_valid_ent(iEntO) )
return FMRES_IGNORED
new smoke_id = pev(iEntO, pev_iuser4)
new iEnt = pev(iEntO, pev_iuser2)
if(smoke_id)
server_print("DEBUG: SMOKE THINK ENTITY = %i, SMOKE ID = %i, SPRITE ID =%i", iEntO, smoke_id, iEnt)
if ( smoke_id == SMOKE_THINKER)
{
set_pev(iEntO, pev_nextthink, get_gametime()+0.1)
smoke_id = pev(iEnt, pev_iuser4)
}
if(smoke_id == SMOKE_SPRITE)
{
new Float:renderamt, Float:scale
pev(iEnt, pev_scale, scale)
pev(iEnt, pev_renderamt, renderamt)
scale *= 1.001
renderamt += 1.0
set_pev(iEnt, pev_scale, scale)
set_pev(iEnt, pev_renderamt, renderamt)
set_pev(iEnt, pev_nextthink, get_gametime()+0.1)
debug_gunshot(iEnt)
}
return FMRES_IGNORED
}
public sprite_think(iEnt)
{
if(!fm_is_valid_ent(iEnt))
return FMRES_IGNORED
new smoke_id = pev(iEnt, pev_iuser4)
if(smoke_id != SMOKE_SPRITE)
return FMRES_IGNORED
return FMRES_IGNORED
}
public debug_gunshot(iEnt)
{
new Float:origin[3]
pev(iEnt, pev_origin, origin)
message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_GUNSHOT)
write_coord(floatround(origin[0])) // start position
write_coord(floatround(origin[1]))
write_coord(floatround(origin[2]))
message_end()
}