Guest User

Untitled

a guest
May 20th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 26.44 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include common_scripts\utility;
  3. #include maps\mp\gametypes\_globallogic_score;
  4. #include maps\mp\gametypes\_hud_util;
  5. init()
  6. {
  7.     if ( GetDvarInt( #"xblive_wagermatch" ) == 1 && !isPregame() )
  8.     {
  9.         level.wagerMatch = 1;
  10.        
  11.         PrecacheString( &"MP_HEADS_UP" );
  12.         PrecacheString( &"MP_U2_ONLINE" );
  13.         PrecacheString( &"MP_BONUS_ACQUIRED" );
  14.         if( !isDefined( game["wager_pot"] ) )
  15.         {
  16.             game["wager_pot"] = 0;
  17.             game["wager_initial_pot"] = 0;
  18.         }
  19.        
  20.         game["dialog"]["wm_u2_online"] = "boost_gen_02";
  21.         game["dialog"]["wm_in_the_money"] = "boost_gen_06";
  22.         game["dialog"]["wm_oot_money"] = "boost_gen_07";
  23.        
  24.         level.powerupList = [];
  25.        
  26.         level thread onPlayerConnect();
  27.         level thread helpGameEnd();
  28.     }
  29.     else
  30.     {
  31.         level.wagerMatch = 0;
  32.     }
  33.    
  34.     level.wagerBet = GetDvarInt( #"scr_wagerBet" );
  35.     level.takeLivesOnDeath = true;
  36. }
  37. onPlayerConnect()
  38. {
  39.     for(;;)
  40.     {
  41.         level waittill( "connected", player );
  42.         player thread onDisconnect();
  43.         player thread initWagerPlayer();
  44.     }
  45. }
  46. initWagerPlayer()
  47. {
  48.     self endon( "disconnect" );
  49.    
  50.     self waittill( "spawned_player" );
  51.        
  52.     if( !isDefined( self.pers["wager"] ) )
  53.     {
  54.         self.pers["wager"] = true;
  55.         self.pers["wager_sideBetWinnings"] = 0;
  56.         self.pers["wager_sideBetLosses"] = 0;
  57.     }
  58.    
  59.     if ( ( IsDefined( level.inTheMoneyOnRadar ) && level.inTheMoneyOnRadar ) || ( IsDefined( level.firstPlaceOnRadar ) && level.firstPlaceOnRadar ) )
  60.     {
  61.         self.pers["hasRadar"] = true;
  62.         self.hasSpyplane = true;
  63.     }
  64.     else
  65.     {
  66.         self.pers["hasRadar"] = false;
  67.         self.hasSpyplane = false;
  68.     }
  69.    
  70.     self thread deductPlayerAnte();
  71. }
  72. onDisconnect()
  73. {
  74.     level endon ( "game_ended" );
  75.     self endon ( "player_eliminated" );
  76.     self waittill ( "disconnect" );
  77.     level notify( "player_eliminated" );
  78. }
  79. deductPlayerAnte()
  80. {
  81.     if( isDefined( self.pers["hasPaidWagerAnte"] ) )
  82.         return;
  83.     waittillframeend;
  84.     codPoints = self maps\mp\gametypes\_rank::getCodPointsStat();
  85.     wagerBet =  level.wagerBet;
  86.     if( wagerBet > codPoints )
  87.     {
  88.        
  89.        
  90.         wagerBet = codPoints;
  91.     }
  92.     codPoints -= wagerBet;
  93.     self maps\mp\gametypes\_rank::setCodPointsStat( codPoints );
  94.     if ( !self IsLocalToHost() )
  95.         self incrementEscrowForPlayer( wagerBet );
  96.     game["wager_pot"] += wagerBet;
  97.     game["wager_initial_pot"] += wagerBet;
  98.     self.pers["hasPaidWagerAnte"] = true;
  99.     lifeTimeBuyin = self maps\mp\gametypes\_persistence::statGet( "LIFETIME_BUYIN" );
  100.     self maps\mp\gametypes\_persistence::setPlayerStat( "PlayerStatsList", "LIFETIME_BUYIN", lifeTimeBuyin + wagerBet );
  101.     self addRecentEarningsToStat( 0 - wagerBet );
  102.     if( isDefined( level.onWagerPlayerAnte ) )
  103.     {
  104.         [[level.onWagerPlayerAnte]]( self, wagerBet );
  105.     }
  106.    
  107.     self thread maps\mp\gametypes\_persistence::uploadStatsSoon();
  108. }
  109. incrementEscrowForPlayer( amount )
  110. {
  111.     if ( !IsDefined( self ) || !IsPlayer( self ) )
  112.         return;
  113.        
  114.     if ( !IsDefined( game["escrows"] ) )
  115.         game["escrows"] = [];
  116.        
  117.     playerXUID = self GetXUID();
  118.     if ( !IsDefined( playerXUID ) )
  119.         return;
  120.        
  121.     IncrementEscrow( playerXUID, amount );
  122.    
  123.     escrowStruct = SpawnStruct();
  124.     escrowStruct.xuid = playerXUID;
  125.     escrowStruct.amount = amount;
  126.     game["escrows"][game["escrows"].size] = escrowStruct;
  127. }
  128. clearEscrows()
  129. {
  130.     if ( !IsDefined( game["escrows"] ) )
  131.         return;
  132.        
  133.     escrows = game["escrows"];
  134.     numEscrows = escrows.size;
  135.     for ( i = 0 ; i < numEscrows ; i++ )
  136.     {
  137.         escrowStruct = escrows[i];
  138.         IncrementEscrow( escrowStruct.xuid, 0 - escrowStruct.amount );
  139.     }
  140.     game["escrows"] = [];
  141. }
  142. addRecentEarningsToStat( recentEarnings )
  143. {
  144.     currEarnings = self maps\mp\gametypes\_persistence::getRecentStat( true, 0, "score" );
  145.     self maps\mp\gametypes\_persistence::setRecentStat( true, 0, "score", currEarnings + recentEarnings );
  146. }
  147. prematchPeriod()
  148. {
  149.     if ( !level.wagerMatch )
  150.         return;
  151. }
  152. finalizeWagerRound()
  153. {
  154.     if ( level.wagerMatch == 0 )
  155.         return;
  156.     determineWagerWinnings();
  157.     if( isDefined( level.onWagerFinalizeRound ) )
  158.     {
  159.         [[level.onWagerFinalizeRound]]();
  160.     }
  161. }
  162. determineWagerWinnings()
  163. {
  164.     shouldCalculateWinnings = !isDefined( level.dontCalcWagerWinnings ) || !level.dontCalcWagerWinnings;
  165.     if( !shouldCalculateWinnings )
  166.     {
  167.         return;
  168.     }
  169.     if( !level.teamBased )
  170.     {
  171.         calculateFreeForAllPayouts();
  172.     }
  173.     else
  174.     {
  175.         calculateTeamPayouts();
  176.     }
  177. }
  178. calculateFreeForAllPayouts()
  179. {
  180.     playerRankings = level.placement["all"];
  181.     payoutPercentages = array( 0.5, 0.3, 0.2 );
  182.     if( playerRankings.size == 2 )
  183.     {
  184.         payoutPercentages = array( 0.7, 0.3 );
  185.     }
  186.     else if( playerRankings.size == 1 )
  187.     {
  188.         payoutPercentages = array( 1.0 );
  189.     }
  190.     setWagerWinningsOnPlayers( level.players, 0 );
  191.    
  192.    
  193.     if ( IsDefined( level.hostForcedEnd ) && level.hostForcedEnd )
  194.     {
  195.         for ( i = 0 ; i < playerRankings.size ; i++ )
  196.         {
  197.             if ( !playerRankings[i] IsLocalToHost() )
  198.                 playerRankings[i].wagerWinnings = level.wagerBet;
  199.         }
  200.     }
  201.    
  202.     else if ( level.players.size == 1 )
  203.     {
  204.         game["escrows"] = undefined;
  205.         return;
  206.     }
  207.     else
  208.     {      
  209.         currentPayoutPercentage = 0;
  210.         cumulativePayoutPercentage = payoutPercentages[0];
  211.         playerGroup = [];
  212.         playerGroup[playerGroup.size] = playerRankings[0];
  213.         for ( i = 1 ; i < playerRankings.size ; i++ )
  214.         {
  215.             if ( playerRankings[i].pers["score"] < playerGroup[0].pers["score"] )
  216.             {
  217.                 setWagerWinningsOnPlayers( playerGroup, int( game["wager_pot"] * cumulativePayoutPercentage / playerGroup.size ) );
  218.                 playerGroup = [];
  219.                 cumulativePayoutPercentage = 0;
  220.             }
  221.             playerGroup[playerGroup.size] = playerRankings[i];
  222.             currentPayoutPercentage++;
  223.             if ( IsDefined( payoutPercentages[currentPayoutPercentage] ) )
  224.                 cumulativePayoutPercentage += payoutPercentages[currentPayoutPercentage];
  225.         }
  226.         setWagerWinningsOnPlayers( playerGroup, int( game["wager_pot"] * cumulativePayoutPercentage / playerGroup.size ) );
  227.     }
  228. }
  229. calculatePlacesBasedOnScore()
  230. {
  231.    
  232.    
  233.     level.playerPlaces = array( [], [], [] );
  234.     playerRankings = level.placement["all"];
  235.     placementScores = array( playerRankings[ 0 ].pers["score"], -1, -1 );
  236.     currentPlace = 0;
  237.     for ( index = 0 ; index < playerRankings.size && currentPlace < placementScores.size ; index++ )
  238.     {
  239.         player = playerRankings[index];
  240.         if( player.pers["score"] < placementScores[ currentPlace ] )
  241.         {
  242.             currentPlace++;
  243.             if( currentPlace >= level.playerPlaces.size )
  244.                 break;
  245.             placementScores[ currentPlace ] = player.pers["score"];
  246.         }
  247.         level.playerPlaces[ currentPlace ][ level.playerPlaces[ currentPlace ].size ] = player;
  248.     }
  249. }
  250. calculateTeamPayouts()
  251. {
  252.     winner = "axis";
  253.     if ( getGameScore( "allies" ) == getGameScore( "axis" ) )
  254.         winner = "tie";
  255.     else if ( getGameScore( "allies" ) > getGameScore( "axis" ) )
  256.         winner = "allies";
  257.     if( winner == "tie" )
  258.     {
  259.         calculateFreeForAllPayouts();
  260.         return;
  261.     }
  262.     playersOnWinningTeam = [];
  263.     for ( index = 0 ; index < level.players.size ; index++ )
  264.     {
  265.         player = level.players[index];
  266.         player.wagerWinnings = 0;
  267.         if( player.pers["team"] == winner )
  268.         {
  269.             playersOnWinningTeam[ playersOnWinningTeam.size ] = player;
  270.         }
  271.     }
  272.     if( playersOnWinningTeam.size == 0 )
  273.     {
  274.        
  275.         setWagerWinningsOnPlayers( level.players, level.wagerbet );
  276.         return;
  277.     }
  278.     winningsSplit = int( game["wager_pot"] / playersOnWinningTeam.size );
  279.     setWagerWinningsOnPlayers( playersOnWinningTeam, winningsSplit );
  280. }
  281. setWagerWinningsOnPlayers( players, amount )
  282. {
  283.     for ( index = 0 ; index < players.size ; index++ )
  284.     {
  285.         players[index].wagerWinnings = amount;
  286.     }
  287. }
  288. finalizeWagerGame()
  289. {
  290.     level.wagerGameFinalized = true;
  291.     if ( level.wagermatch == 0 )
  292.         return;
  293.     determineWagerWinnings();
  294.     determineTopEarners();
  295.     players = level.players;
  296.     wait 0.5;
  297.     playerRankings = level.wagerTopEarners;
  298.     for ( index = 0 ; index < players.size ; index++ )
  299.     {
  300.         player = players[index];
  301.         if ( IsDefined( player.pers["wager_sideBetWinnings"] ) )
  302.             payOutWagerWinnings( player, player.wagerWinnings + player.pers["wager_sideBetWinnings"] );
  303.         else
  304.             payOutWagerWinnings( player, player.wagerWinnings );
  305.            
  306.         if ( player.wagerWinnings > 0 )
  307.         {
  308.             maps\mp\gametypes\_globallogic_score::updateWinStats( player );
  309.            
  310.            
  311.             numWagerWins = 0;
  312.             wagerGametypes = GetWagerGametypeList();
  313.             for ( i = 0 ; i < wagerGametypes.size ; i++ )
  314.             {
  315.                 wins = player getdstat( "PlayerStatsByGameMode", wagerGametypes[i], "wins" );
  316.                 numWagerWins += wins;
  317.             }
  318.             if ( numWagerWins >= 5 )
  319.                 player GiveAchievement( "MP_WAGER_MATCH" );
  320.         }
  321.     }
  322.     clearEscrows();
  323. }
  324. payOutWagerWinnings( player, winnings )
  325. {
  326.     if( winnings == 0 )
  327.         return;
  328.     codPoints = player maps\mp\gametypes\_rank::getCodPointsStat();
  329.     player maps\mp\gametypes\_rank::setCodPointsStat( codPoints + winnings );
  330.     lifeTimeEarnings = player maps\mp\gametypes\_persistence::statGet( "LIFETIME_EARNINGS" );
  331.     player maps\mp\gametypes\_persistence::setPlayerStat( "PlayerStatsList", "LIFETIME_EARNINGS", lifeTimeEarnings + winnings );
  332.     player addRecentEarningsToStat( winnings );
  333. }
  334. determineTopEarners()
  335. {
  336.     topWinnings = array( -1, -1, -1 );
  337.     level.wagerTopEarners = [];
  338.     for ( index = 0 ; index < level.players.size ; index++ )
  339.     {
  340.         player = level.players[ index ];
  341.         if( !isDefined( player.wagerWinnings ) )
  342.         {
  343.             player.wagerWinnings = 0;
  344.         }
  345.         if( player.wagerWinnings > topWinnings[ 0 ] )
  346.         {
  347.             topWinnings[ 2 ] = topWinnings[ 1 ];
  348.             topWinnings[ 1 ] = topWinnings[ 0 ];
  349.             topWinnings[ 0 ] = player.wagerWinnings;
  350.             level.wagerTopEarners[ 2 ] = level.wagerTopEarners[ 1 ];
  351.             level.wagerTopEarners[ 1 ] = level.wagerTopEarners[ 0 ];
  352.             level.wagerTopEarners[ 0 ] = player;
  353.         }
  354.         else if( player.wagerWinnings > topWinnings[ 1 ] )
  355.         {
  356.             topWinnings[ 2 ] = topWinnings[ 1 ];
  357.             topWinnings[ 1 ] = player.wagerWinnings;
  358.             level.wagerTopEarners[ 2 ] = level.wagerTopEarners[ 1 ];
  359.             level.wagerTopEarners[ 1 ] = player;
  360.         }
  361.         else if( player.wagerWinnings > topWinnings[ 2 ] )
  362.         {
  363.             topWinnings[ 2 ] = player.wagerWinnings;
  364.             level.wagerTopEarners[ 2 ] = player;
  365.         }
  366.     }
  367. }
  368. postRoundSideBet()
  369. {
  370.     if ( isDefined( level.sidebet ) && level.sidebet )
  371.     {
  372.         level notify( "side_bet_begin" );
  373.         level waittill( "side_bet_end" );
  374.     }
  375. }
  376. SideBetTimer()
  377. {
  378.     level endon ( "side_bet_end" );
  379.     secondsToWait = ( level.sideBetEndTime - GetTime() ) / 1000.0;
  380.     if ( secondsToWait < 0 )
  381.         secondsToWait = 0;
  382.     wait( secondsToWait );
  383.     for ( playerIndex = 0 ; playerIndex < level.players.size ; playerIndex++ )
  384.     {
  385.         if ( isDefined( level.players[playerIndex] ) )
  386.             level.players[playerIndex] closeMenu();
  387.     }
  388.     level notify ( "side_bet_end" );
  389. }
  390. SideBetAllBetsPlaced()
  391. {
  392.     secondsLeft = ( level.sideBetEndTime - GetTime() ) / 1000.0;
  393.     if( secondsLeft <= 3.0 )
  394.         return;
  395.     level.sideBetEndTime = GetTime() + 3000;
  396.     for ( playerIndex = 0 ; playerIndex < level.players.size ; playerIndex++ )
  397.     {
  398.         player = level.players[ playerIndex ];
  399.         if( !isDefined( player ) )
  400.             continue;
  401.        
  402.         player setClientDvar( "sidebet_endTime", level.sideBetEndTime );
  403.     }
  404.     wait 3;
  405.     for ( playerIndex = 0 ; playerIndex < level.players.size ; playerIndex++ )
  406.     {
  407.         if ( isDefined( level.players[playerIndex] ) )
  408.             level.players[playerIndex] closeMenu();
  409.     }
  410.     level notify ( "side_bet_end" );
  411. }
  412. HandleNewSideBet( player )
  413. {
  414.     if ( isDefined( self.pers["sideBetMade"] ) )
  415.         return;
  416.        
  417.    
  418.     if ( ( !isDefined( self.pers["eliminated"] ) || !self.pers["eliminated"] ) && ( self.name != player.name ) )
  419.         return;
  420.     sideBetAmount = GetDvarInt( #"scr_wagerSideBet" );
  421.     codPointsAfterSideBet = self maps\mp\gametypes\_rank::getCodPointsStat() - sideBetAmount;
  422.     if( codPointsAfterSideBet < 0 )
  423.         return;
  424.        
  425.     self.pers["sideBetMade"] = player.name;
  426.     player.pers["sideBetCount"] += sideBetAmount;
  427.     self maps\mp\gametypes\_rank::setCodPointsStat( codPointsAfterSideBet );
  428.     self.pers["wager_sideBetLosses"] += sideBetAmount;
  429.     lifeTimeBuyin = self maps\mp\gametypes\_persistence::statGet( "LIFETIME_BUYIN" );
  430.     self maps\mp\gametypes\_persistence::setPlayerStat( "PlayerStatsList", "LIFETIME_BUYIN", lifeTimeBuyin + sideBetAmount );
  431.     self addRecentEarningsToStat( 0 - sideBetAmount );
  432.    
  433.     haveAllPlacedSideBets = true;
  434.     for ( playerIndex = 0 ; playerIndex < level.players.size ; playerIndex++ )
  435.     {
  436.         otherPlayer = level.players[ playerIndex ];
  437.         if( !isDefined( otherPlayer ) )
  438.             continue;
  439.         otherPlayer setClientDvar( "sidebet_p"+player.sideBetNumber+"_bets", player.pers["sideBetCount"] );
  440.         codPoints = otherPlayer maps\mp\gametypes\_rank::getCodPointsStat();
  441.         if( !isDefined( otherPlayer.pers["sideBetMade"] ) && codPoints >= sideBetAmount )
  442.         {
  443.             haveAllPlacedSideBets = false;
  444.         }
  445.     }
  446.     if( haveAllPlacedSideBets )
  447.     {
  448.         thread SideBetAllBetsPlaced();
  449.     }
  450. }
  451. setupBlankRandomPlayer( takeWeapons, chooseRandomBody )
  452. {
  453.     if ( !IsDefined( chooseRandomBody ) || chooseRandomBody )
  454.     {
  455.         if ( !IsDefined( self.pers["wagerBodyAssigned"] ) )
  456.         {
  457.             self assignRandomBody();
  458.             self.pers["wagerBodyAssigned"] = true;
  459.         }
  460.         self maps\mp\gametypes\_armor::set_player_model();
  461.     }
  462.    
  463.     self clearPerks();
  464.     self.killstreak = [];
  465.     self.pers["killstreaks"] = [];
  466.     self.pers["killstreak_has_been_used"] = [];
  467.     self.pers["killstreak_unique_id"] = [];
  468.     if ( !IsDefined( takeWeapons ) || takeWeapons )
  469.         self takeAllWeapons();
  470.        
  471.     if ( IsDefined( self.pers["hasRadar"] ) && self.pers["hasRadar"] )
  472.         self.hasSpyplane = true;
  473.    
  474.     if ( IsDefined( self.powerups ) && IsDefined( self.powerups.size ) )
  475.     {
  476.         for ( i = 0 ; i < self.powerups.size ; i++ )
  477.             self applyPowerup( self.powerups[i] );
  478.     }
  479.    
  480.     self setRadarVisibility();
  481. }
  482. assignRandomBody()
  483. {
  484.     self.cac_body_type = random( GetArrayKeys( level.cac_functions[ "set_body_model" ] ) );
  485.     self.cac_head_type = self maps\mp\gametypes\_armor::get_default_head();
  486.     self.cac_hat_type = "none";
  487. }
  488. queueWagerPopup( message, points, subMessage, announcement )
  489. {
  490.     self endon("disconnect");
  491.     size = self.wagerNotifyQueue.size;
  492.     self.wagerNotifyQueue[size] = spawnstruct();
  493.     self.wagerNotifyQueue[size].message = message;
  494.     self.wagerNotifyQueue[size].points = points;
  495.     self.wagerNotifyQueue[size].subMessage = subMessage;
  496.     self.wagerNotifyQueue[size].announcement = announcement;
  497.    
  498.     self notify( "received award" );
  499. }
  500. helpGameEnd()
  501. {
  502.     level endon( "game_ended" );
  503.    
  504.     for ( ;; )
  505.     {
  506.         level waittill( "player_eliminated" );
  507.        
  508.         if ( !IsDefined( level.numLives ) || !level.numLives )
  509.             continue;
  510.        
  511.         wait 0.05;
  512.    
  513.         players = level.players;
  514.         playersLeft = 0;
  515.         for ( i = 0 ; i < players.size ; i++ )
  516.         {
  517.             if ( !players[i] isdemoclient() && IsDefined( players[i].pers["lives"] ) && ( players[i].pers["lives"] > 0 ) )
  518.             {
  519.                 playersLeft++;
  520.             }
  521.         }
  522.        
  523.         if ( playersLeft == 2 )
  524.         {
  525.             for ( i = 0 ; i < players.size ; i++ )
  526.             {
  527.                 players[i] queueWagerPopup( &"MP_HEADS_UP", 0, &"MP_U2_ONLINE", "wm_u2_online" );
  528.                 players[i].pers["hasRadar"] = true;
  529.                 players[i].hasSpyplane = true;
  530.                 level.activeUAVs[players[i] getEntityNumber()]++;
  531.             }
  532.         }
  533.     }
  534. }
  535. setRadarVisibility()
  536. {
  537.     prevScorePlace = self.prevScorePlace;
  538.     if ( !IsDefined( prevScorePlace ) )
  539.         prevScorePlace = 1;
  540.     if ( IsDefined( level.inTheMoneyOnRadar ) && level.inTheMoneyOnRadar )
  541.     {
  542.         if ( prevScorePlace <= 3 && IsDefined( self.score ) && ( self.score > 0 ) )
  543.             self unsetPerk( "specialty_gpsjammer" );
  544.         else
  545.             self setPerk( "specialty_gpsjammer" );
  546.     }      
  547.     else if ( IsDefined( level.firstPlaceOnRadar ) && level.firstPlaceOnRadar )
  548.     {
  549.         if ( prevScorePlace == 1 && IsDefined( self.score ) && ( self.score > 0 ) )
  550.             self unsetPerk( "specialty_gpsjammer" );
  551.         else
  552.             self setPerk( "specialty_gpsjammer" );
  553.     }
  554. }
  555. playerScored()
  556. {
  557.     self notify( "wager_player_scored" );
  558.     self endon( "wager_player_scored" );
  559.    
  560.     wait( 0.05 );
  561.    
  562.     maps\mp\gametypes\_globallogic::updatePlacement();
  563.     for ( i = 0 ; i < level.placement["all"].size ; i++ )
  564.     {
  565.         prevScorePlace = level.placement["all"][i].prevScorePlace;
  566.         if ( !IsDefined( prevScorePlace ) )
  567.             prevScorePlace = 1;
  568.         currentScorePlace = i + 1;
  569.         for ( j = i - 1 ; j >= 0 ; j-- )
  570.         {
  571.             if ( level.placement["all"][i].score == level.placement["all"][j].score )
  572.                 currentScorePlace--;
  573.         }
  574.         wasInTheMoney = ( prevScorePlace <= 3 );
  575.         isInTheMoney = ( currentScorePlace <= 3 );
  576.        
  577.         if ( !wasInTheMoney && isInTheMoney )
  578.         {
  579.             level.placement["all"][i] wagerAnnouncer( "wm_in_the_money" );
  580.         }
  581.         else if ( wasInTheMoney && !isInTheMoney )
  582.         {
  583.             level.placement["all"][i] wagerAnnouncer( "wm_oot_money" );
  584.         }
  585.         level.placement["all"][i].prevScorePlace = currentScorePlace;
  586.         level.placement["all"][i] setRadarVisibility();
  587.     }
  588. }
  589. wagerAnnouncer( dialog, group )
  590. {
  591.     self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( dialog, group );
  592. }
  593. createPowerup( name, type, displayName, iconMaterial )
  594. {
  595.     powerup = spawnstruct();
  596.     powerup.name = [];
  597.     powerup.name[0] = name;
  598.     powerup.type = type;
  599.     powerup.displayName = displayName;
  600.     powerup.iconMaterial = iconMaterial;
  601.    
  602.     return powerup;
  603. }
  604. addPowerup( name, type, displayName, iconMaterial )
  605. {
  606.     if ( !isDefined( level.powerupList ) )
  607.         level.powerupList = [];
  608.        
  609.     for ( i = 0 ; i < level.powerupList.size ; i++ )
  610.     {
  611.         if ( level.powerupList[i].displayName == displayName )
  612.         {
  613.             level.powerupList[i].name[level.powerupList[i].name.size] = name;
  614.             return;
  615.         }
  616.     }
  617.        
  618.     powerup = createPowerup( name, type, displayName, iconMaterial );
  619.    
  620.     level.powerupList[level.powerupList.size] = powerup;
  621. }
  622. copyPowerup( powerup )
  623. {
  624.     return createPowerup( powerup.name[0], powerup.type, powerup.displayName, powerup.iconMaterial );
  625. }
  626. applyPowerup( powerup )
  627. {
  628.     switch ( powerup.type )
  629.     {
  630.         case "primary":
  631.             self giveWeapon( powerup.name[0] );
  632.             self switchToWeapon( powerup.name[0] );
  633.             break;
  634.            
  635.         case "secondary":
  636.             self giveWeapon( powerup.name[0] );
  637.             break;
  638.            
  639.         case "equipment":
  640.             self GiveWeapon( powerup.name[0] );
  641.             self maps\mp\gametypes\_class::setWeaponAmmoOverall( powerup.name[0], 1 );
  642.             self SetActionSlot( 1, "weapon", powerup.name[0] );
  643.             break;
  644.        
  645.         case "primary_grenade":
  646.             self setOffhandPrimaryClass( powerup.name[0] );
  647.             self giveWeapon( powerup.name[0] );
  648.             self setWeaponAmmoClip( powerup.name[0], 2 );
  649.             break;
  650.            
  651.         case "secondary_grenade":
  652.             self setOffhandSecondaryClass( powerup.name[0] );
  653.             self giveWeapon( powerup.name[0] );
  654.             self setWeaponAmmoClip( powerup.name[0], 2 );
  655.             break;
  656.            
  657.         case "perk":
  658.             for ( i = 0 ; i < powerup.name.size ; i++ )
  659.                 self setPerk( powerup.name[i] );
  660.             break;
  661.            
  662.         case "killstreak":
  663.             self maps\mp\gametypes\_hardpoints::giveKillstreak( powerup.name[0] );
  664.             break;
  665.            
  666.         case "score_multiplier":
  667.             self.scoreMultiplier = powerup.name[0];
  668.             break;
  669.     }
  670. }
  671. givePowerup( powerup, doAnimation )
  672. {
  673.     if ( !isDefined( self.powerups ) )
  674.         self.powerups = [];
  675.        
  676.     powerupIndex = self.powerups.size;
  677.     self.powerups[powerupIndex] = copyPowerup( powerup );
  678.     for ( i = 0 ; i < powerup.name.size ; i++ )
  679.     {
  680.         self.powerups[powerupIndex].name[self.powerups[powerupIndex].name.size] = powerup.name[i];
  681.     }
  682.    
  683.     self applyPowerup( self.powerups[powerupIndex] );
  684.    
  685.     self thread showPowerupMessage( powerupIndex, doAnimation );
  686. }
  687. pulsePowerupIcon( powerupIndex )
  688. {  
  689.     if ( !IsDefined( self ) || !IsDefined( self.powerups ) || !IsDefined( self.powerups[powerupIndex] ) || !IsDefined( self.powerups[powerupIndex].hud_elem_icon ) )
  690.         return;
  691.        
  692.     self endon( "disconnect" );
  693.     self endon( "delete" );
  694.     self endon( "clearing_powerups" );
  695.     pulsePercent = 1.5;
  696.     pulseTime = 0.5;
  697.    
  698.     hud_elem = self.powerups[powerupIndex].hud_elem_icon;
  699.     if ( IsDefined( hud_elem.animating ) && hud_elem.animating )
  700.         return;
  701.     origX = hud_elem.x;
  702.     origY = hud_elem.y;
  703.     origWidth = hud_elem.width;
  704.     origHeight = hud_elem.height;
  705.     bigWidth = origWidth * pulsePercent;
  706.     bigHeight = origHeight * pulsePercent;
  707.     xOffset = ( bigWidth - origWidth ) / 2;
  708.     yOffset = ( bigHeight - origHeight ) / 2;
  709.     hud_elem ScaleOverTime( 0.05, int( bigWidth ), int( bigHeight ) );
  710.     hud_elem MoveOverTime( 0.05 );
  711.     hud_elem.x = origX - xOffset;
  712.     hud_elem.y = origY - yOffset;
  713.     wait 0.05;
  714.     hud_elem ScaleOverTime( pulseTime, origWidth, origHeight );
  715.     hud_elem MoveOverTime( pulseTime );
  716.     hud_elem.x = origX;
  717.     hud_elem.y = origY;
  718. }
  719. showPowerupMessage( powerupIndex, doAnimation )
  720. {
  721.     self endon( "disconnect" );
  722.     self endon( "delete" );
  723.     self endon( "clearing_powerups" );
  724.    
  725.     if ( !IsDefined( doAnimation ) )
  726.         doAnimation = true;
  727.        
  728.     wasInPrematch = level.inPrematchPeriod;
  729.    
  730.     powerupStartY = 280;
  731.     powerupSpacing = 40;
  732.     if ( self IsSplitscreen() )
  733.     {
  734.         powerupStartY = 120;
  735.         powerupSpacing = 35;
  736.     }
  737.    
  738.    
  739.     if ( IsDefined( self.powerups[powerupIndex].hud_elem ) )
  740.         self.powerups[powerupIndex].hud_elem destroy();
  741.     self.powerups[powerupIndex].hud_elem = NewClientHudElem( self );
  742.     self.powerups[powerupIndex].hud_elem.fontScale = 1.5;
  743.    
  744.     self.powerups[powerupIndex].hud_elem.x = -125;
  745.     self.powerups[powerupIndex].hud_elem.y = powerupStartY - powerupSpacing * powerupIndex;
  746.     self.powerups[powerupIndex].hud_elem.alignX = "left";
  747.     self.powerups[powerupIndex].hud_elem.alignY = "middle";
  748.     self.powerups[powerupIndex].hud_elem.horzAlign = "user_right";
  749.     self.powerups[powerupIndex].hud_elem.vertAlign = "user_top";
  750.     self.powerups[powerupIndex].hud_elem.color = ( 1, 1, 1 );
  751.     self.powerups[powerupIndex].hud_elem.foreground = true;
  752.     self.powerups[powerupIndex].hud_elem.hidewhendead = false;
  753.     self.powerups[powerupIndex].hud_elem.hidewheninmenu = true;
  754.     self.powerups[powerupIndex].hud_elem.hidewheninkillcam = true;
  755.     self.powerups[powerupIndex].hud_elem.archived = false;
  756.     self.powerups[powerupIndex].hud_elem.alpha = 0.0;
  757.     self.powerups[powerupIndex].hud_elem SetText( self.powerups[powerupIndex].displayName );
  758.    
  759.    
  760.    
  761.     bigIconSize = 40;
  762.     iconSize = 32;
  763.     if ( IsDefined( self.powerups[powerupIndex].hud_elem_icon ) )
  764.         self.powerups[powerupIndex].hud_elem_icon destroy();
  765.     if ( doAnimation )
  766.     {
  767.         self.powerups[powerupIndex].hud_elem_icon = self createIcon( self.powerups[powerupIndex].iconMaterial, bigIconSize, bigIconSize );
  768.         self.powerups[powerupIndex].hud_elem_icon.animating = true;
  769.     }
  770.     else
  771.         self.powerups[powerupIndex].hud_elem_icon = self createIcon( self.powerups[powerupIndex].iconMaterial, iconSize, iconSize );
  772.    
  773.     self.powerups[powerupIndex].hud_elem_icon.x = self.powerups[powerupIndex].hud_elem.x - 5 - iconSize / 2 - bigIconSize / 2;
  774.     self.powerups[powerupIndex].hud_elem_icon.y = powerupStartY - powerupSpacing * powerupIndex - bigIconSize / 2;
  775.     self.powerups[powerupIndex].hud_elem_icon.horzAlign = "user_right";
  776.     self.powerups[powerupIndex].hud_elem_icon.vertAlign = "user_top";
  777.     self.powerups[powerupIndex].hud_elem_icon.color = ( 1, 1, 1 );
  778.     self.powerups[powerupIndex].hud_elem_icon.foreground = true;
  779.     self.powerups[powerupIndex].hud_elem_icon.hidewhendead = false;
  780.     self.powerups[powerupIndex].hud_elem_icon.hidewheninmenu = true;
  781.     self.powerups[powerupIndex].hud_elem_icon.hidewheninkillcam = true;
  782.     self.powerups[powerupIndex].hud_elem_icon.archived = false;
  783.     self.powerups[powerupIndex].hud_elem_icon.alpha = 1.0;
  784.    
  785.     if ( !wasInPrematch && doAnimation )
  786.         self thread queueWagerPopup( self.powerups[powerupIndex].displayName, 0, &"MP_BONUS_ACQUIRED" );
  787.    
  788.     pulseTime = 0.5;
  789.     if ( doAnimation )
  790.     {
  791.         self.powerups[powerupIndex].hud_elem FadeOverTime( pulseTime );
  792.         self.powerups[powerupIndex].hud_elem_icon ScaleOverTime( pulseTime, iconSize, iconSize );
  793.         self.powerups[powerupIndex].hud_elem_icon.width = iconSize;
  794.         self.powerups[powerupIndex].hud_elem_icon.height = iconSize;
  795.         self.powerups[powerupIndex].hud_elem_icon MoveOverTime( pulseTime );
  796.     }
  797.    
  798.     self.powerups[powerupIndex].hud_elem.alpha = 1.0;
  799.     self.powerups[powerupIndex].hud_elem_icon.x = self.powerups[powerupIndex].hud_elem.x - 5 - iconSize;
  800.     self.powerups[powerupIndex].hud_elem_icon.y = powerupStartY - powerupSpacing * powerupIndex - iconSize / 2;
  801.    
  802.     if ( doAnimation )
  803.     {
  804.         wait( pulseTime );
  805.     }
  806.    
  807.     if ( level.inPrematchPeriod )
  808.     {
  809.         level waittill( "prematch_over" );
  810.     }
  811.     else if ( doAnimation )
  812.     {
  813.         wait ( pulseTime );
  814.     }
  815.    
  816.     if ( wasInPrematch && doAnimation )
  817.         self thread queueWagerPopup( self.powerups[powerupIndex].displayName, 0, &"MP_BONUS_ACQUIRED" );
  818.    
  819.     wait ( 5.0 );
  820.     for ( i = 0 ; i <= powerupIndex ; i++ )
  821.     {
  822.         self.powerups[i].hud_elem FadeOverTime( 0.25 );
  823.         self.powerups[i].hud_elem.alpha = 0;
  824.     }
  825.    
  826.     wait ( 0.25 );
  827.     for ( i = 0 ; i <= powerupIndex ; i++ )
  828.     {
  829.         self.powerups[i].hud_elem_icon MoveOverTime( 0.25 );
  830.         self.powerups[i].hud_elem_icon.x = 0 - iconSize;
  831.         self.powerups[i].hud_elem_icon.horzAlign = "user_right";
  832.     }
  833.    
  834.     self.powerups[powerupIndex].hud_elem_icon.animating = false;
  835. }
  836. clearPowerups()
  837. {
  838.     self notify( "clearing_powerups" );
  839.     if ( IsDefined( self.powerups ) && IsDefined( self.powerups.size ) )
  840.     {
  841.         for ( i = 0 ; i < self.powerups.size ; i++ )
  842.         {
  843.             if ( IsDefined( self.powerups[i].hud_elem ) )
  844.                 self.powerups[i].hud_elem destroy();
  845.             if ( IsDefined( self.powerups[i].hud_elem_icon ) )
  846.                 self.powerups[i].hud_elem_icon destroy();
  847.         }
  848.     }
  849.     self.powerups = [];
  850. }
  851. trackWagerWeaponUsage( name, incValue, statName )
  852. {  
  853.     if ( !IsDefined( self.wagerWeaponUsage ) )
  854.         self.wagerWeaponUsage = [];
  855.    
  856.     if ( !IsDefined( self.wagerWeaponUsage[name] ) )
  857.         self.wagerWeaponUsage[name] = [];
  858.        
  859.     if ( !IsDefined( self.wagerWeaponUsage[name][statName] ) )
  860.         self.wagerWeaponUsage[name][statName] = 0;
  861.        
  862.     self.wagerWeaponUsage[name][statName] += incValue;
  863. }
  864. getHighestWagerWeaponUsage( statName )
  865. {
  866.     if ( !IsDefined( self.wagerWeaponUsage ) )
  867.         return undefined;
  868.    
  869.     bestWeapon = undefined;
  870.     highestValue = 0;
  871.    
  872.     wagerWeaponsUsed = GetArrayKeys( self.wagerWeaponUsage );
  873.     for ( i = 0 ; i < wagerWeaponsUsed.size ; i++ )
  874.     {
  875.         weaponStats = self.wagerWeaponUsage[wagerWeaponsUsed[i]];
  876.         if ( !IsDefined( weaponStats[statName] ) || !GetBaseWeaponItemIndex( wagerWeaponsUsed[i] ) )
  877.             continue;
  878.         else if ( !IsDefined( bestWeapon ) || ( weaponStats[statName] > highestValue ) )
  879.         {
  880.             bestWeapon = wagerWeaponsUsed[i];
  881.             highestValue = weaponStats[statName];
  882.         }
  883.     }
  884.    
  885.     return bestWeapon;
  886. }
  887. setWagerAfterActionReportStats()
  888. {      
  889.     topWeapon = self getHighestWagerWeaponUsage( "kills" );
  890.     topKills = 0;
  891.     if ( IsDefined( topWeapon ) )
  892.         topKills = self.wagerWeaponusage[topWeapon]["kills"];
  893.     else
  894.         topWeapon = self getHighestWagerWeaponUsage( "timeUsed" );
  895.    
  896.     if ( !IsDefined( topWeapon ) )
  897.         topWeapon = "";
  898.        
  899.     self maps\mp\gametypes\_persistence::setAfterActionReportStat( "topWeaponItemIndex", GetBaseWeaponItemIndex( topWeapon ) );
  900.     self maps\mp\gametypes\_persistence::setAfterActionReportStat( "topWeaponKills", topKills );
  901.    
  902.     if ( IsDefined( level.onWagerAwards ) )
  903.         self [[level.onWagerAwards]]();
  904.     else
  905.     {
  906.         for ( i = 0 ; i < 3 ; i++ )
  907.             self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerAwards", 0, i );
  908.     }
  909. }
Add Comment
Please, Sign In to add comment