//----------------------------------------------------------------------------- // Purpose: Draw the pickup history //----------------------------------------------------------------------------- void CHudHistoryResource::Paint( void ) { if ( m_bDoNotDraw ) { // this is to not draw things until the first rendered m_bDoNotDraw = false; return; } // set when drawing should occur // will be set if valid drawing does occur m_bNeedsDraw = false; int wide, tall; GetSize( wide, tall ); for ( int i = 0; i < m_PickupHistory.Count(); i++ ) { if ( m_PickupHistory[i].type ) { m_PickupHistory[i].DisplayTime = min( m_PickupHistory[i].DisplayTime, gpGlobals->curtime + hud_drawhistory_time.GetFloat() ); if ( m_PickupHistory[i].DisplayTime <= gpGlobals->curtime ) { // pic drawing time has expired memset( &m_PickupHistory[i], 0, sizeof(HIST_ITEM) ); CheckClearHistory(); continue; } float elapsed = m_PickupHistory[i].DisplayTime - gpGlobals->curtime; float scale = elapsed * 80; Color clr = gHUD.m_clrNormal; clr[3] = min( scale, 255 ); bool bUseAmmoFullMsg = false; // get the icon and number to draw const CHudTexture *itemIcon = NULL; int iAmount = 0; switch ( m_PickupHistory[i].type ) { case HISTSLOT_AMMO: { itemIcon = gWR.GetAmmoIconFromWeapon( m_PickupHistory[i].iId ); iAmount = m_PickupHistory[i].iCount; } break; case HISTSLOT_AMMODENIED: { itemIcon = gWR.GetAmmoIconFromWeapon( m_PickupHistory[i].iId ); iAmount = 0; bUseAmmoFullMsg = true; // display as red clr = gHUD.m_clrCaution; clr[3] = min( scale, 255 ); } break; case HISTSLOT_WEAP: { C_BaseCombatWeapon *pWeapon = m_PickupHistory[i].m_hWeapon; if ( !pWeapon ) return; if ( !pWeapon->HasAmmo() ) { // if the weapon doesn't have ammo, display it as red clr = gHUD.m_clrCaution; clr[3] = min( scale, 255 ); } itemIcon = pWeapon->GetSpriteInactive(); } break; case HISTSLOT_ITEM: { if ( !m_PickupHistory[i].iId ) continue; itemIcon = m_PickupHistory[i].icon; } break; default: // unknown history type Assert( 0 ); break; } if ( !itemIcon ) continue; if ( clr[3] ) { // valid drawing will occur m_bNeedsDraw = true; } int ypos = tall - (m_flHistoryGap * (i + 1)); int xpos = wide - itemIcon->Width() - m_flIconInset; itemIcon->DrawSelf( xpos, ypos, clr ); if ( iAmount ) { wchar_t text[16]; _snwprintf( text, sizeof( text ) / sizeof(wchar_t), L"%i", m_PickupHistory[i].iCount ); // offset the number to sit properly next to the icon ypos -= ( surface()->GetFontTall( m_hNumberFont ) - itemIcon->Height() ) / 2; vgui::surface()->DrawSetTextFont( m_hNumberFont ); vgui::surface()->DrawSetTextColor( clr ); vgui::surface()->DrawSetTextPos( wide - m_flTextInset, ypos ); vgui::surface()->DrawUnicodeString( text ); } else if ( bUseAmmoFullMsg ) { // offset the number to sit properly next to the icon ypos -= ( surface()->GetFontTall( m_hTextFont ) - itemIcon->Height() ) / 2; vgui::surface()->DrawSetTextFont( m_hTextFont ); vgui::surface()->DrawSetTextColor( clr ); vgui::surface()->DrawSetTextPos( wide - m_flTextInset, ypos ); vgui::surface()->DrawUnicodeString( m_wcsAmmoFullMsg ); } } } }
//----------------------------------------------------------------------------- // Purpose: Draw the pickup history //----------------------------------------------------------------------------- void CHudHistoryResource::Paint( void ) { if ( m_bDoNotDraw ) { // this is to not draw things until the first rendered m_bDoNotDraw = false; return; } // set when drawing should occur // will be set if valid drawing does occur m_bNeedsDraw = false; int wide, tall; GetSize( wide, tall ); for ( int i = 0; i < m_PickupHistory.Count(); i++ ) { if ( m_PickupHistory[i].type ) { m_PickupHistory[i].DisplayTime = MIN( m_PickupHistory[i].DisplayTime, gpGlobals->curtime + hud_drawhistory_time.GetFloat() ); if ( m_PickupHistory[i].DisplayTime <= gpGlobals->curtime ) { // pic drawing time has expired memset( &m_PickupHistory[i], 0, sizeof(HIST_ITEM) ); CheckClearHistory(); continue; } float elapsed = m_PickupHistory[i].DisplayTime - gpGlobals->curtime; float scale = elapsed * 80; Color clr = gHUD.m_clrNormal; clr[3] = MIN( scale, 255 ); bool bUseAmmoFullMsg = false; // get the icon and number to draw const CHudTexture *itemIcon = NULL; const CHudTexture *itemAmmoIcon = NULL; int iAmount = 0; bool bHalfHeight = true; switch ( m_PickupHistory[i].type ) { case HISTSLOT_AMMO: { // Get the weapon we belong to #ifndef MSS const FileWeaponInfo_t *pWpnInfo = gWR.GetWeaponFromAmmo( m_PickupHistory[i].iId ); if ( pWpnInfo && ( pWpnInfo->iMaxClip1 >= 0 || pWpnInfo->iMaxClip2 >= 0 ) ) { // The weapon will be the main icon, and the ammo the smaller itemIcon = pWpnInfo->iconSmall; itemAmmoIcon = gWR.GetAmmoIconFromWeapon( m_PickupHistory[i].iId ); } else #endif // HL2MP { itemIcon = gWR.GetAmmoIconFromWeapon( m_PickupHistory[i].iId ); itemAmmoIcon = NULL; } #ifdef CSTRIKE_DLL // show grenades as the weapon icon if ( pWpnInfo && pWpnInfo->iFlags & ITEM_FLAG_EXHAUSTIBLE ) { itemIcon = pWpnInfo->iconActive; itemAmmoIcon = NULL; bHalfHeight = false; } #endif iAmount = m_PickupHistory[i].iCount; } break; case HISTSLOT_AMMODENIED: { itemIcon = gWR.GetAmmoIconFromWeapon( m_PickupHistory[i].iId ); iAmount = 0; bUseAmmoFullMsg = true; // display as red clr = gHUD.m_clrCaution; clr[3] = MIN( scale, 255 ); } break; case HISTSLOT_WEAP: { C_BaseCombatWeapon *pWeapon = m_PickupHistory[i].m_hWeapon; if ( !pWeapon ) return; if ( !pWeapon->HasAmmo() ) { // if the weapon doesn't have ammo, display it as red clr = gHUD.m_clrCaution; clr[3] = MIN( scale, 255 ); } itemIcon = pWeapon->GetSpriteInactive(); bHalfHeight = false; } break; case HISTSLOT_ITEM: { if ( !m_PickupHistory[i].iId ) continue; itemIcon = m_PickupHistory[i].icon; bHalfHeight = false; } break; default: // unknown history type Assert( 0 ); break; } if ( !itemIcon ) continue; if ( clr[3] ) { // valid drawing will occur m_bNeedsDraw = true; } int ypos = tall - (m_flHistoryGap * (i + 1)); int xpos = wide - itemIcon->Width() - m_flIconInset; #ifndef MSS // Adjust for a half-height icon if ( bHalfHeight ) { ypos += itemIcon->Height() / 2; } #endif // HL2MP itemIcon->DrawSelf( xpos, ypos, clr ); if ( itemAmmoIcon ) { itemAmmoIcon->DrawSelf( xpos - ( itemAmmoIcon->Width() * 1.25f ), ypos, clr ); } if ( iAmount ) { wchar_t text[16]; _snwprintf( text, sizeof( text ) / sizeof(wchar_t), L"%i", m_PickupHistory[i].iCount ); // offset the number to sit properly next to the icon ypos -= ( surface()->GetFontTall( m_hNumberFont ) - itemIcon->Height() ) / 2; vgui::surface()->DrawSetTextFont( m_hNumberFont ); vgui::surface()->DrawSetTextColor( clr ); vgui::surface()->DrawSetTextPos( wide - m_flTextInset, ypos ); vgui::surface()->DrawUnicodeString( text ); } else if ( bUseAmmoFullMsg ) { // offset the number to sit properly next to the icon ypos -= ( surface()->GetFontTall( m_hTextFont ) - itemIcon->Height() ) / 2; vgui::surface()->DrawSetTextFont( m_hTextFont ); vgui::surface()->DrawSetTextColor( clr ); vgui::surface()->DrawSetTextPos( wide - m_flTextInset, ypos ); vgui::surface()->DrawUnicodeString( m_wcsAmmoFullMsg ); } } } }
//----------------------------------------------------------------------------- // Purpose: Get ammo info from the weapon and update the displays. //----------------------------------------------------------------------------- void CTFHudWeaponAmmo::OnThink() { // Get the player and active weapon. C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pPlayer ) return; C_BaseCombatWeapon *pWeapon = pPlayer->GetActiveWeapon(); if ( tf2c_ammobucket.GetBool() && m_pWeaponBucket && pWeapon ) { const CHudTexture *pTexture = pWeapon->GetSpriteInactive(); // red team if ( pPlayer ) { if ( pPlayer->GetTeamNumber() == TF_TEAM_BLUE ) { pTexture = pWeapon->GetSpriteActive(); } } if ( pTexture ) { char szImage[64]; Q_snprintf( szImage, sizeof(szImage), "../%s", pTexture->szTextureFile ); m_pWeaponBucket->SetImage( szImage ); m_pWeaponBucket->SetVisible( true ); } else { m_pWeaponBucket->SetVisible( false ); } } else { m_pWeaponBucket->SetVisible( false ); } if ( m_flNextThink < gpGlobals->curtime ) { hudlcd->SetGlobalStat( "(weapon_print_name)", pWeapon ? pWeapon->GetPrintName() : " " ); hudlcd->SetGlobalStat( "(weapon_name)", pWeapon ? pWeapon->GetName() : " " ); if ( !pPlayer || !pWeapon || !pWeapon->UsesPrimaryAmmo() ) { hudlcd->SetGlobalStat( "(ammo_primary)", "n/a" ); hudlcd->SetGlobalStat( "(ammo_secondary)", "n/a" ); // turn off our ammo counts UpdateAmmoLabels( false, false, false ); m_nAmmo = -1; m_nAmmo2 = -1; } else { // Get the ammo in our clip. int nAmmo1 = pWeapon->Clip1(); int nAmmo2 = 0; // Clip ammo not used, get total ammo count. if ( nAmmo1 < 0 ) { nAmmo1 = pPlayer->GetAmmoCount( pWeapon->GetPrimaryAmmoType() ); } // Clip ammo, so the second ammo is the total ammo. else { nAmmo2 = pPlayer->GetAmmoCount( pWeapon->GetPrimaryAmmoType() ); } hudlcd->SetGlobalStat( "(ammo_primary)", VarArgs( "%d", nAmmo1 ) ); hudlcd->SetGlobalStat( "(ammo_secondary)", VarArgs( "%d", nAmmo2 ) ); if ( m_nAmmo != nAmmo1 || m_nAmmo2 != nAmmo2 || m_hCurrentActiveWeapon.Get() != pWeapon ) { m_nAmmo = nAmmo1; m_nAmmo2 = nAmmo2; m_hCurrentActiveWeapon = pWeapon; if ( m_hCurrentActiveWeapon.Get()->UsesClipsForAmmo1() ) { UpdateAmmoLabels( true, true, false ); SetDialogVariable( "Ammo", m_nAmmo ); SetDialogVariable( "AmmoInReserve", m_nAmmo2 ); } else { UpdateAmmoLabels( false, false, true ); SetDialogVariable( "Ammo", m_nAmmo ); } } } m_flNextThink = gpGlobals->curtime + 0.1f; } }