‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_wager.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 #using scripts\shared\callbacks_shared;
3 #using scripts\shared\hud_util_shared;
4 #using scripts\shared\persistence_shared;
5 #using scripts\shared\rank_shared;
6 #using scripts\shared\system_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\mp\gametypes\_globallogic;
11 #using scripts\mp\gametypes\_globallogic_audio;
12 #using scripts\mp\gametypes\_globallogic_score;
13 #using scripts\mp\gametypes\_loadout;
14 
15 #using scripts\mp\_util;
16 #using scripts\mp\killstreaks\_killstreaks;
17 #using scripts\mp\teams\_teams;
18 
19 #precache( "string", "MP_HEADS_UP" );
20 #precache( "string", "MP_U2_ONLINE" );
21 #precache( "string", "MP_BONUS_ACQUIRED" );
22 
23 #namespace wager;
24 
25 ‪REGISTER_SYSTEM( "wager", &‪__init__, undefined )
26 
27 function ‪__init__()
28 {
30 }
31 
32 function ‪init()
33 {
34  if ( GameModeIsMode( ‪GAMEMODE_WAGER_MATCH ) )
35  {
36  level.wagerMatch = 1;
37 
38  if( !isdefined( game["wager_pot"] ) )
39  {
40  game["wager_pot"] = 0;
41  game["wager_initial_pot"] = 0;
42  }
43 
44  game["dialog"]["wm_u2_online"] = "boost_gen_02";
45  game["dialog"]["wm_in_the_money"] = "boost_gen_06";
46  game["dialog"]["wm_oot_money"] = "boost_gen_07";
47 
48  level.powerupList = [];
49 
52  level thread ‪help_game_end();
53  }
54  else
55  {
56  level.wagerMatch = 0;
57  }
58 
59  level.takeLivesOnDeath = true;
60 }
61 
62 function ‪init_player()
63 {
64  self endon( "disconnect" );
65 
66  if( !isdefined( self.pers["wager"] ) )
67  {
68  self.pers["wager"] = true;
69  self.pers["wager_sideBetWinnings"] = 0;
70  self.pers["wager_sideBetLosses"] = 0;
71  }
72 
73  if ( ( isdefined( level.inTheMoneyOnRadar ) && level.inTheMoneyOnRadar ) || ( isdefined( level.firstPlaceOnRadar ) && level.firstPlaceOnRadar ) )
74  {
75  self.pers["hasRadar"] = true;
76  self.hasSpyplane = true;
77  }
78  else
79  {
80  self.pers["hasRadar"] = false;
81  self.hasSpyplane = false;
82  }
83 
84  self thread ‪deduct_player_ante();
85 }
86 
87 
88 function ‪on_disconnect()
89 {
90  level endon ( "game_ended" );
91  self endon ( "player_eliminated" );
92 
93  level notify( "player_eliminated" );
94 }
95 
96 
98 {
99  if( isdefined( self.pers["hasPaidWagerAnte"] ) )
100  {
101  return;
102  }
103 
104  waittillframeend;
105 
106  codPoints = self ‪rank::getCodPointsStat();
107  wagerBet = GetDvarint( "scr_wagerBet" );
108  if( wagerBet > codPoints )
109  {
110  // This should technically never happen since we boot any player with insufficient
111  // funds but it is here to make sure you can never get negative CodPoints.
112  wagerBet = codPoints;
113  }
114  codPoints -= wagerBet;
115  self ‪rank::setCodPointsStat( codPoints );
116  if ( !self IsLocalToHost() )
117  {
118  self ‪increment_escrow_for_player( wagerBet );
119  }
120  game["wager_pot"] += wagerBet;
121  game["wager_initial_pot"] += wagerBet;
122 
123  self.pers["hasPaidWagerAnte"] = true;
124 
125  self AddPlayerStat( "LIFETIME_BUYIN", wagerBet );
126 
127  self ‪add_recent_earnings_to_stat( 0 - wagerBet );
128 
129  if( isdefined( level.onWagerPlayerAnte ) )
130  {
131  [[level.onWagerPlayerAnte]]( self, wagerBet );
132  }
133 
134  self thread ‪persistence::upload_stats_soon();
135 }
136 
138 {
139  if ( !isdefined( self ) || !IsPlayer( self ) )
140  {
141  return;
142  }
143 
144  if ( !isdefined( game["escrows"] ) )
145  {
146  game["escrows"] = [];
147  }
148 
149  playerXUID = self GetXUID();
150  if ( !isdefined( playerXUID ) )
151  {
152  return;
153  }
154 
155  escrowStruct = SpawnStruct();
156  escrowStruct.xuid = playerXUID;
157  escrowStruct.amount = amount;
158  game["escrows"][game["escrows"].size] = escrowStruct;
159 }
160 
162 {
163  if ( !isdefined( game["escrows"] ) )
164  {
165  return;
166  }
167 
168  escrows = game["escrows"];
169  numEscrows = escrows.size;
170  for ( i = 0 ; i < numEscrows ; i++ )
171  {
172  escrowStruct = escrows[i];
173  }
174  game["escrows"] = [];
175 }
176 
177 function ‪add_recent_earnings_to_stat( recentEarnings )
178 {
179  currEarnings = self ‪persistence::get_recent_stat( true, 0, "score" );
180  self ‪persistence::set_recent_stat( true, 0, "score", currEarnings + recentEarnings );
181 }
182 
184 {
185  if ( !level.wagerMatch )
186  {
187  return;
188  }
189 }
190 
192 {
193  if ( level.wagerMatch == 0 )
194  {
195  return;
196  }
197 
199  if( isdefined( level.onWagerFinalizeRound ) )
200  {
201  [[level.onWagerFinalizeRound]]();
202  }
203 }
204 
206 {
207  shouldCalculateWinnings = !isdefined( level.dontCalcWagerWinnings ) || !level.dontCalcWagerWinnings;
208  if( !shouldCalculateWinnings )
209  {
210  return;
211  }
212 
213  if( !level.teamBased )
214  {
216  }
217  else
218  {
220  }
221 }
222 
224 {
225  playerRankings = level.placement["all"];
226  payoutPercentages = ‪array( 0.5, 0.3, 0.2 );
227  if( playerRankings.size == 2 )
228  {
229  payoutPercentages = ‪array( 0.7, 0.3 );
230  }
231  else if( playerRankings.size == 1 )
232  {
233  payoutPercentages = ‪array( 1.0 );
234  }
235 
236  ‪set_winnings_on_players( level.players, 0 );
237 
238  // If host quit and host migration failed give everyone except the host their money back
239  if ( isdefined( level.hostForcedEnd ) && level.hostForcedEnd )
240  {
241  wagerBet = GetDvarint( "scr_wagerBet" );
242  for ( i = 0 ; i < playerRankings.size ; i++ )
243  {
244  if ( !playerRankings[i] IsLocalToHost() )
245  playerRankings[i].wagerWinnings = wagerBet;
246  }
247  }
248  // If host is the only one left in the game, no one gets anything (other players will get their money back later)
249  else if ( level.players.size == 1 )
250  {
251  game["escrows"] = undefined;
252  return;
253  }
254  else
255  {
256  currentPayoutPercentage = 0;
257  cumulativePayoutPercentage = payoutPercentages[0];
258  playerGroup = [];
259  playerGroup[playerGroup.size] = playerRankings[0];
260  for ( i = 1 ; i < playerRankings.size ; i++ )
261  {
262  if ( playerRankings[i].pers["score"] < playerGroup[0].pers["score"] )
263  {
264  ‪set_winnings_on_players( playerGroup, int( game["wager_pot"] * cumulativePayoutPercentage / playerGroup.size ) );
265  playerGroup = [];
266  cumulativePayoutPercentage = 0;
267  }
268  playerGroup[playerGroup.size] = playerRankings[i];
269  currentPayoutPercentage++;
270  if ( isdefined( payoutPercentages[currentPayoutPercentage] ) )
271  {
272  cumulativePayoutPercentage += payoutPercentages[currentPayoutPercentage];
273  }
274  }
275  ‪set_winnings_on_players( playerGroup, int( game["wager_pot"] * cumulativePayoutPercentage / playerGroup.size ) );
276  }
277 }
278 
280 {
281  // Put each player in a bucket for 1st, 2nd, and 3rd based on their score.
282  // eg. if 3 players are tied for first, they will all go in the 0 index bucket.
283  level.playerPlaces = ‪array( [], [], [] );
284 
285  playerRankings = level.placement["all"];
286  placementScores = ‪array( playerRankings[ 0 ].pers["score"], -1, -1 );
287  currentPlace = 0;
288  for ( index = 0 ; index < playerRankings.size && currentPlace < placementScores.size ; index++ )
289  {
290  player = playerRankings[index];
291 
292  if( player.pers["score"] < placementScores[ currentPlace ] )
293  {
294  currentPlace++;
295  if( currentPlace >= level.playerPlaces.size )
296  {
297  break;
298  }
299 
300  placementScores[ currentPlace ] = player.pers["score"];
301  }
302 
303  level.playerPlaces[ currentPlace ][ level.playerPlaces[ currentPlace ].size ] = player;
304  }
305 }
306 
308 {
309  winner = ‪globallogic::determineTeamWinnerByGameStat( "teamScores" );
310  if( winner == "tie" )
311  {
313  return;
314  }
315 
316  playersOnWinningTeam = [];
317  for ( index = 0 ; index < level.players.size ; index++ )
318  {
319  player = level.players[index];
320 
321  player.wagerWinnings = 0;
322  if( player.pers["team"] == winner )
323  {
324  playersOnWinningTeam[ playersOnWinningTeam.size ] = player;
325  }
326  }
327  if( playersOnWinningTeam.size == 0 )
328  {
329  // The winning team has all been disconnected so just refund everyones buyin.
330  ‪set_winnings_on_players( level.players, GetDvarint( "scr_wagerBet" ) );
331  return;
332  }
333  winningsSplit = int( game["wager_pot"] / playersOnWinningTeam.size );
334  ‪set_winnings_on_players( playersOnWinningTeam, winningsSplit );
335 }
336 
337 function ‪set_winnings_on_players( players, amount )
338 {
339  for ( index = 0 ; index < players.size ; index++ )
340  {
341  players[index].wagerWinnings = amount;
342  }
343 }
344 
346 {
347  level.wagerGameFinalized = true;
348  if ( level.wagermatch == 0 )
349  {
350  return;
351  }
352 
355 
356  players = level.players;
357  wait 0.5;
358  playerRankings = level.wagerTopEarners;
359 
360  for ( index = 0 ; index < players.size ; index++ )
361  {
362  player = players[index];
363 
364  if ( isdefined( player.pers["wager_sideBetWinnings"] ) )
365  ‪pay_out_winnings( player, player.wagerWinnings + player.pers["wager_sideBetWinnings"] );
366  else
367  ‪pay_out_winnings( player, player.wagerWinnings );
368 
369  if ( player.wagerWinnings > 0 )
370  {
372  }
373  }
375 }
376 
377 function ‪pay_out_winnings( player, winnings )
378 {
379  if( winnings == 0 )
380  {
381  return;
382  }
383 
384  codPoints = player ‪rank::getCodPointsStat();
385  player ‪rank::setCodPointsStat( codPoints + winnings );
386 
387  player AddPlayerStat( "LIFETIME_EARNINGS", winnings );
388 
389  player ‪add_recent_earnings_to_stat( winnings );
390 }
391 
393 {
394  topWinnings = ‪array( -1, -1, -1 );
395  level.wagerTopEarners = [];
396  for ( index = 0 ; index < level.players.size ; index++ )
397  {
398  player = level.players[ index ];
399  if( !isdefined( player.wagerWinnings ) )
400  {
401  player.wagerWinnings = 0;
402  }
403 
404  if( player.wagerWinnings > topWinnings[ 0 ] )
405  {
406  topWinnings[ 2 ] = topWinnings[ 1 ];
407  topWinnings[ 1 ] = topWinnings[ 0 ];
408  topWinnings[ 0 ] = player.wagerWinnings;
409 
410  level.wagerTopEarners[ 2 ] = level.wagerTopEarners[ 1 ];
411  level.wagerTopEarners[ 1 ] = level.wagerTopEarners[ 0 ];
412  level.wagerTopEarners[ 0 ] = player;
413  }
414  else if( player.wagerWinnings > topWinnings[ 1 ] )
415  {
416  topWinnings[ 2 ] = topWinnings[ 1 ];
417  topWinnings[ 1 ] = player.wagerWinnings;
418 
419  level.wagerTopEarners[ 2 ] = level.wagerTopEarners[ 1 ];
420  level.wagerTopEarners[ 1 ] = player;
421  }
422  else if( player.wagerWinnings > topWinnings[ 2 ] )
423  {
424  topWinnings[ 2 ] = player.wagerWinnings;
425 
426  level.wagerTopEarners[ 2 ] = player;
427  }
428  }
429 }
430 
432 {
433  if ( isdefined( level.sidebet ) && level.sidebet )
434  {
435  level notify( "side_bet_begin" );
436  level waittill( "side_bet_end" );
437  }
438 }
439 
441 {
442  level endon ( "side_bet_end" );
443 
444  secondsToWait = ( level.sideBetEndTime - GetTime() ) / 1000.0;
445  if ( secondsToWait < 0 )
446  {
447  secondsToWait = 0;
448  }
449  wait( secondsToWait );
450  level notify ( "side_bet_end" );
451 }
452 
454 {
455  secondsLeft = ( level.sideBetEndTime - GetTime() ) / 1000.0;
456  if( secondsLeft <= 3.0 )
457  {
458  return;
459  }
460 
461  level.sideBetEndTime = GetTime() + 3000;
462 
463  wait 3;
464  level notify ( "side_bet_end" );
465 }
466 
467 
468 function ‪setup_blank_random_player( takeWeapons, chooseRandomBody, weapon )
469 {
470  if ( !isdefined( chooseRandomBody ) || chooseRandomBody )
471  {
472  if ( !isdefined( self.pers["wagerBodyAssigned"] ) )
473  {
474  self ‪assign_random_body();
475  self.pers["wagerBodyAssigned"] = true;
476  }
477 
478  self ‪teams::set_player_model( self.team, weapon );
479  }
480 
481  self clearPerks();
482  self.killstreak = [];
483  self.pers["killstreaks"] = [];
484  self.pers["killstreak_has_been_used"] = [];
485  self.pers["killstreak_unique_id"] = [];
486  if ( !isdefined( takeWeapons ) || takeWeapons )
487  {
488  self takeAllWeapons();
489  }
490 
491  if ( isdefined( self.pers["hasRadar"] ) && self.pers["hasRadar"] )
492  {
493  self.hasSpyplane = true;
494  }
495 
496  if ( isdefined( self.powerups ) && isdefined( self.powerups.size ) )
497  {
498  for ( i = 0 ; i < self.powerups.size ; i++ )
499  {
500  self ‪apply_powerup( self.powerups[i] );
501  }
502  }
503 
505 }
506 
508 {
509 }
510 
511 function ‪queue_popup( message, points, subMessage, announcement )
512 {
513  self endon("disconnect");
514 
515  size = self.wagerNotifyQueue.size;
516  self.wagerNotifyQueue[size] = spawnstruct();
517  self.wagerNotifyQueue[size].message = message;
518  self.wagerNotifyQueue[size].points = points;
519  self.wagerNotifyQueue[size].subMessage = subMessage;
520  self.wagerNotifyQueue[size].announcement = announcement;
521 
522  self notify( "received award" );
523 }
524 
526 {
527  level endon( "game_ended" );
528 
529  for ( ;; )
530  {
531  level waittill( "player_eliminated" );
532 
533  if ( !isdefined( level.numLives ) || !level.numLives )
534  {
535  continue;
536  }
537 
538  ‪WAIT_SERVER_FRAME; // in case multiple players are eliminated simultaneously
539 
540  players = level.players;
541  playersLeft = 0;
542  for ( i = 0 ; i < players.size ; i++ )
543  {
544  if ( isdefined( players[i].pers["lives"] ) && ( players[i].pers["lives"] > 0 ) )
545  {
546  playersLeft++;
547  }
548  }
549 
550  if ( playersLeft == 2 )
551  {
552  for ( i = 0 ; i < players.size ; i++ )
553  {
554  players[i] ‪queue_popup( &"MP_HEADS_UP", 0, &"MP_U2_ONLINE", "wm_u2_online" );
555  players[i].pers["hasRadar"] = true;
556  players[i].hasSpyplane = true;
557 
558  if ( level.teambased )
559  {
560  assert( isdefined( players[i].team ) );
561  level.activePlayerUAVs[players[i].team]++;
562  }
563  else
564  {
565  level.activePlayerUAVs[players[i] getEntityNumber()]++;
566  }
567 
568  level.activePlayerUAVs[players[i] getEntityNumber()]++;
569  }
570  }
571  }
572 }
573 
575 {
576  prevScorePlace = self.prevScorePlace;
577  if ( !isdefined( prevScorePlace ) )
578  {
579  prevScorePlace = 1;
580  }
581 
582  if ( isdefined( level.inTheMoneyOnRadar ) && level.inTheMoneyOnRadar )
583  {
584  if ( prevScorePlace <= 3 && isdefined( self.score ) && ( self.score > 0 ) )
585  {
586  self unsetPerk( "specialty_gpsjammer" );
587  }
588  else
589  {
590  self setPerk( "specialty_gpsjammer" );
591  }
592  }
593  else if ( isdefined( level.firstPlaceOnRadar ) && level.firstPlaceOnRadar )
594  {
595  if ( prevScorePlace == 1 && isdefined( self.score ) && ( self.score > 0 ) )
596  {
597  self unsetPerk( "specialty_gpsjammer" );
598  }
599  else
600  {
601  self setPerk( "specialty_gpsjammer" );
602  }
603  }
604 }
605 
607 {
608  self notify( "wager_player_scored" );
609  self endon( "wager_player_scored" );
610 
611  ‪WAIT_SERVER_FRAME; // Let other simultaneous sounds play first
612 
614  for ( i = 0 ; i < level.placement["all"].size ; i++ )
615  {
616  prevScorePlace = level.placement["all"][i].prevScorePlace;
617  if ( !isdefined( prevScorePlace ) )
618  {
619  prevScorePlace = 1;
620  }
621  currentScorePlace = i + 1;
622  for ( j = i - 1 ; j >= 0 ; j-- )
623  {
624  if ( level.placement["all"][i].score == level.placement["all"][j].score )
625  {
626  currentScorePlace--;
627  }
628  }
629  wasInTheMoney = ( prevScorePlace <= 3 );
630  isInTheMoney = ( currentScorePlace <= 3 );
631 
632  if ( !wasInTheMoney && isInTheMoney )
633  {
634  level.placement["all"][i] ‪announcer( "wm_in_the_money" );
635  }
636  else if ( wasInTheMoney && !isInTheMoney )
637  {
638  level.placement["all"][i] ‪announcer( "wm_oot_money" );
639  }
640  level.placement["all"][i].prevScorePlace = currentScorePlace;
641  level.placement["all"][i] ‪set_radar_visibility();
642  }
643 }
644 
645 function ‪announcer( dialog, group )
646 {
647  self ‪globallogic_audio::leader_dialog_on_player( dialog, group );
648 }
649 
650 function ‪create_powerup( ‪name, type, displayName, iconMaterial )
651 {
652  powerup = spawnstruct();
653  powerup.name = [];
654  powerup.name[0] = ‪name;
655  powerup.type = type;
656  powerup.displayName = displayName;
657  powerup.iconMaterial = iconMaterial;
658 
659  return powerup;
660 }
661 
662 function ‪add_powerup( ‪name, type, displayName, iconMaterial )
663 {
664  if ( !isdefined( level.powerupList ) )
665  {
666  level.powerupList = [];
667  }
668 
669  for ( i = 0 ; i < level.powerupList.size ; i++ )
670  {
671  if ( level.powerupList[i].displayName == displayName )
672  {
673  level.powerupList[i].name[level.powerupList[i].name.size] = ‪name;
674  return;
675  }
676  }
677 
678  powerup = ‪create_powerup( ‪name, type, displayName, iconMaterial );
679 
680  level.powerupList[level.powerupList.size] = powerup;
681 }
682 
683 function ‪copy_powerup( powerup )
684 {
685  return ‪create_powerup( powerup.name[0], powerup.type, powerup.displayName, powerup.iconMaterial );
686 }
687 
688 function ‪apply_powerup( powerup )
689 {
690  weapon = level.weaponNone;
691  switch ( powerup.type )
692  {
693  case "primary":
694  case "secondary":
695  case "equipment":
696  case "primary_grenade":
697  case "secondary_grenade":
698  weapon = GetWeapon( powerup.name[0] );
699  break;
700  }
701 
702  switch ( powerup.type )
703  {
704  case "primary":
705  self giveWeapon( weapon );
706  self switchToWeapon( weapon );
707  break;
708 
709  case "secondary":
710  self giveWeapon( weapon );
711  break;
712 
713  case "equipment":
714  self GiveWeapon( weapon );
715  self ‪loadout::setWeaponAmmoOverall( weapon, 1 );
716  self SetActionSlot( 1, "weapon", weapon );
717  break;
718 
719  case "primary_grenade":
720  self setOffhandPrimaryClass( weapon );
721  self giveWeapon( weapon );
722  self setWeaponAmmoClip( weapon, 2 );
723  break;
724 
725  case "secondary_grenade":
726  self setOffhandSecondaryClass( weapon );
727  self giveWeapon( weapon );
728  self setWeaponAmmoClip( weapon, 2 );
729  break;
730 
731  case "perk":
732  for ( i = 0 ; i < powerup.name.size ; i++ )
733  self setPerk( powerup.name[i] );
734  break;
735 
736  case "killstreak":
737  self ‪killstreaks::give( powerup.name[0] );
738  break;
739 
740  case "score_multiplier":
741  self.scoreMultiplier = powerup.name[0];
742  break;
743  }
744 }
745 
746 function ‪give_powerup( powerup, doAnimation )
747 {
748  if ( !isdefined( self.powerups ) )
749  {
750  self.powerups = [];
751  }
752 
753  powerupIndex = self.powerups.size;
754  self.powerups[powerupIndex] = ‪copy_powerup( powerup );
755  for ( i = 0 ; i < powerup.name.size ; i++ )
756  {
757  self.powerups[powerupIndex].name[self.powerups[powerupIndex].name.size] = powerup.name[i];
758  }
759 
760  self ‪apply_powerup( self.powerups[powerupIndex] );
761 
762  self thread ‪show_powerup_message( powerupIndex, doAnimation );
763 }
764 
765 function ‪pulse_powerup_icon( powerupIndex )
766 {
767  if ( !isdefined( self ) || !isdefined( self.powerups ) || !isdefined( self.powerups[powerupIndex] ) || !isdefined( self.powerups[powerupIndex].hud_elem_icon ) )
768  {
769  return;
770  }
771 
772  self endon( "disconnect" );
773  self endon( "delete" );
774  self endon( "clearing_powerups" );
775 
776  pulsePercent = 1.5;
777  pulseTime = 0.5;
778 
779  hud_elem = self.powerups[powerupIndex].hud_elem_icon;
780  if ( isdefined( hud_elem.animating ) && hud_elem.animating )
781  {
782  return;
783  }
784 
785  origX = hud_elem.x;
786  origY = hud_elem.y;
787  origWidth = hud_elem.width;
788  origHeight = hud_elem.height;
789  bigWidth = origWidth * pulsePercent;
790  bigHeight = origHeight * pulsePercent;
791  xOffset = ( bigWidth - origWidth ) / 2;
792  yOffset = ( bigHeight - origHeight ) / 2;
793  hud_elem ScaleOverTime( 0.05, int( bigWidth ), int( bigHeight ) );
794  hud_elem MoveOverTime( 0.05 );
795  hud_elem.x = origX - xOffset;
796  hud_elem.y = origY - yOffset;
797 
799 
800  hud_elem ScaleOverTime( pulseTime, origWidth, origHeight );
801  hud_elem MoveOverTime( pulseTime );
802  hud_elem.x = origX;
803  hud_elem.y = origY;
804 }
805 
806 function ‪show_powerup_message( powerupIndex, doAnimation )
807 {
808  self endon( "disconnect" );
809  self endon( "delete" );
810  self endon( "clearing_powerups" );
811 
812  if ( !isdefined( doAnimation ) )
813  {
814  doAnimation = true;
815  }
816 
817  wasInPrematch = level.inPrematchPeriod;
818 
819  powerupStartY = 320;
820  powerupSpacing = 40;
821  if ( self IsSplitscreen() )
822  {
823  powerupStartY = 120;
824  powerupSpacing = 35;
825  }
826 
827  // Text elem
828  if ( isdefined( self.powerups[powerupIndex].hud_elem ) )
829  {
830  self.powerups[powerupIndex].hud_elem ‪destroy();
831  }
832  self.powerups[powerupIndex].hud_elem = NewClientHudElem( self );
833  self.powerups[powerupIndex].hud_elem.fontScale = 1.5;
834 
835  self.powerups[powerupIndex].hud_elem.x = -125;
836  self.powerups[powerupIndex].hud_elem.y = powerupStartY - powerupSpacing * powerupIndex;
837  self.powerups[powerupIndex].hud_elem.alignX = "left";
838  self.powerups[powerupIndex].hud_elem.alignY = "middle";
839  self.powerups[powerupIndex].hud_elem.horzAlign = "user_right";
840  self.powerups[powerupIndex].hud_elem.vertAlign = "user_top";
841  self.powerups[powerupIndex].hud_elem.color = ( 1, 1, 1 );
842 
843  self.powerups[powerupIndex].hud_elem.foreground = true;
844  self.powerups[powerupIndex].hud_elem.hidewhendead = false;
845  self.powerups[powerupIndex].hud_elem.hidewheninmenu = true;
846  self.powerups[powerupIndex].hud_elem.hidewheninkillcam = true;
847  self.powerups[powerupIndex].hud_elem.archived = false;
848  self.powerups[powerupIndex].hud_elem.alpha = 0.0;
849  self.powerups[powerupIndex].hud_elem SetText( self.powerups[powerupIndex].displayName );
850 
851  // Icon elem
852 
853  bigIconSize = 40;
854  iconSize = 32;
855  if ( isdefined( self.powerups[powerupIndex].hud_elem_icon ) )
856  {
857  self.powerups[powerupIndex].hud_elem_icon ‪destroy();
858  }
859  if ( doAnimation )
860  {
861  self.powerups[powerupIndex].hud_elem_icon = self ‪hud::createIcon( self.powerups[powerupIndex].iconMaterial, bigIconSize, bigIconSize );
862  self.powerups[powerupIndex].hud_elem_icon.animating = true;
863  }
864  else
865  {
866  self.powerups[powerupIndex].hud_elem_icon = self ‪hud::createIcon( self.powerups[powerupIndex].iconMaterial, iconSize, iconSize );
867  }
868 
869  self.powerups[powerupIndex].hud_elem_icon.x = self.powerups[powerupIndex].hud_elem.x - 5 - iconSize / 2 - bigIconSize / 2;
870  self.powerups[powerupIndex].hud_elem_icon.y = powerupStartY - powerupSpacing * powerupIndex - bigIconSize / 2;
871  self.powerups[powerupIndex].hud_elem_icon.horzAlign = "user_right";
872  self.powerups[powerupIndex].hud_elem_icon.vertAlign = "user_top";
873  self.powerups[powerupIndex].hud_elem_icon.color = ( 1, 1, 1 );
874 
875  self.powerups[powerupIndex].hud_elem_icon.foreground = true;
876  self.powerups[powerupIndex].hud_elem_icon.hidewhendead = false;
877  self.powerups[powerupIndex].hud_elem_icon.hidewheninmenu = true;
878  self.powerups[powerupIndex].hud_elem_icon.hidewheninkillcam = true;
879  self.powerups[powerupIndex].hud_elem_icon.archived = false;
880  self.powerups[powerupIndex].hud_elem_icon.alpha = 1.0;
881 
882  if ( !wasInPrematch && doAnimation )
883  {
884  self thread ‪queue_popup( self.powerups[powerupIndex].displayName, 0, &"MP_BONUS_ACQUIRED" );
885  }
886 
887  pulseTime = 0.5;
888  if ( doAnimation )
889  {
890  self.powerups[powerupIndex].hud_elem FadeOverTime( pulseTime );
891  self.powerups[powerupIndex].hud_elem_icon ScaleOverTime( pulseTime, iconSize, iconSize );
892  self.powerups[powerupIndex].hud_elem_icon.width = iconSize;
893  self.powerups[powerupIndex].hud_elem_icon.height = iconSize;
894  self.powerups[powerupIndex].hud_elem_icon MoveOverTime( pulseTime );
895  }
896 
897  self.powerups[powerupIndex].hud_elem.alpha = 1.0;
898  self.powerups[powerupIndex].hud_elem_icon.x = self.powerups[powerupIndex].hud_elem.x - 5 - iconSize;
899  self.powerups[powerupIndex].hud_elem_icon.y = powerupStartY - powerupSpacing * powerupIndex - iconSize / 2;
900 
901  if ( doAnimation )
902  {
903  wait( pulseTime );
904  }
905 
906  if ( level.inPrematchPeriod )
907  {
908  level waittill( "prematch_over" );
909  }
910  else if ( doAnimation )
911  {
912  wait ( pulseTime );
913  }
914 
915  if ( wasInPrematch && doAnimation )
916  {
917  self thread ‪queue_popup( self.powerups[powerupIndex].displayName, 0, &"MP_BONUS_ACQUIRED" );
918  }
919 
920  wait ( 1.5 );
921  for ( i = 0 ; i <= powerupIndex ; i++ )
922  {
923  self.powerups[i].hud_elem FadeOverTime( 0.25 );
924  self.powerups[i].hud_elem.alpha = 0;
925  }
926 
927  wait ( 0.25 );
928  for ( i = 0 ; i <= powerupIndex ; i++ )
929  {
930  self.powerups[i].hud_elem_icon MoveOverTime( 0.25 );
931  self.powerups[i].hud_elem_icon.x = 0 - iconSize;
932  self.powerups[i].hud_elem_icon.horzAlign = "user_right";
933  }
934 
935  self.powerups[powerupIndex].hud_elem_icon.animating = false;
936 }
937 
939 {
940  self notify( "clearing_powerups" );
941  if ( isdefined( self.powerups ) && isdefined( self.powerups.size ) )
942  {
943  for ( i = 0 ; i < self.powerups.size ; i++ )
944  {
945  if ( isdefined( self.powerups[i].hud_elem ) )
946  {
947  self.powerups[i].hud_elem ‪destroy();
948  }
949  if ( isdefined( self.powerups[i].hud_elem_icon ) )
950  {
951  self.powerups[i].hud_elem_icon ‪destroy();
952  }
953  }
954  }
955  self.powerups = [];
956 }
957 
958 function ‪track_weapon_usage( ‪name, incValue, statName )
959 {
960  if ( !isdefined( self.wagerWeaponUsage ) )
961  {
962  self.wagerWeaponUsage = [];
963  }
964 
965  if ( !isdefined( self.wagerWeaponUsage[‪name] ) )
966  {
967  self.wagerWeaponUsage[‪name] = [];
968  }
969 
970  if ( !isdefined( self.wagerWeaponUsage[‪name][statName] ) )
971  {
972  self.wagerWeaponUsage[‪name][statName] = 0;
973  }
974 
975  self.wagerWeaponUsage[‪name][statName] += incValue;
976 }
977 
978 function ‪get_highest_weapon_usage( statName )
979 {
980  if ( !isdefined( self.wagerWeaponUsage ) )
981  {
982  return undefined;
983  }
984 
985  bestWeapon = undefined;
986  highestValue = 0;
987 
988  wagerWeaponsUsed = GetArrayKeys( self.wagerWeaponUsage );
989  for ( i = 0 ; i < wagerWeaponsUsed.size ; i++ )
990  {
991  weaponStats = self.wagerWeaponUsage[wagerWeaponsUsed[i]];
992  if ( !isdefined( weaponStats[statName] ) || !GetBaseWeaponItemIndex( [[ level.get_base_weapon_param ]]( wagerWeaponsUsed[i] ) ) )
993  {
994  continue;
995  }
996  else if ( !isdefined( bestWeapon ) || ( weaponStats[statName] > highestValue ) )
997  {
998  bestWeapon = wagerWeaponsUsed[i];
999  highestValue = weaponStats[statName];
1000  }
1001  }
1002 
1003  return bestWeapon;
1004 }
1005 
1007 {
1008  topWeapon = self ‪get_highest_weapon_usage( "kills" );
1009  topKills = 0;
1010  if ( isdefined( topWeapon ) )
1011  {
1012  topKills = self.wagerWeaponusage[topWeapon]["kills"];
1013  }
1014  else
1015  {
1016  topWeapon = self ‪get_highest_weapon_usage( "timeUsed" );
1017  }
1018 
1019  if ( !isdefined( topWeapon ) )
1020  {
1021  topWeapon = "";
1022  }
1023 
1024  self ‪persistence::set_after_action_report_stat( "topWeaponItemIndex", GetBaseWeaponItemIndex( [[ level.get_base_weapon_param ]]( topWeapon ) ) );
1025  self ‪persistence::set_after_action_report_stat( "topWeaponKills", topKills );
1026 
1027  if ( isdefined( level.onWagerAwards ) )
1028  {
1029  self [[level.onWagerAwards]]();
1030  }
1031  else
1032  {
1033  for ( i = 0 ; i < 3 ; i++ )
1034  {
1035  self ‪persistence::set_after_action_report_stat( "wagerAwards", 0, i );
1036  }
1037  }
1038 }
‪calculate_team_payouts
‪function calculate_team_payouts()
Definition: _wager.gsc:307
‪copy_powerup
‪function copy_powerup(powerup)
Definition: _wager.gsc:683
‪setup_blank_random_player
‪function setup_blank_random_player(takeWeapons, chooseRandomBody, weapon)
Definition: _wager.gsc:468
‪upload_stats_soon
‪function upload_stats_soon()
Definition: persistence_shared.gsc:476
‪updatePlacement
‪function updatePlacement()
Definition: _globallogic.gsc:2692
‪setCodPointsStat
‪function setCodPointsStat(codPoints)
Definition: rank_shared.gsc:380
‪__init__
‪function __init__()
Definition: _wager.gsc:27
‪finalize_round
‪function finalize_round()
Definition: _wager.gsc:191
‪set_after_action_report_stat
‪function set_after_action_report_stat(statName, value, index)
Definition: persistence_shared.gsc:404
‪create_powerup
‪function create_powerup(name, type, displayName, iconMaterial)
Definition: _wager.gsc:650
‪on_start_gametype
‪function on_start_gametype(func, obj)
Definition: callbacks_shared.csc:285
‪init
‪function init()
Definition: _wager.gsc:32
‪getCodPointsStat
‪function getCodPointsStat()
Definition: rank_shared.gsc:367
‪deduct_player_ante
‪function deduct_player_ante()
Definition: _wager.gsc:97
‪on_disconnect
‪function on_disconnect()
Definition: _wager.gsc:88
‪set_radar_visibility
‪function set_radar_visibility()
Definition: _wager.gsc:574
‪side_bet_timer
‪function side_bet_timer()
Definition: _wager.gsc:440
‪show_powerup_message
‪function show_powerup_message(powerupIndex, doAnimation)
Definition: _wager.gsc:806
‪add_recent_earnings_to_stat
‪function add_recent_earnings_to_stat(recentEarnings)
Definition: _wager.gsc:177
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪give_powerup
‪function give_powerup(powerup, doAnimation)
Definition: _wager.gsc:746
‪apply_powerup
‪function apply_powerup(powerup)
Definition: _wager.gsc:688
‪player_scored
‪function player_scored()
Definition: _wager.gsc:606
‪prematch_period
‪function prematch_period()
Definition: _wager.gsc:183
‪calculate_free_for_all_payouts
‪function calculate_free_for_all_payouts()
Definition: _wager.gsc:223
‪clear_powerups
‪function clear_powerups()
Definition: _wager.gsc:938
‪determineTeamWinnerByGameStat
‪function determineTeamWinnerByGameStat(gameStat)
Definition: _globallogic.gsc:578
‪determine_winnings
‪function determine_winnings()
Definition: _wager.gsc:205
‪queue_popup
‪function queue_popup(message, points, subMessage, announcement)
Definition: _wager.gsc:511
‪add_powerup
‪function add_powerup(name, type, displayName, iconMaterial)
Definition: _wager.gsc:662
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪array
‪function filter array
Definition: array_shared.csc:16
‪side_bet_all_bets_placed
‪function side_bet_all_bets_placed()
Definition: _wager.gsc:453
‪announcer
‪function announcer(dialog, group)
Definition: _wager.gsc:645
‪updateWinStats
‪function updateWinStats(winner)
Definition: _globallogic_score.gsc:1051
‪assign_random_body
‪function assign_random_body()
Definition: _wager.gsc:507
‪get_recent_stat
‪function get_recent_stat(isGlobal, index, statName)
Definition: persistence_shared.gsc:270
‪finalize_game
‪function finalize_game()
Definition: _wager.gsc:345
‪GAMEMODE_WAGER_MATCH
‪#define GAMEMODE_WAGER_MATCH
Definition: shared.gsh:13
‪set_recent_stat
‪function set_recent_stat(isGlobal, index, statName, value)
Definition: persistence_shared.gsc:287
‪pay_out_winnings
‪function pay_out_winnings(player, winnings)
Definition: _wager.gsc:377
‪post_round_side_bet
‪function post_round_side_bet()
Definition: _wager.gsc:431
‪set_player_model
‪function set_player_model(team, weapon)
Definition: _teams.gsc:349
‪setWeaponAmmoOverall
‪function setWeaponAmmoOverall(weapon, amount)
Definition: _loadout.gsc:1173
‪destroy
‪function destroy(watcher, owner)
Definition: _decoy.gsc:108
‪set_after_action_report_stats
‪function set_after_action_report_stats()
Definition: _wager.gsc:1006
‪track_weapon_usage
‪function track_weapon_usage(name, incValue, statName)
Definition: _wager.gsc:958
‪get_highest_weapon_usage
‪function get_highest_weapon_usage(statName)
Definition: _wager.gsc:978
‪calculate_places_based_on_score
‪function calculate_places_based_on_score()
Definition: _wager.gsc:279
‪pulse_powerup_icon
‪function pulse_powerup_icon(powerupIndex)
Definition: _wager.gsc:765
‪clear_escrows
‪function clear_escrows()
Definition: _wager.gsc:161
‪give
‪function give(killstreakType, streak, suppressNotification, noXP, toBottom)
Definition: _killstreaks.gsc:539
‪leader_dialog_on_player
‪function leader_dialog_on_player(dialogKey, objectiveKey, killstreakId, dialogBufferKey, introDialog)
Definition: _globallogic_audio.gsc:460
‪set_winnings_on_players
‪function set_winnings_on_players(players, amount)
Definition: _wager.gsc:337
‪name
‪class GroundFx name
‪createIcon
‪function createIcon(shader, width, height)
Definition: hud_util_shared.gsc:417
‪increment_escrow_for_player
‪function increment_escrow_for_player(amount)
Definition: _wager.gsc:137
‪determine_top_earners
‪function determine_top_earners()
Definition: _wager.gsc:392
‪help_game_end
‪function help_game_end()
Definition: _wager.gsc:525
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪init_player
‪function init_player()
Definition: _wager.gsc:62