Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.35 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4.  
  5.  
  6.  
  7. getHighestScoringPlayer()
  8. {
  9. updatePlacement();
  10.  
  11. if ( !level.placement["all"].size )
  12. return ( undefined );
  13. else
  14. return ( level.placement["all"][0] );
  15. }
  16.  
  17.  
  18. getLosingPlayers()
  19. {
  20. updatePlacement();
  21.  
  22. players = level.placement["all"];
  23. losingPlayers = [];
  24.  
  25. foreach ( player in players )
  26. {
  27. if ( player == level.placement["all"][0] )
  28. continue;
  29.  
  30. losingPlayers[losingPlayers.size] = player;
  31. }
  32.  
  33. return losingPlayers;
  34. }
  35.  
  36.  
  37. givePlayerScore( event, player, victim )
  38. {
  39. if ( isDefined( level.nukeIncoming ) )
  40. return;
  41.  
  42. score = player.pers["score"];
  43. onPlayerScore( event, player, victim );
  44.  
  45. if ( score == player.pers["score"] )
  46. return;
  47.  
  48. if ( !player rankingEnabled() && !level.hardcoreMode )
  49. player thread maps\mp\gametypes\_rank::scorePopup( (player.pers["score"] - score), false, (0.85,0.85,0.85), 0 );
  50.  
  51. player maps\mp\gametypes\_persistence::statAdd( "score", (player.pers["score"] - score) );
  52.  
  53. player.score = player.pers["score"];
  54. player maps\mp\gametypes\_persistence::statSetChild( "round", "score", player.score );
  55.  
  56. if ( !level.teambased )
  57. thread sendUpdatedDMScores();
  58.  
  59. player maps\mp\gametypes\_gamelogic::checkPlayerScoreLimitSoon();
  60. scoreEndedMatch = player maps\mp\gametypes\_gamelogic::checkScoreLimit();
  61.  
  62. if ( scoreEndedMatch && event == "kill" )
  63. player.finalKill = true;
  64. }
  65.  
  66.  
  67. onPlayerScore( event, player, victim )
  68. {
  69. score = maps\mp\gametypes\_rank::getScoreInfoValue( event );
  70.  
  71. assert( isDefined( score ) );
  72.  
  73. player.pers["score"] += score * level.objectivePointsMod;
  74. }
  75.  
  76.  
  77. // Seems to only be used for reducing a player's score due to suicide
  78. _setPlayerScore( player, score )
  79. {
  80. if ( score == player.pers["score"] )
  81. return;
  82.  
  83. player.pers["score"] = score;
  84. player.score = player.pers["score"];
  85.  
  86. player thread maps\mp\gametypes\_gamelogic::checkScoreLimit();
  87. }
  88.  
  89.  
  90. _getPlayerScore( player )
  91. {
  92. return player.pers["score"];
  93. }
  94.  
  95.  
  96. giveTeamScoreForObjective( team, score )
  97. {
  98. if ( isDefined( level.nukeIncoming ) )
  99. return;
  100.  
  101. score *= level.objectivePointsMod;
  102.  
  103. teamScore = game["teamScores"][team];
  104.  
  105. otherTeam = level.otherTeam[team];
  106.  
  107. if ( game["teamScores"][team] > game["teamScores"][otherTeam] )
  108. level.wasWinning = team;
  109. else if ( game["teamScores"][otherTeam] > game["teamScores"][team] )
  110. level.wasWinning = otherTeam;
  111.  
  112. _setTeamScore( team, _getTeamScore( team ) + score );
  113.  
  114. isWinning = "none";
  115. if ( game["teamScores"][team] > game["teamScores"][otherTeam] )
  116. isWinning = team;
  117. else if ( game["teamScores"][otherTeam] > game["teamScores"][team] )
  118. isWinning = otherTeam;
  119.  
  120. if ( !level.splitScreen && isWinning != "none" && isWinning != level.wasWinning && getTime() - level.lastStatusTime > 5000 && getScoreLimit() != 1 )
  121. {
  122. level.lastStatusTime = getTime();
  123. leaderDialog( "lead_taken", isWinning, "status" );
  124. if ( level.wasWinning != "none")
  125. leaderDialog( "lead_lost", level.wasWinning, "status" );
  126. }
  127.  
  128. if ( isWinning != "none" )
  129. level.wasWinning = isWinning;
  130. }
  131.  
  132.  
  133. getWinningTeam()
  134. {
  135. if ( game["teamScores"]["allies"] > game["teamScores"]["axis"] )
  136. return ( "allies" );
  137. else if ( game["teamScores"]["allies"] < game["teamScores"]["axis"] )
  138. return ( "axis" );
  139.  
  140. return ( "none" );
  141. }
  142.  
  143. _setTeamScore( team, teamScore )
  144. {
  145. if ( teamScore == game["teamScores"][team] )
  146. return;
  147.  
  148. if ( isDefined( level.nukeIncoming ) )
  149. return;
  150.  
  151. game["teamScores"][team] = teamScore;
  152.  
  153. updateTeamScore( team );
  154.  
  155. if ( game["status"] == "overtime" )
  156. thread maps\mp\gametypes\_gamelogic::onScoreLimit();
  157. else
  158. {
  159. thread maps\mp\gametypes\_gamelogic::checkTeamScoreLimitSoon( team );
  160. thread maps\mp\gametypes\_gamelogic::checkScoreLimit();
  161. }
  162. }
  163.  
  164.  
  165. updateTeamScore( team )
  166. {
  167. assert( level.teamBased );
  168.  
  169. teamScore = 0;
  170. if ( !isRoundBased() || !isObjectiveBased() )
  171. teamScore = _getTeamScore( team );
  172. else
  173. teamScore = game["roundsWon"][team];
  174.  
  175. setTeamScore( team, teamScore );
  176.  
  177. //thread sendUpdatedTeamScores();
  178. }
  179.  
  180.  
  181. _getTeamScore( team )
  182. {
  183. return game["teamScores"][team];
  184. }
  185.  
  186.  
  187. sendUpdatedTeamScores()
  188. {
  189. level notify("updating_scores");
  190. level endon("updating_scores");
  191. wait .05;
  192.  
  193. WaitTillSlowProcessAllowed();
  194.  
  195. foreach ( player in level.players )
  196. player updateScores();
  197. }
  198.  
  199. sendUpdatedDMScores()
  200. {
  201. level notify("updating_dm_scores");
  202. level endon("updating_dm_scores");
  203. wait .05;
  204.  
  205. WaitTillSlowProcessAllowed();
  206.  
  207. for ( i = 0; i < level.players.size; i++ )
  208. {
  209. level.players[i] updateDMScores();
  210. level.players[i].updatedDMScores = true;
  211. }
  212. }
  213.  
  214.  
  215. removeDisconnectedPlayerFromPlacement()
  216. {
  217. offset = 0;
  218. numPlayers = level.placement["all"].size;
  219. found = false;
  220. for ( i = 0; i < numPlayers; i++ )
  221. {
  222. if ( level.placement["all"][i] == self )
  223. found = true;
  224.  
  225. if ( found )
  226. level.placement["all"][i] = level.placement["all"][ i + 1 ];
  227. }
  228. if ( !found )
  229. return;
  230.  
  231. level.placement["all"][ numPlayers - 1 ] = undefined;
  232. assert( level.placement["all"].size == numPlayers - 1 );
  233.  
  234. if ( level.teamBased )
  235. {
  236. updateTeamPlacement();
  237. return;
  238. }
  239.  
  240. numPlayers = level.placement["all"].size;
  241. for ( i = 0; i < numPlayers; i++ )
  242. {
  243. player = level.placement["all"][i];
  244. player notify( "update_outcome" );
  245. }
  246.  
  247. }
  248.  
  249. updatePlacement()
  250. {
  251. prof_begin("updatePlacement");
  252.  
  253. placementAll = [];
  254. foreach ( player in level.players )
  255. {
  256. if ( isDefined( player.connectedPostGame ) || (player.pers["team"] != "allies" && player.pers["team"] != "axis") )
  257. continue;
  258.  
  259. placementAll[placementAll.size] = player;
  260. }
  261.  
  262. for ( i = 1; i < placementAll.size; i++ )
  263. {
  264. player = placementAll[i];
  265. playerScore = player.score;
  266. // for ( j = i - 1; j >= 0 && (player.score > placementAll[j].score || (player.score == placementAll[j].score && player.deaths < placementAll[j].deaths)); j-- )
  267. for ( j = i - 1; j >= 0 && getBetterPlayer( player, placementAll[j] ) == player; j-- )
  268. placementAll[j + 1] = placementAll[j];
  269. placementAll[j + 1] = player;
  270. }
  271.  
  272. level.placement["all"] = placementAll;
  273.  
  274. if ( level.teamBased )
  275. updateTeamPlacement();
  276.  
  277. prof_end("updatePlacement");
  278. }
  279.  
  280.  
  281. getBetterPlayer( playerA, playerB )
  282. {
  283. if ( playerA.score > playerB.score )
  284. return playerA;
  285.  
  286. if ( playerB.score > playerA.score )
  287. return playerB;
  288.  
  289. if ( playerA.deaths < playerB.deaths )
  290. return playerA;
  291.  
  292. if ( playerB.deaths < playerA.deaths )
  293. return playerB;
  294.  
  295. // TODO: more metrics for getting the better player
  296.  
  297. if ( cointoss() )
  298. return playerA;
  299. else
  300. return playerB;
  301. }
  302.  
  303.  
  304. updateTeamPlacement()
  305. {
  306. placement["allies"] = [];
  307. placement["axis"] = [];
  308. placement["spectator"] = [];
  309.  
  310. assert( level.teamBased );
  311.  
  312. placementAll = level.placement["all"];
  313. placementAllSize = placementAll.size;
  314.  
  315. for ( i = 0; i < placementAllSize; i++ )
  316. {
  317. player = placementAll[i];
  318. team = player.pers["team"];
  319.  
  320. placement[team][ placement[team].size ] = player;
  321. }
  322.  
  323. level.placement["allies"] = placement["allies"];
  324. level.placement["axis"] = placement["axis"];
  325. }
  326.  
  327.  
  328. initialDMScoreUpdate()
  329. {
  330. // the first time we call updateDMScores on a player, we have to send them the whole scoreboard.
  331. // by calling updateDMScores on each player one at a time,
  332. // we can avoid having to send the entire scoreboard to every single player
  333. // the first time someone kills someone else.
  334. wait .2;
  335. numSent = 0;
  336. while(1)
  337. {
  338. didAny = false;
  339.  
  340. players = level.players;
  341. for ( i = 0; i < players.size; i++ )
  342. {
  343. player = players[i];
  344.  
  345. if ( !isdefined( player ) )
  346. continue;
  347.  
  348. if ( isdefined( player.updatedDMScores ) )
  349. continue;
  350.  
  351. player.updatedDMScores = true;
  352. player updateDMScores();
  353.  
  354. didAny = true;
  355. wait .5;
  356. }
  357.  
  358. if ( !didAny )
  359. wait 3; // let more players connect
  360. }
  361. }
  362.  
  363.  
  364. processAssist( killedplayer )
  365. {
  366. self endon("disconnect");
  367. killedplayer endon("disconnect");
  368.  
  369. wait .05; // don't ever run on the same frame as the playerkilled callback.
  370. WaitTillSlowProcessAllowed();
  371.  
  372. if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" )
  373. return;
  374.  
  375. if ( self.pers["team"] == killedplayer.pers["team"] )
  376. return;
  377.  
  378. self thread [[level.onXPEvent]]( "assist" );
  379. self incPersStat( "assists", 1 );
  380. self.assists = self getPersStat( "assists" );
  381. self incPlayerStat( "assists", 1 );
  382.  
  383. givePlayerScore( "assist", self, killedplayer );
  384. self thread giveAdrenaline( "assist" );
  385.  
  386. self thread maps\mp\gametypes\_missions::playerAssist();
  387. }
  388.  
  389. processShieldAssist( killedPlayer )
  390. {
  391. self endon( "disconnect" );
  392. killedPlayer endon( "disconnect" );
  393.  
  394. wait .05; // don't ever run on the same frame as the playerkilled callback.
  395. WaitTillSlowProcessAllowed();
  396.  
  397. if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" )
  398. return;
  399.  
  400. if ( self.pers["team"] == killedplayer.pers["team"] )
  401. return;
  402.  
  403. self thread [[level.onXPEvent]]( "assist" );
  404. self thread [[level.onXPEvent]]( "assist" );
  405. self incPersStat( "assists", 1 );
  406. self.assists = self getPersStat( "assists" );
  407. self incPlayerStat( "assists", 1 );
  408.  
  409. givePlayerScore( "assist", self, killedplayer );
  410.  
  411. self thread maps\mp\gametypes\_hud_message::SplashNotifyDelayed( "shield_assist" );
  412.  
  413. self thread maps\mp\gametypes\_missions::playerAssist();
  414. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement