diff --git a/dlls/engine/engine.cpp b/dlls/engine/engine.cpp index 3e1d119e..d2c2bc2b 100755 --- a/dlls/engine/engine.cpp +++ b/dlls/engine/engine.cpp @@ -798,31 +798,42 @@ static cell AMX_NATIVE_CALL in_view_cone(AMX *amx, cell *params) CHECK_ENTITY(src); - Vector vecLOS; + edict_t *pEdictSrc = INDEXENT(src); + + Vector vecLOS, vecForward; float flDot; - edict_t *pEdictSrc = INDEXENT(src); cell *addr = MF_GetAmxAddr(amx, params[2]); - float vecOrigin[3]; + Vector origin(amx_ctof(addr[0]), amx_ctof(addr[1]), amx_ctof(addr[2])); - vecOrigin[0] = amx_ctof(addr[0]); - vecOrigin[1] = amx_ctof(addr[1]); - vecOrigin[2] = amx_ctof(addr[2]); + bool use2D = (params[0] / sizeof(cell)) == 2 || params[3] == 0; - Vector origin(vecOrigin[0], vecOrigin[1], vecOrigin[2]); + if (use2D) + { + MAKE_VECTORS(pEdictSrc->v.angles); + vecForward = gpGlobals->v_forward; - MAKE_VECTORS(pEdictSrc->v.v_angle); + vecLOS = origin - pEdictSrc->v.origin; + + vecForward.z = 0; + vecLOS.z = 0; + } + else + { + MAKE_VECTORS(pEdictSrc->v.v_angle); + vecForward = gpGlobals->v_forward; + + vecLOS = origin - (pEdictSrc->v.origin + pEdictSrc->v.view_ofs); + } - vecLOS = origin - (pEdictSrc->v.origin + pEdictSrc->v.view_ofs); vecLOS = vecLOS.Normalize(); - flDot = DotProduct(vecLOS, gpGlobals->v_forward); + flDot = DotProduct(vecLOS, vecForward); if (flDot >= cos(pEdictSrc->v.fov * (M_PI / 360))) return 1; else return 0; - } static cell AMX_NATIVE_CALL traceresult(AMX *amx, cell *params) diff --git a/plugins/include/engine.inc b/plugins/include/engine.inc index 935c860e..35b40335 100755 --- a/plugins/include/engine.inc +++ b/plugins/include/engine.inc @@ -226,8 +226,10 @@ forward pfn_spawn(entid); */ native find_sphere_class(aroundent, _lookforclassname[], Float:radius, entlist[], maxents, Float:origin[3] = {0.0, 0.0, 0.0}); -//SDK function - checks if an origin is in an entity's view cone -native is_in_viewcone(entity, Float:origin[3]); +/* SDK function - checks if an origin is in an entity's view cone + * Set use3d to 1 to do the calculation in 3D. Otherwise it will be in 2D. + */ +native is_in_viewcone(entity, Float:origin[3], use3d = 0); //SDK function - checks if an entity is visible to an entity native is_visible(entity, target);