Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

608 lines
20 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Draws achievement progress bars on the HUD
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #include "cbase.h"
  8. #include "hudelement.h"
  9. #include "hud_macros.h"
  10. #include <game_controls/baseviewport.h>
  11. #include <vgui_controls/Controls.h>
  12. #include <vgui_controls/Panel.h>
  13. #include <vgui_controls/ImagePanel.h>
  14. #include <vgui_controls/TextImage.h>
  15. #include "vgui/ILocalize.h"
  16. #include "hud_baseachievement_tracker.h"
  17. #include "iachievementmgr.h"
  18. #include "baseachievement.h"
  19. #include "iclientmode.h"
  20. #include "cdll_int.h"
  21. #include <vgui/ISurface.h>
  22. #include <vgui_controls/AnimationController.h>
  23. #include "fmtstr.h"
  24. #include "engine/IEngineSound.h"
  25. //=============================================================================
  26. // HPE_BEGIN
  27. // [dwenger] Necessary for HUD Achievement display
  28. //=============================================================================
  29. #include "cdll_client_int.h"
  30. #include "steam/isteamuserstats.h"
  31. #include "steam/steam_api.h"
  32. //=============================================================================
  33. // HPE_END
  34. //=============================================================================
  35. // memdbgon must be the last include file in a .cpp file!!!
  36. #include "tier0/memdbgon.h"
  37. using namespace vgui;
  38. #define PROGRESS_BAR_NEEDS_UPDATE -1
  39. #define UNKNOWN_ACHIEVEMENT_ID -1
  40. void TrackerDescriptionChanged( IConVar *var, const char *pOldString, float flOldValue )
  41. {
  42. static int s_iTimesChanged = 0;
  43. if ( s_iTimesChanged > 0 )
  44. {
  45. engine->ClientCmd_Unrestricted( "hud_reloadscheme" );
  46. }
  47. s_iTimesChanged++;
  48. }
  49. ConVar hud_achievement_description("hud_achievement_description", "1", FCVAR_ARCHIVE, "Show full descriptions of achievements on the HUD", TrackerDescriptionChanged );
  50. #ifdef CSTRIKE_DLL
  51. ConVar hud_achievement_count("hud_achievement_count", "5", FCVAR_ARCHIVE, "Max number of achievements that can be shown on the HUD" );
  52. #else
  53. ConVar hud_achievement_count("hud_achievement_count", "8", FCVAR_ARCHIVE, "Max number of achievements that can be shown on the HUD" );
  54. #endif
  55. ConVar hud_achievement_glowtime("hud_achievement_glowtime", "2.5", FCVAR_NONE, "Duration of glow effect around incremented achievements" );
  56. ConVar hud_achievement_tracker("hud_achievement_tracker", "1", FCVAR_NONE, "Show or hide the achievement tracker" );
  57. //-----------------------------------------------------------------------------
  58. // Purpose:
  59. //-----------------------------------------------------------------------------
  60. CHudBaseAchievementTracker::CHudBaseAchievementTracker( const char *pElementName ) :
  61. CHudElement( pElementName ), BaseClass( NULL, "HudAchievementTracker" )
  62. {
  63. vgui::Panel *pParent = g_pClientMode->GetViewport();
  64. SetParent( pParent );
  65. SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD );
  66. for ( int i=0; i < GetMaxAchievementsShown(); i++ )
  67. {
  68. CAchievementTrackerItem *pNewItem = CreateAchievementPanel();
  69. pNewItem->SetAchievement( NULL );
  70. m_AchievementItem.AddToTail( pNewItem );
  71. }
  72. m_flNextThink = 0;
  73. }
  74. //-----------------------------------------------------------------------------
  75. // Purpose:
  76. //-----------------------------------------------------------------------------
  77. void CHudBaseAchievementTracker::Reset()
  78. {
  79. m_flNextThink = gpGlobals->curtime + 0.05f;
  80. }
  81. void CHudBaseAchievementTracker::LevelInit()
  82. {
  83. // clear out tracker items and floating numbers on level change
  84. for ( int i = 0; i < GetChildCount(); i++ )
  85. {
  86. GetChild( i )->SetVisible( false );
  87. GetChild( i )->MarkForDeletion();
  88. }
  89. m_AchievementItem.Purge();
  90. for ( int i=0; i < GetMaxAchievementsShown(); i++ )
  91. {
  92. CAchievementTrackerItem *pNewItem = CreateAchievementPanel();
  93. pNewItem->SetAchievement( NULL );
  94. m_AchievementItem.AddToTail( pNewItem );
  95. }
  96. CHudElement::LevelInit();
  97. }
  98. //-----------------------------------------------------------------------------
  99. // Purpose:
  100. //-----------------------------------------------------------------------------
  101. void CHudBaseAchievementTracker::ApplySchemeSettings( IScheme *pScheme )
  102. {
  103. BaseClass::ApplySchemeSettings( pScheme );
  104. }
  105. //-----------------------------------------------------------------------------
  106. // Purpose:
  107. //-----------------------------------------------------------------------------
  108. bool CHudBaseAchievementTracker::ShouldDraw()
  109. {
  110. if ( engine->IsPlayingDemo() )
  111. return false;
  112. return CHudElement::ShouldDraw();
  113. }
  114. //-----------------------------------------------------------------------------
  115. // Purpose:
  116. //-----------------------------------------------------------------------------
  117. void CHudBaseAchievementTracker::OnThink()
  118. {
  119. if ( m_flNextThink < gpGlobals->curtime )
  120. {
  121. UpdateAchievementItems();
  122. m_flNextThink = gpGlobals->curtime + 0.5f;
  123. }
  124. }
  125. //-----------------------------------------------------------------------------
  126. // Purpose: Max number of achievements shown on the HUD
  127. //-----------------------------------------------------------------------------
  128. int CHudBaseAchievementTracker::GetMaxAchievementsShown()
  129. {
  130. return hud_achievement_count.GetInt();
  131. }
  132. bool CHudBaseAchievementTracker::ShouldShowAchievement( IAchievement *pAchievement )
  133. {
  134. return ( hud_achievement_tracker.GetBool() && pAchievement && pAchievement->ShouldShowOnHUD() && !pAchievement->IsAchieved() );
  135. }
  136. CAchievementTrackerItem* CHudBaseAchievementTracker::CreateAchievementPanel()
  137. {
  138. return new CAchievementTrackerItem( this, "HudAchievementTrackerItem" );
  139. }
  140. //-----------------------------------------------------------------------------
  141. // Purpose: create panels for each achievement the player wants shown on the HUD and assign achievements to each one
  142. //-----------------------------------------------------------------------------
  143. void CHudBaseAchievementTracker::UpdateAchievementItems()
  144. {
  145. IAchievementMgr *pAchievementMgr = engine->GetAchievementMgr();
  146. if ( !pAchievementMgr )
  147. return;
  148. int iCount = pAchievementMgr->GetAchievementCount();
  149. int iShown = 0;
  150. for ( int i = 0; i < iCount; ++i )
  151. {
  152. IAchievement* pCur = pAchievementMgr->GetAchievementByIndex( i );
  153. if ( !ShouldShowAchievement( pCur ) )
  154. {
  155. // don't remove achievements that are still glowing (typically a just completed achievement)
  156. if ( pCur && m_AchievementItem.Count() > iShown && m_AchievementItem[iShown]->GetAchievementID() == pCur->GetAchievementID()
  157. && m_AchievementItem[iShown]->GetGlow() > 0 )
  158. {
  159. iShown++;
  160. }
  161. continue;
  162. }
  163. if ( m_AchievementItem.Count() < iShown+1 )
  164. {
  165. CAchievementTrackerItem *pNewItem = CreateAchievementPanel();
  166. SETUP_PANEL( pNewItem );
  167. m_AchievementItem.AddToTail( pNewItem );
  168. }
  169. m_AchievementItem[iShown]->SetAchievement( pCur );
  170. m_AchievementItem[iShown]->SetSlot( iShown );
  171. m_AchievementItem[iShown]->SetVisible( true );
  172. iShown++;
  173. if ( iShown >= GetMaxAchievementsShown() )
  174. break;
  175. }
  176. // hide any extra panels we may have created from when the list was longer
  177. if ( iShown < m_AchievementItem.Count() )
  178. {
  179. for ( int i = m_AchievementItem.Count() - 1; i >= iShown ; i-- )
  180. {
  181. m_AchievementItem[i]->SetVisible( false );
  182. m_AchievementItem[i]->SetAchievement( NULL );
  183. }
  184. }
  185. }
  186. //-----------------------------------------------------------------------------
  187. // Purpose: Layout all child panels vertically
  188. //-----------------------------------------------------------------------------
  189. void CHudBaseAchievementTracker::PerformLayout()
  190. {
  191. // make sure all children are laid out first
  192. for ( int i=0; i < m_AchievementItem.Count(); i++ )
  193. {
  194. m_AchievementItem[i]->InvalidateLayout( true );
  195. }
  196. int iCurrentY = 0;
  197. int x, y;
  198. for ( int i=0; i< m_AchievementItem.Count(); i++ )
  199. {
  200. m_AchievementItem[i]->GetPos( x, y );
  201. m_AchievementItem[i]->SetPos( x, iCurrentY );
  202. iCurrentY += m_AchievementItem[i]->GetTall() + m_iItemPadding;
  203. }
  204. }
  205. CAchievementTrackerItem* CHudBaseAchievementTracker::GetAchievementPanel( int i )
  206. {
  207. if ( i < 0 || i >= m_AchievementItem.Count() )
  208. return NULL;
  209. return m_AchievementItem[i];
  210. }
  211. //-----------------------------------------------------------------------------
  212. // Purpose: The child panels
  213. //-----------------------------------------------------------------------------
  214. CAchievementTrackerItem::CAchievementTrackerItem( vgui::Panel* pParent, const char *pElementName ) :
  215. BaseClass( pParent, pElementName )
  216. {
  217. m_pAchievementNameGlow = new vgui::Label( this, "AchievementNameGlow", "" );
  218. m_pAchievementName = new vgui::Label( this, "AchievementName", "" );
  219. m_pAchievementDesc = new vgui::Label( this, "AchievementDesc", "" );
  220. m_pProgressBarBackground = SETUP_PANEL( new ImagePanel( this, "ProgressBarBG" ) );
  221. m_pProgressBar = SETUP_PANEL( new ImagePanel( this, "ProgressBar" ) );
  222. m_iAchievementID = UNKNOWN_ACHIEVEMENT_ID;
  223. m_iLastPaintedAchievementID = UNKNOWN_ACHIEVEMENT_ID;
  224. m_iAccumulatedIncrement = 0;
  225. m_flShowIncrementsTime = 0;
  226. m_iLastCount = 0;
  227. m_iPadding = 1;
  228. }
  229. CAchievementTrackerItem::~CAchievementTrackerItem()
  230. {
  231. if ( m_pAchievementName )
  232. {
  233. m_pAchievementName->MarkForDeletion();
  234. m_pAchievementName = NULL;
  235. }
  236. if ( m_pAchievementNameGlow )
  237. {
  238. m_pAchievementNameGlow->MarkForDeletion();
  239. m_pAchievementNameGlow = NULL;
  240. }
  241. if ( m_pAchievementDesc )
  242. {
  243. m_pAchievementDesc->MarkForDeletion();
  244. m_pAchievementDesc = NULL;
  245. }
  246. if ( m_pProgressBarBackground )
  247. {
  248. m_pProgressBarBackground->MarkForDeletion();
  249. m_pProgressBarBackground = NULL;
  250. }
  251. if ( m_pProgressBar )
  252. {
  253. m_pProgressBar->MarkForDeletion();
  254. m_pProgressBar = NULL;
  255. }
  256. }
  257. //-----------------------------------------------------------------------------
  258. // Purpose:
  259. //-----------------------------------------------------------------------------
  260. void CAchievementTrackerItem::ApplySchemeSettings( IScheme *pScheme )
  261. {
  262. BaseClass::ApplySchemeSettings( pScheme );
  263. LoadControlSettings( "resource/UI/HudAchievementTrackerItem.res" );
  264. m_pAchievementDesc->SetVisible( hud_achievement_description.GetBool() );
  265. m_iLastPaintedAchievementID = UNKNOWN_ACHIEVEMENT_ID;
  266. }
  267. //-----------------------------------------------------------------------------
  268. // Purpose:
  269. //-----------------------------------------------------------------------------
  270. void CAchievementTrackerItem::PerformLayout()
  271. {
  272. BaseClass::PerformLayout();
  273. int x, y, w, t;
  274. //=============================================================================
  275. // HPE_BEGIN
  276. // [dwenger] Necessary for HUD Achievement display
  277. //=============================================================================
  278. m_pAchievementName->GetContentSize( w, t ); // needed in order to load up font for the name
  279. m_pAchievementNameGlow->GetContentSize( w, t ); // needed in order to load up font for the glow
  280. //=============================================================================
  281. // HPE_END
  282. //=============================================================================
  283. if ( hud_achievement_description.GetBool() )
  284. {
  285. m_pAchievementDesc->GetContentSize( w, t );
  286. m_pAchievementDesc->SetTall( t );
  287. m_pAchievementDesc->GetBounds( x, y, w, t );
  288. }
  289. else
  290. {
  291. m_pAchievementName->GetBounds( x, y, w, t );
  292. }
  293. if ( m_pProgressBarBackground->IsVisible() )
  294. {
  295. // put progress bar after description
  296. int bx, by;
  297. m_pProgressBarBackground->GetPos( bx, by );
  298. m_pProgressBarBackground->SetPos( bx, y + t + m_iPadding );
  299. SetTall( y + t + m_pProgressBarBackground->GetTall() + m_iPadding * 2 );
  300. }
  301. else
  302. {
  303. SetTall( y + t + m_iPadding );
  304. }
  305. m_iLastProgressBarCount = m_iLastProgressBarGoal = PROGRESS_BAR_NEEDS_UPDATE;
  306. }
  307. //-----------------------------------------------------------------------------
  308. // Purpose:
  309. //-----------------------------------------------------------------------------
  310. void CAchievementTrackerItem::SetAchievement( IAchievement* pAchievement )
  311. {
  312. if ( !pAchievement )
  313. {
  314. m_iAchievementID = UNKNOWN_ACHIEVEMENT_ID;
  315. m_iLastCount = 0;
  316. return;
  317. }
  318. if ( m_iAchievementID != pAchievement->GetAchievementID() )
  319. {
  320. m_iAchievementID = pAchievement->GetAchievementID();
  321. m_iLastCount = pAchievement->GetCount();
  322. UpdateAchievementDisplay();
  323. }
  324. }
  325. void CAchievementTrackerItem::OnThink()
  326. {
  327. UpdateAchievementDisplay();
  328. }
  329. //-----------------------------------------------------------------------------
  330. // Purpose: Make sure our labels and progress bar are up to date
  331. //-----------------------------------------------------------------------------
  332. void CAchievementTrackerItem::UpdateAchievementDisplay()
  333. {
  334. IAchievementMgr *pAchievementMgr = engine->GetAchievementMgr();
  335. if ( !pAchievementMgr )
  336. return;
  337. CBaseAchievement* pAchievement = pAchievementMgr->GetAchievementByID( m_iAchievementID );
  338. if ( !pAchievement )
  339. return;
  340. if ( m_iAchievementID != m_iLastPaintedAchievementID )
  341. {
  342. // need to update labels
  343. //=============================================================================
  344. // HPE_BEGIN
  345. // [dwenger] Necessary for HUD Achievement display
  346. //=============================================================================
  347. m_pAchievementName->SetText( ACHIEVEMENT_LOCALIZED_NAME( pAchievement ) );
  348. m_pAchievementNameGlow->SetText( ACHIEVEMENT_LOCALIZED_NAME( pAchievement ) );
  349. m_pAchievementDesc->SetText( ACHIEVEMENT_LOCALIZED_DESC( pAchievement ) );
  350. //=============================================================================
  351. // HPE_END
  352. //=============================================================================
  353. m_pProgressBarBackground->SetVisible( pAchievement->GetGoal() > 1 );
  354. m_pProgressBar->SetVisible( pAchievement->GetGoal() > 1 );
  355. m_iLastPaintedAchievementID = m_iAchievementID;
  356. m_flGlow = 0.0f;
  357. m_flGlowTime = 0.0f;
  358. m_iAccumulatedIncrement = 0;
  359. //InvalidateLayout( true );
  360. GetParent()->InvalidateLayout( true );
  361. }
  362. if ( m_iAccumulatedIncrement > 0 && gpGlobals->curtime > m_flShowIncrementsTime )
  363. {
  364. ShowAccumulatedIncrements();
  365. }
  366. if ( pAchievement->GetCount() != m_iLastProgressBarCount || pAchievement->GetGoal() != m_iLastProgressBarGoal )
  367. {
  368. // need to update progress bar
  369. float flProgress = float ( pAchievement->GetCount() ) / float( pAchievement->GetGoal() );
  370. int x, y, w, t;
  371. m_pProgressBarBackground->GetBounds( x, y, w, t );
  372. m_pProgressBar->SetBounds( x, y, w * flProgress, t );
  373. m_iLastProgressBarCount = pAchievement->GetCount();
  374. m_iLastProgressBarGoal = pAchievement->GetGoal();
  375. AchievementIncremented( pAchievement->GetCount() );
  376. }
  377. if ( gpGlobals->curtime < m_flGlowTime )
  378. {
  379. m_flGlow = MIN( 1.0f, m_flGlow + gpGlobals->frametime * 5.0f );
  380. }
  381. else
  382. {
  383. m_flGlow = MAX( 0.0f, m_flGlow - gpGlobals->frametime * 5.0f );
  384. }
  385. m_pAchievementNameGlow->SetAlpha( m_flGlow * 255.0f );
  386. }
  387. //-----------------------------------------------------------------------------
  388. // Purpose: Achievement count has gone up, make it flash
  389. //-----------------------------------------------------------------------------
  390. void CAchievementTrackerItem::AchievementIncremented( int iNewCount )
  391. {
  392. int iIncrement = iNewCount - m_iLastCount;
  393. m_iLastCount = iNewCount;
  394. if ( iIncrement <= 0 )
  395. return;
  396. if ( m_iLastProgressBarGoal > 1500 )
  397. {
  398. // for achievements with very high counts, accumulate increments so we don't have too many +1s on screen
  399. // also don't play sounds as these achievements tend to increment constantly
  400. if ( m_flShowIncrementsTime < gpGlobals->curtime )
  401. {
  402. m_flShowIncrementsTime = gpGlobals->curtime + 2.0f;
  403. }
  404. m_iAccumulatedIncrement += iIncrement;
  405. }
  406. else
  407. {
  408. m_flGlowTime = gpGlobals->curtime + hud_achievement_glowtime.GetFloat();
  409. // create a floating +X to scroll up alongside this achievement
  410. if ( m_pProgressBarBackground->IsVisible() )
  411. {
  412. int px, py;
  413. GetPos( px, py );
  414. int x, y, w, t;
  415. m_pProgressBarBackground->GetBounds( x, y, w, t );
  416. x += w;
  417. new CFloatingAchievementNumber( iIncrement, px + x, py + y + ( t * 0.5f ), FN_DIR_RIGHT, GetParent() );
  418. }
  419. CLocalPlayerFilter filter;
  420. C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "Hud.AchievementIncremented" );
  421. }
  422. }
  423. //-----------------------------------------------------------------------------
  424. // Purpose: Show all the increments we've accumulated
  425. //-----------------------------------------------------------------------------
  426. void CAchievementTrackerItem::ShowAccumulatedIncrements()
  427. {
  428. int px, py;
  429. GetPos( px, py );
  430. int x, y, w, t;
  431. m_pProgressBarBackground->GetBounds( x, y, w, t );
  432. x += w;
  433. new CFloatingAchievementNumber( m_iAccumulatedIncrement, px + x, py + y + ( t * 0.5f ), FN_DIR_RIGHT, GetParent() );
  434. m_iAccumulatedIncrement = 0;
  435. m_flGlowTime = gpGlobals->curtime + hud_achievement_glowtime.GetFloat();
  436. }
  437. //-----------------------------------------------------------------------------
  438. // Purpose: Floating numbers showing how much achievement progress bars have gone up
  439. //-----------------------------------------------------------------------------
  440. CFloatingAchievementNumber::CFloatingAchievementNumber( int iProgress, int x, int y, floating_number_directions iDir, vgui::Panel* pParent )
  441. : BaseClass( pParent, "FloatingAchievementNumber" )
  442. {
  443. m_iStartX = x;
  444. m_iStartY = y;
  445. m_iProgress = iProgress;
  446. m_fStartTime = gpGlobals->curtime;
  447. m_iDirection = iDir;
  448. char szLabel[64];
  449. Q_snprintf( szLabel, sizeof( szLabel ), "+%d", iProgress );
  450. m_pNumberLabel = new vgui::Label( this, "FloatingNumberLabel", szLabel );
  451. }
  452. CFloatingAchievementNumber::~CFloatingAchievementNumber()
  453. {
  454. if ( m_pNumberLabel )
  455. {
  456. m_pNumberLabel->MarkForDeletion();
  457. m_pNumberLabel = NULL;
  458. }
  459. }
  460. void CFloatingAchievementNumber::ApplySchemeSettings( vgui::IScheme *scheme )
  461. {
  462. BaseClass::ApplySchemeSettings( scheme );
  463. LoadControlSettings( "resource/UI/HudAchievementFloatingNumber.res" );
  464. int fontHeight = surface()->GetFontTall( m_pNumberLabel->GetFont() );
  465. SetPos( m_iStartX, m_iStartY - ( fontHeight * 0.5f ) );
  466. m_pNumberLabel->SetAlpha( 0 );
  467. GetAnimationController()->RunAnimationCommand( m_pNumberLabel, "alpha", 255, 0, 0.3, vgui::AnimationController::INTERPOLATOR_LINEAR );
  468. switch ( m_iDirection )
  469. {
  470. default:
  471. case FN_DIR_UP:
  472. vgui::GetAnimationController()->RunAnimationCommand( this, "ypos", m_iStartY - m_iScrollDistance, 0, 2.0f, vgui::AnimationController::INTERPOLATOR_LINEAR );
  473. break;
  474. case FN_DIR_DOWN:
  475. vgui::GetAnimationController()->RunAnimationCommand( this, "ypos", m_iStartY + m_iScrollDistance, 0, 2.0f, vgui::AnimationController::INTERPOLATOR_LINEAR );
  476. break;
  477. case FN_DIR_LEFT:
  478. vgui::GetAnimationController()->RunAnimationCommand( this, "xpos", m_iStartX - m_iScrollDistance, 0, 2.0f, vgui::AnimationController::INTERPOLATOR_LINEAR );
  479. break;
  480. case FN_DIR_RIGHT:
  481. vgui::GetAnimationController()->RunAnimationCommand( this, "xpos", m_iStartX + m_iScrollDistance, 0, 2.0f, vgui::AnimationController::INTERPOLATOR_LINEAR );
  482. break;
  483. }
  484. }
  485. //-----------------------------------------------------------------------------
  486. // Purpose: Delete panel when floating number has faded out
  487. //-----------------------------------------------------------------------------
  488. void CFloatingAchievementNumber::OnThink()
  489. {
  490. if ( gpGlobals->curtime > m_fStartTime + 1.0f )
  491. {
  492. if ( m_pNumberLabel->GetAlpha() >= 255 )
  493. {
  494. m_pNumberLabel->SetAlpha( 254 );
  495. GetAnimationController()->RunAnimationCommand( m_pNumberLabel, "alpha", 0, 0.0, 1.0f, vgui::AnimationController::INTERPOLATOR_LINEAR );
  496. }
  497. else if ( m_pNumberLabel->GetAlpha() <= 0 )
  498. {
  499. MarkForDeletion();
  500. SetVisible( false );
  501. }
  502. }
  503. }
  504. //-----------------------------------------------------------------------------
  505. // Purpose: Debug command to make one of the achievement panels flash as though it just went up
  506. //-----------------------------------------------------------------------------
  507. class CHudAchievementTracker;
  508. void cc_TrackerAnim_f( const CCommand &args )
  509. {
  510. CHudBaseAchievementTracker *pTracker = ( CHudBaseAchievementTracker * )GET_HUDELEMENT( CHudAchievementTracker );
  511. if ( !pTracker )
  512. return;
  513. CAchievementTrackerItem *pItem = pTracker->GetAchievementPanel( atoi(args[1]) );
  514. if ( !pItem )
  515. return;
  516. pItem->AchievementIncremented( pItem->GetLastCount() + RandomInt(1, 1) );
  517. }
  518. ConCommand cc_TrackerAnim( "TrackerAnim", cc_TrackerAnim_f, "Test animation of the achievement tracker. Parameter is achievement number on HUD to flash", FCVAR_NONE );