//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- float CalculateDefaultPhysicsDamage( int index, gamevcollisionevent_t *pEvent, float energyScale, bool allowStaticDamage, int &damageType, string_t iszDamageTableName, bool bDamageFromHeldObjects ) { // If we have a specified damage table, find it and use it instead if ( iszDamageTableName != NULL_STRING ) { for ( int i = 0; i < ARRAYSIZE(gDamageTableRegistry); i++ ) { if ( !Q_strcmp( gDamageTableRegistry[i].pszTableName, STRING(iszDamageTableName) ) ) return CalculatePhysicsImpactDamage( index, pEvent, *(gDamageTableRegistry[i].pTable), energyScale, allowStaticDamage, damageType, bDamageFromHeldObjects ); } Warning("Failed to find custom physics damage table name: %s\n", STRING(iszDamageTableName) ); } return CalculatePhysicsImpactDamage( index, pEvent, gDefaultNPCImpactDamageTable, energyScale, allowStaticDamage, damageType, bDamageFromHeldObjects ); }
//----------------------------------------------------------------------------- // Purpose: // The player takes damage if he hits something going fast enough //----------------------------------------------------------------------------- void CPropVehicleDriveable::VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ) { // Don't care if we don't have a driver if ( !GetDriver() ) return; // Make sure we don't keep hitting the same entity int otherIndex = !index; CBaseEntity *pHitEntity = pEvent->pEntities[otherIndex]; if ( pEvent->deltaCollisionTime < 0.5 && (pHitEntity == this) ) return; BaseClass::VPhysicsCollision( index, pEvent ); // If we hit hard enough, damage the player // Don't take damage from ramming bad guys if ( pHitEntity->MyNPCPointer() ) return; // Don't take damage from ramming ragdolls if ( pEvent->pObjects[otherIndex]->GetGameFlags() & FVPHYSICS_PART_OF_RAGDOLL ) return; // Ignore func_breakables CBreakable *pBreakable = dynamic_cast<CBreakable *>(pHitEntity); if ( pBreakable ) { // ROBIN: Do we want to only do this on func_breakables that are about to die? //if ( pBreakable->HasSpawnFlags( SF_PHYSICS_BREAK_IMMEDIATELY ) ) return; } // Over our skill's minimum crash level? int damageType = 0; float flDamage = CalculatePhysicsImpactDamage( index, pEvent, gDefaultPlayerVehicleImpactDamageTable, 1.0, true, damageType ); if ( flDamage > 0 ) { Vector damagePos; pEvent->pInternalData->GetContactPoint( damagePos ); Vector damageForce = pEvent->postVelocity[index] * pEvent->pObjects[index]->GetMass(); CTakeDamageInfo info( this, GetDriver(), damageForce, damagePos, flDamage, damageType ); GetDriver()->TakeDamage( info ); } }