//----------------------------------------------------------------------------- // 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: 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 ); } } } }