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;
8 #insert scripts\shared\shared.gsh;
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;
15 #using scripts\mp\_util;
16 #using scripts\mp\killstreaks\_killstreaks;
17 #using scripts\mp\teams\_teams;
19 #precache( "string", "MP_HEADS_UP" );
20 #precache( "string", "MP_U2_ONLINE" );
21 #precache( "string", "MP_BONUS_ACQUIRED" );
38 if( !isdefined( game[
"wager_pot"] ) )
40 game[
"wager_pot"] = 0;
41 game[
"wager_initial_pot"] = 0;
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";
48 level.powerupList = [];
59 level.takeLivesOnDeath =
true;
64 self endon(
"disconnect" );
66 if( !isdefined(
self.pers[
"wager"] ) )
68 self.pers[
"wager"] =
true;
69 self.pers[
"wager_sideBetWinnings"] = 0;
70 self.pers[
"wager_sideBetLosses"] = 0;
73 if ( ( isdefined( level.inTheMoneyOnRadar ) && level.inTheMoneyOnRadar ) || ( isdefined( level.firstPlaceOnRadar ) && level.firstPlaceOnRadar ) )
75 self.pers[
"hasRadar"] =
true;
76 self.hasSpyplane =
true;
80 self.pers[
"hasRadar"] =
false;
81 self.hasSpyplane =
false;
90 level endon (
"game_ended" );
91 self endon (
"player_eliminated" );
93 level notify(
"player_eliminated" );
99 if( isdefined(
self.pers[
"hasPaidWagerAnte"] ) )
107 wagerBet = GetDvarint(
"scr_wagerBet" );
108 if( wagerBet > codPoints )
112 wagerBet = codPoints;
114 codPoints -= wagerBet;
116 if ( !
self IsLocalToHost() )
120 game[
"wager_pot"] += wagerBet;
121 game[
"wager_initial_pot"] += wagerBet;
123 self.pers[
"hasPaidWagerAnte"] =
true;
125 self AddPlayerStat(
"LIFETIME_BUYIN", wagerBet );
129 if( isdefined( level.onWagerPlayerAnte ) )
131 [[level.onWagerPlayerAnte]](
self, wagerBet );
139 if ( !isdefined(
self ) || !IsPlayer(
self ) )
144 if ( !isdefined( game[
"escrows"] ) )
146 game[
"escrows"] = [];
149 playerXUID =
self GetXUID();
150 if ( !isdefined( playerXUID ) )
155 escrowStruct = SpawnStruct();
156 escrowStruct.xuid = playerXUID;
157 escrowStruct.amount = amount;
158 game[
"escrows"][game[
"escrows"].size] = escrowStruct;
163 if ( !isdefined( game[
"escrows"] ) )
168 escrows = game[
"escrows"];
169 numEscrows = escrows.size;
170 for ( i = 0 ; i < numEscrows ; i++ )
172 escrowStruct = escrows[i];
174 game[
"escrows"] = [];
185 if ( !level.wagerMatch )
193 if ( level.wagerMatch == 0 )
199 if( isdefined( level.onWagerFinalizeRound ) )
201 [[level.onWagerFinalizeRound]]();
207 shouldCalculateWinnings = !isdefined( level.dontCalcWagerWinnings ) || !level.dontCalcWagerWinnings;
208 if( !shouldCalculateWinnings )
213 if( !level.teamBased )
225 playerRankings = level.placement[
"all"];
226 payoutPercentages =
array( 0.5, 0.3, 0.2 );
227 if( playerRankings.size == 2 )
229 payoutPercentages =
array( 0.7, 0.3 );
231 else if( playerRankings.size == 1 )
233 payoutPercentages =
array( 1.0 );
239 if ( isdefined( level.hostForcedEnd ) && level.hostForcedEnd )
241 wagerBet = GetDvarint(
"scr_wagerBet" );
242 for ( i = 0 ; i < playerRankings.size ; i++ )
244 if ( !playerRankings[i] IsLocalToHost() )
245 playerRankings[i].wagerWinnings = wagerBet;
249 else if ( level.players.size == 1 )
251 game[
"escrows"] = undefined;
256 currentPayoutPercentage = 0;
257 cumulativePayoutPercentage = payoutPercentages[0];
259 playerGroup[playerGroup.size] = playerRankings[0];
260 for ( i = 1 ; i < playerRankings.size ; i++ )
262 if ( playerRankings[i].pers[
"score"] < playerGroup[0].pers[
"score"] )
266 cumulativePayoutPercentage = 0;
268 playerGroup[playerGroup.size] = playerRankings[i];
269 currentPayoutPercentage++;
270 if ( isdefined( payoutPercentages[currentPayoutPercentage] ) )
272 cumulativePayoutPercentage += payoutPercentages[currentPayoutPercentage];
283 level.playerPlaces =
array( [], [], [] );
285 playerRankings = level.placement[
"all"];
286 placementScores =
array( playerRankings[ 0 ].pers[
"score"], -1, -1 );
288 for ( index = 0 ; index < playerRankings.size && currentPlace < placementScores.size ; index++ )
290 player = playerRankings[index];
292 if( player.pers[
"score"] < placementScores[ currentPlace ] )
295 if( currentPlace >= level.playerPlaces.size )
300 placementScores[ currentPlace ] = player.pers[
"score"];
303 level.playerPlaces[ currentPlace ][ level.playerPlaces[ currentPlace ].size ] = player;
310 if( winner ==
"tie" )
316 playersOnWinningTeam = [];
317 for ( index = 0 ; index < level.players.size ; index++ )
319 player = level.players[index];
321 player.wagerWinnings = 0;
322 if( player.pers[
"team"] == winner )
324 playersOnWinningTeam[ playersOnWinningTeam.size ] = player;
327 if( playersOnWinningTeam.size == 0 )
333 winningsSplit = int( game[
"wager_pot"] / playersOnWinningTeam.size );
339 for ( index = 0 ; index < players.size ; index++ )
341 players[index].wagerWinnings = amount;
347 level.wagerGameFinalized =
true;
348 if ( level.wagermatch == 0 )
356 players = level.players;
358 playerRankings = level.wagerTopEarners;
360 for ( index = 0 ; index < players.size ; index++ )
362 player = players[index];
364 if ( isdefined( player.pers[
"wager_sideBetWinnings"] ) )
365 pay_out_winnings( player, player.wagerWinnings + player.pers[
"wager_sideBetWinnings"] );
369 if ( player.wagerWinnings > 0 )
387 player AddPlayerStat(
"LIFETIME_EARNINGS", winnings );
394 topWinnings =
array( -1, -1, -1 );
395 level.wagerTopEarners = [];
396 for ( index = 0 ; index < level.players.size ; index++ )
398 player = level.players[ index ];
399 if( !isdefined( player.wagerWinnings ) )
401 player.wagerWinnings = 0;
404 if( player.wagerWinnings > topWinnings[ 0 ] )
406 topWinnings[ 2 ] = topWinnings[ 1 ];
407 topWinnings[ 1 ] = topWinnings[ 0 ];
408 topWinnings[ 0 ] = player.wagerWinnings;
410 level.wagerTopEarners[ 2 ] = level.wagerTopEarners[ 1 ];
411 level.wagerTopEarners[ 1 ] = level.wagerTopEarners[ 0 ];
412 level.wagerTopEarners[ 0 ] = player;
414 else if( player.wagerWinnings > topWinnings[ 1 ] )
416 topWinnings[ 2 ] = topWinnings[ 1 ];
417 topWinnings[ 1 ] = player.wagerWinnings;
419 level.wagerTopEarners[ 2 ] = level.wagerTopEarners[ 1 ];
420 level.wagerTopEarners[ 1 ] = player;
422 else if( player.wagerWinnings > topWinnings[ 2 ] )
424 topWinnings[ 2 ] = player.wagerWinnings;
426 level.wagerTopEarners[ 2 ] = player;
433 if ( isdefined( level.sidebet ) && level.sidebet )
435 level notify(
"side_bet_begin" );
436 level waittill(
"side_bet_end" );
442 level endon (
"side_bet_end" );
444 secondsToWait = ( level.sideBetEndTime - GetTime() ) / 1000.0;
445 if ( secondsToWait < 0 )
449 wait( secondsToWait );
450 level notify (
"side_bet_end" );
455 secondsLeft = ( level.sideBetEndTime - GetTime() ) / 1000.0;
456 if( secondsLeft <= 3.0 )
461 level.sideBetEndTime = GetTime() + 3000;
464 level notify (
"side_bet_end" );
470 if ( !isdefined( chooseRandomBody ) || chooseRandomBody )
472 if ( !isdefined(
self.pers[
"wagerBodyAssigned"] ) )
475 self.pers[
"wagerBodyAssigned"] =
true;
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 )
488 self takeAllWeapons();
491 if ( isdefined(
self.pers[
"hasRadar"] ) &&
self.pers[
"hasRadar"] )
493 self.hasSpyplane =
true;
496 if ( isdefined(
self.powerups ) && isdefined(
self.powerups.size ) )
498 for ( i = 0 ; i <
self.powerups.size ; i++ )
513 self endon(
"disconnect");
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;
522 self notify(
"received award" );
527 level endon(
"game_ended" );
531 level waittill(
"player_eliminated" );
533 if ( !isdefined( level.numLives ) || !level.numLives )
540 players = level.players;
542 for ( i = 0 ; i < players.size ; i++ )
544 if ( isdefined( players[i].pers[
"lives"] ) && ( players[i].pers[
"lives"] > 0 ) )
550 if ( playersLeft == 2 )
552 for ( i = 0 ; i < players.size ; i++ )
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;
558 if ( level.teambased )
560 assert( isdefined( players[i].team ) );
561 level.activePlayerUAVs[players[i].team]++;
565 level.activePlayerUAVs[players[i] getEntityNumber()]++;
568 level.activePlayerUAVs[players[i] getEntityNumber()]++;
576 prevScorePlace =
self.prevScorePlace;
577 if ( !isdefined( prevScorePlace ) )
582 if ( isdefined( level.inTheMoneyOnRadar ) && level.inTheMoneyOnRadar )
584 if ( prevScorePlace <= 3 && isdefined(
self.score ) && (
self.score > 0 ) )
586 self unsetPerk(
"specialty_gpsjammer" );
590 self setPerk(
"specialty_gpsjammer" );
593 else if ( isdefined( level.firstPlaceOnRadar ) && level.firstPlaceOnRadar )
595 if ( prevScorePlace == 1 && isdefined(
self.score ) && (
self.score > 0 ) )
597 self unsetPerk(
"specialty_gpsjammer" );
601 self setPerk(
"specialty_gpsjammer" );
608 self notify(
"wager_player_scored" );
609 self endon(
"wager_player_scored" );
614 for ( i = 0 ; i < level.placement[
"all"].size ; i++ )
616 prevScorePlace = level.placement[
"all"][i].prevScorePlace;
617 if ( !isdefined( prevScorePlace ) )
621 currentScorePlace = i + 1;
622 for ( j = i - 1 ; j >= 0 ; j-- )
624 if ( level.placement[
"all"][i].score == level.placement[
"all"][j].score )
629 wasInTheMoney = ( prevScorePlace <= 3 );
630 isInTheMoney = ( currentScorePlace <= 3 );
632 if ( !wasInTheMoney && isInTheMoney )
634 level.placement[
"all"][i]
announcer(
"wm_in_the_money" );
636 else if ( wasInTheMoney && !isInTheMoney )
638 level.placement[
"all"][i]
announcer(
"wm_oot_money" );
640 level.placement[
"all"][i].prevScorePlace = currentScorePlace;
652 powerup = spawnstruct();
654 powerup.name[0] =
name;
656 powerup.displayName = displayName;
657 powerup.iconMaterial = iconMaterial;
664 if ( !isdefined( level.powerupList ) )
666 level.powerupList = [];
669 for ( i = 0 ; i < level.powerupList.size ; i++ )
671 if ( level.powerupList[i].displayName == displayName )
673 level.powerupList[i].name[level.powerupList[i].name.size] =
name;
680 level.powerupList[level.powerupList.size] = powerup;
685 return create_powerup( powerup.name[0], powerup.type, powerup.displayName, powerup.iconMaterial );
690 weapon = level.weaponNone;
691 switch ( powerup.type )
696 case "primary_grenade":
697 case "secondary_grenade":
698 weapon = GetWeapon( powerup.name[0] );
702 switch ( powerup.type )
705 self giveWeapon( weapon );
706 self switchToWeapon( weapon );
710 self giveWeapon( weapon );
714 self GiveWeapon( weapon );
716 self SetActionSlot( 1,
"weapon", weapon );
719 case "primary_grenade":
720 self setOffhandPrimaryClass( weapon );
721 self giveWeapon( weapon );
722 self setWeaponAmmoClip( weapon, 2 );
725 case "secondary_grenade":
726 self setOffhandSecondaryClass( weapon );
727 self giveWeapon( weapon );
728 self setWeaponAmmoClip( weapon, 2 );
732 for ( i = 0 ; i < powerup.name.size ; i++ )
733 self setPerk( powerup.name[i] );
740 case "score_multiplier":
741 self.scoreMultiplier = powerup.name[0];
748 if ( !isdefined(
self.powerups ) )
753 powerupIndex =
self.powerups.size;
755 for ( i = 0 ; i < powerup.name.size ; i++ )
757 self.powerups[powerupIndex].name[
self.powerups[powerupIndex].name.size] = powerup.name[i];
767 if ( !isdefined(
self ) || !isdefined(
self.powerups ) || !isdefined(
self.powerups[powerupIndex] ) || !isdefined(
self.powerups[powerupIndex].hud_elem_icon ) )
772 self endon(
"disconnect" );
773 self endon(
"delete" );
774 self endon(
"clearing_powerups" );
779 hud_elem =
self.powerups[powerupIndex].hud_elem_icon;
780 if ( isdefined( hud_elem.animating ) && hud_elem.animating )
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;
800 hud_elem ScaleOverTime( pulseTime, origWidth, origHeight );
801 hud_elem MoveOverTime( pulseTime );
808 self endon(
"disconnect" );
809 self endon(
"delete" );
810 self endon(
"clearing_powerups" );
812 if ( !isdefined( doAnimation ) )
817 wasInPrematch = level.inPrematchPeriod;
821 if (
self IsSplitscreen() )
828 if ( isdefined(
self.powerups[powerupIndex].hud_elem ) )
830 self.powerups[powerupIndex].hud_elem
destroy();
832 self.powerups[powerupIndex].hud_elem = NewClientHudElem(
self );
833 self.powerups[powerupIndex].hud_elem.fontScale = 1.5;
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 );
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 );
855 if ( isdefined(
self.powerups[powerupIndex].hud_elem_icon ) )
857 self.powerups[powerupIndex].hud_elem_icon
destroy();
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;
866 self.powerups[powerupIndex].hud_elem_icon =
self hud::createIcon(
self.powerups[powerupIndex].iconMaterial, iconSize, iconSize );
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 );
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;
882 if ( !wasInPrematch && doAnimation )
884 self thread
queue_popup(
self.powerups[powerupIndex].displayName, 0, &
"MP_BONUS_ACQUIRED" );
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 );
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;
906 if ( level.inPrematchPeriod )
908 level waittill(
"prematch_over" );
910 else if ( doAnimation )
915 if ( wasInPrematch && doAnimation )
917 self thread
queue_popup(
self.powerups[powerupIndex].displayName, 0, &
"MP_BONUS_ACQUIRED" );
921 for ( i = 0 ; i <= powerupIndex ; i++ )
923 self.powerups[i].hud_elem FadeOverTime( 0.25 );
924 self.powerups[i].hud_elem.alpha = 0;
928 for ( i = 0 ; i <= powerupIndex ; i++ )
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";
935 self.powerups[powerupIndex].hud_elem_icon.animating =
false;
940 self notify(
"clearing_powerups" );
941 if ( isdefined(
self.powerups ) && isdefined(
self.powerups.size ) )
943 for ( i = 0 ; i <
self.powerups.size ; i++ )
945 if ( isdefined(
self.powerups[i].hud_elem ) )
947 self.powerups[i].hud_elem
destroy();
949 if ( isdefined(
self.powerups[i].hud_elem_icon ) )
951 self.powerups[i].hud_elem_icon
destroy();
960 if ( !isdefined(
self.wagerWeaponUsage ) )
962 self.wagerWeaponUsage = [];
965 if ( !isdefined(
self.wagerWeaponUsage[
name] ) )
967 self.wagerWeaponUsage[
name] = [];
970 if ( !isdefined(
self.wagerWeaponUsage[
name][statName] ) )
972 self.wagerWeaponUsage[
name][statName] = 0;
975 self.wagerWeaponUsage[
name][statName] += incValue;
980 if ( !isdefined(
self.wagerWeaponUsage ) )
985 bestWeapon = undefined;
988 wagerWeaponsUsed = GetArrayKeys(
self.wagerWeaponUsage );
989 for ( i = 0 ; i < wagerWeaponsUsed.size ; i++ )
991 weaponStats =
self.wagerWeaponUsage[wagerWeaponsUsed[i]];
992 if ( !isdefined( weaponStats[statName] ) || !GetBaseWeaponItemIndex( [[ level.get_base_weapon_param ]]( wagerWeaponsUsed[i] ) ) )
996 else if ( !isdefined( bestWeapon ) || ( weaponStats[statName] > highestValue ) )
998 bestWeapon = wagerWeaponsUsed[i];
999 highestValue = weaponStats[statName];
1010 if ( isdefined( topWeapon ) )
1012 topKills =
self.wagerWeaponusage[topWeapon][
"kills"];
1019 if ( !isdefined( topWeapon ) )
1027 if ( isdefined( level.onWagerAwards ) )
1029 self [[level.onWagerAwards]]();
1033 for ( i = 0 ; i < 3 ; i++ )