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: Status string for hud //----------------------------------------------------------------------------- void C_ObjectSapper::GetStatusText( wchar_t *pStatus, int iMaxStatusLen ) { float flHealthPercent = (float)GetHealth() / (float)GetMaxHealth(); wchar_t wszHealthPercent[32]; _snwprintf(wszHealthPercent, sizeof(wszHealthPercent)/sizeof(wchar_t) - 1, L"%d%%", (int)( flHealthPercent * 100 ) ); wchar_t *pszTemplate; if ( IsBuilding() ) { pszTemplate = g_pVGuiLocalize->Find( "#TF_ObjStatus_Sapper_Building" ); } else { pszTemplate = g_pVGuiLocalize->Find( "#TF_ObjStatus_Sapper" ); } if ( pszTemplate ) { wchar_t wszTargetHealthPercent[32]; wszTargetHealthPercent[0] = '\0'; C_BaseObject *pParent = GetParentObject(); Assert( pParent ); if ( pParent ) { float flTargetHealthPercent = (float)pParent->GetHealth() / (float)pParent->GetMaxHealth(); _snwprintf(wszTargetHealthPercent, sizeof(wszTargetHealthPercent)/sizeof(wchar_t) - 1, L"%d%%", (int)( flTargetHealthPercent * 100 ) ); } g_pVGuiLocalize->ConstructString( pStatus, iMaxStatusLen, pszTemplate, 2, wszHealthPercent, wszTargetHealthPercent); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTargetID::UpdateID( void ) { wchar_t sIDString[ MAX_ID_STRING ] = L""; wchar_t sDataString[ MAX_ID_STRING ] = L""; C_TFPlayer *pLocalTFPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pLocalTFPlayer ) return; // Get our target's ent index Assert( m_iTargetEntIndex ); // Is this an entindex sent by the server? if ( m_iTargetEntIndex ) { C_BaseEntity *pEnt = cl_entitylist->GetEnt( m_iTargetEntIndex ); if ( !pEnt ) return; bool bShowHealth = false; float flHealth = 0; float flMaxHealth = 1; int iMaxBuffedHealth = 0; int iColorNum = TEAM_UNASSIGNED; // Some entities we always want to check, cause the text may change // even while we're looking at it // Is it a player? if ( IsPlayerIndex( m_iTargetEntIndex ) ) { const char *printFormatString = NULL; wchar_t wszPlayerName[ MAX_PLAYER_NAME_LENGTH ]; bool bDisguisedTarget = false; bool bDisguisedEnemy = false; C_TFPlayer *pPlayer = static_cast<C_TFPlayer*>( pEnt ); if ( !pPlayer ) return; C_TFPlayer *pDisguiseTarget = NULL; g_pVGuiLocalize->ConvertANSIToUnicode( pPlayer->GetPlayerName(), wszPlayerName, sizeof(wszPlayerName) ); // determine if the target is a disguised spy (either friendly or enemy) if ( pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) && // they're disguised //!pPlayer->m_Shared.InCond( TF_COND_DISGUISING ) && // they're not in the process of disguising !pPlayer->m_Shared.InCond( TF_COND_STEALTHED ) ) // they're not cloaked { bDisguisedTarget = true; pDisguiseTarget = ToTFPlayer( pPlayer->m_Shared.GetDisguiseTarget() ); } iColorNum = pPlayer->GetTeamNumber(); if ( bDisguisedTarget ) { // is the target a disguised enemy spy? if ( pPlayer->IsEnemyPlayer() ) { if ( pDisguiseTarget ) { bDisguisedEnemy = true; // change the player name g_pVGuiLocalize->ConvertANSIToUnicode( pDisguiseTarget->GetPlayerName(), wszPlayerName, sizeof(wszPlayerName) ); // Show their disguise team color. iColorNum = pPlayer->m_Shared.GetDisguiseTeam(); } } else { // The target is a disguised friendly spy. They appear to the player with no disguise. Add the disguise // team & class to the target ID element. bool bDisguisedAsEnemy = ( pPlayer->m_Shared.GetDisguiseTeam() != pPlayer->GetTeamNumber() ); const wchar_t *wszAlignment = g_pVGuiLocalize->Find( bDisguisedAsEnemy ? "#TF_enemy" : "#TF_friendly" ); int classindex = pPlayer->m_Shared.GetDisguiseClass(); const wchar_t *wszClassName = g_pVGuiLocalize->Find( g_aPlayerClassNames[classindex] ); // build a string with disguise information g_pVGuiLocalize->ConstructString( sDataString, sizeof(sDataString), g_pVGuiLocalize->Find( "#TF_playerid_friendlyspy_disguise" ), 2, wszAlignment, wszClassName ); } } if ( pPlayer->IsPlayerClass( TF_CLASS_MEDIC ) ) { wchar_t wszChargeLevel[ 10 ]; _snwprintf( wszChargeLevel, ARRAYSIZE(wszChargeLevel) - 1, L"%.0f", pPlayer->MedicGetChargeLevel() * 100 ); wszChargeLevel[ ARRAYSIZE(wszChargeLevel)-1 ] = '\0'; g_pVGuiLocalize->ConstructString( sDataString, sizeof(sDataString), g_pVGuiLocalize->Find( "#TF_playerid_mediccharge" ), 1, wszChargeLevel ); } if (pLocalTFPlayer->GetTeamNumber() == TEAM_SPECTATOR || pPlayer->InSameTeam(pLocalTFPlayer) || (bDisguisedEnemy && pPlayer->m_Shared.GetDisguiseTeam() == pLocalTFPlayer->GetTeamNumber())) { printFormatString = "#TF_playerid_sameteam"; bShowHealth = true; } else if ( pLocalTFPlayer->IsPlayerClass( TF_CLASS_SPY ) && !pPlayer->m_Shared.InCond( TF_COND_STEALTHED ) ) { // Spy can see enemy's health. printFormatString = "#TF_playerid_diffteam"; bShowHealth = true; } if ( bShowHealth ) { C_TF_PlayerResource *tf_PR = dynamic_cast<C_TF_PlayerResource *>(g_PR); if ( tf_PR ) { flMaxHealth = tf_PR->GetMaxHealth( m_iTargetEntIndex ); iMaxBuffedHealth = pPlayer->m_Shared.GetMaxBuffedHealth(); if ( bDisguisedEnemy ) { flHealth = (float)pPlayer->m_Shared.GetDisguiseHealth(); } else { flHealth = (float)pPlayer->GetHealth(); } } else { bShowHealth = false; } } if ( printFormatString ) { wchar_t *pszPrepend = GetPrepend(); if ( !pszPrepend || !pszPrepend[0] ) { pszPrepend = L""; } g_pVGuiLocalize->ConstructString( sIDString, sizeof(sIDString), g_pVGuiLocalize->Find(printFormatString), 2, pszPrepend, wszPlayerName ); } } else { // see if it is an object if ( pEnt->IsBaseObject() ) { C_BaseObject *pObj = assert_cast<C_BaseObject *>( pEnt ); pObj->GetTargetIDString( sIDString, sizeof(sIDString) ); pObj->GetTargetIDDataString( sDataString, sizeof(sDataString) ); bShowHealth = true; flHealth = pObj->GetHealth(); flMaxHealth = pObj->GetMaxHealth(); C_TFPlayer *pBuilder = pObj->GetBuilder(); iColorNum = pBuilder ? pBuilder->GetTeamNumber() : pObj->GetTeamNumber(); } else if ( pEnt->IsNPC() ) { C_AI_BaseNPC *pNPC = assert_cast<C_AI_BaseNPC *>( pEnt ); pNPC->GetTargetIDString( sIDString, sizeof(sIDString) ); pNPC->GetTargetIDDataString( sDataString, sizeof(sDataString) ); bShowHealth = true; flHealth = pNPC->GetHealth(); flMaxHealth = pNPC->GetMaxHealth(); iMaxBuffedHealth = pNPC->GetMaxBuffedHealth(); iColorNum = pNPC->GetTeamNumber(); } } // Setup health icon if ( !pEnt->IsAlive() ) { flHealth = 0; // fixup for health being 1 when dead } SetColorForTargetTeam( iColorNum ); m_pTargetHealth->SetHealth( flHealth, flMaxHealth, iMaxBuffedHealth ); m_pTargetHealth->SetVisible( bShowHealth ); int iNameW, iDataW, iIgnored; m_pTargetNameLabel->GetContentSize( iNameW, iIgnored ); m_pTargetDataLabel->GetContentSize( iDataW, iIgnored ); // Target name if ( sIDString[0] ) { sIDString[ ARRAYSIZE(sIDString)-1 ] = '\0'; m_pTargetNameLabel->SetVisible(true); // TODO: Support if( hud_centerid.GetInt() == 0 ) SetDialogVariable( "targetname", sIDString ); } else { m_pTargetNameLabel->SetVisible(false); m_pTargetNameLabel->SetText(""); } // Extra target data if ( sDataString[0] ) { sDataString[ ARRAYSIZE(sDataString)-1 ] = '\0'; m_pTargetDataLabel->SetVisible(true); SetDialogVariable( "targetdata", sDataString ); } else { m_pTargetDataLabel->SetVisible(false); m_pTargetDataLabel->SetText(""); } int iPostNameW, iPostDataW; m_pTargetNameLabel->GetContentSize( iPostNameW, iIgnored ); m_pTargetDataLabel->GetContentSize( iPostDataW, iIgnored ); if ( m_bLayoutOnUpdate || (iPostDataW != iDataW) || (iPostNameW != iNameW) ) { InvalidateLayout( true ); m_bLayoutOnUpdate = false; } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBuildingStatusItem::OnTick() { // We only tick while active and with a valid built object C_BaseObject *pObj = GetRepresentativeObject(); if ( !pObj ) // implies not active { if ( m_bActive ) { // we lost our object. force relayout to inactive mode InvalidateLayout(); // tell our parent that we're gone IGameEvent *event = gameeventmanager->CreateEvent( "building_info_changed" ); if ( event ) { event->SetInt( "building_type", GetRepresentativeObjectType() ); gameeventmanager->FireEventClientSide( event ); } } // We don't want to tick while inactive regardless return; } float flHealth = (float)pObj->GetHealth() / (float)pObj->GetMaxHealth(); m_pHealthBar->SetProgress( flHealth ); if ( pObj->IsBuilding() ) { m_pBuildingPanel->SetVisible( true ); m_pRunningPanel->SetVisible( false ); m_pBuildingProgress->SetProgress( pObj->GetPercentageConstructed() ); } else { m_pBuildingPanel->SetVisible( false ); m_pRunningPanel->SetVisible( true ); } // what is our current alert state? BuildingHudAlert_t alertLevel = pObj->GetBuildingAlertLevel(); if ( alertLevel <= BUILDING_HUD_ALERT_NONE ) { // if the tray is out, hide it if ( m_pAlertTray->IsTrayOut() ) { m_pAlertTray->HideTray(); m_pWrenchIcon->SetVisible( false ); m_pSapperIcon->SetVisible( false ); } } else { if ( !m_pAlertTray->IsTrayOut() ) { m_pAlertTray->ShowTray(); } m_pAlertTray->SetAlertType( alertLevel ); m_pWrenchIcon->SetVisible( false ); m_pSapperIcon->SetVisible( false ); if ( m_pAlertTray->GetAlertType() != BUILDING_HUD_ALERT_NONE && m_pAlertTray->GetPercentDeployed() >= 1.0f ) { switch( m_pAlertTray->GetAlertType() ) { case BUILDING_HUD_ALERT_LOW_AMMO: case BUILDING_HUD_ALERT_LOW_HEALTH: case BUILDING_HUD_ALERT_VERY_LOW_AMMO: case BUILDING_HUD_ALERT_VERY_LOW_HEALTH: m_pWrenchIcon->SetVisible( true ); break; case BUILDING_HUD_ALERT_SAPPER: m_pSapperIcon->SetVisible( true ); break; case BUILDING_HUD_ALERT_NONE: default: break; } } } }