Advertisement
Guest User

_persistance - Notesblok

a guest
Nov 19th, 2011
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.68 KB | None | 0 0
  1. #include maps\mp\_utility;
  2.  
  3. init()
  4. {
  5. level.persistentDataInfo = [];
  6.  
  7. maps\mp\gametypes\_class::init();
  8. maps\mp\gametypes\_rank::init();
  9. maps\mp\gametypes\_missions::init();
  10. maps\mp\gametypes\_playercards::init();
  11.  
  12. level thread updateBufferedStats();
  13.  
  14. level thread uploadGlobalStatCounters();
  15. }
  16.  
  17.  
  18. initBufferedStats()
  19. {
  20. println( "Init Buffered Stats for " + self.name );
  21.  
  22. self.bufferedStats = [];
  23. self.bufferedStats[ "totalShots" ] = self getPlayerData( "totalShots" );
  24. self.bufferedStats[ "accuracy" ] = self getPlayerData( "accuracy" );
  25. self.bufferedStats[ "misses" ] = self getPlayerData( "misses" );
  26. self.bufferedStats[ "hits" ] = self getPlayerData( "hits" );
  27. self.bufferedStats[ "timePlayedAllies" ] = self getPlayerData( "timePlayedAllies" );
  28. self.bufferedStats[ "timePlayedOpfor" ] = self getPlayerData( "timePlayedOpfor" );
  29. self.bufferedStats[ "timePlayedOther" ] = self getPlayerData( "timePlayedOther" );
  30. self.bufferedStats[ "timePlayedTotal" ] = self getPlayerData( "timePlayedTotal" );
  31.  
  32. println( "timePlayedAllies " + self.bufferedStats[ "timePlayedAllies" ] );
  33. println( "timePlayedOpfor " + self.bufferedStats[ "timePlayedOpfor" ] );
  34. println( "timePlayedOther " + self.bufferedStats[ "timePlayedOther" ] );
  35. println( "timePlayedTotal " + self.bufferedStats[ "timePlayedTotal" ] );
  36.  
  37. self.bufferedChildStats = [];
  38. self.bufferedChildStats[ "round" ] = [];
  39. self.bufferedChildStats[ "round" ][ "timePlayed" ] = self getPlayerData( "round", "timePlayed" );
  40.  
  41. self.bufferedChildStats[ "xpMultiplierTimePlayed" ] = [];
  42. self.bufferedChildStats[ "xpMultiplierTimePlayed" ][ 0 ] = self getPlayerData( "xpMultiplierTimePlayed", 0 );
  43. self.bufferedChildStats[ "xpMultiplierTimePlayed" ][ 1 ] = self getPlayerData( "xpMultiplierTimePlayed", 1 );
  44. self.bufferedChildStats[ "xpMultiplierTimePlayed" ][ 2 ] = self getPlayerData( "xpMultiplierTimePlayed", 2 );
  45.  
  46. self.bufferedChildStatsMax[ "xpMaxMultiplierTimePlayed" ] = [];
  47. self.bufferedChildStatsMax[ "xpMaxMultiplierTimePlayed" ][ 0 ] = self getPlayerData( "xpMaxMultiplierTimePlayed", 0 );
  48. self.bufferedChildStatsMax[ "xpMaxMultiplierTimePlayed" ][ 1 ] = self getPlayerData( "xpMaxMultiplierTimePlayed", 1 );
  49. self.bufferedChildStatsMax[ "xpMaxMultiplierTimePlayed" ][ 2 ] = self getPlayerData( "xpMaxMultiplierTimePlayed", 2 );
  50.  
  51. self.bufferedChildStats[ "challengeXPMultiplierTimePlayed" ] = [];
  52. self.bufferedChildStats[ "challengeXPMultiplierTimePlayed" ][ 0 ] = self getPlayerData( "challengeXPMultiplierTimePlayed", 0 );
  53.  
  54. self.bufferedChildStatsMax[ "challengeXPMaxMultiplierTimePlayed" ] = [];
  55. self.bufferedChildStatsMax[ "challengeXPMaxMultiplierTimePlayed" ][ 0 ] = self getPlayerData( "challengeXPMaxMultiplierTimePlayed", 0 );
  56.  
  57. self.bufferedChildStats[ "weaponXPMultiplierTimePlayed" ] = [];
  58. self.bufferedChildStats[ "weaponXPMultiplierTimePlayed" ][ 0 ] = self getPlayerData( "weaponXPMultiplierTimePlayed", 0 );
  59.  
  60. self.bufferedChildStatsMax[ "weaponXPMaxMultiplierTimePlayed" ] = [];
  61. self.bufferedChildStatsMax[ "weaponXPMaxMultiplierTimePlayed" ][ 0 ] = self getPlayerData( "weaponXPMaxMultiplierTimePlayed", 0 );
  62.  
  63. //IW5 prestige reward double XP
  64. self.bufferedStats["prestigeDoubleXp"] = self getPlayerData( "prestigeDoubleXp" );
  65. self.bufferedStats["prestigeDoubleXpTimePlayed"] = self getPlayerData( "prestigeDoubleXpTimePlayed" );
  66. self.bufferedStatsMax["prestigeDoubleXpMaxTimePlayed"] = self getPlayerData( "prestigeDoubleXpMaxTimePlayed" );
  67.  
  68. //IW5 prestige reward double Weapon XP
  69. self.bufferedStats["prestigeDoubleWeaponXp"] = self getPlayerData( "prestigeDoubleWeaponXp" );
  70. self.bufferedStats["prestigeDoubleWeaponXpTimePlayed"] = self getPlayerData( "prestigeDoubleWeaponXpTimePlayed" );
  71. self.bufferedStatsMax["prestigeDoubleWeaponXpMaxTimePlayed"] = self getPlayerData( "prestigeDoubleWeaponXpMaxTimePlayed" );
  72.  
  73. }
  74.  
  75.  
  76. // ==========================================
  77. // Script persistent data functions
  78. // These are made for convenience, so persistent data can be tracked by strings.
  79. // They make use of code functions which are prototyped below.
  80.  
  81. /*
  82. =============
  83. statGet
  84.  
  85. Returns the value of the named stat
  86. =============
  87. */
  88. statGet( dataName )
  89. {
  90. assert( !isDefined( self.bufferedStats[ dataName ] ) ); // should use statGetBuffered consistently with statSetBuffered
  91. return self GetPlayerData( dataName );
  92. }
  93.  
  94. /*
  95. =============
  96. statSet
  97.  
  98. Sets the value of the named stat
  99. =============
  100. */
  101. statSet( dataName, value )
  102. {
  103. assert( !isDefined( self.bufferedStats[ dataName ] ) ); // should use statGetBuffered consistently with statSetBuffered
  104.  
  105. if ( !self rankingEnabled() )
  106. return;
  107.  
  108. self SetPlayerData( dataName, value );
  109. }
  110.  
  111. /*
  112. =============
  113. statAdd
  114.  
  115. Adds the passed value to the value of the named stat
  116. =============
  117. */
  118. statAdd( dataName, value, optionalArrayInd )
  119. {
  120. assert( !isDefined( self.bufferedStats[ dataName ] ) ); // should use statGetBuffered consistently with statSetBuffered
  121.  
  122. if ( !self rankingEnabled() )
  123. return;
  124.  
  125. if ( isDefined( optionalArrayInd ) )
  126. {
  127. curValue = self GetPlayerData( dataName, optionalArrayInd );
  128. self SetPlayerData( dataName, optionalArrayInd, value + curValue );
  129. }
  130. else
  131. {
  132. curValue = self GetPlayerData( dataName );
  133. self SetPlayerData( dataName, value + curValue );
  134. }
  135. }
  136.  
  137.  
  138. statGetChild( parent, child )
  139. {
  140. return self GetPlayerData( parent, child );
  141. }
  142.  
  143.  
  144. statSetChild( parent, child, value )
  145. {
  146. if ( !self rankingEnabled() )
  147. return;
  148.  
  149. self SetPlayerData( parent, child, value );
  150. }
  151.  
  152.  
  153. statAddChild( parent, child, value )
  154. {
  155. assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) );
  156.  
  157. if ( !self rankingEnabled() )
  158. return;
  159.  
  160. curValue = self GetPlayerData( parent, child );
  161. self SetPlayerData( parent, child, curValue + value );
  162. }
  163.  
  164.  
  165. statGetChildBuffered( parent, child )
  166. {
  167. assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) );
  168.  
  169. return self.bufferedChildStats[ parent ][ child ];
  170. }
  171.  
  172.  
  173. statSetChildBuffered( parent, child, value )
  174. {
  175. assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) );
  176.  
  177. if ( !self rankingEnabled() )
  178. return;
  179.  
  180. self.bufferedChildStats[ parent ][ child ] = value;
  181. }
  182.  
  183.  
  184. statAddChildBuffered( parent, child, value )
  185. {
  186. assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) );
  187.  
  188. if ( !self rankingEnabled() )
  189. return;
  190.  
  191. curValue = statGetChildBuffered( parent, child );
  192. statSetChildBuffered( parent, child, curValue + value );
  193. }
  194.  
  195.  
  196. statAddBufferedWithMax( stat, value, max )
  197. {
  198. assert( isDefined( self.bufferedStats[ stat ] ) );
  199.  
  200. if ( !self rankingEnabled() )
  201. return;
  202.  
  203. newValue = statGetBuffered( stat ) + value;
  204.  
  205. if ( newValue > max )
  206. newValue = max;
  207.  
  208. if ( newValue < statGetBuffered( stat ) ) // has wrapped so keep at the max
  209. newValue = max;
  210.  
  211. statSetBuffered( stat, newValue );
  212. }
  213.  
  214.  
  215. statAddChildBufferedWithMax( parent, child, value, max )
  216. {
  217. assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) );
  218.  
  219. if ( !self rankingEnabled() )
  220. return;
  221.  
  222. newValue = statGetChildBuffered( parent, child ) + value;
  223.  
  224. if ( newValue > max )
  225. newValue = max;
  226.  
  227. if ( newValue < statGetChildBuffered( parent, child ) ) // has wrapped so keep at the max
  228. newValue = max;
  229.  
  230. statSetChildBuffered( parent, child, newValue );
  231. }
  232.  
  233.  
  234. /*
  235. =============
  236. statGetBuffered
  237.  
  238. Returns the value of the named stat
  239. =============
  240. */
  241. statGetBuffered( dataName )
  242. {
  243. assert( isDefined( self.bufferedStats[ dataName ] ) );
  244.  
  245. return self.bufferedStats[ dataName ];
  246. }
  247.  
  248. /*
  249. =============
  250. statSet
  251.  
  252. Sets the value of the named stat
  253. =============
  254. */
  255. statSetBuffered( dataName, value )
  256. {
  257. assert( isDefined( self.bufferedStats[ dataName ] ) );
  258.  
  259. if ( !self rankingEnabled() )
  260. return;
  261.  
  262. self.bufferedStats[ dataName ] = value;
  263. }
  264.  
  265. /*
  266. =============
  267. statAdd
  268.  
  269. Adds the passed value to the value of the named stat
  270. =============
  271. */
  272. statAddBuffered( dataName, value )
  273. {
  274. assert( isDefined( self.bufferedStats[ dataName ] ) );
  275. assert( value >= 0 );
  276.  
  277. if ( !self rankingEnabled() )
  278. return;
  279.  
  280. curValue = statGetBuffered( dataName );
  281. statSetBuffered( dataName, curValue + value );
  282. }
  283.  
  284.  
  285. updateBufferedStats()
  286. {
  287. // give the first player time to connect
  288. wait ( 0.15 );
  289.  
  290. nextToUpdate = 0;
  291. while ( !level.gameEnded )
  292. {
  293. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  294.  
  295. nextToUpdate++;
  296. if ( nextToUpdate >= level.players.size )
  297. nextToUpdate = 0;
  298.  
  299. if ( isDefined( level.players[nextToUpdate] ) )
  300. {
  301. level.players[nextToUpdate] writeBufferedStats();
  302. level.players[nextToUpdate] updateWeaponBufferedStats();
  303. }
  304.  
  305. wait ( 2.0 );
  306. }
  307.  
  308. foreach ( player in level.players )
  309. {
  310. player writeBufferedStats();
  311. player updateWeaponBufferedStats();
  312. }
  313.  
  314. }
  315.  
  316.  
  317. writeBufferedStats()
  318. {
  319. foreach ( statName, statVal in self.bufferedStats )
  320. {
  321. self setPlayerData( statName, statVal );
  322. }
  323.  
  324. foreach ( statName, statVal in self.bufferedChildStats )
  325. {
  326. foreach ( childStatName, childStatVal in statVal )
  327. self setPlayerData( statName, childStatName, childStatVal );
  328. }
  329. }
  330.  
  331. incrementWeaponStat( weaponName, stat, incValue )
  332. {
  333. if( isKillstreakWeapon( weaponName ) )
  334. return;
  335.  
  336. if ( self rankingEnabled() )
  337. {
  338. oldval = self getPlayerData( "weaponStats", weaponName, stat );
  339. self setPlayerData( "weaponStats", weaponName, stat, oldval+incValue );
  340. }
  341. }
  342.  
  343. incrementAttachmentStat( attachmentName, stat, incValue )
  344. {
  345. if ( self rankingEnabled() )
  346. {
  347. oldval = self getPlayerData( "attachmentsStats", attachmentName, stat );
  348. self setPlayerData( "attachmentsStats", attachmentName, stat, oldval+incValue );
  349. }
  350. }
  351.  
  352.  
  353. updateWeaponBufferedStats()
  354. {
  355. if( !isdefined( self.trackingWeaponName ) )
  356. return;
  357.  
  358. if( self.trackingWeaponName == "" || self.trackingWeaponName == "none" )
  359. return;
  360.  
  361. tmp = self.trackingWeaponName;
  362.  
  363. //if( isSubStr( self.trackingWeaponName, "iw5_" ) )
  364. //tmp = GetSubStr( self.trackingWeaponName, 4, self.trackingWeaponName.size );
  365.  
  366. // check for killstreak and environment before we start tokenizing the weapon name
  367. if( isKillstreakWeapon( tmp ) || isEnvironmentWeapon( tmp ) )
  368. return;
  369.  
  370. /*stripping out akimbo and adding it in as it were an attachment for tracking
  371. if ( isSubStr( tmp, "akimbo" ) )
  372. {
  373. tmp = fixAkimboString( tmp );
  374. }
  375. */
  376.  
  377. tokens = strTok( tmp, "_" );
  378.  
  379. //updating for IW5 weapons
  380. if ( tokens[0] == "iw5" )
  381. tokens[0] = tokens[0] + "_" + tokens[1];
  382.  
  383. if ( tokens[0] == "alt" )
  384. {
  385. foreach( token in tokens )
  386. {
  387. if ( token == "gl" || token == "gp25" || token == "m320" )
  388. {
  389. tokens[0] = "gl";
  390. break;
  391. }
  392. if ( token == "shotgun" )
  393. {
  394. tokens[0] = "shotgun";
  395. break;
  396. }
  397. }
  398.  
  399. //For Hybrid Scopes
  400. if ( tokens[0] == "alt" )
  401. {
  402. tokens[0] = tokens[1] + "_" + tokens[2];
  403. }
  404.  
  405. }
  406.  
  407. //when you hit someone or kill someone with the gl it will come in as the first token
  408. if( tokens[0] == "gl" || tokens[0] == "shotgun" )
  409. {
  410. //println(" player is " + self.name);
  411. //println( "weapon is " + tokens[0]);
  412. if( self.trackingWeaponShots > 0 )
  413. {
  414. self incrementAttachmentStat( tokens[0], "shots", self.trackingWeaponShots );
  415. self maps\mp\_matchdata::logAttachmentStat( tokens[0], "shots", self.trackingWeaponShots);
  416. //println("wrote shots");
  417. }
  418.  
  419. if( self.trackingWeaponKills > 0 )
  420. {
  421. self incrementAttachmentStat( tokens[0], "kills", self.trackingWeaponKills );
  422. self maps\mp\_matchdata::logAttachmentStat( tokens[0], "kills", self.trackingWeaponKills);
  423. //println("wrote kills");
  424. }
  425.  
  426. if( self.trackingWeaponHits > 0 )
  427. {
  428. self incrementAttachmentStat( tokens[0], "hits", self.trackingWeaponHits );
  429. self maps\mp\_matchdata::logAttachmentStat( tokens[0], "hits", self.trackingWeaponHits);
  430. //println("wrote hits");
  431. }
  432.  
  433. if( self.trackingWeaponHeadShots > 0 )
  434. {
  435. self incrementAttachmentStat( tokens[0], "headShots", self.trackingWeaponHeadShots );
  436. self maps\mp\_matchdata::logAttachmentStat( tokens[0], "headShots", self.trackingWeaponHeadShots);
  437. //println("wrote headshots");
  438. }
  439.  
  440. if( self.trackingWeaponDeaths > 0 )
  441. {
  442. self incrementAttachmentStat( tokens[0], "deaths", self.trackingWeaponDeaths );
  443. self maps\mp\_matchdata::logAttachmentStat( tokens[0], "deaths", self.trackingWeaponDeaths);
  444. //println("wrote deaths");
  445. }
  446.  
  447. self.trackingWeaponName = "none";
  448. self.trackingWeaponShots = 0;
  449. self.trackingWeaponKills = 0;
  450. self.trackingWeaponHits = 0;
  451. self.trackingWeaponHeadShots = 0;
  452. self.trackingWeaponDeaths = 0;
  453. return;
  454. }
  455.  
  456. if ( !isCACPrimaryWeapon( tokens[0] ) && !isCACSecondaryWeapon( tokens[0] ) )
  457. return;
  458.  
  459. //log the weapon
  460. //println(" player is " + self.name);
  461. //println( "weapon is " + tokens[0]);
  462. if( self.trackingWeaponShots > 0 )
  463. {
  464. self incrementWeaponStat( tokens[0], "shots", self.trackingWeaponShots );
  465. self maps\mp\_matchdata::logWeaponStat( tokens[0], "shots", self.trackingWeaponShots);
  466. //println("wrote shots");
  467. }
  468.  
  469. if( self.trackingWeaponKills > 0 )
  470. {
  471. self incrementWeaponStat( tokens[0], "kills", self.trackingWeaponKills );
  472. self maps\mp\_matchdata::logWeaponStat( tokens[0], "kills", self.trackingWeaponKills);
  473. //println("wrote kills");
  474. }
  475.  
  476. if( self.trackingWeaponHits > 0 )
  477. {
  478. self incrementWeaponStat( tokens[0], "hits", self.trackingWeaponHits );
  479. self maps\mp\_matchdata::logWeaponStat( tokens[0], "hits", self.trackingWeaponHits);
  480. //println("wrote hits");
  481. }
  482.  
  483. if( self.trackingWeaponHeadShots > 0 )
  484. {
  485. self incrementWeaponStat( tokens[0], "headShots", self.trackingWeaponHeadShots );
  486. self maps\mp\_matchdata::logWeaponStat( tokens[0], "headShots", self.trackingWeaponHeadShots);
  487. //println("wrote headshots");
  488. }
  489.  
  490. if( self.trackingWeaponDeaths > 0 )
  491. {
  492. self incrementWeaponStat( tokens[0], "deaths", self.trackingWeaponDeaths );
  493. self maps\mp\_matchdata::logWeaponStat( tokens[0], "deaths", self.trackingWeaponDeaths);
  494. //println("wrote deaths");
  495. }
  496.  
  497. //retokenize for attachments.
  498. tokens = strTok( tmp, "_" );
  499.  
  500. //log the attachments
  501. if( tokens[0] != "none" )
  502. {
  503. for( i = 0; i < tokens.size; i++ )
  504. {
  505. if( tokens[i] == "mp" || tokens[i] == "scope1" || tokens[i] == "scope2" || tokens[i] == "scope3" || tokens[i] == "scope4" || tokens[i] == "scope5" || tokens[i] == "scope6" || tokens[i] == "scope7" || tokens[i] == "scope8" || tokens[i] == "scope9" || tokens[i] == "scope10" )
  506. continue;
  507.  
  508. if ( isSubStr( tokens[i], "camo" ) )
  509. continue;
  510.  
  511. //handles iw5 scoped weapons
  512. if( isSubStr( tokens[i], "scope" ) && !isSubStr( tokens[i], "vz" ) )
  513. continue;
  514.  
  515. //iw5 token magic
  516. if(tokens[i] == "alt" )
  517. {
  518. i += 2;
  519. continue;
  520. }
  521.  
  522. //iw5 token magic
  523. if(tokens[i] == "iw5" )
  524. {
  525. i += 1;
  526. continue;
  527. }
  528.  
  529. //turns alternate silencers and gls into correct stat track
  530. tokens[i] = validateAttachment( tokens[i] );
  531. if( tokens[i] == "gl" || tokens[i] == "shotgun" )
  532. continue;
  533.  
  534. if ( isSubStr( tokens[i], "scope" ) && isSubStr( tokens[i], "vz" ) )
  535. tokens[i] = "vzscope";
  536.  
  537. //IW4 weapon check
  538. if ( i == 0 && ( tokens[i] != "iw5" && tokens[i] != "alt" ) )
  539. continue;
  540.  
  541. //println( "weapon is " + tokens[i]);
  542. if( self.trackingWeaponShots > 0 )
  543. {
  544. self incrementAttachmentStat( tokens[i], "shots", self.trackingWeaponShots );
  545. self maps\mp\_matchdata::logAttachmentStat( tokens[i], "shots", self.trackingWeaponShots);
  546. //println("wrote shots");
  547. }
  548.  
  549. if( self.trackingWeaponKills > 0 )
  550. {
  551. self incrementAttachmentStat( tokens[i], "kills", self.trackingWeaponKills );
  552. self maps\mp\_matchdata::logAttachmentStat( tokens[i], "kills", self.trackingWeaponKills);
  553. //println("wrote kills");
  554. }
  555.  
  556. if( self.trackingWeaponHits > 0 )
  557. {
  558. self incrementAttachmentStat( tokens[i], "hits", self.trackingWeaponHits );
  559. self maps\mp\_matchdata::logAttachmentStat( tokens[i], "hits", self.trackingWeaponHits);
  560. //println("wrote hits");
  561. }
  562.  
  563. if( self.trackingWeaponHeadShots > 0 )
  564. {
  565. self incrementAttachmentStat( tokens[i], "headShots", self.trackingWeaponHeadShots );
  566. self maps\mp\_matchdata::logAttachmentStat( tokens[i], "headShots", self.trackingWeaponHeadShots);
  567. //println("wrote headshots");
  568. }
  569.  
  570. if( self.trackingWeaponDeaths > 0 )
  571. {
  572. self incrementAttachmentStat( tokens[i], "deaths", self.trackingWeaponDeaths );
  573. self maps\mp\_matchdata::logAttachmentStat( tokens[i], "deaths", self.trackingWeaponDeaths);
  574. //println("wrote deaths");
  575. }
  576.  
  577. }
  578. }
  579.  
  580. self.trackingWeaponName = "none";
  581. self.trackingWeaponShots = 0;
  582. self.trackingWeaponKills = 0;
  583. self.trackingWeaponHits = 0;
  584. self.trackingWeaponHeadShots = 0;
  585. self.trackingWeaponDeaths = 0;
  586. }
  587.  
  588.  
  589. uploadGlobalStatCounters()
  590. {
  591. level waittill( "game_ended" );
  592.  
  593. if( !matchMakingGame() )
  594. return;
  595.  
  596. totalKills = 0;
  597. totalDeaths = 0;
  598. totalAssists = 0;
  599. totalHeadshots = 0;
  600. totalSuicides = 0;
  601. totalTimePlayed = 0;
  602.  
  603. foreach ( player in level.players )
  604. {
  605. totalTimePlayed += player.timePlayed["total"];
  606. }
  607.  
  608. incrementCounter( "global_minutes", int( totalTimePlayed / 60 ) );
  609.  
  610. if ( !wasLastRound() )
  611. return;
  612.  
  613. wait( 0.05 );
  614.  
  615. foreach ( player in level.players )
  616. {
  617. totalKills += player.kills;
  618. totalDeaths += player.deaths;
  619. totalAssists += player.assists;
  620. totalHeadshots += player.headshots;
  621. totalSuicides += player.suicides;
  622. }
  623.  
  624. incrementCounter( "global_kills", totalKills );
  625. incrementCounter( "global_deaths", totalDeaths );
  626. incrementCounter( "global_assists", totalAssists );
  627. incrementCounter( "global_headshots", totalHeadshots );
  628. incrementCounter( "global_suicides", totalSuicides );
  629. incrementCounter( "global_games", 1 );
  630. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement