//----------------------------------------------------------------------------- // Tempent //----------------------------------------------------------------------------- void TE_Decal( IRecipientFilter& filter, float delay, const Vector* pos, const Vector* start, int entity, int hitbox, int index ) { RecordDecal( *pos, *start, entity, hitbox, index ); trace_t tr; // Special case for world entity with hitbox: if ( (entity == 0) && (hitbox != 0) ) { Ray_t ray; ray.Init( *start, *pos ); staticpropmgr->AddDecalToStaticProp( *start, *pos, hitbox - 1, index, false, tr ); } else { // Only decal the world + brush models // Here we deal with decals on entities. C_BaseEntity* ent; if ( ( ent = cl_entitylist->GetEnt( entity ) ) == false ) return; ent->AddDecal( *start, *pos, *pos, hitbox, index, false, tr ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool Impact( Vector &vecOrigin, Vector &vecStart, int iMaterial, int iDamageType, int iHitbox, int iEntIndex, trace_t &tr, bool bDecal, int maxLODToDecal ) { // Clear out the trace memset( &tr, 0, sizeof(trace_t)); tr.fraction = 1.f; // Setup our shot information Vector shotDir = vecOrigin - vecStart; float flLength = VectorNormalize( shotDir ); Vector traceExt; VectorMA( vecStart, flLength + 8.0f, shotDir, traceExt ); // Attempt to hit ragdolls bool bHitRagdoll = AffectRagdolls( vecOrigin, vecStart, iDamageType ); // Get the entity we hit, according to the server C_BaseEntity *pEntity = ClientEntityList().GetEnt( iEntIndex ); if ( bDecal ) { int decalNumber = decalsystem->GetDecalIndexForName( GetImpactDecal( pEntity, iMaterial, iDamageType ) ); if ( decalNumber == -1 ) return false; if ( (iEntIndex == 0) && (iHitbox != 0) ) { // Special case for world entity with hitbox (that's a static prop): // In this case, we've hit a static prop. Decal it! staticpropmgr->AddDecalToStaticProp( vecStart, traceExt, iHitbox - 1, decalNumber, true, tr ); } else if ( pEntity ) { // Here we deal with decals on entities. pEntity->AddDecal( vecStart, traceExt, vecOrigin, iHitbox, decalNumber, true, tr, maxLODToDecal ); } } else { // Perform the trace ourselves Ray_t ray; ray.Init( vecStart, traceExt ); enginetrace->ClipRayToEntity( ray, MASK_SHOT, pEntity, &tr ); } // If we found the surface, emit debris flecks if ( ( tr.fraction == 1.0f ) || ( bHitRagdoll ) ) return false; return true; }