vexd_pfntouch, pfn_touch, FM_Touch are bad to use.
You could greatly optimize your code using register_touch.
Also, consider find_ent_sphere so you can retrieve entity list within the wanted sphere :
PHP Code:
new const MONSTER_CLASS[] = "func_wall";
public plugin_init()
{
register_touch("m203_nade", "*", "M203_Nade_Touch");
}
public M203_Nade_Touch(nade, idOther)
{
new walls[64], monster, Float:takedamage, Float:dist, Float:origin[3], Float:monsterAbsMax[3], Float:monsterAbsMin[3], Float:monsterOrigin[3];
new wallsnum = find_sphere_class(nade, MONSTER_CLASS, dmgradius, walls, sizeof(walls));
entity_get_vector(nade, EV_VEC_origin, origin);
for(--wallsnum; wallsnum>=0; wallsnum--)
{
monster = walls[ wallsnum ];
if( IsEntMonster(monster, false) )
{
entity_get_float(monster, EV_FL_takedamage, takedamage);
if( takedamage != DAMAGE_NO )
{
entity_get_vector(monster, EV_VEC_absmin, monsterAbsMin);
entity_get_vector(monster, EV_VEC_absmax, monsterAbsMin);
xs_vec_sub(monsterAbsMax, monsterAbsMin, monsterOrigin);
dist = get_distance_f(origin, monsterOrigin);
// if (dist <= dmgradius) // not needed because we use find_sphere_class
dRatio = dmgradius / dist
damage = maxdamage - floatround( dRatio * maxdamage )
//...do damage
}
}
}
new players[32], pnum, id;
find_sphere_class(nade, "player", dmgradius, players, sizeof(players));
for(--pnum; pnum >= 0; pnum--)
{
id = players[pnum];
if( is_user_alive(id) && !get_user_godmode(id) )
{
dist = entity_range(nade, id);
// do damage, screenshake etc..
}
}
remove_entity(nade);
return PLUGIN_HANDLED;
}
bool:IsEntMonster(ent, bool:bCheckClassName)
{
if( bCheckClassName )
{
static class[];
entity_get_string(ent, EV_SZ_classname, class, charsmax(class));
if( !equal(class, MONSTER_CLASS) )
{
return false;
}
}
return !!(entity_get_int(ent, EV_INT_flags) & FL_MONSTER);
}
__________________