Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.66 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4.  
  5. init()
  6. {
  7. initAwards();
  8.  
  9. level thread onPlayerConnect();
  10. level thread monitorMovementDistance();
  11. level thread monitorEnemyDistance();
  12. }
  13.  
  14. onPlayerConnect()
  15. {
  16. for(;;)
  17. {
  18. level waittill( "connected", player );
  19.  
  20. // Reset player awards to none
  21.  
  22. if ( !isDefined( player.pers["stats"] ) )
  23. player.pers["stats"] = [];
  24.  
  25. player.stats = player.pers["stats"];
  26.  
  27. if ( !player.stats.size )
  28. {
  29. player setPlayerData( "round", "awardCount", 0 );
  30.  
  31. // Initialize player stats
  32. foreach ( ref, award in level.awards )
  33. {
  34. if ( isDefined( level.awards[ ref ].defaultvalue ) )
  35. player initPlayerStat( ref, level.awards[ ref ].defaultvalue );
  36. else
  37. player initPlayerStat( ref );
  38. }
  39. }
  40.  
  41. player.prevPos = player.origin;
  42. player.previousDeaths = 0;
  43. player.altitudePolls = 0;
  44. player.totalAltitudeSum = 0;
  45. player.usedWeapons = [];
  46.  
  47. player thread onPlayerSpawned();
  48. player thread monitorPositionCamping();
  49. player thread monitorClassChange();
  50. }
  51. }
  52.  
  53. onPlayerSpawned()
  54. {
  55. self endon( "disconnect" );
  56.  
  57. for(;;)
  58. {
  59. self waittill( "spawned_player" );
  60.  
  61. self thread monitorReloads();
  62. self thread monitorShotsFired();
  63. self thread monitorSwaps();
  64. self thread monitorExplosionsSurvived();
  65. self thread monitorShieldBlocks();
  66. self thread monitorFlashHits();
  67. self thread monitorStunHits();
  68. self thread monitorStanceTime();
  69. }
  70. }
  71.  
  72. initAwards()
  73. {
  74. if ( isDefined( level.initGametypeAwards ) )
  75. [[ level.initGametypeAwards ]]();
  76.  
  77. // flags generated from other stats, these are not awards,
  78. // but are checked against for the assignment of some awards
  79. initAwardFlag( "10kills", ::isAtleast, 10, "kills" );
  80. initAwardFlag( "1death", ::isAtleast, 1, "deaths" );
  81. initAwardFlag( "nodeaths", ::isAtMost, 0, "deaths" );
  82. initAwardFlag( "nokills", ::isAtMost, 0, "kills" );
  83.  
  84. // ordered in priority assigned
  85. // TODO: should decouple dependency processing order from order assigned
  86. initMultiAward( "mvp", "kills", "deaths" );
  87. initMultiAward( "highlander", "10kills", "nodeaths" );
  88. initThresholdAward( "kdratio10", ::isAtleast, 10, "kdratio" );
  89. initMultiAward( "punisher", "kills", "killstreak" );
  90. initMultiAward( "overkill", "kills", "headshots" );
  91. initDerivedAward( "killedotherteamonelife" );
  92. initStatAward( "kdratio", 0, ::highestWins );
  93. initStatAward( "kills", 0, ::highestWins );
  94. initStatAward( "higherrankkills", 0, ::highestWins );
  95. initStatAward( "deaths", 0, ::lowestWithHalfPlayedTime );
  96. initStatAward( "killstreak", 0, ::highestWins );
  97. initStatAward( "headshots", 0, ::highestWins );
  98. initDerivedAward( "finalkill" );
  99. initDerivedAward( "killedotherteam" );
  100. initStatAward( "closertoenemies", 0, ::highestWins );
  101. initStatAward( "throwingknifekills", 0, ::highestWins );
  102. initStatAward( "grenadekills", 0, ::highestWins );
  103. initStatAward( "helicopters", 0, ::highestWins );
  104. initStatAward( "airstrikes", 0, ::highestWins );
  105. initStatAward( "uavs", 0, ::highestWins );
  106. initStatAward( "mostmultikills", 0, ::highestWins );
  107. initStatAward( "multikill", 0, ::highestWins );
  108. initStatAward( "knifekills", 0, ::highestWins );
  109. initStatAward( "flankkills", 0, ::highestWins );
  110. initStatAward( "bulletpenkills", 0, ::highestWins );
  111. initStatAward( "laststandkills", 0, ::highestWins );
  112. initStatAward( "laststanderkills", 0, ::highestWins );
  113. initStatAward( "assists", 0, ::highestWins );
  114. initStatAward( "c4kills", 0, ::highestWins );
  115. initStatAward( "claymorekills", 0, ::highestWins );
  116. initStatAward( "fragkills", 0, ::highestWins );
  117. initStatAward( "semtexkills", 0, ::highestWins );
  118. initStatAward( "explosionssurvived",0, ::highestWins );
  119. initStatAward( "mosttacprevented", 0, ::highestWins );
  120. initStatAward( "avengekills", 0, ::highestWins );
  121. initStatAward( "rescues", 0, ::highestWins );
  122. initStatAward( "longshots", 0, ::highestWins );
  123. initStatAward( "adskills", 0, ::highestWins );
  124. initStatAward( "hipfirekills", 0, ::highestWins );
  125. initStatAward( "revengekills", 0, ::highestWins );
  126. initStatAward( "longestlife", 0, ::highestWins );
  127. initStatAward( "throwbacks", 0, ::highestWins );
  128. initStatAward( "thumperkills", 0, ::highestWins );
  129. initStatAward( "otherweaponkills", 0, ::highestWins );
  130. initStatAward( "killedsameplayer", 0, ::highestWins, 2 );
  131. initStatAward( "mostweaponsused", 0, ::highestWins, 3 );
  132. initStatAward( "distancetraveled", 0, ::highestWins );
  133. initStatAward( "mostreloads", 0, ::highestWins );
  134. initStatAward( "mostswaps", 0, ::highestWins );
  135. initStat( "flankdeaths", 0 );
  136. initDerivedAward( "noflankdeaths", ::isAtMostWithHalfPlayedTime, 0, "flankdeaths" );
  137. initStatAward( "thermalkills", 0, ::highestWins );
  138. initStatAward( "mostcamperkills", 0, ::highestWins );
  139. initStatAward( "fbhits", 0, ::highestWins );
  140. initStatAward( "stunhits", 0, ::highestWins );
  141. initStatAward( "scopedkills", 0, ::highestWins );
  142. initStatAward( "arkills", 0, ::highestWins );
  143. initStatAward( "arheadshots", 0, ::highestWins );
  144. initStatAward( "lmgkills", 0, ::highestWins );
  145. initStatAward( "lmgheadshots", 0, ::highestWins );
  146. initStatAward( "sniperkills", 0, ::highestWins );
  147. initStatAward( "sniperheadshots", 0, ::highestWins );
  148. initStatAward( "shieldblocks", 0, ::highestWins );
  149. initStatAward( "shieldkills", 0, ::highestWins );
  150. initStatAward( "smgkills", 0, ::highestWins );
  151. initStatAward( "smgheadshots", 0, ::highestWins );
  152. initStatAward( "shotgunkills", 0, ::highestWins );
  153. initStatAward( "shotgunheadshots", 0, ::highestWins );
  154. initStatAward( "pistolkills", 0, ::highestWins );
  155. initStatAward( "pistolheadshots", 0, ::highestWins );
  156. initStatAward( "rocketkills", 0, ::highestWins );
  157. initStatAward( "equipmentkills", 0, ::highestWins );
  158. initStatAward( "mostclasseschanged",0, ::highestWins );
  159. initStatAward( "lowerrankkills", 0, ::highestWins );
  160. initStatAward( "sprinttime", 0, ::highestWins, 1 );
  161. initStatAward( "crouchtime", 0, ::highestWins );
  162. initStatAward( "pronetime", 0, ::highestWins );
  163. initStatAward( "comebacks", 0, ::highestWins );
  164. initStatAward( "mostshotsfired", 0, ::highestWins );
  165. initStatAward( "timeinspot", 0, ::highestWins );
  166. initStatAward( "killcamtimewatched",0, ::highestWins );
  167. initStatAward( "greatestavgalt", 0, ::highestWins );
  168. initStatAward( "leastavgalt", 9999999, ::lowestWins );
  169.  
  170. // Offline/private match only awards
  171. if ( !matchMakingGame() )
  172. {
  173. initStatAward( "killcamskipped", 0, ::highestWins );
  174. initStatAward( "killsteals", 0, ::highestWins );
  175. if ( !getGametypeNumLives() )
  176. initStatAward( "deathstreak", 0, ::highestWins );
  177. initStatAward( "shortestlife", 9999999, ::lowestWins );
  178. initStatAward( "suicides", 0, ::highestWins );
  179. initStatAward( "mostff", 0, ::highestWins );
  180. initStatAward( "shotgundeaths", 0, ::highestWins );
  181. initStatAward( "shielddeaths", 0, ::highestWins );
  182. initStatAward( "flankdeaths", 0, ::highestWins ); // sets the process property of the "stat only" init above
  183. initMultiAward( "participant", "nokills", "1death" );
  184. initMultiAward( "afk", "nokills", "nodeaths" );
  185.  
  186. // special case post process award
  187. initDerivedAward( "noawards" );
  188. }
  189. }
  190.  
  191. initBaseAward( ref )
  192. {
  193. assert( isDefined( ref ) );
  194.  
  195. level.awards[ ref ] = spawnStruct();
  196. level.awards[ ref ].winners = [];
  197. level.awards[ ref ].exclusive = true; // For now just make all awards exclusive
  198. }
  199.  
  200. initAwardProcess( ref, process, var1, var2 )
  201. {
  202. if ( isDefined( process ) )
  203. level.awards[ ref ].process = process;
  204.  
  205. if ( isDefined( var1 ) )
  206. level.awards[ ref ].var1 = var1;
  207.  
  208. if ( isDefined( var2 ) )
  209. level.awards[ ref ].var2 = var2;
  210. }
  211.  
  212. initStat( ref, defaultvalue )
  213. {
  214. initBaseAward( ref );
  215. level.awards[ ref ].defaultvalue = defaultvalue;
  216. level.awards[ ref ].type = "stat";
  217. }
  218.  
  219. initStatAward( ref, defaultvalue, process, var1, var2 )
  220. {
  221. initBaseAward( ref );
  222. initAwardProcess( ref, process, var1, var2 );
  223. level.awards[ ref ].defaultvalue = defaultvalue;
  224. level.awards[ ref ].type = "stat";
  225. }
  226.  
  227. initDerivedAward( ref, process, var1, var2 )
  228. {
  229. initBaseAward( ref );
  230. initAwardProcess( ref, process, var1, var2 );
  231. level.awards[ ref ].type = "derived";
  232. }
  233.  
  234. initAwardFlag( ref, process, var1, var2 )
  235. {
  236. initBaseAward( ref );
  237. initAwardProcess( ref, process, var1, var2 );
  238. level.awards[ ref ].type = "flag";
  239. }
  240.  
  241. initMultiAward( ref, award1_ref, award2_ref )
  242. {
  243. assert( isDefined( award1_ref ) );
  244. assert( isDefined( award2_ref ) );
  245.  
  246. initBaseAward( ref );
  247. level.awards[ ref ].award1_ref = award1_ref;
  248. level.awards[ ref ].award2_ref = award2_ref;
  249. level.awards[ ref ].type = "multi";
  250. }
  251.  
  252. initThresholdAward( ref, process, var1, var2 )
  253. {
  254. initBaseAward( ref );
  255. initAwardProcess( ref, process, var1, var2 );
  256. level.awards[ ref ].type = "threshold";
  257. }
  258.  
  259. setMatchRecordIfGreater( ref )
  260. {
  261. playerValue = self getPlayerStat( ref );
  262. playerTime = self getPlayerStatTime( ref );
  263. recordValue = getAwardRecord( ref );
  264. recordTime = getAwardRecordTime( ref );
  265.  
  266. if ( !IsDefined( recordValue ) || ( playerValue > recordValue ) )
  267. {
  268. clearAwardWinners( ref );
  269. addAwardWinner( ref, self.clientid );
  270. setAwardRecord( ref, playerValue, playerTime );
  271. }
  272. else if ( playerValue == recordValue )
  273. {
  274. if ( isAwardExclusive( ref ) )
  275. {
  276. if ( !IsDefined( recordTime ) || ( playerTime < recordTime ) )
  277. {
  278. clearAwardWinners( ref );
  279. addAwardWinner( ref, self.clientid );
  280. setAwardRecord( ref, playerValue, playerTime );
  281. }
  282. }
  283. else
  284. addAwardWinner( ref, self.clientid );
  285. }
  286. }
  287.  
  288. setMatchRecordIfLower( ref )
  289. {
  290. playerValue = self getPlayerStat( ref );
  291. playerTime = self getPlayerStatTime( ref );
  292. recordValue = getAwardRecord( ref );
  293. recordTime = getAwardRecordTime( ref );
  294.  
  295. if ( !IsDefined( recordValue ) || ( playerValue < recordValue ) )
  296. {
  297. clearAwardWinners( ref );
  298. addAwardWinner( ref, self.clientid );
  299. setAwardRecord( ref, playerValue, playerTime );
  300. }
  301. else if ( playerValue == recordValue )
  302. {
  303. if ( isAwardExclusive( ref ) )
  304. {
  305. if ( !IsDefined( recordTime ) || ( playerTime < recordTime ) )
  306. {
  307. clearAwardWinners( ref );
  308. addAwardWinner( ref, self.clientid );
  309. setAwardRecord( ref, playerValue, playerTime );
  310. }
  311. }
  312. else
  313. addAwardWinner( ref, self.clientid );
  314. }
  315. }
  316.  
  317. getDecodedRatio( value )
  318. {
  319. loVal = getRatioLoVal( value );
  320. hiVal = getRatioHiVal( value );
  321.  
  322. if ( !loVal )
  323. return ( hiVal + 0.001 ); // favor the "n:0" case
  324.  
  325. return ( hiVal / loVal );
  326. }
  327.  
  328. setPersonalBestIfGreater( ref )
  329. {
  330. recordValue = self getPlayerData( "bests", ref );
  331. playerValue = self getPlayerStat( ref );
  332.  
  333. if ( recordValue == 0 || ( playervalue > recordValue ) )
  334. {
  335. playerValue = getFormattedValue( ref, playerValue );
  336. self setPlayerData( "bests", ref, playerValue );
  337. }
  338. }
  339.  
  340. setPersonalBestIfLower( ref )
  341. {
  342. recordvalue = self getPlayerData( "bests", ref );
  343. playervalue = self getPlayerStat( ref );
  344.  
  345. if ( recordValue == 0 || ( playervalue < recordvalue ) )
  346. {
  347. playerValue = getFormattedValue( ref, playerValue );
  348. self setPlayerData( "bests", ref, playerValue );
  349. }
  350. }
  351.  
  352. incPlayerRecord( ref )
  353. {
  354. recordValue = self getPlayerData( "awards", ref );
  355. self setPlayerData( "awards", ref, recordValue + 1 );
  356.  
  357. /#
  358. if ( !isDefined( self.statprint ) )
  359. self.statprint = [];
  360.  
  361. if ( hasDisplayValue( ref ) )
  362. value = self getPlayerStat( ref );
  363. else
  364. value = true;
  365.  
  366. stat = spawnstruct();
  367. stat.ref = ref;
  368. stat.value = value;
  369.  
  370. self.statprint[ self.statprint.size ] = stat;
  371. #/
  372. }
  373.  
  374. addAwardWinner( ref, clientid )
  375. {
  376. foreach ( winner in level.awards[ ref ].winners )
  377. {
  378. if ( winner == clientid )
  379. return;
  380. }
  381.  
  382. level.awards[ ref ].winners[ level.awards[ ref ].winners.size ] = clientid;
  383. }
  384.  
  385. getAwardWinners( ref )
  386. {
  387. return level.awards[ ref ].winners;
  388. }
  389.  
  390. clearAwardWinners( ref )
  391. {
  392. level.awards[ ref ].winners = [];
  393. }
  394.  
  395. setAwardRecord( ref, value, time )
  396. {
  397. level.awards[ ref ].value = value;
  398. level.awards[ ref ].time = time;
  399. }
  400.  
  401. getAwardRecord( ref )
  402. {
  403. return level.awards[ ref ].value;
  404. }
  405.  
  406. getAwardRecordTime( ref )
  407. {
  408. return level.awards[ ref ].time;
  409. }
  410.  
  411. // does this work correctly for roundbased games?
  412. assignAwards()
  413. {
  414. println( "Awards: Assigning" );
  415.  
  416. // Special case handling of awards which get stat values updated at the end of a game
  417. foreach ( player in level.players )
  418. {
  419. kills = player getPlayerStat( "kills" );
  420. deaths = player getPlayerStat( "deaths" );
  421.  
  422. if ( deaths == 0 )
  423. deaths = 1;
  424.  
  425. player setPlayerStat( "kdratio", ( kills / deaths ) );
  426.  
  427. if ( isAlive( player ) )
  428. {
  429. timeAlive = getTime() - player.spawnTime;
  430. player setPlayerStatIfGreater( "longestlife", timeAlive );
  431. }
  432. }
  433.  
  434. // process end of match stats
  435. foreach ( ref, award in level.awards )
  436. {
  437. if ( !isDefined( level.awards[ ref ].process ) )
  438. continue;
  439.  
  440. process = level.awards[ ref ].process;
  441. var1 = level.awards[ ref ].var1;
  442. var2 = level.awards[ ref ].var2;
  443.  
  444. if ( isDefined( var1 ) && isDefined( var2 ) )
  445. [[ process ]]( ref, var1, var2 );
  446. else if ( isDefined( var1 ) )
  447. [[ process ]]( ref, var1 );
  448. else
  449. [[ process ]]( ref );
  450. }
  451.  
  452. // set multi-award winners
  453. foreach ( ref, award in level.awards )
  454. {
  455. if ( !isMultiAward( ref ) )
  456. continue;
  457.  
  458. award1_ref = level.awards[ ref ].award1_ref;
  459. award2_ref = level.awards[ ref ].award2_ref;
  460. award1_winners = getAwardWinners( award1_ref );
  461. award2_winners = getAwardWinners( award2_ref );
  462.  
  463. if ( !isDefined( award1_winners ) || !isDefined( award2_winners ) )
  464. continue;
  465.  
  466. foreach ( winner1 in award1_winners )
  467. {
  468. foreach ( winner2 in award2_winners )
  469. {
  470. if ( winner1 == winner2 )
  471. {
  472. addAwardWinner( ref, winner1 );
  473. player = playerForClientId( winner1 );
  474. stat1 = player getPlayerStat( award1_ref );
  475. stat2 = player getPlayerStat( award2_ref );
  476. player setPlayerStat( ref, encodeRatio( stat1, stat2 ) );
  477. }
  478. }
  479. }
  480. }
  481.  
  482. // assign awards
  483. foreach ( ref, award in level.awards )
  484. {
  485. if ( !isAwardFlag( ref ) )
  486. assignAward( ref );
  487. }
  488.  
  489. // assign "noawards" winners
  490. if ( !matchMakingGame() )
  491. {
  492. foreach ( player in level.players )
  493. {
  494. awardCount = player getPlayerData( "round", "awardCount" );
  495. if ( awardCount == 0 )
  496. player giveAward( "noawards" );
  497. }
  498. }
  499.  
  500. foreach ( player in level.players )
  501. {
  502. awardCount = player getPlayerData( "round", "awardCount" );
  503.  
  504. println( "Awards: [", player.name, "] won ", awardCount, " awards" );
  505.  
  506. for ( i = 0; (i < awardCount && i < 3 ); i++ )
  507. {
  508. award = player getPlayerData( "round", "awards", i, "award" );
  509. value = player getPlayerData( "round", "awards", i, "value" );
  510.  
  511. println( "Awards: [", player.name, "][", i, "] ", award, " ", value );
  512. }
  513.  
  514. /#
  515. if ( isDefined( player.statprint ) )
  516. {
  517. for ( i = 3; i < player.statprint.size; i++ )
  518. println( "Awards: [", player.name, "][", i, "] ", player.statprint[i].ref, " ", player.statprint[i].value );
  519. }
  520. #/
  521. }
  522.  
  523. println( "Awards: Finished assigning" );
  524. }
  525.  
  526. assignAward( ref )
  527. {
  528. winners = getAwardWinners( ref );
  529. if ( !isDefined( winners ) )
  530. return;
  531.  
  532. foreach ( winner in winners )
  533. {
  534. foreach ( player in level.players )
  535. {
  536. if ( player.clientid == winner )
  537. {
  538. player giveAward( ref );
  539. // /# player writeAwardLine( ref ); #/
  540. }
  541. }
  542. }
  543. }
  544.  
  545. getAwardType( ref )
  546. {
  547. if ( isDefined( level.awards[ ref ].type ) )
  548. return level.awards[ ref ].type;
  549. else
  550. return "none";
  551. }
  552.  
  553. isMultiAward( ref )
  554. {
  555. return ( getAwardType( ref ) == "multi" );
  556. }
  557.  
  558. isStatAward( ref )
  559. {
  560. return ( getAwardType( ref ) == "stat" );
  561. }
  562.  
  563. isThresholdAward( ref )
  564. {
  565. return ( getAwardType( ref ) == "threshold" );
  566. }
  567.  
  568. isAwardFlag( ref )
  569. {
  570. return ( getAwardType( ref ) == "flag" );
  571. }
  572.  
  573. isAwardExclusive( ref )
  574. {
  575. if ( isDefined( level.awards[ ref ].exclusive ) )
  576. return level.awards[ ref ].exclusive;
  577. else
  578. return true;
  579. }
  580.  
  581. hasDisplayValue( ref )
  582. {
  583. type = getAwardType( ref );
  584. switch ( type )
  585. {
  586. case "derived":
  587. hasDisplayValue = false;
  588. break;
  589. case "stat":
  590. case "multi":
  591. default:
  592. hasDisplayValue = true;
  593. break;
  594. }
  595.  
  596. return ( hasDisplayValue );
  597. }
  598.  
  599. giveAward( ref )
  600. {
  601. awardCount = self getPlayerData( "round", "awardCount" );
  602. self incPlayerRecord( ref );
  603.  
  604. if ( hasDisplayValue( ref ) )
  605. {
  606. if ( isStatAward( ref ) )
  607. assertex( self getPlayerStat( ref ) == getAwardRecord( ref ), "Ref is: " + ref + ", PlayerStat is: " + self getPlayerStat( ref ) + ", MatchRecord is: " + getAwardRecord( ref ) );
  608.  
  609. value = self getPlayerStat( ref );
  610. }
  611. else
  612. value = true;
  613.  
  614. value = getFormattedValue( ref, value );
  615.  
  616. if ( awardCount < 3 )
  617. {
  618. self setPlayerData( "round", "awards", awardCount, "award", ref );
  619. self setPlayerData( "round", "awards", awardCount, "value", value );
  620. }
  621.  
  622. awardCount++;
  623. self SetPlayerData( "round", "awardCount", awardCount );
  624.  
  625. if ( awardCount == 1 )
  626. maps\mp\_highlights::giveHighlight( ref, value );
  627. }
  628.  
  629. getFormattedValue( ref, value )
  630. {
  631. awardFormat = tableLookup( "mp/awardTable.csv", 1, ref, 7 );
  632. switch ( awardFormat )
  633. {
  634. case "float":
  635. value = limitDecimalPlaces( value, 2 );
  636. value = value * 100;
  637. break;
  638. case "ratio":
  639. case "multi":
  640. case "count":
  641. case "time":
  642. case "distance":
  643. case "none":
  644. default:
  645. break;
  646. }
  647.  
  648. value = int( value );
  649. return ( value );
  650. }
  651.  
  652. highestWins( ref, minAwardable )
  653. {
  654. foreach ( player in level.players )
  655. {
  656. if ( player statValueChanged( ref ) && ( !isDefined( minAwardable ) || player getPlayerStat( ref ) >= minAwardable ) )
  657. {
  658. player setMatchRecordIfGreater( ref );
  659. if ( !isAwardFlag( ref ) )
  660. player setPersonalBestIfGreater( ref );
  661. }
  662. }
  663. }
  664.  
  665. lowestWins( ref, maxAwardable)
  666. {
  667. foreach ( player in level.players )
  668. {
  669. if ( player statValueChanged( ref ) && ( !isDefined( maxAwardable ) || player getPlayerStat( ref ) <= maxAwardable ) )
  670. {
  671. player setMatchRecordIfLower( ref );
  672. if ( !isAwardFlag( ref ) )
  673. player setPersonalBestIfLower( ref );
  674. }
  675. }
  676. }
  677.  
  678. lowestWithHalfPlayedTime( ref )
  679. {
  680. gameLength = getTimePassed() / 1000;
  681. halfGameLength = gameLength * 0.5;
  682.  
  683. foreach ( player in level.players )
  684. {
  685. // hasSpawned check is required or players who pick a team and never spawn can win awards
  686. if ( player.hasSpawned && player.timePlayed["total"] >= halfGameLength )
  687. {
  688. player setMatchRecordIfLower( ref );
  689. if ( !isAwardFlag( ref ) )
  690. player setPersonalBestIfLower( ref );
  691. }
  692. }
  693. }
  694.  
  695. statValueChanged( ref )
  696. {
  697. playervalue = self getPlayerStat( ref );
  698. defaultvalue = level.awards[ ref ].defaultvalue;
  699.  
  700. if ( playervalue == defaultvalue )
  701. return false;
  702. else
  703. return true;
  704. }
  705.  
  706.  
  707. isAtLeast( ref, minimum, checkAwardRef )
  708. {
  709. foreach ( player in level.players )
  710. {
  711. playerValue = player getPlayerStat( checkAwardRef );
  712. checkValue = playerValue;
  713.  
  714. if ( checkValue >= minimum )
  715. addAwardWinner( ref, player.clientid );
  716.  
  717. // TODO: Instead of copying the value, reference the other stat directly
  718. if ( isThresholdAward( ref ) || isAwardFlag( ref ) )
  719. player setPlayerStat( ref, playerValue );
  720. }
  721. }
  722.  
  723.  
  724. isAtMost( ref, maximum, award_ref )
  725. {
  726. foreach ( player in level.players )
  727. {
  728. playerValue = player getPlayerStat( award_ref );
  729.  
  730. if ( playerValue <= maximum )
  731. addAwardWinner( ref, player.clientid );
  732. }
  733. }
  734.  
  735.  
  736. isAtMostWithHalfPlayedTime( ref, maximum, award_ref )
  737. {
  738. gameLength = getTimePassed() / 1000;
  739. halfGameLength = gameLength * 0.5;
  740.  
  741. foreach ( player in level.players )
  742. {
  743. // hasSpawned check is required or players who pick a team and never spawn can win awards
  744. if ( player.hasSpawned && player.timePlayed["total"] >= halfGameLength )
  745. {
  746. playerValue = player getPlayerStat( award_ref );
  747.  
  748. if ( playerValue <= maximum )
  749. addAwardWinner( ref, player.clientid );
  750. }
  751. }
  752. }
  753.  
  754.  
  755. setRatio( ref, award1_ref, award2_ref )
  756. {
  757. foreach ( player in level.players )
  758. {
  759. playerValue1 = player getPlayerStat( award1_ref );
  760. playerValue2 = player getPlayerStat( award2_ref );
  761.  
  762. if ( playerValue2 == 0 )
  763. player setPlayerStat( ref, playerValue1 );
  764. else
  765. {
  766. ratio = playerValue1 / playerValue2;
  767. player setPlayerStat( ref, ratio );
  768. }
  769. }
  770. }
  771.  
  772. getKillstreakAwardRef( streakName )
  773. {
  774. switch( streakName )
  775. {
  776. case "uav":
  777. case "double_uav":
  778. case "counter_uav":
  779. return "uavs";
  780. case "airstrike":
  781. case "precision_airstrike":
  782. case "stealth_airstrike":
  783. case "harrier_airstrike":
  784. case "super_airstrike":
  785. return "airstrikes";
  786. case "helicopter":
  787. case "helicopter_minigun":
  788. case "helicopter_mk19":
  789. case "helicopter_blackbox":
  790. case "helicopter_flares":
  791. return "helicopters";
  792. default:
  793. return undefined;
  794. }
  795. }
  796.  
  797. monitorReloads()
  798. {
  799. level endon( "game_ended" );
  800. self endon( "spawned_player" );
  801. self endon( "death" );
  802. self endon( "disconnect" );
  803.  
  804. for ( ;; )
  805. {
  806. self waittill( "reload" );
  807. self incPlayerStat( "mostreloads", 1 );
  808. }
  809. }
  810.  
  811. monitorShotsFired()
  812. {
  813. level endon( "game_ended" );
  814. self endon( "spawned_player" );
  815. self endon( "death" );
  816. self endon( "disconnect" );
  817.  
  818. for ( ;; )
  819. {
  820. self waittill( "weapon_fired" );
  821. self incPlayerStat( "mostshotsfired", 1 );
  822. }
  823. }
  824.  
  825. monitorSwaps()
  826. {
  827. level endon( "game_ended" );
  828. self endon( "spawned_player" );
  829. self endon( "death" );
  830. self endon( "disconnect" );
  831.  
  832. lastWeapon = "none";
  833.  
  834. for ( ;; )
  835. {
  836. self waittill( "weapon_change", weapon );
  837.  
  838. if ( lastWeapon == weapon )
  839. continue;
  840.  
  841. if ( weapon == "none" )
  842. continue;
  843.  
  844. if ( ! maps\mp\gametypes\_weapons::isPrimaryWeapon( weapon ) )
  845. continue;
  846.  
  847. lastWeapon = weapon;
  848.  
  849. self incPlayerStat( "mostswaps", 1 );
  850.  
  851. alreadyUsed = false;
  852.  
  853. //creates an array of weapons used
  854. foreach( usedWeapon in self.usedWeapons )
  855. {
  856. if ( weapon == usedWeapon )
  857. {
  858. alreadyUsed = true;
  859. break;
  860. }
  861. }
  862.  
  863. if ( !alreadyUsed )
  864. {
  865. self.usedWeapons[self.usedWeapons.size] = weapon;
  866. self incPlayerStat( "mostweaponsused", 1 );
  867. }
  868. }
  869. }
  870.  
  871.  
  872. monitorMovementDistance()
  873. {
  874. level endon( "game_ended" );
  875. self endon( "disconnect" );
  876.  
  877. for ( ;; )
  878. {
  879. foreach ( player in level.players )
  880. {
  881. if ( !isAlive( Player ) )
  882. continue;
  883.  
  884. if ( player.deaths != player.previousDeaths )
  885. {
  886. player.prevPos = player.origin;
  887. player.previousDeaths = player.deaths;
  888. }
  889.  
  890. distanceTraveled = Distance( player.origin, player.prevPos );
  891. player incPlayerStat( "distancetraveled", distanceTraveled );
  892.  
  893. player.prevPos = player.origin;
  894.  
  895. player.altitudePolls++;
  896. player.totalAltitudeSum += player.origin[2];
  897. avgAltitude = player.totalAltitudeSum / player.altitudePolls;
  898. player setPlayerStat( "leastavgalt", avgAltitude );
  899. player setPlayerStat( "greatestavgalt", avgAltitude );
  900.  
  901. wait( 0.05 );
  902. }
  903. wait( 0.05 );
  904. }
  905. }
  906.  
  907. monitorPositionCamping()
  908. {
  909. level endon( "game_ended" );
  910. self endon( "disconnect" );
  911.  
  912. self.lastCampChecked = getTime();
  913. self.positionArray = [];
  914.  
  915. CAMPTHRESHOLD = 512;
  916.  
  917. for ( ;; )
  918. {
  919. if ( !isAlive( self ) )
  920. {
  921. wait( 0.5 );
  922. self.lastCampChecked = getTime();
  923. self.positionArray = [];
  924. continue;
  925. }
  926. self.positionArray[self.positionArray.size] = self.origin;
  927.  
  928. if ( ( getTime() - self.lastCampChecked ) >= 15000 )
  929. {
  930. if ( Distance( self.positionArray[0], self.origin ) < CAMPTHRESHOLD && Distance( self.positionArray[1], self.positionArray[0] ) < CAMPTHRESHOLD )
  931. {
  932. timeCamping = getTime() - self.lastCampChecked;
  933. self incPlayerStat( "timeinspot", timeCamping );
  934. }
  935.  
  936. self.positionArray = [];
  937.  
  938. self.lastCampChecked = getTime();
  939. }
  940. wait( 5 );
  941. }
  942. }
  943.  
  944. encodeRatio( value1, value2 )
  945. {
  946. return ( value1 + (value2 << 16) );
  947. }
  948.  
  949. getRatioHiVal( value )
  950. {
  951. return (value & 65535);
  952. }
  953.  
  954. getRatioLoVal( value )
  955. {
  956. return (value >> 16);
  957. }
  958.  
  959. monitorEnemyDistance()
  960. {
  961. level endon( "game_ended" );
  962. self endon( "disconnect" );
  963.  
  964. while( level.players.size < 3 )
  965. wait( 1 );
  966.  
  967. prof_begin( "EnemyDistance" );
  968. for ( ;; )
  969. {
  970. foreach ( player in level.players )
  971. {
  972.  
  973. if ( !isdefined( player ) )
  974. continue;
  975.  
  976. if ( player.team == "spectator" )
  977. continue;
  978.  
  979. if ( !isAlive( player ) )
  980. continue;
  981.  
  982. sortedPlayersByDistance = SortByDistance( level.players, player.origin );
  983.  
  984. if( !sortedPlayersByDistance.size )
  985. {
  986. wait( 0.05 );
  987. continue;
  988. }
  989.  
  990. if ( sortedPlayersByDistance.size < 2 )
  991. {
  992. wait( 0.05 );
  993. continue;
  994. }
  995.  
  996. if ( sortedPlayersByDistance[1].team != player.team )
  997. player incPlayerStat( "closertoenemies", 0.05 );
  998.  
  999. wait( 0.05 );
  1000. }
  1001.  
  1002. wait( 0.05);
  1003. }
  1004.  
  1005. prof_end( "EnemyDistance" );
  1006. }
  1007.  
  1008. monitorClassChange()
  1009. {
  1010. level endon( "game_ended" );
  1011. self endon( "disconnect" );
  1012.  
  1013. for(;;)
  1014. {
  1015. self waittill( "spawned" );
  1016.  
  1017. if ( self.team == "spectator" )
  1018. continue;
  1019.  
  1020. if( isDefined( self.lastClass ) && self.lastClass != "" && self.lastClass != self.class )
  1021. {
  1022. self incPlayerStat( "mostclasseschanged", 1 );
  1023. }
  1024.  
  1025. self.lastClass = self.class;
  1026. }
  1027. }
  1028.  
  1029. monitorExplosionsSurvived()
  1030. {
  1031. level endon( "game_ended" );
  1032. self endon( "spawned_player" );
  1033. self endon( "death" );
  1034. self endon( "disconnect" );
  1035.  
  1036. for(;;)
  1037. {
  1038. self waittill( "survived_explosion" );
  1039. self incPlayerStat( "explosionssurvived", 1 );
  1040. wait( 0.05 );
  1041. }
  1042. }
  1043.  
  1044. monitorShieldBlocks()
  1045. {
  1046. level endon( "game_ended" );
  1047. self endon( "spawned_player" );
  1048. self endon( "death" );
  1049. self endon( "disconnect" );
  1050.  
  1051. for(;;)
  1052. {
  1053. self waittill( "shield_blocked" );
  1054. self incPlayerStat( "shieldblocks", 1 );
  1055. wait( 0.05 );
  1056. }
  1057. }
  1058.  
  1059. monitorFlashHits()
  1060. {
  1061. level endon( "game_ended" );
  1062. self endon( "spawned_player" );
  1063. self endon( "death" );
  1064. self endon( "disconnect" );
  1065.  
  1066. for(;;)
  1067. {
  1068. self waittill( "flash_hit" );
  1069. self incPlayerStat( "fbhits", 1 );
  1070. wait( 0.05 );
  1071. }
  1072. }
  1073.  
  1074. monitorStunHits()
  1075. {
  1076. level endon( "game_ended" );
  1077. self endon( "spawned_player" );
  1078. self endon( "death" );
  1079. self endon( "disconnect" );
  1080.  
  1081. for(;;)
  1082. {
  1083. self waittill( "stun_hit" );
  1084. self incPlayerStat( "stunhits", 1 );
  1085. wait( 0.05 );
  1086. }
  1087. }
  1088.  
  1089. //this approximates a players time spent in crouch or prone.
  1090. monitorStanceTime()
  1091. {
  1092. level endon( "game_ended" );
  1093. self endon( "spawned_player" );
  1094. self endon( "death" );
  1095. self endon( "disconnect" );
  1096.  
  1097. for(;;)
  1098. {
  1099. if ( self GetStance() == "crouch" )
  1100. self incPlayerStat( "crouchtime", 500 );
  1101. else if ( self GetStance() == "prone" )
  1102. self incPlayerStat( "pronetime", 500 );
  1103.  
  1104. wait( 0.5 );
  1105. }
  1106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement