I tried to detect if player is in front of the entity.
I used in_view_cone & distance to check. The distance was fine but in_view_cone didn't detect player.
PHP Code:
public Spawn_NPC(id)
{
new szModelPath[64], team
formatex(szModelPath, sizeof(szModelPath) - 1, "models/Z_Files/Zombies/%s.mdl", g_Zombie_Model[0])
static entid; entid = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
if(!pev_valid(entid)) return
new Float:VEC_HULL_MIN[3] = {-15.0, -9.0, -36.0}
new Float:VEC_HULL_MAX[3] = {15.0, 9.0, 28.0}
set_pev(entid, pev_classname, NPC_ZOMBIE)
engfunc(EngFunc_SetModel, entid, szModelPath)
set_pev(entid, pev_modelindex, ZombieModelIndex[Class])
engfunc(EngFunc_SetSize, entid, VEC_HULL_MIN, VEC_HULL_MAX)
set_pev(entid, pev_iuser1, STATE_IDLE)
set_pev(entid, pev_angles, NPC_Angle[0])
set_pev(entid, pev_v_angle, NPC_VAngle[0])
set_pev(entid, pev_movetype, MOVETYPE_PUSHSTEP)
set_pev(entid, pev_solid, SOLID_BBOX)
set_pev(entid, pev_origin, NPC_Origin[0])
//set_pev(entid, pev_angles, g_Item_Angle[item_type])
set_pev(entid, pev_animtime, get_gametime())
set_pev(entid, pev_framerate, 1.0)
set_pev(entid, pev_sequence, 0)
set_pev(entid, pev_nextthink, get_gametime() + 0.01)
}
public Zombie_Think(ent)
{
if(!pev_valid(ent))
return FMRES_IGNORED
new Float:fOrigin[3], Float:fVicOrigin[3], Float:distance
pev(g_PlayerID, pev_origin, fVicOrigin) //it is single player so g_PlayerID = id on spawn
pev(ent, pev_origin, fOrigin)
distance = get_distance_f(fOrigin, fVicOrigin)
new bRunning = get_xvar_num(g_pRunning)
if(distance < 270.0 && !is_wall_between_points(fOrigin, fVicOrigin, 0))
{
if(bRunning)
{
client_print(g_PlayerID, print_center, "Detected")
set_pev(ent, pev_iuser1, STATE_ATTACK)
}
else
{
if(fm_is_in_viewcone(ent, fVicOrigin))
{
client_print(g_PlayerID, print_center, "Detected")
set_pev(ent, pev_iuser1, STATE_ATTACK)
}
else
{
client_print(g_PlayerID, print_center, "Stand by...")
}
}
}
//else
// client_print(g_PlayerID, print_center, "Stand by...")
set_pev(ent, pev_nextthink, get_gametime()+1.0)
}
}
stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
{
static ptr
ptr = create_tr2()
engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
static Float:EndPos[3]
get_tr2(ptr, TR_vecEndPos, EndPos)
free_tr2(ptr)
return floatround(get_distance_f(end, EndPos))
}
I want to make it only detect when player go in eye sight of it or running close to it.