Guest User

Untitled

a guest
Aug 28th, 2010
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.62 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3. #include maps\mp\gametypes\_hud_util;
  4.  
  5.  
  6. init()
  7. {
  8. level.scoreInfo = [];
  9. level.xpScale = getDvarInt( "scr_xpscale" );
  10.  
  11. if ( level.xpScale > 2 || level.xpScale < 0)
  12. exitLevel( false );
  13.  
  14. level.xpScale = min( level.xpScale, 2 );
  15. level.xpScale = max( level.xpScale, 0 );
  16.  
  17. // more anti-hacking
  18. if ( getDvarInt( "scr_restxp_timescale" ) > 1000 )
  19. exitLevel( false );
  20.  
  21. if ( getDvarInt( "scr_restxp_minRestTime" ) < 1 )
  22. exitLevel( false );
  23.  
  24. if ( getDvarInt( "scr_restxp_levelsPerDay" ) > 30 )
  25. exitLevel( false );
  26.  
  27. if ( getDvarInt( "scr_restxp_cap" ) > 5000 )
  28. exitLevel( false );
  29.  
  30. level.rankTable = [];
  31.  
  32. precacheShader("white");
  33.  
  34. precacheString( &"RANK_PLAYER_WAS_PROMOTED_N" );
  35. precacheString( &"RANK_PLAYER_WAS_PROMOTED" );
  36. precacheString( &"RANK_PROMOTED" );
  37. precacheString( &"MP_PLUS" );
  38. precacheString( &"RANK_ROMANI" );
  39. precacheString( &"RANK_ROMANII" );
  40. precacheString( &"RANK_ROMANIII" );
  41.  
  42. if ( level.teamBased )
  43. {
  44. registerScoreInfo( "kill", 100 );
  45. registerScoreInfo( "headshot", 100 );
  46. registerScoreInfo( "assist", 20 );
  47. registerScoreInfo( "suicide", 0 );
  48. registerScoreInfo( "teamkill", 0 );
  49. }
  50. else
  51. {
  52. registerScoreInfo( "kill", 50 );
  53. registerScoreInfo( "headshot", 50 );
  54. registerScoreInfo( "assist", 0 );
  55. registerScoreInfo( "suicide", 0 );
  56. registerScoreInfo( "teamkill", 0 );
  57. }
  58.  
  59. registerScoreInfo( "win", 1 );
  60. registerScoreInfo( "loss", 0.5 );
  61. registerScoreInfo( "tie", 0.75 );
  62. registerScoreInfo( "capture", 300 );
  63. registerScoreInfo( "defend", 300 );
  64.  
  65. registerScoreInfo( "challenge", 2500 );
  66.  
  67. level.maxRank = int(tableLookup( "mp/rankTable.csv", 0, "maxrank", 1 ));
  68. level.maxPrestige = int(tableLookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ));
  69.  
  70. pId = 0;
  71. rId = 0;
  72. for ( pId = 0; pId <= level.maxPrestige; pId++ )
  73. {
  74. for ( rId = 0; rId <= level.maxRank; rId++ )
  75. precacheShader( tableLookup( "mp/rankIconTable.csv", 0, rId, pId+1 ) );
  76. }
  77.  
  78. rankId = 0;
  79. rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
  80. assert( isDefined( rankName ) && rankName != "" );
  81.  
  82. while ( isDefined( rankName ) && rankName != "" )
  83. {
  84. level.rankTable[rankId][1] = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
  85. level.rankTable[rankId][2] = tableLookup( "mp/ranktable.csv", 0, rankId, 2 );
  86. level.rankTable[rankId][3] = tableLookup( "mp/ranktable.csv", 0, rankId, 3 );
  87. level.rankTable[rankId][7] = tableLookup( "mp/ranktable.csv", 0, rankId, 7 );
  88.  
  89. precacheString( tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 ) );
  90.  
  91. rankId++;
  92. rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
  93. }
  94.  
  95. maps\mp\gametypes\_missions::buildChallegeInfo();
  96.  
  97. level thread patientZeroWaiter();
  98.  
  99. level thread onPlayerConnect();
  100. }
  101.  
  102. patientZeroWaiter()
  103. {
  104. level endon( "game_ended" );
  105.  
  106. while ( !isDefined( level.players ) || !level.players.size )
  107. wait ( 0.05 );
  108.  
  109. if ( !matchMakingGame() )
  110. {
  111. if ( (getDvar( "mapname" ) == "mp_rust" && randomInt( 1000 ) == 999) )
  112. level.patientZeroName = level.players[0].name;
  113. }
  114. else
  115. {
  116. if ( getDvar( "scr_patientZero" ) != "" )
  117. level.patientZeroName = getDvar( "scr_patientZero" );
  118. }
  119. }
  120.  
  121. isRegisteredEvent( type )
  122. {
  123. if ( isDefined( level.scoreInfo[type] ) )
  124. return true;
  125. else
  126. return false;
  127. }
  128.  
  129.  
  130. registerScoreInfo( type, value )
  131. {
  132. level.scoreInfo[type]["value"] = value;
  133. }
  134.  
  135.  
  136. getScoreInfoValue( type )
  137. {
  138. overrideDvar = "scr_" + level.gameType + "_score_" + type;
  139. if ( getDvar( overrideDvar ) != "" )
  140. return getDvarInt( overrideDvar );
  141. else
  142. return ( level.scoreInfo[type]["value"] );
  143. }
  144.  
  145.  
  146. getScoreInfoLabel( type )
  147. {
  148. return ( level.scoreInfo[type]["label"] );
  149. }
  150.  
  151.  
  152. getRankInfoMinXP( rankId )
  153. {
  154. return int(level.rankTable[rankId][2]);
  155. }
  156.  
  157.  
  158. getRankInfoXPAmt( rankId )
  159. {
  160. return int(level.rankTable[rankId][3]);
  161. }
  162.  
  163.  
  164. getRankInfoMaxXp( rankId )
  165. {
  166. return int(level.rankTable[rankId][7]);
  167. }
  168.  
  169.  
  170. getRankInfoFull( rankId )
  171. {
  172. return tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 );
  173. }
  174.  
  175.  
  176. getRankInfoIcon( rankId, prestigeId )
  177. {
  178. return tableLookup( "mp/rankIconTable.csv", 0, rankId, prestigeId+1 );
  179. }
  180.  
  181. getRankInfoLevel( rankId )
  182. {
  183. return int( tableLookup( "mp/ranktable.csv", 0, rankId, 13 ) );
  184. }
  185.  
  186.  
  187. onPlayerConnect()
  188. {
  189. for(;;)
  190. {
  191. level waittill( "connected", player );
  192.  
  193. /#
  194. if ( getDvarInt( "scr_forceSequence" ) )
  195. player setPlayerData( "experience", 145499 );
  196. #/
  197. player.pers["rankxp"] = player maps\mp\gametypes\_persistence::statGet( "experience" );
  198. if ( player.pers["rankxp"] < 0 ) // paranoid defensive
  199. player.pers["rankxp"] = 0;
  200.  
  201. rankId = player getRankForXp( player getRankXP() );
  202. player.pers[ "rank" ] = rankId;
  203. player.pers[ "participation" ] = 0;
  204.  
  205. player.xpUpdateTotal = 0;
  206. player.bonusUpdateTotal = 0;
  207.  
  208. prestige = player getPrestigeLevel();
  209. player setRank( rankId, prestige );
  210. player.pers["prestige"] = prestige;
  211.  
  212. player.postGamePromotion = false;
  213. if ( !isDefined( player.pers["postGameChallenges"] ) )
  214. {
  215. player setClientDvars( "ui_challenge_1_ref", "",
  216. "ui_challenge_2_ref", "",
  217. "ui_challenge_3_ref", "",
  218. "ui_challenge_4_ref", "",
  219. "ui_challenge_5_ref", "",
  220. "ui_challenge_6_ref", "",
  221. "ui_challenge_7_ref", ""
  222. );
  223. }
  224.  
  225. // more anti-hacking
  226. if ( getDvarInt( "scr_restxp_timescale" ) > 1000 )
  227. exitLevel( false );
  228.  
  229. if ( getDvarInt( "scr_restxp_minRestTime" ) < 1 )
  230. exitLevel( false );
  231.  
  232. if ( getDvarInt( "scr_restxp_levelsPerDay" ) > 30 )
  233. exitLevel( false );
  234.  
  235. if ( getDvarInt( "scr_restxp_cap" ) > 5000 )
  236. exitLevel( false );
  237.  
  238. player setClientDvar( "ui_promotion", 0 );
  239.  
  240. if ( !isDefined( player.pers["summary"] ) )
  241. {
  242. player.pers["summary"] = [];
  243. player.pers["summary"]["xp"] = 0;
  244. player.pers["summary"]["score"] = 0;
  245. player.pers["summary"]["challenge"] = 0;
  246. player.pers["summary"]["match"] = 0;
  247. player.pers["summary"]["misc"] = 0;
  248.  
  249. // resetting game summary dvars
  250. player setClientDvar( "player_summary_xp", "0" );
  251. player setClientDvar( "player_summary_score", "0" );
  252. player setClientDvar( "player_summary_challenge", "0" );
  253. player setClientDvar( "player_summary_match", "0" );
  254. player setClientDvar( "player_summary_misc", "0" );
  255. }
  256.  
  257.  
  258. // resetting summary vars
  259.  
  260. player setClientDvar( "ui_opensummary", 0 );
  261.  
  262. player maps\mp\gametypes\_missions::updateChallenges();
  263. player.explosiveKills[0] = 0;
  264. player.xpGains = [];
  265.  
  266. player.hud_scorePopup = newClientHudElem( player );
  267. player.hud_scorePopup.horzAlign = "center";
  268. player.hud_scorePopup.vertAlign = "middle";
  269. player.hud_scorePopup.alignX = "center";
  270. player.hud_scorePopup.alignY = "middle";
  271. player.hud_scorePopup.x = 0;
  272. if ( level.splitScreen )
  273. player.hud_scorePopup.y = -40;
  274. else
  275. player.hud_scorePopup.y = -60;
  276. player.hud_scorePopup.font = "hudbig";
  277. player.hud_scorePopup.fontscale = 0.75;
  278. player.hud_scorePopup.archived = false;
  279. player.hud_scorePopup.color = (0.5,0.5,0.5);
  280. player.hud_scorePopup.sort = 10000;
  281. player.hud_scorePopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
  282.  
  283. player thread onPlayerSpawned();
  284. player thread onJoinedTeam();
  285. player thread onJoinedSpectators();
  286. }
  287. }
  288.  
  289.  
  290. onJoinedTeam()
  291. {
  292. self endon("disconnect");
  293.  
  294. for(;;)
  295. {
  296. self waittill( "joined_team" );
  297. self thread removeRankHUD();
  298. }
  299. }
  300.  
  301.  
  302. onJoinedSpectators()
  303. {
  304. self endon("disconnect");
  305.  
  306. for(;;)
  307. {
  308. self waittill( "joined_spectators" );
  309. self thread removeRankHUD();
  310. }
  311. }
  312.  
  313.  
  314. onPlayerSpawned()
  315. {
  316. self endon("disconnect");
  317.  
  318. for(;;)
  319. {
  320. self waittill("spawned_player");
  321. }
  322. }
  323.  
  324.  
  325. roundUp( floatVal )
  326. {
  327. if ( int( floatVal ) != floatVal )
  328. return int( floatVal+1 );
  329. else
  330. return int( floatVal );
  331. }
  332.  
  333.  
  334. giveRankXP( type, value )
  335. {
  336. self endon("disconnect");
  337.  
  338. lootType = "none";
  339.  
  340. // more anti-hacking
  341. if ( getDvarInt( "scr_restxp_timescale" ) > 1000 )
  342. exitLevel( false );
  343.  
  344. if ( getDvarInt( "scr_restxp_minRestTime" ) < 1 )
  345. exitLevel( false );
  346.  
  347. if ( getDvarInt( "scr_restxp_levelsPerDay" ) > 30 )
  348. exitLevel( false );
  349.  
  350. if ( getDvarInt( "scr_restxp_cap" ) > 5000 )
  351. exitLevel( false );
  352.  
  353. if ( !self rankingEnabled() )
  354. return;
  355.  
  356. if ( level.teamBased && (!level.teamCount["allies"] || !level.teamCount["axis"]) )
  357. return;
  358. else if ( !level.teamBased && (level.teamCount["allies"] + level.teamCount["axis"] < 2) )
  359. return;
  360.  
  361. if ( !isDefined( value ) )
  362. value = getScoreInfoValue( type );
  363.  
  364. if ( !isDefined( self.xpGains[type] ) )
  365. self.xpGains[type] = 0;
  366.  
  367. momentumBonus = 0;
  368. gotRestXP = false;
  369.  
  370. switch( type )
  371. {
  372. case "kill":
  373. case "headshot":
  374. case "shield_damage":
  375. value *= self.xpScaler;
  376. case "assist":
  377. case "suicide":
  378. case "teamkill":
  379. case "capture":
  380. case "defend":
  381. case "return":
  382. case "pickup":
  383. case "assault":
  384. case "plant":
  385. case "destroy":
  386. case "save":
  387. case "defuse":
  388. if ( getGametypeNumLives() > 0 )
  389. {
  390. multiplier = max(1,int( 10/getGametypeNumLives() ));
  391. value = int(value * multiplier);
  392. }
  393.  
  394. value = int( value * level.xpScale );
  395.  
  396. restXPAwarded = getRestXPAward( value );
  397. value += restXPAwarded;
  398. if ( restXPAwarded > 0 )
  399. {
  400. if ( isLastRestXPAward( value ) )
  401. thread maps\mp\gametypes\_hud_message::splashNotify( "rested_done" );
  402.  
  403. gotRestXP = true;
  404. }
  405. break;
  406. }
  407.  
  408. if ( !gotRestXP )
  409. {
  410. // if we didn't get rest XP for this type, we push the rest XP goal ahead so we didn't waste it
  411. if ( self getPlayerData( "restXPGoal" ) > self getRankXP() )
  412. self setPlayerData( "restXPGoal", self getPlayerData( "restXPGoal" ) + value );
  413. }
  414.  
  415. oldxp = self getRankXP();
  416. self.xpGains[type] += value;
  417.  
  418. self incRankXP( value );
  419.  
  420. if ( self rankingEnabled() && updateRank( oldxp ) )
  421. self thread updateRankAnnounceHUD();
  422.  
  423. // Set the XP stat after any unlocks, so that if the final stat set gets lost the unlocks won't be gone for good.
  424. self syncXPStat();
  425.  
  426. if ( !level.hardcoreMode )
  427. {
  428. if ( type == "teamkill" )
  429. {
  430. self thread scorePopup( 0 - getScoreInfoValue( "kill" ), 0, (1,0,0), 0 );
  431. }
  432. else
  433. {
  434. color = (1,1,0.5);
  435. if ( gotRestXP )
  436. color = (1,.65,0);
  437. self thread scorePopup( value, momentumBonus, color, 0 );
  438. }
  439. }
  440.  
  441. switch( type )
  442. {
  443. case "kill":
  444. case "headshot":
  445. case "suicide":
  446. case "teamkill":
  447. case "assist":
  448. case "capture":
  449. case "defend":
  450. case "return":
  451. case "pickup":
  452. case "assault":
  453. case "plant":
  454. case "defuse":
  455. self.pers["summary"]["score"] += value;
  456. self.pers["summary"]["xp"] += value;
  457. break;
  458.  
  459. case "win":
  460. case "loss":
  461. case "tie":
  462. self.pers["summary"]["match"] += value;
  463. self.pers["summary"]["xp"] += value;
  464. break;
  465.  
  466. case "challenge":
  467. self.pers["summary"]["challenge"] += value;
  468. self.pers["summary"]["xp"] += value;
  469. break;
  470.  
  471. default:
  472. self.pers["summary"]["misc"] += value; //keeps track of ungrouped match xp reward
  473. self.pers["summary"]["match"] += value;
  474. self.pers["summary"]["xp"] += value;
  475. break;
  476. }
  477. }
  478.  
  479. updateRank( oldxp )
  480. {
  481. newRankId = self getRank();
  482. if ( newRankId == self.pers["rank"] )
  483. return false;
  484.  
  485. oldRank = self.pers["rank"];
  486. rankId = self.pers["rank"];
  487. self.pers["rank"] = newRankId;
  488.  
  489. //self logString( "promoted from " + oldRank + " to " + newRankId + " timeplayed: " + self maps\mp\gametypes\_persistence::statGet( "timePlayedTotal" ) );
  490. println( "promoted " + self.name + " from rank " + oldRank + " to " + newRankId + ". Experience went from " + oldxp + " to " + self getRankXP() + "." );
  491.  
  492. self setRank( newRankId );
  493.  
  494. return true;
  495. }
  496.  
  497.  
  498. updateRankAnnounceHUD()
  499. {
  500. self endon("disconnect");
  501.  
  502. self notify("update_rank");
  503. self endon("update_rank");
  504.  
  505. team = self.pers["team"];
  506. if ( !isdefined( team ) )
  507. return;
  508.  
  509. // give challenges and other XP a chance to process
  510. // also ensure that post game promotions happen asap
  511. if ( !levelFlag( "game_over" ) )
  512. level waittill_notify_or_timeout( "game_over", 0.25 );
  513.  
  514.  
  515. newRankName = self getRankInfoFull( self.pers["rank"] );
  516. rank_char = level.rankTable[self.pers["rank"]][1];
  517. subRank = int(rank_char[rank_char.size-1]);
  518.  
  519. thread maps\mp\gametypes\_hud_message::promotionSplashNotify();
  520.  
  521. if ( subRank > 1 )
  522. return;
  523.  
  524. for ( i = 0; i < level.players.size; i++ )
  525. {
  526. player = level.players[i];
  527. playerteam = player.pers["team"];
  528. if ( isdefined( playerteam ) && player != self )
  529. {
  530. if ( playerteam == team )
  531. player iPrintLn( &"RANK_PLAYER_WAS_PROMOTED", self, newRankName );
  532. }
  533. }
  534. }
  535.  
  536.  
  537. endGameUpdate()
  538. {
  539. player = self;
  540. }
  541.  
  542.  
  543. scorePopup( amount, bonus, hudColor, glowAlpha )
  544. {
  545. self endon( "disconnect" );
  546. self endon( "joined_team" );
  547. self endon( "joined_spectators" );
  548.  
  549. if ( amount == 0 )
  550. return;
  551.  
  552. self notify( "scorePopup" );
  553. self endon( "scorePopup" );
  554.  
  555. self.xpUpdateTotal += amount;
  556. self.bonusUpdateTotal += bonus;
  557.  
  558. wait ( 0.05 );
  559.  
  560. if ( self.xpUpdateTotal < 0 )
  561. self.hud_scorePopup.label = &"";
  562. else
  563. self.hud_scorePopup.label = &"MP_PLUS";
  564.  
  565. self.hud_scorePopup.color = hudColor;
  566. self.hud_scorePopup.glowColor = hudColor;
  567. self.hud_scorePopup.glowAlpha = glowAlpha;
  568.  
  569. self.hud_scorePopup setValue(self.xpUpdateTotal);
  570. self.hud_scorePopup.alpha = 0.85;
  571. self.hud_scorePopup thread maps\mp\gametypes\_hud::fontPulse( self );
  572.  
  573. increment = max( int( self.bonusUpdateTotal / 20 ), 1 );
  574.  
  575. if ( self.bonusUpdateTotal )
  576. {
  577. while ( self.bonusUpdateTotal > 0 )
  578. {
  579. self.xpUpdateTotal += min( self.bonusUpdateTotal, increment );
  580. self.bonusUpdateTotal -= min( self.bonusUpdateTotal, increment );
  581.  
  582. self.hud_scorePopup setValue( self.xpUpdateTotal );
  583.  
  584. wait ( 0.05 );
  585. }
  586. }
  587. else
  588. {
  589. wait ( 1.0 );
  590. }
  591.  
  592. self.hud_scorePopup fadeOverTime( 0.75 );
  593. self.hud_scorePopup.alpha = 0;
  594.  
  595. self.xpUpdateTotal = 0;
  596. }
  597.  
  598. removeRankHUD()
  599. {
  600. self.hud_scorePopup.alpha = 0;
  601. }
  602.  
  603. getRank()
  604. {
  605. rankXp = self.pers["rankxp"];
  606. rankId = self.pers["rank"];
  607.  
  608. if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) )
  609. return rankId;
  610. else
  611. return self getRankForXp( rankXp );
  612. }
  613.  
  614.  
  615. levelForExperience( experience )
  616. {
  617. return getRankForXP( experience );
  618. }
  619.  
  620.  
  621. getRankForXp( xpVal )
  622. {
  623. rankId = 0;
  624. rankName = level.rankTable[rankId][1];
  625. assert( isDefined( rankName ) );
  626.  
  627. while ( isDefined( rankName ) && rankName != "" )
  628. {
  629. if ( xpVal < getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId ) )
  630. return rankId;
  631.  
  632. rankId++;
  633. if ( isDefined( level.rankTable[rankId] ) )
  634. rankName = level.rankTable[rankId][1];
  635. else
  636. rankName = undefined;
  637. }
  638.  
  639. rankId--;
  640. return rankId;
  641. }
  642.  
  643.  
  644. getSPM()
  645. {
  646. rankLevel = self getRank() + 1;
  647. return (3 + (rankLevel * 0.5))*10;
  648. }
  649.  
  650. getPrestigeLevel()
  651. {
  652. return self maps\mp\gametypes\_persistence::statGet( "prestige" );
  653. }
  654.  
  655. getRankXP()
  656. {
  657. return self.pers["rankxp"];
  658. }
  659.  
  660. incRankXP( amount )
  661. {
  662. if ( !self rankingEnabled() )
  663. return;
  664.  
  665. if ( isDefined( self.isCheater ) )
  666. return;
  667.  
  668. xp = self getRankXP();
  669. newXp = (int( min( xp, getRankInfoMaxXP( level.maxRank ) ) ) + amount);
  670.  
  671. if ( self.pers["rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) )
  672. newXp = getRankInfoMaxXP( level.maxRank );
  673.  
  674. self.pers["rankxp"] = newXp;
  675. }
  676.  
  677. getRestXPAward( baseXP )
  678. {
  679. if ( !getdvarint( "scr_restxp_enable" ) )
  680. return 0;
  681.  
  682. restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" ); // as a fraction of base xp
  683.  
  684. // prevent hacks using 'restxp'
  685. if ( restXPAwardRate > 2 )
  686. exitLevel( false );
  687.  
  688. wantGiveRestXP = int(baseXP * restXPAwardRate);
  689. mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
  690.  
  691. if ( mayGiveRestXP <= 0 )
  692. return 0;
  693.  
  694. // we don't care about giving more rest XP than we have; we just want it to always be X2
  695. //if ( wantGiveRestXP > mayGiveRestXP )
  696. // return mayGiveRestXP;
  697.  
  698. return wantGiveRestXP;
  699. }
  700.  
  701.  
  702. isLastRestXPAward( baseXP )
  703. {
  704. if ( !getdvarint( "scr_restxp_enable" ) )
  705. return false;
  706.  
  707. restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" ); // as a fraction of base xp
  708.  
  709. // prevent hacks using 'restxp'
  710. if ( restXPAwardRate > 2 )
  711. exitLevel( false );
  712.  
  713. wantGiveRestXP = int(baseXP * restXPAwardRate);
  714. mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
  715.  
  716. if ( mayGiveRestXP <= 0 )
  717. return false;
  718.  
  719. if ( wantGiveRestXP >= mayGiveRestXP )
  720. return true;
  721.  
  722. return false;
  723. }
  724.  
  725. syncXPStat()
  726. {
  727. if ( level.xpScale > 2 || level.xpScale <= 0)
  728. exitLevel( false );
  729.  
  730. xp = self getRankXP();
  731.  
  732. self maps\mp\gametypes\_persistence::statSet( "experience", xp );
  733. }
Add Comment
Please, Sign In to add comment