//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- BuildingHudAlert_t C_BaseObject::GetBuildingAlertLevel( void ) { float flHealthPercent = GetHealth() / GetMaxHealth(); BuildingHudAlert_t alertLevel = BUILDING_HUD_ALERT_NONE; if ( HasSapper() ) { alertLevel = BUILDING_HUD_ALERT_SAPPER; } else if ( !IsBuilding() && flHealthPercent < 0.33 ) { alertLevel = BUILDING_HUD_ALERT_VERY_LOW_HEALTH; } else if ( !IsBuilding() && flHealthPercent < 0.66 ) { alertLevel = BUILDING_HUD_ALERT_LOW_HEALTH; } BuildingHudAlert_t iFakeAlert = (BuildingHudAlert_t)cl_obj_fake_alert.GetInt(); if ( iFakeAlert > BUILDING_HUD_ALERT_NONE && iFakeAlert < MAX_BUILDING_HUD_ALERT_LEVEL ) { alertLevel = iFakeAlert; } return alertLevel; }
//----------------------------------------------------------------------------- // Purpose: Player has waved his crosshair over this entity. Display appropriate hints. //----------------------------------------------------------------------------- void C_BaseObject::DisplayHintTo( C_BasePlayer *pPlayer ) { bool bHintPlayed = false; C_TFPlayer *pTFPlayer = ToTFPlayer(pPlayer); if ( InSameTeam( pPlayer ) ) { // We're looking at a friendly object. if ( HasSapper() ) { bHintPlayed = pPlayer->HintMessage( HINT_OBJECT_HAS_SAPPER, true, true ); } if ( pTFPlayer->IsPlayerClass( TF_CLASS_ENGINEER ) ) { // I'm an engineer. // If I'm looking at a constructing object, let me know I can help build it (but not // if I built it myself, since I've already got that hint from the wrench). if ( !bHintPlayed && IsBuilding() && GetBuilder() != pTFPlayer ) { bHintPlayed = pPlayer->HintMessage( HINT_ENGINEER_USE_WRENCH_ONOTHER, false, true ); } // If it's damaged, I can repair it if ( !bHintPlayed && !IsBuilding() && GetHealth() < GetMaxHealth() ) { bHintPlayed = pPlayer->HintMessage( HINT_ENGINEER_REPAIR_OBJECT, false, true ); } } } }
//----------------------------------------------------------------------------- // Purpose: Note our last attacked time //----------------------------------------------------------------------------- int CObjectSentrygun::OnTakeDamage( const CTakeDamageInfo &info ) { CTakeDamageInfo newInfo = info; // As we increase in level, we get more resistant to minigun bullets, to compensate for // our increased surface area taking more minigun hits. if ( ( info.GetDamageType() & DMG_BULLET ) && ( info.GetDamageCustom() == TF_DMG_CUSTOM_MINIGUN ) ) { float flDamage = newInfo.GetDamage(); flDamage *= ( 1.0 - m_flHeavyBulletResist ); newInfo.SetDamage( flDamage ); } // Check to see if we are being sapped. if ( HasSapper() ) { // Get the sapper owner. CBaseObject *pSapper = GetObjectOfTypeOnMe( OBJ_ATTACHMENT_SAPPER ); Assert( pSapper ); // Take less damage if the owner is causing additional damage. if ( pSapper && ( info.GetAttacker() == pSapper->GetOwner() ) ) { float flDamage = newInfo.GetDamage() * SENTRYGUN_SAPPER_OWNER_DAMAGE_MODIFIER; newInfo.SetDamage( flDamage ); } } int iDamageTaken = BaseClass::OnTakeDamage( newInfo ); if ( iDamageTaken > 0 ) { m_flLastAttackedTime = gpGlobals->curtime; } return iDamageTaken; }
bool CObjectTeleporter::InputWrenchHit( CTFPlayer *pPlayer, CTFWrench *pWrench, Vector vecHitPos ) { if ( HasSapper() && GetMatchingTeleporter() ) { CObjectTeleporter *pMatch = GetMatchingTeleporter(); // do damage to any attached buildings CTakeDamageInfo info( pPlayer, pPlayer, 65, DMG_CLUB, TF_DMG_WRENCH_FIX ); IHasBuildPoints *pBPInterface = dynamic_cast< IHasBuildPoints * >( pMatch ); int iNumObjects = pBPInterface->GetNumObjectsOnMe(); for ( int iPoint=0; iPoint < iNumObjects; iPoint++ ) { CBaseObject *pObject = pMatch->GetBuildPointObject( iPoint ); if ( pObject && pObject->IsHostileUpgrade() ) pObject->TakeDamage( info ); } } return BaseClass::InputWrenchHit( pPlayer, pWrench, vecHitPos ); }