//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGrenadePipebombProjectile::PipebombTouch( CBaseEntity *pOther ) { if ( pOther == GetThrower() ) return; // Verify a correct "other." if ( !pOther->IsSolid() || pOther->IsSolidFlagSet( FSOLID_VOLUME_CONTENTS ) ) return; // Handle hitting skybox (disappear). trace_t pTrace; Vector velDir = GetAbsVelocity(); VectorNormalize( velDir ); Vector vecSpot = GetAbsOrigin() - velDir * 32; UTIL_TraceLine( vecSpot, vecSpot + velDir * 64, MASK_SOLID, this, COLLISION_GROUP_NONE, &pTrace ); if ( pTrace.fraction < 1.0 && pTrace.surface.flags & SURF_SKY ) { UTIL_Remove( this ); return; } //If we already touched a surface then we're not exploding on contact anymore. if ( m_bTouched == true ) return; // Blow up if we hit an enemy we can damage if ( pOther->GetTeamNumber() && pOther->GetTeamNumber() != GetTeamNumber() && pOther->m_takedamage != DAMAGE_NO ) { // Check to see if this is a respawn room. if ( !pOther->IsPlayer() ) { CFuncRespawnRoom *pRespawnRoom = dynamic_cast<CFuncRespawnRoom*>( pOther ); if ( pRespawnRoom ) { if ( !pRespawnRoom->PointIsWithin( GetAbsOrigin() ) ) return; } } // Restore damage. See comment in CTFGrenadePipebombProjectile::Create() above to understand this. m_flDamage = m_flFullDamage; Explode( &pTrace, GetDamageType() ); } // Train hack! if ( pOther->GetModelName() == s_iszTrainName && ( pOther->GetAbsVelocity().LengthSqr() > 1.0f ) ) { Explode( &pTrace, GetDamageType() ); } }
//----------------------------------------------------------------------------- // Purpose: Is a given point contained within a respawn room? //----------------------------------------------------------------------------- bool PointInRespawnRoom( CBaseEntity *pTarget, const Vector &vecOrigin ) { // Find out whether we're in a respawn room or not CBaseEntity *pEntity = NULL; while ((pEntity = gEntList.FindEntityByClassname( pEntity, "func_respawnroom" )) != NULL) { CFuncRespawnRoom *pRespawnRoom = (CFuncRespawnRoom *)pEntity; // Are we within this respawn room? if ( pRespawnRoom->GetActive() ) { if ( pRespawnRoom->PointIsWithin( vecOrigin ) ) { if ( !pTarget || pRespawnRoom->GetTeamNumber() == TEAM_UNASSIGNED || pRespawnRoom->InSameTeam( pTarget ) ) return true; } else { if ( pTarget && pRespawnRoom->IsTouching(pTarget) ) return true; } } } return false; }