//----------------------------------------------------------------------------- // 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; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool Impact( Vector &vecOrigin, Vector &vecStart, int iMaterial, int iDamageType, int iHitbox, C_BaseEntity *pEntity, trace_t &tr, int nFlags, int maxLODToDecal ) { VPROF( "Impact" ); Assert ( pEntity ); // Clear out the trace memset( &tr, 0, sizeof(trace_t)); tr.fraction = 1.0f; // 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 = false; if ( !pEntity->IsClientCreated() ) { bHitRagdoll = FX_AffectRagdolls( vecOrigin, vecStart, iDamageType ); } if ( (nFlags & IMPACT_NODECAL) == 0 ) { const char *pchDecalName = GetImpactDecal( pEntity, iMaterial, iDamageType ); int decalNumber = decalsystem->GetDecalIndexForName( pchDecalName ); if ( decalNumber == -1 ) return false; bool bSkipDecal = false; #ifdef TF_CLIENT_DLL // Don't show blood decals if we're filtering them out (Pyro Goggles) if ( IsLocalPlayerUsingVisionFilterFlags( TF_VISION_FILTER_PYRO ) || UTIL_IsLowViolence() ) { if ( V_strstr( pchDecalName, "Flesh" ) ) { bSkipDecal = true; } } #endif // (davideo): don't show blood decals on the player model, makes the mutant too visible if ( V_strstr( pchDecalName, "Flesh" ) ) { bSkipDecal = true; } if ( !bSkipDecal ) { if ( (pEntity->entindex() == 0) && (iHitbox != 0) ) { 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 ); if ( (pEntity->entindex() == 0) && (iHitbox != 0) ) { // Special case for world entity with hitbox (that's a static prop) ICollideable *pCollideable = staticpropmgr->GetStaticPropByIndex( iHitbox - 1 ); enginetrace->ClipRayToCollideable( ray, MASK_SHOT, pCollideable, &tr ); } else { if ( !pEntity ) return false; enginetrace->ClipRayToEntity( ray, MASK_SHOT, pEntity, &tr ); } } // If we found the surface, emit debris flecks bool bReportRagdollImpacts = (nFlags & IMPACT_REPORT_RAGDOLL_IMPACTS) != 0; if ( ( tr.fraction == 1.0f ) || ( bHitRagdoll && !bReportRagdollImpacts ) ) return false; return true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool Impact( Vector &vecOrigin, Vector &vecStart, int iMaterial, int iDamageType, int iHitbox, C_BaseEntity *pEntity, trace_t &tr, int nFlags, int maxLODToDecal ) { VPROF( "Impact" ); Assert ( pEntity ); MDLCACHE_CRITICAL_SECTION(); // Clear out the trace memset( &tr, 0, sizeof(trace_t)); tr.fraction = 1.0f; // 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 = false; if ( !pEntity->IsClientCreated() ) { bHitRagdoll = FX_AffectRagdolls( vecOrigin, vecStart, iDamageType ); } if ( (nFlags & IMPACT_NODECAL) == 0 ) { int decalNumber = decalsystem->GetDecalIndexForName( GetImpactDecal( pEntity, iMaterial, iDamageType ) ); if ( decalNumber == -1 ) return false; if ( (pEntity->entindex() == 0) && (iHitbox != 0) ) { 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 ); if ( (pEntity->entindex() == 0) && (iHitbox != 0) ) { // Special case for world entity with hitbox (that's a static prop) ICollideable *pCollideable = staticpropmgr->GetStaticPropByIndex( iHitbox - 1 ); enginetrace->ClipRayToCollideable( ray, MASK_SHOT, pCollideable, &tr ); } else { if ( !pEntity ) return false; enginetrace->ClipRayToEntity( ray, MASK_SHOT, pEntity, &tr ); } } // If we found the surface, emit debris flecks bool bReportRagdollImpacts = (nFlags & IMPACT_REPORT_RAGDOLL_IMPACTS) != 0; if ( ( tr.fraction == 1.0f ) || ( bHitRagdoll && !bReportRagdollImpacts ) ) return false; return true; }