// returns the ypos where it finishes drawing int CHudScoreboard :: DrawPlayers( float list_slot, int nameoffset, const char *team ) { // draw the players, in order, and restricted to team if set while ( 1 ) { // Find the top ranking player int highest_frags = -99999; int lowest_deaths = 99999; int best_player = 0; for ( int i = 1; i < MAX_PLAYERS; i++ ) { if ( g_PlayerInfoList[i].name && g_PlayerExtraInfo[i].frags >= highest_frags ) { if ( !(team && stricmp(g_PlayerExtraInfo[i].teamname, team)) ) // make sure it is the specified team { extra_player_info_t *pl_info = &g_PlayerExtraInfo[i]; if ( pl_info->frags > highest_frags || pl_info->deaths < lowest_deaths ) { best_player = i; lowest_deaths = pl_info->deaths; highest_frags = pl_info->frags; } } } } if ( !best_player ) break; // draw out the best player hud_player_info_t *pl_info = &g_PlayerInfoList[best_player]; int ypos = ystart + (list_slot * ROW_GAP); // check we haven't drawn too far down if ( ypos > yend ) // don't draw to close to the lower border break; int r = 255, g = 255, b = 255; float *colors = GetClientColor( best_player ); r *= colors[0]; g *= colors[1]; b *= colors[2]; if(pl_info->thisplayer) // hey, it's me! { FillRGBABlend( xstart, ypos, xend - xstart, ROW_GAP, 255, 255, 255, 15 ); } DrawUtils::DrawHudString( NAME_POS_START() + nameoffset, ypos, NAME_POS_END(), pl_info->name, r, g, b ); // draw bomb( if player have the bomb ) if( g_PlayerExtraInfo[best_player].dead ) DrawUtils::DrawHudString( ATTRIB_POS_START(), ypos, ATTRIB_POS_END(), "Dead", r, g, b ); else if( g_PlayerExtraInfo[best_player].has_c4 ) DrawUtils::DrawHudString( ATTRIB_POS_START(), ypos, ATTRIB_POS_END(), "Bomb", r, g, b ); else if( g_PlayerExtraInfo[best_player].vip ) DrawUtils::DrawHudString( ATTRIB_POS_START(), ypos, ATTRIB_POS_END(), "VIP", r, g, b ); // draw kills (right to left) DrawUtils::DrawHudNumberString( KILLS_POS_END(), ypos, KILLS_POS_START(), g_PlayerExtraInfo[best_player].frags, r, g, b ); // draw deaths DrawUtils::DrawHudNumberString( DEATHS_POS_END(), ypos, DEATHS_POS_START(), g_PlayerExtraInfo[best_player].deaths, r, g, b ); // draw ping & packetloss static char buf[64]; sprintf( buf, "%d", g_PlayerInfoList[best_player].ping ); DrawUtils::DrawHudStringReverse( PING_POS_END(), ypos, PING_POS_START(), buf, r, g, b ); pl_info->name = NULL; // set the name to be NULL, so this client won't get drawn again list_slot++; } list_slot += 2.0f; return list_slot; }
void CHudAmmo::DrawCrosshair( float flTime, int weaponid ) { int flags; int iDeltaDistance, iDistance; int iLength; float flCrosshairDistance; if ( g_iWeaponFlags & WPNSTATE_SHIELD_DRAWN ) return; if ( weaponid > 30 ) { iDistance = 4; iDeltaDistance = 3; } else { // TODO: Get an info about crosshair for weapon iDistance = Distances[weaponid-1][0]; iDeltaDistance = Distances[weaponid-1][1]; } iLength = 0; flags = GetWeaponAccuracyFlags(weaponid); if ( flags && m_pClDynamicCrosshair->value && !(gHUD.m_iHideHUDDisplay & 1) ) { if ( g_iPlayerFlags & FL_ONGROUND || !(flags & ACCURACY_AIR) ) { if ( (g_iPlayerFlags & FL_DUCKING) && (flags & ACCURACY_DUCK) ) iDistance *= 0.5; else { int iWeaponSpeed = 0; switch( weaponid ) { case 30: // p90 iWeaponSpeed = 170; break; case 8: // aug case 14: // galil case 15: // famas case 20: // m249 case 22: // m4a1 case 27: // sg552 case 28: // ak47 iWeaponSpeed = 140; break; } if ( (g_flPlayerSpeed >= iWeaponSpeed) && (flags & ACCURACY_SPEED) ) iDistance *= 1.5; } } else iDistance *= 2; if ( flags & ACCURACY_MULTIPLY_BY_14 ) iDistance *= 1.4; if ( flags & ACCURACY_MULTIPLY_BY_14_2 ) iDistance *= 1.4; } if ( m_iAmmoLastCheck >= g_iShotsFired ) { m_flCrosshairDistance -= (m_flCrosshairDistance * 0.013 + 0.1 ); m_iAlpha += 2; } else { m_flCrosshairDistance += iDeltaDistance; m_iAlpha -= 40; if ( m_flCrosshairDistance > 15.0 ) m_flCrosshairDistance = 15.0; if ( m_iAlpha < 120 ) m_iAlpha = 120; } if ( g_iShotsFired > 600 ) g_iShotsFired = 1; CalcCrosshairColor(); CalcCrosshairDrawMode(); CalcCrosshairSize(); m_iAmmoLastCheck = g_iShotsFired; if ( iDistance > m_flCrosshairDistance ) m_flCrosshairDistance = iDistance; if ( m_iAlpha > 255 ) m_iAlpha = 255; iLength = (m_flCrosshairDistance - iDistance) * 0.5 + 5; flCrosshairDistance = m_flCrosshairDistance; if ( ScreenWidth != m_iCrosshairScaleBase ) { flCrosshairDistance = ScreenWidth * flCrosshairDistance / m_iCrosshairScaleBase; iLength = ScreenWidth * iLength / m_iCrosshairScaleBase; } // drawing if ( gHUD.m_NVG.m_iEnable ) { FillRGBABlend(WEST_XPOS, EAST_WEST_YPOS, iLength, 1, 250, 50, 50, m_iAlpha); FillRGBABlend(EAST_XPOS, EAST_WEST_YPOS, iLength, 1, 250, 50, 50, m_iAlpha); FillRGBABlend(NORTH_SOUTH_XPOS, NORTH_YPOS, 1, iLength, 250, 50, 50, m_iAlpha); FillRGBABlend(NORTH_SOUTH_XPOS, SOUTH_YPOS, 1, iLength, 250, 50, 50, m_iAlpha); } else if ( !m_bAdditive ) { FillRGBABlend(WEST_XPOS, EAST_WEST_YPOS, iLength, 1, m_R, m_G, m_B, m_iAlpha); FillRGBABlend(EAST_XPOS, EAST_WEST_YPOS, iLength, 1, m_R, m_G, m_B, m_iAlpha); FillRGBABlend(NORTH_SOUTH_XPOS, NORTH_YPOS, 1, iLength, m_R, m_G, m_B, m_iAlpha); FillRGBABlend(NORTH_SOUTH_XPOS, SOUTH_YPOS, 1, iLength, m_R, m_G, m_B, m_iAlpha); } else { FillRGBA(WEST_XPOS, EAST_WEST_YPOS, iLength, 1, m_R, m_G, m_B, m_iAlpha); FillRGBA(EAST_XPOS, EAST_WEST_YPOS, iLength, 1, m_R, m_G, m_B, m_iAlpha); FillRGBA(NORTH_SOUTH_XPOS, NORTH_YPOS, 1, iLength, m_R, m_G, m_B, m_iAlpha); FillRGBA(NORTH_SOUTH_XPOS, SOUTH_YPOS, 1, iLength, m_R, m_G, m_B, m_iAlpha); } return; }