FORCEINLINE void Check( T *pEntity ) { // Hmmm.. everything in this list should be a trigger.... ICollideable *pTriggerCollideable = pEntity->GetCollideable(); if ( !m_pCollide->ShouldTouchTrigger(pTriggerCollideable->GetSolidFlags()) ) return; if ( pTriggerCollideable->GetSolidFlags() & FSOLID_USE_TRIGGER_BOUNDS ) { Vector vecTriggerMins, vecTriggerMaxs; pTriggerCollideable->WorldSpaceTriggerBounds( &vecTriggerMins, &vecTriggerMaxs ); if ( !IsBoxIntersectingRay( vecTriggerMins, vecTriggerMaxs, m_Ray ) ) { return; } } else { trace_t tr; enginetrace->ClipRayToCollideable( m_Ray, MASK_SOLID, pTriggerCollideable, &tr ); if ( !(tr.contents & MASK_SOLID) ) return; } trace_t tr; UTIL_ClearTrace( tr ); tr.endpos = (m_pEnt->GetAbsOrigin() + pEntity->GetAbsOrigin()) * 0.5; m_pEnt->PhysicsMarkEntitiesAsTouching( pEntity, tr ); }
//----------------------------------------------------------------------------- // Purpose: Converts a VPhysics Collision event to a standard trace //----------------------------------------------------------------------------- void CGETKnife::CollisionEventToTrace( int index, gamevcollisionevent_t *pEvent, trace_t &tr ) { UTIL_ClearTrace( tr ); pEvent->pInternalData->GetSurfaceNormal( tr.plane.normal ); pEvent->pInternalData->GetContactPoint( tr.endpos ); tr.plane.dist = DotProduct( tr.plane.normal, tr.endpos ); VectorMA( tr.endpos, -1.0f, pEvent->preVelocity[index], tr.startpos ); tr.m_pEnt = pEvent->pEntities[!index]; tr.fraction = 0.01f; // spoof! }
bool CBoneFollower::TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ) { vcollide_t *pCollide = modelinfo->GetVCollide( GetModelIndex() ); Assert( pCollide && pCollide->solidCount > m_solidIndex ); UTIL_ClearTrace( trace ); physcollision->TraceBox( ray, pCollide->solids[m_solidIndex], GetAbsOrigin(), GetAbsAngles(), &trace ); if ( trace.fraction >= 1 ) return false; return true; }
bool CBoneFollower::TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ) { vcollide_t *pCollide = modelinfo->GetVCollide( GetModelIndex() ); Assert( pCollide && pCollide->solidCount > m_solidIndex ); UTIL_ClearTrace( trace ); physcollision->TraceBox( ray, pCollide->solids[m_solidIndex], GetAbsOrigin(), GetAbsAngles(), &trace ); if ( trace.fraction >= 1 ) return false; // return owner as trace hit trace.m_pEnt = GetOwnerEntity(); trace.hitgroup = m_hitGroup; trace.physicsbone = m_physicsBone; return true; }
void CAOPEntity::DefaultStartTouch(CBaseEntity *pOther) { #ifdef OFFICIALSERV_ONLY if(disabletouch.GetBool()) { RETURN_META(MRES_SUPERCEDE); } else { #endif //update touch trace trace_t tr; UTIL_ClearTrace( tr ); tr.endpos = (VFuncs::GetAbsOrigin(GetBase()) + VFuncs::GetAbsOrigin(pOther)) * 0.5; g_TouchTrace = tr; RETURN_META(MRES_IGNORED); #ifdef OFFICIALSERV_ONLY } #endif }