//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudHealth::OnThink() { int newHealth = 0; C_BasePlayer *local = C_BasePlayer::GetLocalPlayer(); if ( local ) { // Never below zero newHealth = MAX( local->GetHealth(), 0 ); } // Only update the fade if we've changed health if ( newHealth == m_iHealth ) { return; } m_iHealth = newHealth; if ( m_iHealth >= 20 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthIncreasedAbove20"); } else if ( m_iHealth > 0 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthIncreasedBelow20"); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthLow"); } SetDisplayValue(m_iHealth); }
//------------------------------------------------------------------------ // Purpose: //------------------------------------------------------------------------ void CHudHealth::OnThink( void ) { float newHealth = 0; C_BasePlayer * local = C_BasePlayer:: GetLocalPlayer (); if (!local) return; // Never below zero newHealth = max(local->GetHealth(), 0); // DevMsg("Sheild at is at: %f\n",newShield); // Only update the fade if we've changed health if (newHealth == m_flHealthSize) { return; } m_flHealthSize = newHealth; if ( m_flHealthSize >= 11 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("C17HealthIncreasedAbove20"); } else if ( m_flHealthSize > 0 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("C17HealthIncreasedBelow20"); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("C17HealthLow"); } }
//----------------------------------------------------------------------------- // Purpose: Return true if the passed in sections of the HUD shouldn't be drawn //----------------------------------------------------------------------------- bool CHud::IsHidden(int iHudFlags) { // Not in game? if (!engine->IsInGame()) return true; // No local player yet? C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if (!pPlayer) return true; // Get current hidden flags int iHideHud = pPlayer->m_Local.m_iHideHUD; if (hidehud.GetInt()) { iHideHud = hidehud.GetInt(); } // Everything hidden? if (iHideHud & HIDEHUD_ALL) return true; // Local player dead? if ((iHudFlags & HIDEHUD_PLAYERDEAD) && (pPlayer->GetHealth() <= 0 && !pPlayer->IsAlive())) return true; // Need the HEV suit ( HL2 ) if ((iHudFlags & HIDEHUD_NEEDSUIT) && (!pPlayer->IsSuitEquipped())) return true; return ((iHudFlags & iHideHud) != 0); }
//----------------------------------------------------------------------------- // Purpose: If the shield has no health, and they're trying to raise it, flash the power level //----------------------------------------------------------------------------- void CWeaponCombatShield::HandleInput( void ) { // If the player's dead, ignore input C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer || pPlayer->GetHealth() < 0 ) return; // Attempting to raise the shield? if ( !GetShieldHealth() && ( gHUD.m_iKeyBits & IN_ATTACK2 ) ) { m_flFlashTimeEnd = gpGlobals->curtime + 1.0; } }
//----------------------------------------------------------------------------- // Purpose: Return true if the passed in sections of the HUD shouldn't be drawn //----------------------------------------------------------------------------- bool CHud::IsHidden( int iHudFlags, HUDRENDERSTAGE_t stage ) // GSTRINGMIGRATION { // GSTRINGMIGRATION const bool bDrawAll = m_iRenderingStage == HUDRENDERSTAGE_ALL; if ( !bDrawAll && stage != m_iRenderingStage ) return true; // END GSTRINGMIGRATION // Not in game? if ( !engine->IsInGame() ) return true; // No local player yet? C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return true; // Get current hidden flags int iHideHud = pPlayer->m_Local.m_iHideHUD; if ( hidehud.GetInt() ) { iHideHud = hidehud.GetInt(); } // Everything hidden? if ( iHideHud & HIDEHUD_ALL ) return true; // Local player dead? if ( ( iHudFlags & HIDEHUD_PLAYERDEAD ) && ( pPlayer->GetHealth() <= 0 && !pPlayer->IsAlive() ) ) return true; // Need the HEV suit ( HL2 ) if ( ( iHudFlags & HIDEHUD_NEEDSUIT ) && ( !pPlayer->IsSuitEquipped() ) ) return true; // Hide all HUD elements during screenshot if the user's set hud_freezecamhide ( TF2 ) #if defined( TF_CLIENT_DLL ) extern bool IsTakingAFreezecamScreenshot(); extern ConVar hud_freezecamhide; if ( IsTakingAFreezecamScreenshot() && hud_freezecamhide.GetBool() ) return true; #endif return ( ( iHudFlags & iHideHud ) != 0); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWebHudFull::Health( void ) { int newHealth = 0; C_BasePlayer *local = C_BasePlayer::GetLocalPlayer(); if ( local ) { // Never below zero newHealth = MAX( local->GetHealth(), 0 ); } // Only update the fade if we've changed health if ( newHealth == m_iHealth ) { return; } m_iHealth = newHealth; }
//----------------------------------------------------------------------------- // Purpose: Return true if the passed in sections of the HUD shouldn't be drawn //----------------------------------------------------------------------------- bool CHud::IsHidden( int iHudFlags ) { // Not in game? if ( !engine->IsInGame() ) return true; // No local player yet? C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return true; // Get current hidden flags int iHideHud = pPlayer->m_Local.m_iHideHUD; if ( hidehud.GetInt() ) { iHideHud = hidehud.GetInt(); } // Everything hidden? if ( iHideHud & HIDEHUD_ALL ) return true; // Local player dead? if ( ( iHudFlags & HIDEHUD_PLAYERDEAD ) && ( pPlayer->GetHealth() <= 0 && !pPlayer->IsAlive() ) ) return true; //BG2 - found this stuff removed while porting to 2016 - Awesome /* // Need the HEV suit ( HL2 ) if ( ( iHudFlags & HIDEHUD_NEEDSUIT ) && ( !pPlayer->IsSuitEquipped() ) ) return true; // Hide all HUD elements during screenshot if the user's set hud_freezecamhide ( TF2 ) #if defined( TF_CLIENT_DLL ) extern bool IsTakingAFreezecamScreenshot(); extern ConVar hud_freezecamhide; if ( IsTakingAFreezecamScreenshot() && hud_freezecamhide.GetBool() ) return true; #endif */ return ( ( iHudFlags & iHideHud ) != 0); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudHealth::OnThink() { int x = 0; C_BasePlayer *local = C_BasePlayer::GetLocalPlayer(); if ( local ) { // Never below zero x = max( local->GetHealth(), 0 ); } // Only update the fade if we've changed health if ( x == m_iHealth ) { return; } m_flFade = FADE_TIME; m_iHealth = x; }
//----------------------------------------------------------------------------- // Purpose: Return true if the passed in sections of the HUD shouldn't be drawn //----------------------------------------------------------------------------- bool CHud::IsHidden( int iHudFlags ) { // Not in game? if ( !m_bEngineIsInGame ) return true; // No local player yet? C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer( m_nSplitScreenSlot ); if ( !pPlayer ) return true; // Get current hidden flags int iHideHud = pPlayer->m_Local.m_iHideHUD; if ( hidehud.GetInt() ) { iHideHud = hidehud.GetInt(); } // Hide all hud elements if we're blurring the background, since they don't blur properly if ( GetClientMode()->GetBlurFade() ) return true; // Everything hidden? if ( iHideHud & HIDEHUD_ALL ) return true; // Don't show hud elements when we're at the mainmenu with a background map running if (engine->IsLevelMainMenuBackground()) return true; // Local player dead? if ( ( iHudFlags & HIDEHUD_PLAYERDEAD ) && ( pPlayer->GetHealth() <= 0 ) ) return true; // Need the HEV suit ( HL2 ) if ( ( iHudFlags & HIDEHUD_NEEDSUIT ) && ( !pPlayer->IsSuitEquipped() ) ) return true; return ( ( iHudFlags & iHideHud ) != 0); }
C_BasePlayer* GetClosestPlayer(CUserCmd* cmd, bool visible, Bone& bestBone, float& bestDamage, AimTargetType aimTargetType = AimTargetType::FOV) { if (Settings::Aimbot::AutoAim::realDistance) aimTargetType = AimTargetType::REAL_DISTANCE; bestBone = static_cast<Bone>(Settings::Aimbot::bone); C_BasePlayer* localplayer = (C_BasePlayer*) entityList->GetClientEntity(engine->GetLocalPlayer()); C_BasePlayer* closestEntity = NULL; // TODO Change the big value with a distance/fov slider float bestFov = Settings::Aimbot::AutoAim::fov; float bestRealDistance = Settings::Aimbot::AutoAim::fov * 5.f; float bestDistance = 999999999.0f; int bestHp = 100; if (!localplayer) return NULL; for (int i = 1; i < engine->GetMaxClients(); ++i) { C_BasePlayer* player = (C_BasePlayer*) entityList->GetClientEntity(i); if (!player || player == localplayer || player->GetDormant() || !player->GetAlive() || player->GetImmune()) continue; if (!Settings::Aimbot::friendly && player->GetTeam() == localplayer->GetTeam()) continue; IEngineClient::player_info_t entityInformation; engine->GetPlayerInfo(i, &entityInformation); if (std::find(Aimbot::friends.begin(), Aimbot::friends.end(), entityInformation.xuid) != Aimbot::friends.end()) continue; Vector eVecTarget = player->GetBonePosition((int) Settings::Aimbot::bone); Vector pVecTarget = localplayer->GetEyePosition(); QAngle viewAngles; engine->GetViewAngles(viewAngles); float distance = pVecTarget.DistTo(eVecTarget); float fov = Math::GetFov(viewAngles, Math::CalcAngle(pVecTarget, eVecTarget)); float real_distance = GetRealDistanceFOV(distance, Math::CalcAngle(pVecTarget, eVecTarget), cmd); int hp = player->GetHealth(); if (aimTargetType == AimTargetType::DISTANCE && distance > bestDistance) continue; if (aimTargetType == AimTargetType::FOV && fov > bestFov) continue; if (aimTargetType == AimTargetType::REAL_DISTANCE && real_distance > bestRealDistance) continue; if (aimTargetType == AimTargetType::HP && hp > bestHp) continue; if (visible && !Settings::Aimbot::AutoWall::enabled && !Entity::IsVisible(player, Settings::Aimbot::bone)) continue; bestBone = static_cast<Bone>(Entity::GetBoneByName(player, targets[(int) Settings::Aimbot::bone])); if (Settings::Aimbot::AutoWall::enabled) { float damage = 0.0f; Bone bone; GetBestBone(player, damage, bone); if (damage >= bestDamage && damage >= Settings::Aimbot::AutoWall::value) { bestDamage = damage; bestBone = bone; closestEntity = player; } } else { closestEntity = player; bestFov = fov; bestRealDistance = real_distance; bestDistance = distance; bestHp = hp; } } return closestEntity; }
void CHUDQuickInfo::Paint() { //BB: KILL THIS CRAP! return; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( player == NULL ) return; C_BaseCombatWeapon *pWeapon = GetActiveWeapon(); if ( pWeapon == NULL ) return; float fX, fY; bool bBehindCamera = false; CHudCrosshair::GetDrawPosition( &fX, &fY, &bBehindCamera ); // if the crosshair is behind the camera, don't draw it if( bBehindCamera ) return; int xCenter = (int)fX; int yCenter = (int)fY - m_icon_lb->Height() / 2; float scalar = 138.0f/255.0f; // Check our health for a warning int health = player->GetHealth(); if ( health != m_lastHealth ) { UpdateEventTime(); m_lastHealth = health; if ( health <= HEALTH_WARNING_THRESHOLD ) { if ( m_warnHealth == false ) { m_healthFade = 255; m_warnHealth = true; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HUDQuickInfo.LowHealth" ); } } else { m_warnHealth = false; } } // Check our ammo for a warning int ammo = pWeapon->Clip1(); if ( ammo != m_lastAmmo ) { UpdateEventTime(); m_lastAmmo = ammo; // Find how far through the current clip we are float ammoPerc = (float) ammo / (float) pWeapon->GetMaxClip1(); // Warn if we're below a certain percentage of our clip's size if (( pWeapon->GetMaxClip1() > 1 ) && ( ammoPerc <= ( 1.0f - CLIP_PERC_THRESHOLD ))) { if ( m_warnAmmo == false ) { m_ammoFade = 255; m_warnAmmo = true; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HUDQuickInfo.LowAmmo" ); } } else { m_warnAmmo = false; } } Color clrNormal = gHUD.m_clrNormal; clrNormal[3] = 255 * scalar; m_icon_c->DrawSelf( xCenter, yCenter, clrNormal ); if( IsX360() ) { // Because the fixed reticle draws on half-texels, this rather unsightly hack really helps // center the appearance of the quickinfo on 360 displays. xCenter += 1; } if ( !hud_quickinfo.GetInt() ) return; int sinScale = (int)( fabs(sin(gpGlobals->curtime*8.0f)) * 128.0f ); // Update our health if ( m_healthFade > 0.0f ) { DrawWarning( xCenter - (m_icon_lb->Width() * 2), yCenter, m_icon_lb, m_healthFade ); } else { float healthPerc = (float) health / 100.0f; healthPerc = clamp( healthPerc, 0.0f, 1.0f ); Color healthColor = m_warnHealth ? gHUD.m_clrCaution : gHUD.m_clrNormal; if ( m_warnHealth ) { healthColor[3] = 255 * sinScale; } else { healthColor[3] = 255 * scalar; } gHUD.DrawIconProgressBar( xCenter - (m_icon_lb->Width() * 2), yCenter, m_icon_lb, m_icon_lbe, ( 1.0f - healthPerc ), healthColor, CHud::HUDPB_VERTICAL ); } // Update our ammo if ( m_ammoFade > 0.0f ) { DrawWarning( xCenter + m_icon_rb->Width(), yCenter, m_icon_rb, m_ammoFade ); } else { float ammoPerc; if ( pWeapon->GetMaxClip1() <= 0 ) { ammoPerc = 0.0f; } else { ammoPerc = 1.0f - ( (float) ammo / (float) pWeapon->GetMaxClip1() ); ammoPerc = clamp( ammoPerc, 0.0f, 1.0f ); } Color ammoColor = m_warnAmmo ? gHUD.m_clrCaution : gHUD.m_clrNormal; if ( m_warnAmmo ) { ammoColor[3] = 255 * sinScale; } else { ammoColor[3] = 255 * scalar; } gHUD.DrawIconProgressBar( xCenter + m_icon_rb->Width(), yCenter, m_icon_rb, m_icon_rbe, ammoPerc, ammoColor, CHud::HUDPB_VERTICAL ); } }
void CHUDQuickInfo::Paint() { CHudTexture *icon_c = gHUD.GetIcon( "crosshair" ); CHudTexture *icon_rb = gHUD.GetIcon( "crosshair_right" ); CHudTexture *icon_lb = gHUD.GetIcon( "crosshair_left" ); if ( !icon_c || !icon_rb || !icon_lb ) return; int xCenter = ( ScreenWidth() / 2 ) - icon_c->Width() / 2; int yCenter = ( ScreenHeight() / 2 ) - icon_c->Height() / 2; int scalar; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( player == NULL ) return; C_BaseCombatWeapon *pWeapon = GetActiveWeapon(); if ( pWeapon == NULL ) return; //Get our values int health = player->GetHealth(); int ammo = pWeapon->Clip1(); if ( m_fDamageFade > 0.0f ) { m_fDamageFade -= (gpGlobals->frametime * 200.0f); } //Check our health for a warning if ( health != m_lastHealth ) { if ( health < m_lastHealth ) { m_fDamageFade = QINFO_FADE_TIME; } m_fFade = QINFO_FADE_TIME; m_lastHealth = health; if ( health <= HEALTH_WARNING_THRESHOLD ) { if ( m_warnHealth == false ) { m_healthFade = 255; m_warnHealth = true; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HUDQuickInfo.LowHealth" ); } } else { m_warnHealth = false; } } // Check our ammo for a warning if ( ammo != m_lastAmmo ) { m_fFade = QINFO_FADE_TIME; m_lastAmmo = ammo; if ( ( (float) ammo / (float) pWeapon->GetMaxClip1() ) <= ( 1.0f - CLIP_PERC_THRESHOLD ) ) { if ( m_warnAmmo == false ) { m_ammoFade = 255; m_warnAmmo = true; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HUDQuickInfo.LowAmmo" ); } } else { m_warnAmmo = false; } } //Get our crosshair intensity if ( m_fFade > 0.0f ) { m_fFade -= (gpGlobals->frametime * 50.0f); if ( m_fFade < 128.0f ) { scalar = (int) max( 16, (m_fFade) ); } else { scalar = 128; } } else { scalar = 16; } if ( player->IsInAVehicle() ) { scalar = 48; } Color clrNormal = gHUD.m_clrNormal; clrNormal[3] = 255 * scalar; icon_c->DrawSelf( xCenter, yCenter, clrNormal ); int sinScale = (int)( fabs(sin(gpGlobals->curtime*8.0f)) * 128.0f ); //Update our health if ( m_healthFade > 0.0f ) { DrawWarning( xCenter - 10, yCenter-5, icon_lb, m_healthFade ); } else { float healthPerc = (float) health / 100.0f; Color healthColor = m_warnHealth ? gHUD.m_clrCaution : gHUD.m_clrNormal; if ( m_warnHealth ) { healthColor[3] = 255 * sinScale; } else { healthColor[3] = 255 * scalar; } gHUD.DrawIconProgressBar( xCenter - 10, yCenter-5, icon_lb, ( 1.0f - healthPerc ), healthColor, CHud::HUDPB_VERTICAL ); } //Update our ammo if ( m_ammoFade > 0.0f ) { DrawWarning( xCenter + icon_rb->Width() - 6, yCenter-5, icon_rb, m_ammoFade ); } else { float ammoPerc = 1.0f - ( (float) ammo / (float) pWeapon->GetMaxClip1() ); Color ammoColor = m_warnAmmo ? gHUD.m_clrCaution : gHUD.m_clrNormal; if ( m_warnAmmo ) { ammoColor[3] = 255 * sinScale; } else { ammoColor[3] = 255 * scalar; } gHUD.DrawIconProgressBar( xCenter + icon_rb->Width() - 6, yCenter-5, icon_rb, ammoPerc, ammoColor, CHud::HUDPB_VERTICAL ); } }
//==================================================================== //==================================================================== void CBaseHTML::WebThink() { if ( !cl_web_think.GetBool() ) return; float flNextThink = cl_web_think_interval.GetFloat(); // Información de la partida SetProperty( "isInGame", JSValue(engine->IsInGame()), m_pGameObject ); SetProperty( "isPaused", JSValue(engine->IsPaused()), m_pGameObject ); SetProperty( "maxClients", JSValue(engine->GetMaxClients()), m_pGameObject ); SetProperty( "isLoading", JSValue(GameUI().m_bIsLoading), m_pGameObject ); if ( InRules ) SetProperty( "gameMode", JSValue(InRules->GameMode()), m_pGameObject ); // Obtenemos al Jugador C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); // Existe, estamos en una partida if ( pPlayer ) { // Información actual del Jugador C_BaseCombatWeapon *pWeapon = pPlayer->GetActiveWeapon(); int iHealth = pPlayer->GetHealth(); int iAmmo = 0; int iAmmoTotal = 0; // Tenemos un arma if ( pWeapon ) { iAmmo = pWeapon->Clip1(); iAmmoTotal = pPlayer->GetAmmoCount( pWeapon->GetPrimaryAmmoType() ); } // Actualizamos la información básica SetProperty( "health", JSValue(iHealth), m_pPlayerObject ); SetProperty( "clip1Ammo", JSValue(iAmmo), m_pPlayerObject ); SetProperty( "clip1TotalAmmo", JSValue(iAmmoTotal), m_pPlayerObject ); } // Información de la API de Steam if ( IsPC() && steamapicontext ) { // ID de Steam if ( !m_pSteamID ) { // Intentamos obtener la ID if ( steamapicontext->SteamUser() ) { CSteamID steamID = steamapicontext->SteamUser()->GetSteamID(); uint64 mySteamID = steamID.ConvertToUint64(); m_pSteamID = VarArgs("%llu", mySteamID); } // ID cargada, se lo dejamos a JavaScript... if ( m_pSteamID ) { SetProperty( "playerID", JSValue(WSLit(m_pSteamID)), m_pSteamObject ); ExecuteJavaScript( "Helper.loadUserInfo()", "" ); } } // Utilidades e información if ( steamapicontext->SteamUtils() ) { uint32 serverTime = steamapicontext->SteamUtils()->GetServerRealTime(); const char *country = steamapicontext->SteamUtils()->GetIPCountry(); uint8 battery = steamapicontext->SteamUtils()->GetCurrentBatteryPower(); uint32 computer = steamapicontext->SteamUtils()->GetSecondsSinceComputerActive(); SetProperty( "serverTime", JSValue(WSLit(VarArgs("%llu", serverTime))), m_pSteamObject ); SetProperty( "country", JSValue(country), m_pSteamObject ); SetProperty( "batteryPower", JSValue(WSLit(VarArgs("%llu", battery))), m_pSteamObject ); SetProperty( "computerActive", JSValue(WSLit(VarArgs("%llu", computer))), m_pSteamObject ); } } // Pensamiento en JS ExecuteJavaScript( "think()", "" ); // Pensamiento nuevamente en... m_flNextThink = gpGlobals->curtime + flNextThink; }
//----------------------------------------------------------------------------- // Purpose: Draw function for the element //----------------------------------------------------------------------------- void CTargetID::Paint() { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return; // No id if still choosing class if ( C_BaseTFPlayer::GetLocalPlayer()->GetClass() == TFCLASS_UNDECIDED ) return; // Get our target's ent index int iEntIndex = C_BaseTFPlayer::GetLocalPlayer()->GetIDTarget(); // Didn't find one? if ( !iEntIndex ) { // Check to see if we should clear our ID if ( m_flLastChangeTime && (gpGlobals->curtime > (m_flLastChangeTime + 0.5)) ) { m_flLastChangeTime = 0; m_sIDString[0] = 0; m_iLastEntIndex = 0; } else { // Keep re-using the old one iEntIndex = m_iLastEntIndex; } } else { m_flLastChangeTime = gpGlobals->curtime; } // Is this an entindex sent by the server? if ( iEntIndex ) { C_BaseTFPlayer *pPlayer = static_cast<C_BaseTFPlayer*>(cl_entitylist->GetEnt( iEntIndex )); C_BaseTFPlayer *pLocalPlayer = C_BaseTFPlayer::GetLocalPlayer(); // 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( iEntIndex ) ) { if ( pPlayer->InSameTeam(pLocalPlayer) ) { // Check distance to other player, and if the player is on the same team float flDistSq = pPlayer->GetRenderOrigin().DistToSqr( pLocalPlayer->GetRenderOrigin() ); if ( flDistSq < PLAYER_HINT_DISTANCE_SQ ) { Q_snprintf( m_sIDString, sizeof(m_sIDString), "%s\nHealth: %.0f percent\nUse to donate resources", pPlayer->GetPlayerName(), ((float)pPlayer->GetHealth() / (float)pPlayer->GetMaxHealth() ) * 100 ); } else { Q_snprintf( m_sIDString, sizeof(m_sIDString), "%s\nHealth: %.0f percent", pPlayer->GetPlayerName(), ((float)pPlayer->GetHealth() / (float)pPlayer->GetMaxHealth() ) * 100 ); } } else if (( pPlayer->GetHealth() == 0) && (pLocalPlayer->GetClass() == TFCLASS_INFILTRATOR) ) { Q_snprintf( m_sIDString, sizeof(m_sIDString), "%s\nUse to disguise as this player", pPlayer->GetPlayerName() ); } else { m_sIDString[0] = 0; m_iLastEntIndex = 0; } } else { // Objects C_BaseEntity *pEnt = cl_entitylist->GetEnt( iEntIndex ); if ( !pEnt || !pEnt->InSameTeam(pLocalPlayer) ) { // This can happen because the object was destroyed m_sIDString[0] = 0; m_iLastEntIndex = 0; } else { // Don't check validity if it's sent by the server Q_strncpy( m_sIDString, pEnt->GetIDString(), sizeof(m_sIDString) ); m_iLastEntIndex = iEntIndex; } } } // Draw our ID string if ( m_sIDString[0] ) { int width, height; int ypos = YRES(300); // Messagechars can't handle multiple line strings, so parse out the \n's and give it one line at a time char *ch = m_sIDString; while ( *ch ) { // Find the next newline char *next_line; for ( next_line = ch; *next_line != '\n' && *next_line != 0; next_line++ ) { } // Stomp the newline char *top = next_line; if ( *top == '\n' ) { *top = 0; } else { top = NULL; } // Draw the line messagechars->GetStringLength( m_hFont, &width, &height, ch ); messagechars->DrawString( m_hFont, (ScreenWidth() - width) / 2, ypos, 255, 255, 245, 255, ch, IMessageChars::MESSAGESTRINGID_NONE ); ypos += height; // Restore the newline if ( top ) { *top = '\n'; } // Move to the next line ch = next_line; if ( *ch == '\n' ) { ch++; } } } }