qboolean G_VisibleFromBinoculars ( gentity_t* viewer, gentity_t* ent, vec3_t origin ) {
	vec3_t vieworg;
	trace_t trace;

	VectorCopy(viewer->client->ps.origin, vieworg);
	vieworg[2] += viewer->client->ps.viewheight;

	if(!G_CullPointAndRadius( origin, 0 )) {
		return qfalse;
	}

	if(!trap_InPVS( vieworg, origin )) {
		return qfalse;
	}

	trap_Trace( &trace, vieworg, NULL, NULL, origin, viewer->s.number, MASK_SHOT );

/*	if( ent && trace.entityNum != ent-g_entities ) {
		return qfalse;
	}*/

	if( trace.fraction != 1.f ) {
		if( ent ) {
			if( trace.entityNum != ent->s.number ) {
				return qfalse;
			} else {
				return qtrue;
			}
		} else {
			return qfalse;
		}
	}

	return qtrue;
}
Esempio n. 2
0
/**
 * @brief G_VisibleFromBinoculars_Box
 * @param[in] viewer
 * @param[in] ent
 * @param[in,out] origin
 * @param[in] mins
 * @param[in] maxs
 * @return
 */
qboolean G_VisibleFromBinoculars_Box(gentity_t *viewer, gentity_t *ent, vec3_t origin, vec3_t mins, vec3_t maxs)
{
	vec3_t  vieworg;
	trace_t trace;

	VectorCopy(viewer->client->ps.origin, vieworg);
	vieworg[2] += viewer->client->ps.viewheight;

	// check if head is visible
	if (ent->methodOfDeath != MOD_LANDMINE)
	{
		origin[2] += ent->client->ps.viewheight;
	}

	if (!G_CullPointAndRadius(origin, 0))
	{
		return qfalse;
	}

	if (!trap_InPVS(vieworg, origin))
	{
		return qfalse;
	}

	trap_Trace(&trace, vieworg, mins, maxs, origin, viewer->s.number, MASK_SHOT);

	if (trace.fraction != 1.f)
	{
		if (trace.entityNum != ent->s.number)
		{
			return qfalse;
		}
		else
		{
			return qtrue;
		}
	}

	return qtrue;
}