void HintEventFn_BuildObject( CHintData *pData, C_HintEvent_Base *pEvent ) { if ( pEvent->GetType() == HINTEVENT_OBJECT_BUILT_BY_LOCAL_PLAYER ) { C_BaseObject *pObj = ((C_HintEvent_ObjectBuiltByLocalPlayer*)pEvent)->m_pObject; if ( pObj->GetType() == pData->m_ObjectType ) { // Ok, they just built the object that any hints of this type are referring to, so disable // all further hints of this type. KeyValues *pkvStats = GetHintDisplayStats(); if ( pkvStats ) { KeyValues *pkvStatSection = pkvStats->FindKey( pData->name, true ); if ( pkvStatSection ) { pkvStatSection->SetString( "times_shown", VarArgs( "%i", 100 ) ); } } } } }
void CBuildingStatusItem_Sapper::PerformLayout( void ) { BaseClass::PerformLayout(); // We only tick while active and with a valid built object C_ObjectSapper *pSapper = static_cast<C_ObjectSapper*>(GetRepresentativeObject()); // only visible SetVisible( pSapper != NULL ); if ( !IsActive() || !pSapper ) { return; } C_BaseObject *pTarget = pSapper->GetParentObject(); if ( pTarget ) { float flHealth = (float)pTarget->GetHealth() / (float)pTarget->GetMaxHealth(); m_pTargetHealthBar->SetProgress( flHealth ); int iTargetType = pTarget->GetType(); if ( m_iTargetType != iTargetType ) { m_pTargetIcon->SetIcon( pTarget->GetHudStatusIcon() ); m_iTargetType = iTargetType; } } else { m_pTargetHealthBar->SetProgress( 0.0f ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_BaseObject::HighlightBuildPoints( int flags ) { C_TFPlayer *pLocal = C_TFPlayer::GetLocalTFPlayer(); if ( !pLocal ) return; if ( !GetNumBuildPoints() || !InLocalTeam() ) return; C_TFWeaponBuilder *pBuilderWpn = dynamic_cast< C_TFWeaponBuilder * >( pLocal->GetActiveWeaponForSelection() ); if ( !pBuilderWpn ) return; if ( !pBuilderWpn->IsPlacingObject() ) return; C_BaseObject *pPlacementObj = pBuilderWpn->GetPlacementModel(); if ( !pPlacementObj || pPlacementObj == this ) return; // Near enough? if ( (GetAbsOrigin() - pLocal->GetAbsOrigin()).LengthSqr() < MAX_VISIBLE_BUILDPOINT_DISTANCE ) { bool bRestoreModel = false; Vector vecPrevAbsOrigin = pPlacementObj->GetAbsOrigin(); QAngle vecPrevAbsAngles = pPlacementObj->GetAbsAngles(); Vector orgColor; render->GetColorModulation( orgColor.Base() ); float orgBlend = render->GetBlend(); bool bSameTeam = ( pPlacementObj->GetTeamNumber() == GetTeamNumber() ); if ( pPlacementObj->IsHostileUpgrade() && bSameTeam ) { // Don't hilight hostile upgrades on friendly objects return; } else if ( !bSameTeam ) { // Don't hilight upgrades on enemy objects return; } // Any empty buildpoints? for ( int i = 0; i < GetNumBuildPoints(); i++ ) { // Can this object build on this point? if ( CanBuildObjectOnBuildPoint( i, pPlacementObj->GetType() ) ) { Vector vecBPOrigin; QAngle vecBPAngles; if ( GetBuildPoint(i, vecBPOrigin, vecBPAngles) ) { pPlacementObj->InvalidateBoneCaches(); Vector color( 0, 255, 0 ); render->SetColorModulation( color.Base() ); float frac = fmod( gpGlobals->curtime, 3 ); frac *= 2 * M_PI; frac = cos( frac ); render->SetBlend( (175 + (int)( frac * 75.0f )) / 255.0 ); // FIXME: This truly sucks! The bone cache should use // render location for this computation instead of directly accessing AbsAngles // Necessary for bone cache computations to work pPlacementObj->SetAbsOrigin( vecBPOrigin ); pPlacementObj->SetAbsAngles( vecBPAngles ); modelrender->DrawModel( flags, pPlacementObj, pPlacementObj->GetModelInstance(), pPlacementObj->index, pPlacementObj->GetModel(), vecBPOrigin, vecBPAngles, pPlacementObj->m_nSkin, pPlacementObj->m_nBody, pPlacementObj->m_nHitboxSet ); bRestoreModel = true; } } } if ( bRestoreModel ) { pPlacementObj->SetAbsOrigin(vecPrevAbsOrigin); pPlacementObj->SetAbsAngles(vecPrevAbsAngles); pPlacementObj->InvalidateBoneCaches(); render->SetColorModulation( orgColor.Base() ); render->SetBlend( orgBlend ); } } }