Advertisement
Guest User

Edited _globallogic.gsc (Black Ops 2)

a guest
Mar 13th, 2021
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 86.07 KB | None | 0 0
  1. #include maps/mp/gametypes/_hostmigration;
  2. #include maps/mp/gametypes/_dev;
  3. #include maps/mp/_multi_extracam;
  4. #include maps/mp/gametypes/_friendicons;
  5. #include maps/mp/_bb;
  6. #include maps/mp/gametypes/_battlechatter_mp;
  7. #include maps/mp/gametypes/_healthoverlay;
  8. #include maps/mp/gametypes/_damagefeedback;
  9. #include maps/mp/teams/_teams;
  10. #include maps/mp/gametypes/_menus;
  11. #include maps/mp/_decoy;
  12. #include maps/mp/gametypes/_spawnlogic;
  13. #include maps/mp/gametypes/_gameobjects;
  14. #include maps/mp/gametypes/_objpoints;
  15. #include maps/mp/gametypes/_spectating;
  16. #include maps/mp/gametypes/_deathicons;
  17. #include maps/mp/gametypes/_shellshock;
  18. #include maps/mp/gametypes/_killcam;
  19. #include maps/mp/gametypes/_scoreboard;
  20. #include maps/mp/gametypes/_weaponobjects;
  21. #include maps/mp/gametypes/_clientids;
  22. #include maps/mp/gametypes/_serversettings;
  23. #include maps/mp/_challenges;
  24. #include maps/mp/_music;
  25. #include maps/mp/gametypes/_weapons;
  26. #include maps/mp/gametypes/_globallogic_player;
  27. #include maps/mp/_demo;
  28. #include maps/mp/killstreaks/_killstreaks;
  29. #include maps/mp/gametypes/_wager;
  30. #include maps/mp/gametypes/_persistence;
  31. #include maps/mp/gametypes/_hud;
  32. #include maps/mp/gametypes/_globallogic_utils;
  33. #include maps/mp/bots/_bot;
  34. #include maps/mp/gametypes/_hud_message;
  35. #include maps/mp/gametypes/_globallogic_defaults;
  36. #include maps/mp/gametypes/_globallogic_score;
  37. #include maps/mp/gametypes/_globallogic_spawn;
  38. #include maps/mp/_gamerep;
  39. #include maps/mp/_gameadvertisement;
  40. #include maps/mp/gametypes/_globallogic_audio;
  41. #include maps/mp/gametypes/_class;
  42. #include maps/mp/gametypes/_globallogic_ui;
  43. #include maps/mp/gametypes/_tweakables;
  44. #include common_scripts/utility;
  45. #include maps/mp/_busing;
  46. #include maps/mp/_burnplayer;
  47. #include maps/mp/gametypes/_hud_util;
  48. #include maps/mp/_utility;
  49.  
  50.  
  51. init() //checked matches bo3 _globallogic.gsc within reason
  52. {
  53.  
  54.     // hack to allow maps with no scripts to run correctly
  55.     if ( !isDefined( level.tweakablesInitialized ) )
  56.         maps\mp\gametypes\_tweakables::init();
  57.    
  58.     init_session_mode_flags();
  59.  
  60.     level.splitscreen = isSplitScreen();
  61.     level.xenon = (GetDvar( "xenonGame") == "true");
  62.     level.ps3 = (GetDvar( "ps3Game") == "true");
  63.     level.wiiu = (GetDvar( "wiiuGame") == "true");
  64.  
  65.     level.onlineGame = SessionModeIsOnlineGame();
  66.     //level.systemlink = sessionmodeissystemlink();
  67.     level.xenon = level.console;
  68.     level.ps3 = level.console;
  69.     level.wiiu = level.console;
  70.    
  71.     if(GameModeIsUsingXP())
  72.     { if(!isPreGame()) level.rankedmatch = true; }
  73.     level.leagueMatch = GameModeIsMode( level.GAMEMODE_LEAGUE_MATCH );
  74.    
  75.     level.contractsEnabled = !GetGametypeSetting( "disableContracts" );
  76.        
  77.     if ( GameModeIsMode( level.GAMEMODE_BASIC_TRAINING ) )
  78.     {
  79.         level.contractsEnabled = false;
  80.     }
  81.  
  82.     if (level.xenon || level.ps3 || gamemodeisusingxp() && GetDvarint( "scr_forcerankedmatch" ) == 1 ) level.rankedMatch = true;
  83.    
  84.     level.script = toLower( GetDvar( "mapname" ) );
  85.     level.gametype = toLower( GetDvar( "g_gametype" ) );
  86.  
  87.     level.teamBased = false;
  88.     level.teamCount = GetGametypeSetting( "teamCount" );
  89.     level.multiTeam = ( level.teamCount > 2 );
  90.    
  91.     if ( SessionModeIsZombiesGame() )
  92.     {
  93.         level.zombie_team_index = level.teamCount + 1;
  94.         if ( 2 == level.zombie_team_index )
  95.         {
  96.             level.zombie_team = "axis";
  97.         }
  98.         else
  99.         {
  100.             level.zombie_team = "team" + level.zombie_team_index;
  101.         }
  102.     }
  103.  
  104.     // used to loop through all valid playing teams ( not spectator )
  105.     // can also be used to check if a team is valid ( isdefined( level.teams[team] ) )
  106.     // NOTE: added in the same order they are defined in code
  107.     level.teams = [];
  108.     level.teamIndex = [];
  109.    
  110.     teamCount = level.teamCount;
  111.    
  112.     level.teams[ "allies" ] = "allies";
  113.     level.teams[ "axis" ] = "axis";
  114.  
  115.     level.teamIndex[ "neutral" ] = 0; // Neutral team set to 0 so that it can be used by objectives
  116.     level.teamIndex[ "allies" ] = 1;
  117.     level.teamIndex[ "axis" ] = 2;
  118.    
  119.     for( teamIndex = 3; teamIndex <= teamCount; teamIndex++ )
  120.     {
  121.         level.teams[ "team" + teamIndex ] = "team" + teamIndex;
  122.         level.teamIndex[ "team" + teamIndex ] = teamIndex;
  123.     }
  124.    
  125.     level.overrideTeamScore = false;
  126.     level.overridePlayerScore = false;
  127.     level.displayHalftimeText = false;
  128.     level.displayRoundEndText = true;
  129.    
  130.     level.clampScoreLimit = true;
  131.     level.endGameOnScoreLimit = true;
  132.     level.endGameOnTimeLimit = true;
  133.     level.scoreRoundWinBased = false;
  134.     level.resetPlayerScoreEveryRound = false;
  135.     level.doEndgameScoreboard = true;
  136.    
  137.     level.gameForfeited= false;
  138.     level.forceAutoAssign = false;
  139.    
  140.     level.halftimeType = "halftime";
  141.     level.halftimeSubCaption = &"MP_SWITCHING_SIDES_CAPS";
  142.    
  143.     level.lastStatusTime = 0;
  144.     level.wasWinning = [];
  145.    
  146.     level.lastSlowProcessFrame = 0;
  147.    
  148.     level.placement = [];
  149.     foreach( team in level.teams )
  150.     {
  151.         level.placement[team] = [];
  152.     }
  153.     level.placement["all"] = [];
  154.    
  155.     level.postRoundTime = 7.0;//Kevin Sherwood changed to 9 to have enough time for music stingers
  156.    
  157.     level.inOvertime = false;
  158.    
  159.     level.defaultOffenseRadius = 560;
  160.     //level.defaultOffenseRadiusSQ = level.defaultOffenseRadius * level.defaultOffenseRadius;
  161.  
  162.     level.dropTeam = GetDvarint( "sv_maxclients" );
  163.    
  164.     level.inFinalKillcam = false;
  165.  
  166.     maps\mp\gametypes\_globallogic_ui::init();
  167.  
  168.     registerDvars();
  169.     maps\mp\gametypes\_class::initPerkDvars();
  170.  
  171.     level.oldschool = ( GetDvarint( "scr_oldschool" ) == 1 );
  172.     if ( level.oldschool )
  173.     {
  174.         logstring( "game mode: oldschool" );
  175.    
  176.         SetDvar( "jump_height", 64 );
  177.         SetDvar( "jump_slowdownEnable", 0 );
  178.         SetDvar( "bg_fallDamageMinHeight", 256 );
  179.         SetDvar( "bg_fallDamageMaxHeight", 512 );
  180.         SetDvar( "player_clipSizeMultiplier", 2.0 );
  181.     }
  182.  
  183.     precacheModel( "tag_origin" );
  184.     precacheRumble( "dtp_rumble" );
  185.     precacheRumble( "slide_rumble" );
  186.     precachestatusicon("hud_status_dead");
  187.     precachestatusicon("hud_status_connecting");
  188.     precache_mp_leaderboards();
  189.    
  190.     // sets up the flame fx
  191.     maps\mp\_burnplayer::initBurnPlayer();
  192.    
  193.     if ( !isDefined( game["tiebreaker"] ) )
  194.         game["tiebreaker"] = false;
  195.        
  196.     maps\mp\gametypes\_globallogic_audio::registerDialogGroup( "introboost", true );
  197.     maps\mp\gametypes\_globallogic_audio::registerDialogGroup( "status", true );
  198.  
  199.     thread maps\mp\_gameadvertisement::init();
  200.     thread maps\mp\_gamerep::init();
  201.     level.disableChallenges = false;
  202.      
  203.     if (level.leagueMatch || GetDvarInt("scr_disableChallenges") > 0) level.disableChallenges = true;
  204.      
  205.     level.disableStatTracking = ( GetDvarInt( "scr_disableStatTracking" ) > 0 );
  206.      
  207.     setupcallbacks();
  208. }
  209.  
  210. registerDvars() //checked matches bo3 _globallogic.gsc within reason
  211. {
  212.     if ( GetDvar( "scr_oldschool" ) == "" )
  213.         SetDvar( "scr_oldschool", "0" );
  214.        
  215.     makeDvarServerInfo( "scr_oldschool" );
  216.  
  217.     if ( GetDvar( "ui_guncycle" ) == "" )
  218.         SetDvar( "ui_guncycle", 0 );
  219.        
  220.     makedvarserverinfo( "ui_guncycle" );
  221.  
  222.     if ( GetDvar( "ui_weapon_tiers" ) == "" )
  223.         SetDvar( "ui_weapon_tiers", 0 );
  224.     makedvarserverinfo( "ui_weapon_tiers" );
  225.  
  226.     SetDvar( "ui_text_endreason", "");
  227.     makeDvarServerInfo( "ui_text_endreason", "" );
  228.  
  229.     setMatchFlag( "bomb_timer", 0 );
  230.    
  231.     setMatchFlag( "enable_popups", 1 );
  232.    
  233.     setMatchFlag( "pregame", isPregame() );
  234.  
  235.     if ( GetDvar( "scr_vehicle_damage_scalar" ) == "" )
  236.         SetDvar( "scr_vehicle_damage_scalar", "1" );
  237.        
  238.     level.vehicleDamageScalar = GetDvarfloat( "scr_vehicle_damage_scalar");
  239.  
  240.     level.fire_audio_repeat_duration = GetDvarint( "fire_audio_repeat_duration" );
  241.     level.fire_audio_random_max_duration = GetDvarint( "fire_audio_random_max_duration" );
  242.    
  243.       teamName = getcustomteamname( level.teamIndex[ "allies" ] );
  244.       if( isdefined( teamName ) )
  245.       SetDvar( "g_customTeamName_Allies", teamName );
  246.       else
  247.       SetDvar( "g_customTeamName_Allies", "" );
  248.      
  249.       teamName = getcustomteamname( level.teamIndex[ "axis" ] );
  250.       if( isdefined( teamName ) )
  251.       SetDvar( "g_customTeamName_Axis", teamName );
  252.       else
  253.       SetDvar( "g_customTeamName_Axis", "" );
  254. }
  255.  
  256. blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) //checked matches bo3 _globallogic.gsc within reason
  257. {
  258. }
  259.  
  260. /*SetupCallbacks() //checked matches bo3 _globallogic.gsc within reason
  261. {
  262.     level.spawnPlayer = maps\mp\gametypes\_globallogic_spawn::spawnPlayer;
  263.     level.spawnPlayerPrediction = maps\mp\gametypes\_globallogic_spawn::spawnPlayerPrediction;
  264.     level.spawnClient = maps\mp\gametypes\_globallogic_spawn::spawnClient;
  265.     level.spawnSpectator = maps\mp\gametypes\_globallogic_spawn::spawnSpectator;
  266.     level.spawnIntermission = maps\mp\gametypes\_globallogic_spawn::spawnIntermission;
  267.     level.onPlayerScore = maps\mp\gametypes\_globallogic_score::default_onPlayerScore;
  268.     level.onTeamScore = maps\mp\gametypes\_globallogic_score::default_onTeamScore;
  269.    
  270.     level.waveSpawnTimer = ::waveSpawnTimer;
  271.     level.spawnMessage =    maps\mp\gametypes\_globallogic_spawn::default_spawnMessage;
  272.    
  273.     level.onSpawnPlayer = ::blank;
  274.     level.onSpawnPlayerUnified = ::blank;
  275.     level.onSpawnSpectator = maps\mp\gametypes\_globallogic_defaults::default_onSpawnSpectator;
  276.     level.onSpawnIntermission = maps\mp\gametypes\_globallogic_defaults::default_onSpawnIntermission;
  277.     level.onRespawnDelay = ::blank;
  278.  
  279.     level.onForfeit = maps\mp\gametypes\_globallogic_defaults::default_onForfeit;
  280.     level.onTimeLimit = maps\mp\gametypes\_globallogic_defaults::default_onTimeLimit;
  281.     level.onScoreLimit = maps\mp\gametypes\_globallogic_defaults::default_onScoreLimit;
  282.     level.onAliveCountChange = maps\mp\gametypes\_globallogic_defaults::default_onAliveCountChange;
  283.     level.onDeadEvent = maps\mp\gametypes\_globallogic_defaults::default_onDeadEvent;
  284.     level.onOneLeftEvent = maps\mp\gametypes\_globallogic_defaults::default_onOneLeftEvent;
  285.     level.giveTeamScore = maps\mp\gametypes\_globallogic_score::giveTeamScore;
  286.     level.onLastTeamAliveEvent = undefined;
  287.  
  288.     level.getTimeLimit = maps\mp\gametypes\_globallogic_defaults::default_getTimeLimit;
  289.     level.getTeamKillPenalty = maps\mp\gametypes\_globallogic_defaults::default_getTeamKillPenalty;
  290.     level.getTeamKillScore = maps\mp\gametypes\_globallogic_defaults::default_getTeamKillScore;
  291.  
  292.     level.isKillBoosting = maps\mp\gametypes\_globallogic_score::default_isKillBoosting;
  293.  
  294.     level._setTeamScore = maps\mp\gametypes\_globallogic_score::_setTeamScore;
  295.     level._setPlayerScore = maps\mp\gametypes\_globallogic_score::_setPlayerScore;
  296.  
  297.     level._getTeamScore = maps\mp\gametypes\_globallogic_score::_getTeamScore;
  298.     level._getPlayerScore = maps\mp\gametypes\_globallogic_score::_getPlayerScore;
  299.    
  300.     level.onPrecacheGametype = ::blank;
  301.     level.onStartGameType = ::blank;
  302.     level.onPlayerConnect = ::blank;
  303.     level.onPlayerDisconnect = ::blank;
  304.     level.onPlayerDamage = ::blank;
  305.     level.onPlayerKilled = ::blank;
  306.     level.onPlayerKilledExtraUnthreadedCBs = []; //< Array of other CB function pointers
  307.  
  308.     level.onTeamOutcomeNotify = maps\mp\gametypes\_hud_message::teamOutcomeNotify;
  309.     level.onOutcomeNotify = maps\mp\gametypes\_hud_message::outcomeNotify;
  310.     level.onTeamWagerOutcomeNotify = maps\mp\gametypes\_hud_message::teamWagerOutcomeNotify;
  311.     level.onWagerOutcomeNotify = maps\mp\gametypes\_hud_message::wagerOutcomeNotify;
  312.     level.setMatchScoreHUDElemForTeam = maps\mp\gametypes\_hud_message::setMatchScoreHUDElemForTeam;
  313.     level.onEndGame = ::blank;
  314.     level.onRoundEndGame = maps\mp\gametypes\_globallogic_defaults::default_onRoundEndGame;
  315.     level.onMedalAwarded = ::blank;
  316.  
  317.     maps\mp\gametypes\_globallogic_ui::SetupCallbacks();
  318. }*/
  319. setupcallbacks()
  320. {
  321.     level.spawnplayer = ::spawnplayer;
  322.     level.spawnplayerprediction = ::spawnplayerprediction;
  323.     level.spawnclient = ::spawnclient;
  324.     level.spawnspectator = ::spawnspectator;
  325.     level.spawnintermission = ::spawnintermission;
  326.     level.onplayerscore = ::default_onplayerscore;
  327.     level.onteamscore = ::default_onteamscore;
  328.     level.wavespawntimer = ::wavespawntimer;
  329.     level.spawnmessage = ::default_spawnmessage;
  330.     level.onspawnplayer = ::blank;
  331.     level.onspawnplayerunified = ::blank;
  332.     level.onspawnspectator = ::default_onspawnspectator;
  333.     level.onspawnintermission = ::default_onspawnintermission;
  334.     level.onrespawndelay = ::blank;
  335.     level.onforfeit = ::default_onforfeit;
  336.     level.ontimelimit = ::default_ontimelimit;
  337.     level.onscorelimit = ::default_onscorelimit;
  338.     level.onalivecountchange = ::default_onalivecountchange;
  339.     level.ondeadevent = undefined;
  340.     level.ononeleftevent = ::default_ononeleftevent;
  341.     level.giveteamscore = ::giveteamscore;
  342.     level.onlastteamaliveevent = ::default_onlastteamaliveevent;
  343.     level.gettimelimit = ::default_gettimelimit;
  344.     level.getteamkillpenalty = ::default_getteamkillpenalty;
  345.     level.getteamkillscore = ::default_getteamkillscore;
  346.     level.iskillboosting = ::default_iskillboosting;
  347.     level._setteamscore = ::_setteamscore;
  348.     level._setplayerscore = ::_setplayerscore;
  349.     level._getteamscore = ::_getteamscore;
  350.     level._getplayerscore = ::_getplayerscore;
  351.     level.onprecachegametype = ::blank;
  352.     level.onstartgametype = ::blank;
  353.     level.onplayerconnect = ::blank;
  354.     level.onplayerdisconnect = ::blank;
  355.     level.onplayerdamage = ::blank;
  356.     level.onplayerkilled = ::blank;
  357.     level.onplayerkilledextraunthreadedcbs = [];
  358.     level.onteamoutcomenotify = ::teamoutcomenotify;
  359.     level.onoutcomenotify = ::outcomenotify;
  360.     level.onteamwageroutcomenotify = ::teamwageroutcomenotify;
  361.     level.onwageroutcomenotify = ::wageroutcomenotify;
  362.     level.setmatchscorehudelemforteam = ::setmatchscorehudelemforteam;
  363.     level.onendgame = ::blank;
  364.     level.onroundendgame = ::default_onroundendgame;
  365.     level.onmedalawarded = ::blank;
  366.     maps/mp/gametypes/_globallogic_ui::setupcallbacks();
  367. }
  368. precache_mp_leaderboards() //checked matches bo3 _globallogic.gsc within reason
  369. {
  370.     if (maps/mp/bots/_bot::is_bot_ranked_match())
  371.     {
  372.         return;
  373.     }
  374.     if( SessionModeIsZombiesGame() )
  375.         return;
  376.  
  377.     if( !level.rankedMatch )
  378.         return;
  379.        
  380.     mapname = GetDvar( "mapname" );
  381.  
  382.     globalLeaderboards = "LB_MP_GB_XPPRESTIGE LB_MP_GB_TOTALXP_AT LB_MP_GB_TOTALXP_LT LB_MP_GB_WINS_AT LB_MP_GB_WINS_LT LB_MP_GB_KILLS_AT LB_MP_GB_KILLS_LT LB_MP_GB_ACCURACY_AT LB_MP_GB_ACCURACY_LT";
  383.     careerleaderboard = "";
  384.     switch (level.gametype)
  385.     {
  386.         case "gun":
  387.         case "oic":
  388.         case "sas":
  389.         case "shrp":
  390.             break;
  391.  
  392.         default:
  393.             careerleaderboard = " LB_MP_GB_SCOREPERMINUTE";
  394.             break;
  395.     }
  396.     gamemodeLeaderboard = " LB_MP_GM_" + level.gametype;
  397.     gamemodeleaderboardext = " LB_MP_GM_" + level.gametype + "_EXT";
  398.     gamemodehcleaderboard = "";
  399.     gamemodehcleaderboardext = "";         
  400.     if( getDvarInt( "g_hardcore" ) )
  401.         gamemodeLeaderboard += "_HC";
  402.    
  403.     mapLeaderboard = " LB_MP_MAP_" + getsubstr( mapname, 3, mapname.size ); // strip the MP_ from the map name
  404.        
  405.     precacheLeaderboards( globalLeaderboards + gamemodeLeaderboard + mapLeaderboard ); 
  406. }
  407.  
  408. compareTeamByGameStat( gameStat, teamA, teamB, previous_winner_score ) //checked matches bo3 _globallogic.gsc within reason
  409. {
  410.     winner = undefined;
  411.    
  412.     if ( teamA == "tie" )
  413.     {
  414.         winner = "tie";
  415.        
  416.         if ( previous_winner_score < game[gameStat][teamB] )
  417.             winner = teamB;
  418.     }
  419.     else if ( game[gameStat][teamA] == game[gameStat][teamB] )
  420.         winner = "tie";
  421.     else if ( game[gameStat][teamB] > game[gameStat][teamA] )
  422.         winner = teamB;
  423.     else
  424.         winner = teamA;
  425.    
  426.     return winner;
  427. }
  428.  
  429. determineTeamWinnerByGameStat( gameStat ) //checked matches bo3 _globallogic.gsc within reason
  430. {
  431.     teamKeys = GetArrayKeys(level.teams);
  432.     winner = teamKeys[0];
  433.     previous_winner_score = game[gameStat][winner];
  434.    
  435.     for ( teamIndex = 1; teamIndex < teamKeys.size; teamIndex++ )
  436.     {
  437.         winner = compareTeamByGameStat( gameStat, winner, teamKeys[teamIndex], previous_winner_score);
  438.        
  439.         if ( winner != "tie" )
  440.         {
  441.             previous_winner_score = game[gameStat][winner];
  442.         }  
  443.     }
  444.    
  445.     return winner;
  446. }
  447.  
  448. compareTeamByTeamScore( teamA, teamB, previous_winner_score ) //checked matches bo3 _globallogic.gsc within reason
  449. {
  450.     winner = undefined;
  451.   teamBScore = [[level._getTeamScore]]( teamB );
  452.  
  453.     if ( teamA == "tie" )
  454.     {
  455.         winner = "tie";
  456.        
  457.         if ( previous_winner_score < teamBScore )
  458.             winner = teamB;
  459.            
  460.         return winner;
  461.     }
  462.    
  463.   teamAScore = [[level._getTeamScore]]( teamA );
  464.  
  465.     if ( teamBScore == teamAScore )
  466.         winner = "tie";
  467.     else if ( teamBScore > teamAScore )
  468.         winner = teamB;
  469.     else
  470.         winner = teamA;
  471.        
  472.     return winner;
  473. }
  474.  
  475. determineTeamWinnerByTeamScore( ) //checked matches bo3 _globallogic.gsc within reason
  476. {
  477.     teamKeys = GetArrayKeys(level.teams);
  478.     winner = teamKeys[0];
  479.     previous_winner_score = [[level._getTeamScore]]( winner );
  480.    
  481.     for ( teamIndex = 1; teamIndex < teamKeys.size; teamIndex++ )
  482.     {
  483.         winner = compareTeamByTeamScore( winner, teamKeys[teamIndex], previous_winner_score);
  484.        
  485.         if ( winner != "tie" )
  486.         {
  487.             previous_winner_score = [[level._getTeamScore]]( winner );
  488.         }  
  489.     }
  490.    
  491.     return winner;
  492. }
  493.  
  494. forceEnd(hostsucks) //checked matches bo3 _globallogic.gsc within reason
  495. {
  496.     if (!isDefined(hostsucks))
  497.         hostsucks = false;
  498.  
  499.     if ( level.hostForcedEnd || level.forcedEnd )
  500.         return;
  501.  
  502.     winner = undefined;
  503.    
  504.     if ( level.teamBased )
  505.     {
  506.         winner = determineTeamWinnerByGameStat("teamScores");
  507.         maps\mp\gametypes\_globallogic_utils::logTeamWinString( "host ended game", winner );
  508.     }
  509.     else
  510.     {
  511.         winner = maps/mp/gametypes/_globallogic_score::gethighestscoringplayer();
  512.         if (isDefined(winner))
  513.         {
  514.             logstring("host ended game, win: " + winner.name);
  515.         }
  516.         else
  517.         {
  518.             logstring("host ended game, tie");
  519.         }
  520.     }
  521.    
  522.     level.forcedEnd = true;
  523.     level.hostForcedEnd = true;
  524.    
  525.     if (hostsucks)
  526.     {
  527.         endString = &"MP_HOST_SUCKS";
  528.     }
  529.     else
  530.     {
  531.         if ( level.splitscreen )
  532.             endString = &"MP_ENDED_GAME";
  533.         else
  534.             endString = &"MP_HOST_ENDED_GAME";
  535.     }
  536.     setMatchFlag( "disableIngameMenu", 1 );
  537.     makeDvarServerInfo( "ui_text_endreason", endString );
  538.     SetDvar( "ui_text_endreason", endString );
  539.     thread endGame( winner, endString );
  540. }
  541.  
  542. killserverPc() //checked matches bo3 _globallogic.gsc within reason
  543. {
  544.     if ( level.hostForcedEnd || level.forcedEnd )
  545.         return;
  546.        
  547.     winner = undefined;
  548.    
  549.     if ( level.teamBased )
  550.     {
  551.         winner = determineTeamWinnerByGameStat("teamScores");
  552.         maps\mp\gametypes\_globallogic_utils::logTeamWinString( "host ended game", winner );
  553.     }
  554.     else
  555.     {
  556.         winner = maps/mp/gametypes/_globallogic_score::gethighestscoringplayer();
  557.         if (isDefined(winner))
  558.         {
  559.             logstring("host ended game, win: " + winner.name);
  560.         }
  561.         else
  562.         {
  563.             logstring("host ended game, tie");
  564.         }
  565.     }
  566.    
  567.     level.forcedEnd = true;
  568.     level.hostForcedEnd = true;
  569.    
  570.     level.killserver = true;
  571.    
  572.     endString = &"MP_HOST_ENDED_GAME";
  573.    
  574.         /*
  575. /#
  576.         PrintLn("kill server; ending game\n");
  577. #/
  578.         */
  579.     thread endGame( winner, endString );
  580. }
  581.  
  582. atleasttwoteams() //checked changed to match bo3 _globallogic.gsc
  583. {
  584.     valid_count = 0;
  585.    
  586.     foreach ( team in level.teams )
  587.     {
  588.         if ( level.playerCount[team] != 0 ) valid_count++;
  589.     }
  590.     if ( valid_count < 2 ) return false;
  591.     return true;
  592. }
  593. checkIfTeamForfeits( team ) //checked matches bo3 _globallogic.gsc within reason
  594. {
  595.     if (!game["everExisted"][team])
  596.         return false;
  597.        
  598.     if ( level.playerCount[team] < 1 && totalPlayerCount() > 0 ) return true;
  599.     return false;
  600. }
  601.  
  602. checkForAnyTeamForfeit() //checked does not match bo3 _globallogic.gsc did not change
  603. {
  604.     forfeit_count = 0;
  605.     valid_team = undefined;
  606.     foreach( team in level.teams )
  607.     {
  608.         if ( checkIfTeamForfeits( team ) )
  609.         {
  610.             if (!level.multiteam)
  611.             {
  612.                 thread [[level.onForfeit]]( team );
  613.                 return true;
  614.             }
  615.         }
  616.         else valid_team = team;
  617.     }
  618.     if (level.multiteam && forfeit_count == level.teams.size - 1)
  619.     {
  620.         thread [[level.onforfeit]](valid_team);
  621.         return true;
  622.     }
  623.     return false;
  624. }
  625.  
  626. doSpawnQueueUpdates() //checked matches bo3 _globallogic.gsc within reason
  627. {
  628.     foreach( team in level.teams )
  629.     {
  630.         if ( level.spawnQueueModified[team] )
  631.         {
  632.             [[level.onAliveCountChange]]( team );
  633.         }
  634.     }
  635. }
  636.  
  637. isTeamAllDead( team ) //checked matches bo3 _globallogic.gsc within reason
  638. {
  639.     return level.everExisted[team] && !level.aliveCount[team] && !level.playerLives[team];
  640. }
  641.  
  642. areAllTeamsDead( ) //checked matches bo3 _globallogic.gsc within reason
  643. {
  644.     foreach( team in level.teams )
  645.     {
  646.         // if team was alive and now they are not
  647.         if (!isTeamAllDead(team)) return false;
  648.     }
  649.     return true;
  650. }
  651.  
  652. allDeadTeamCount( ) //checked does not exist in bo3 _globallogic.gsc leaving in
  653. {
  654.     count = 0;
  655.     foreach(team in level.teams)
  656.     {
  657.         // if team was alive and now they are not
  658.         if (isTeamAllDead(team)) count++;
  659.     }
  660.     return count;
  661. }
  662. getTeamScoreRatio()
  663. {
  664.     playerTeam = self.pers["team"];
  665.  
  666.   score = getTeamScore( playerTeam );
  667.  
  668.   otherTeamScore = 0;
  669.  
  670.   foreach ( team in level.teams )
  671.   {
  672.     if ( team == playerTeam )
  673.     continue;
  674.     otherTeamScore += getTeamScore( team );
  675.   }
  676.  
  677.   if ( level.teams.size > 1 )
  678.   {
  679.   otherTeamScore = otherTeamScore / ( level.teams.size - 1 );
  680.   }
  681.  
  682.   if ( otherTeamScore != 0 )
  683.   return ( float( score ) / float( otherTeamScore ) );
  684.  
  685.   // should we just return the flat score here or some other indication of win?
  686.   return score;
  687.  }
  688.  
  689. doDeadEventUpdates() //checked changed to match bo3 _globallogic.gsc
  690. {
  691.     if ( level.teamBased )
  692.     {
  693.         // if all teams were alive and now they are all dead in the same instance
  694.         if ( areAllTeamsDead( ) )
  695.         {
  696.             [[level.onDeadEvent]]( "all" );
  697.             return true;
  698.         }
  699.         if ( !isdefined( level.onDeadEvent ) )
  700.         {
  701.             lastTeamAlive = getLastTeamAlive();
  702.             if ( isdefined( lastTeamAlive ) )
  703.             {
  704.                 [[level.onLastTeamAliveEvent]]( lastTeamAlive );
  705.                 return true;
  706.             }
  707.         }
  708.         else
  709.         {
  710.             foreach( team in level.teams )
  711.             {
  712.                 // if team was alive and now they are not
  713.                 if ( isTeamAllDead( team ) )
  714.                 {  
  715.                     [[level.onDeadEvent]]( team );
  716.                     return true;
  717.                 }
  718.             }
  719.         }
  720.     }
  721.     else
  722.     {
  723.         // everyone is dead
  724.         if ( totalAliveCount() == 0 && totalPlayerLives() == 0 && level.maxPlayerCount > 1 )
  725.         {
  726.             [[ level.onDeadEvent ]]( "all" );
  727.             return true;
  728.         }
  729.     }
  730.    
  731.     return false;
  732. }
  733. getLastTeamAlive()
  734. {
  735.     count = 0;
  736.     everExistedCount = 0;
  737.     aliveTeam = undefined;
  738.     foreach(team in level.teams)
  739.     {
  740.         if (level.everExisted[team])
  741.         {
  742.             if (!isteamalldead(team))
  743.             {
  744.                 aliveTeam = team;
  745.                 count++;
  746.             }
  747.             everExistedCount++;
  748.         }
  749.    }
  750.    if (everExistedCount > 1 && count == 1) return aliveTeam;
  751.    return undefined;
  752. }
  753. isOnlyOneLeftAliveOnTeam( team ) //checked matches bo3 _globallogic.gsc within reason
  754. {
  755.     return level.lastAliveCount[team] > 1 && level.aliveCount[team] == 1 && level.playerLives[team] == 1 ;
  756. }
  757.  
  758.  
  759. doOneLeftEventUpdates() //checked matches bo3 _globallogic.gsc within reason
  760. {
  761.     if ( level.teamBased )
  762.     {
  763.         foreach( team in level.teams )
  764.         {
  765.             // one "team" left
  766.             if ( isOnlyOneLeftAliveOnTeam( team ) )
  767.             {  
  768.                 [[level.onOneLeftEvent]]( team );
  769.                 return true;
  770.             }
  771.         }
  772.     }
  773.     else
  774.     {
  775.         // last man standing
  776.         if ( (totalAliveCount() == 1) && (totalPlayerLives() == 1) && level.maxPlayerCount > 1 )
  777.         {
  778.             [[level.onOneLeftEvent]]( "all" );
  779.             return true;
  780.         }
  781.     }
  782.    
  783.     return false;
  784. }
  785.  
  786. updateGameEvents() //checked matches bo3 _globallogic.gsc within reason
  787. {
  788.     /*
  789. /#
  790.     if( GetDvarint( "scr_hostmigrationtest" ) == 1 )
  791.     {
  792.         return;
  793.     }
  794. #/
  795.     */
  796.     if (level.rankedmatch || level.wagermatch || level.leaguematch && !(level.ingraceperiod))
  797.     {
  798.         if ( level.teamBased )
  799.         {
  800.             if (!level.gameForfeited )
  801.             {
  802.                 if(game["state"] == "playing" && checkForAnyTeamForfeit()) return;
  803.             }
  804.             else // level.gameForfeited==true
  805.             {
  806.                 if ( atleasttwoteams() )
  807.                 {
  808.                     level.gameForfeited = false;
  809.                     level notify( "abort forfeit" );
  810.                 }
  811.             }
  812.         }
  813.         else
  814.         {
  815.             if (!level.gameForfeited)
  816.             {
  817.                 if ( totalPlayerCount() == 1 && level.maxPlayerCount > 1 )
  818.                 {
  819.                     thread [[level.onForfeit]]();
  820.                     return;
  821.                 }
  822.             }
  823.             else // level.gameForfeited==true
  824.             {
  825.                 if ( totalPlayerCount() > 1 )
  826.                 {
  827.                     level.gameForfeited = false;
  828.                     level notify( "abort forfeit" );
  829.                 }
  830.             }
  831.         }
  832.     }
  833.        
  834.     if ( !level.playerQueuedRespawn && !level.numLives && !level.inOverTime )
  835.         return;
  836.        
  837.     if ( level.inGracePeriod )
  838.         return;
  839.  
  840.     while ( level.playerQueuedRespawn )
  841.     {
  842.         doSpawnQueueUpdates();
  843.     }
  844.    
  845.     if ( doDeadEventUpdates() )
  846.         return;
  847.        
  848.     if ( doOneLeftEventUpdates() )
  849.         return;
  850. }
  851.  
  852.  
  853. matchStartTimer() //checked does not match bo3 _globallogic.gsc did not change
  854. {  
  855.     visionSetNaked( "mpIntro", 0 );
  856.  
  857.     matchStartText = createServerFontString( "objective", 1.5 );
  858.     matchStartText setPoint( "CENTER", "CENTER", 0, -40 );
  859.     matchStartText.sort = 1001;
  860.     matchStartText setText( game["strings"]["waiting_for_teams"] );
  861.     matchStartText.foreground = false;
  862.     matchStartText.hidewheninmenu = true;
  863.  
  864.     waitForPlayers();
  865.     matchStartText setText( game["strings"]["match_starting_in"] );
  866.  
  867.     matchStartTimer = createServerFontString( "objective", 2.2 );
  868.     matchStartTimer setPoint( "CENTER", "CENTER", 0, 0 );
  869.     matchStartTimer.sort = 1001;
  870.     matchStartTimer.color = (1,1,0);
  871.     matchStartTimer.foreground = false;
  872.     matchStartTimer.hidewheninmenu = true;
  873.    
  874.    
  875.     //Since the scaling is disabled, we cant see the pulse effect by scaling. We need to change keep switching between
  876.     //some small and big font to get the pulse effect. This will be fixed when we have fixed set of different sizes fonts.
  877.    
  878.     matchStartTimer maps\mp\gametypes\_hud::fontPulseInit();
  879.  
  880.     countTime = int( level.prematchPeriod );
  881.    
  882.     if ( countTime >= 2 )
  883.     {
  884.         while ( countTime > 0 && !level.gameEnded )
  885.         {
  886.             matchStartTimer setValue( countTime );
  887.             matchStartTimer thread maps\mp\gametypes\_hud::fontPulse( level );
  888.             if ( countTime == 2 )
  889.                 visionSetNaked( GetDvar( "mapname" ), 3.0 );
  890.             countTime--;
  891.             foreach(player in level.players)
  892.                 player playlocalsound("uin_start_count_down");
  893.                
  894.             wait 1;
  895.         }
  896.     }
  897.     else visionSetNaked( GetDvar( "mapname" ), 1.0 );
  898.     matchStartTimer destroyElem();
  899.     matchStartText destroyElem();
  900. }
  901.  
  902. matchStartTimerSkip() //checked does not match bo3 _globallogic.gsc did not change
  903. {
  904.     if (!isPregame()) visionSetNaked( GetDvar( "mapname" ), 0 );
  905.     else visionSetNaked( "mpIntro", 0 );
  906. }
  907.  
  908. notifyTeamWaveSpawn( team, time ) //checked matches bo3 _globallogic.gsc within reason
  909. {
  910.     if ( time - level.lastWave[team] > (level.waveDelay[team] * 1000) )
  911.     {
  912.         level notify ( "wave_respawn_" + team );
  913.         level.lastWave[team] = time;
  914.         level.wavePlayerSpawnIndex[team] = 0;
  915.     }
  916. }
  917.  
  918. waveSpawnTimer() //checked matches bo3 _globallogic.gsc within reason
  919. {
  920.     level endon( "game_ended" );
  921.  
  922.     while ( game["state"] == "playing" )
  923.     {
  924.         time = getTime();
  925.         foreach( team in level.teams ) notifyTeamWaveSpawn( team, time );
  926.         wait 0.05;
  927.     }
  928. }
  929. gamehistoryplayerkicked()
  930. {
  931.     teamscoreratio = self getteamscoreratio();
  932.     scoreboardposition = getplacementforplayer(self);
  933.     if (scoreboardposition < 0) scoreboardposition = level.players.size;
  934.     self gamehistoryfinishmatch(2, self.kills, self.deaths, self.score, scoreboardposition, teamscoreratio);
  935.     if (isDefined(self.pers["matchesPlayedStatsTracked"]))
  936.     {
  937.         gamemode = getcurrentgamemode();
  938.         self incrementmatchcompletionstat(gamemode, "played", "kicked");
  939.         self.pers["matchesPlayedStatsTracked"] = undefined;
  940.     }
  941.     uploadstats(self);
  942.     wait 1;
  943. }
  944. gamehistoryplayerquit()
  945. {
  946.     teamscoreratio = self getteamscoreratio();
  947.     scoreboardposition = getplacementforplayer(self);
  948.     if (scoreboardposition < 0)
  949.     {
  950.         scoreboardposition = level.players.size;
  951.     }
  952.     self gamehistoryfinishmatch(3, self.kills, self.deaths, self.score, scoreboardposition, teamscoreratio);
  953.     if (isDefined(self.pers["matchesPlayedStatsTracked"]))
  954.     {
  955.         gamemode = getcurrentgamemode();
  956.         self incrementmatchcompletionstat(gamemode, "played", "quit");
  957.         if (isDefined(self.pers["matchesHostedStatsTracked"]))
  958.         {
  959.             self incrementmatchcompletionstat(gamemode, "hosted", "quit");
  960.             self.pers["matchesHostedStatsTracked"] = undefined;
  961.         }
  962.         self.pers["matchesPlayedStatsTracked"] = undefined;
  963.     }
  964.     uploadstats(self);
  965.     if (!self ishost()) wait 1;
  966. }
  967.  
  968. hostIdledOut() //checked matches bo3 _globallogic.gsc within reason
  969. {
  970.     hostPlayer = getHostPlayer();
  971.     /*
  972. /#
  973.     if( GetDvarint( "scr_writeconfigstrings" ) == 1  || GetDvarint( "scr_hostmigrationtest" ) == 1 )
  974.         return false;
  975. #/
  976.     */
  977.     // host never spawned
  978.     if ( isDefined( hostPlayer ) && !hostPlayer.hasSpawned && !isDefined( hostPlayer.selectedClass ) )
  979.         return true;
  980.  
  981.     return false;
  982. }
  983.  
  984. IncrementMatchCompletionStat( gameMode, playedOrHosted, stat ) //checked matches bo3 _globallogic.gsc within reason
  985. {
  986.     self AddDStat( "gameHistory", gameMode, "modeHistory", playedOrHosted, stat, 1 );
  987. }
  988.  
  989. SetMatchCompletionStat( gameMode, playedOrHosted, stat ) //checked matches bo3 _globallogic.gsc within reason
  990. {
  991.     self SetDStat( "gameHistory", gameMode, "modeHistory", playedOrHosted, stat, 1 );
  992. }
  993.  
  994. GetCurrentGameMode() //checked does not exist in bo3 _globallogic.gsc
  995. {
  996.     if( GameModeIsMode( level.GAMEMODE_LEAGUE_MATCH ) )
  997.         return "leaguematch";
  998.        
  999.     return "publicmatch";
  1000. }
  1001.  
  1002. sendAfterActionReport() //checked matches bo3 _globallogic.gsc within reason
  1003. {
  1004.     /*
  1005. /#
  1006.     if( GetDvarint( "scr_writeconfigstrings" ) == 1 )
  1007.         return;
  1008. #/
  1009.     */
  1010.     if ( !level.onlineGame || isPregame() || SessionModeIsZombiesGame()) return;
  1011.     //Send After Action Report information to the client
  1012.     for ( index = 0; index < level.players.size; index++ )
  1013.     {
  1014.         player = level.players[index];
  1015.  
  1016.         if (player is_bot()) continue;
  1017.        
  1018.         //Find the Nemesis for each player
  1019.         nemesis = player.pers["nemesis_name"];
  1020.  
  1021.         if( !isDefined( player.pers["killed_players"][nemesis] ) )
  1022.             player.pers["killed_players"][nemesis] = 0;
  1023.         if( !isDefined( player.pers["killed_by"][nemesis] ) )
  1024.             player.pers["killed_by"][nemesis] = 0;
  1025.  
  1026.         //Get the kill to death spread of the player
  1027.         spread = player.kills - player.deaths;
  1028.        
  1029.         if( player.pers["cur_kill_streak"] > player.pers["best_kill_streak"] )
  1030.             player.pers["best_kill_streak"] = player.pers["cur_kill_streak"];  
  1031.    
  1032.         if ( level.rankedMatch || level.wagerMatch || level.leagueMatch )  
  1033.             player maps\mp\gametypes\_persistence::setAfterActionReportStat( "privateMatch", 0 );
  1034.         else
  1035.             player maps\mp\gametypes\_persistence::setAfterActionReportStat( "privateMatch", 1 );
  1036.  
  1037.         player setNemesisXuid( player.pers["nemesis_xuid"] );
  1038.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "nemesisName", nemesis );
  1039.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "nemesisRank", player.pers["nemesis_rank"] );
  1040.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "nemesisRankIcon", player.pers["nemesis_rankIcon"] );
  1041.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "nemesisKills", player.pers["killed_players"][nemesis] );
  1042.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "nemesisKilledBy", player.pers["killed_by"][nemesis] );
  1043.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "bestKillstreak", player.pers["best_kill_streak"] );
  1044.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "kills", player.kills );
  1045.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "deaths", player.deaths );
  1046.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "headshots", player.headshots );
  1047.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "score", player.score );
  1048.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "xpEarned", int( player.pers["summary"]["xp"] ) );
  1049.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "cpEarned", int( player.pers["summary"]["codpoints"] ) );
  1050.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "miscBonus", int( player.pers["summary"]["challenge"] + player.pers["summary"]["misc"] ) );
  1051.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "matchBonus", int( player.pers["summary"]["match"] ) );
  1052.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "demoFileID", getDemoFileID() );
  1053.         player maps/mp/gametypes/_persistence::setafteractionreportstat("leagueTeamID", player getleagueteamid());
  1054.    
  1055.         teamscoreratio = player getteamscoreratio();
  1056.         scoreboardposition = getplacementforplayer(player);
  1057.         if (scoreboardposition < 0)
  1058.         {
  1059.             scoreboardposition = level.players.size;
  1060.         }
  1061.         player gamehistoryfinishmatch(4, player.kills, player.deaths, player.score, scoreboardposition, teamscoreratio);
  1062.         recordPlayerStats( player, "total_xp", player.pers["summary"]["xp"] );
  1063.         placement = level.placement["all"];
  1064.        
  1065.         for ( otherPlayerIndex = 0; otherPlayerIndex < placement.size; otherPlayerIndex++ )
  1066.         {
  1067.             while ( level.placement["all"][otherPlayerIndex] == player ) recordPlayerStats( player, "position", otherPlayerIndex );                        
  1068.         }
  1069.        
  1070.         if ( level.wagerMatch )
  1071.         {
  1072.             recordPlayerStats( player, "wagerPayout", player.wagerWinnings );
  1073.             player maps\mp\gametypes\_wager::setWagerAfterActionReportStats();
  1074.             player maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatch", 1 );
  1075.         }
  1076.         else
  1077.         {
  1078.             player maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatch", 0 );
  1079.         }
  1080.         player maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 0 );
  1081.  
  1082.         if ( level.rankedMatch || level.wagerMatch || level.leagueMatch )  
  1083.             player maps\mp\gametypes\_persistence::setAfterActionReportStat( "valid", 1 );
  1084.            
  1085.         if ( IsDefined( player.pers["matchesPlayedStatsTracked"] ) )
  1086.         {
  1087.             gameMode = GetCurrentGameMode();
  1088.            
  1089.             player IncrementMatchCompletionStat( gameMode, "played", "completed" );
  1090.                
  1091.             if ( IsDefined( player.pers["matchesHostedStatsTracked"] ) )
  1092.             {
  1093.                 player IncrementMatchCompletionStat( gameMode, "hosted", "completed" );
  1094.                 player.pers["matchesHostedStatsTracked"] = undefined;
  1095.             }
  1096.            
  1097.             player.pers["matchesPlayedStatsTracked"] = undefined;
  1098.         }
  1099.  
  1100.         recordPlayerStats( player, "highestKillStreak", player.pers["best_kill_streak"] );
  1101.         recordPlayerStats( player, "numUavCalled", player maps\mp\killstreaks\_killstreaks::getKillstreakUsage("uav_used") );
  1102.         recordPlayerStats( player, "numDogsCalled", player maps\mp\killstreaks\_killstreaks::getKillstreakUsage("dogs_used") );
  1103.         recordPlayerStats( player, "numDogsKills", player.pers["dog_kills"] );
  1104.        
  1105.         recordPlayerMatchEnd( player );
  1106.         RecordPlayerStats(player, "presentAtEnd", 1 );
  1107.     }
  1108. }
  1109.  
  1110. displayRoundEnd( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason
  1111. {
  1112.     while ( level.displayRoundEndText)
  1113.     {
  1114.         while(level.teambased)
  1115.         {
  1116.             if ( winner == "tie" ) maps\mp\_demo::gameResultBookmark( "round_result", level.teamIndex[ "neutral" ], level.teamIndex[ "neutral" ] );
  1117.             else maps\mp\_demo::gameResultBookmark( "round_result", level.teamIndex[ winner ], level.teamIndex[ "neutral" ] );
  1118.         }
  1119.  
  1120.         setmatchflag( "cg_drawSpectatorMessages", 0 );
  1121.         players = level.players;
  1122.         for ( index = 0; index < players.size; index++ )
  1123.         {
  1124.             player = players[index];
  1125.             if (!waslastround()) player notify("round_ended");
  1126.             if ( !isDefined( player.pers["team"] ) )
  1127.             {
  1128.                 player [[level.spawnIntermission]]( true );
  1129.                 player closeMenu();
  1130.                 player closeInGameMenu();
  1131.                 continue;
  1132.             }
  1133.            
  1134.             if ( level.wagerMatch )
  1135.             {
  1136.                 if ( level.teamBased )
  1137.                     player thread [[level.onTeamWagerOutcomeNotify]]( winner, true, endReasonText );
  1138.                 else
  1139.                     player thread [[level.onWagerOutcomeNotify]]( winner, endReasonText );
  1140.             }
  1141.             else
  1142.             {
  1143.                 if ( level.teamBased )
  1144.                 {
  1145.                     player thread [[level.onTeamOutcomeNotify]]( winner, true, endReasonText );
  1146.                     player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "ROUND_END" );       
  1147.                 }
  1148.                 else
  1149.                 {
  1150.                     player thread [[level.onOutcomeNotify]]( winner, true, endReasonText );
  1151.                     player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "ROUND_END" );
  1152.                 }
  1153.             }
  1154.    
  1155.             player setClientUIVisibilityFlag( "hud_visible", 0 );
  1156.             player setClientUIVisibilityFlag( "g_compassShowEnemies", 0 );
  1157.         }
  1158.     }
  1159.     if ( wasLastRound() )
  1160.     {
  1161.         roundEndWait( level.roundEndDelay, false );
  1162.     }
  1163.     else
  1164.     {
  1165.         thread maps\mp\gametypes\_globallogic_audio::announceRoundWinner( winner, level.roundEndDelay / 4 );
  1166.         roundEndWait( level.roundEndDelay, true );
  1167.     }
  1168. }
  1169.  
  1170. displayRoundSwitch( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason
  1171. {
  1172.     switchType = level.halftimeType;
  1173.     foreach(player in level.players) player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "ROUND_SWITCH" );
  1174.     if ( switchType == "halftime" )
  1175.     {
  1176.         if ( IsDefined( level.nextRoundIsOvertime ) && level.nextRoundIsOvertime ) switchType = "overtime";
  1177.         else
  1178.         {
  1179.             if ( level.roundLimit )
  1180.             {
  1181.                 if ( (game["roundsplayed"] * 2) == level.roundLimit )
  1182.                     switchType = "halftime";
  1183.                 else
  1184.                     switchType = "intermission";
  1185.             }
  1186.             else if ( level.scoreLimit )
  1187.             {
  1188.                 if ( game["roundsplayed"] == (level.scoreLimit - 1) )
  1189.                     switchType = "halftime";
  1190.                 else
  1191.                     switchType = "intermission";
  1192.             }
  1193.             else switchType = "intermission";
  1194.         }
  1195.     }
  1196.    
  1197.     leaderdialog = maps\mp\gametypes\_globallogic_audio::getRoundSwitchDialog( switchType );
  1198.     SetMatchTalkFlag( "EveryoneHearsEveryone", 1 );
  1199.     players = level.players;
  1200.     for ( index = 0; index < players.size; index++ )
  1201.     {
  1202.         player = players[index];
  1203.        
  1204.         if ( !isDefined( player.pers["team"] ) )
  1205.         {
  1206.             player [[level.spawnIntermission]]( true );
  1207.             player closeMenu();
  1208.             player closeInGameMenu();
  1209.             continue;
  1210.         }
  1211.             player maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( leaderdialog );
  1212.             player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "ROUND_SWITCH" );
  1213.            
  1214.             if ( level.wagerMatch )
  1215.                 player thread [[level.onTeamWagerOutcomeNotify]]( switchType, true, level.halftimeSubCaption );
  1216.             else
  1217.                 player thread [[level.onTeamOutcomeNotify]]( switchType, false, level.halftimeSubCaption );
  1218.                
  1219.             player setClientUIVisibilityFlag( "hud_visible", 0 );
  1220.     }
  1221.     roundEndWait( level.halftimeRoundEndDelay, false );
  1222. }
  1223.  
  1224. displayGameEnd( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason
  1225. {
  1226.     SetMatchTalkFlag( "EveryoneHearsEveryone", 1 );
  1227.     setmatchflag( "cg_drawSpectatorMessages", 0 );
  1228.  
  1229.     while ( level.teambased )
  1230.     {
  1231.         if ( winner == "tie" ) maps\mp\_demo::gameResultBookmark( "game_result", level.teamIndex[ "neutral" ], level.teamIndex[ "neutral" ] );
  1232.         else maps\mp\_demo::gameResultBookmark( "game_result", level.teamIndex[ winner ], level.teamIndex[ "neutral" ] );
  1233.     }
  1234.     // catching gametype, since DM forceEnd sends winner as player entity, instead of string
  1235.       players = level.players;
  1236.       for ( index = 0; index < players.size; index++ )
  1237.       {
  1238.         player = players[index];
  1239.    
  1240.         if ( !isDefined( player.pers["team"] ) )
  1241.         {
  1242.             player [[level.spawnIntermission]]( true );
  1243.             player closeMenu();
  1244.             player closeInGameMenu();
  1245.             continue;
  1246.         }
  1247.         if ( level.wagerMatch )
  1248.         {
  1249.             if ( level.teamBased )
  1250.                 player thread [[level.onTeamWagerOutcomeNotify]]( winner, false, endReasonText );
  1251.             else
  1252.                 player thread [[level.onWagerOutcomeNotify]]( winner, endReasonText );
  1253.         }
  1254.         else
  1255.         {
  1256.             if ( level.teamBased ) player thread [[level.onTeamOutcomeNotify]]( winner, false, endReasonText );
  1257.             else
  1258.             {
  1259.                 player thread [[level.onOutcomeNotify]]( winner, false, endReasonText );
  1260.                 if ( isDefined( winner ) && player == winner )
  1261.                 {
  1262.                     music = game["music"]["victory_" + player.team];
  1263.                     player maps\mp\gametypes\_globallogic_audio::set_music_on_player( music );
  1264.                 }
  1265.                 else if ( !level.splitScreen )
  1266.                 {
  1267.                     player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "LOSE" );
  1268.                 }
  1269.             }
  1270.         }
  1271.         player setClientUIVisibilityFlag( "hud_visible", 0 );
  1272.         player setClientUIVisibilityFlag( "g_compassShowEnemies", 0 );
  1273.    
  1274.     while ( level.teamBased )
  1275.     {
  1276.         thread maps\mp\gametypes\_globallogic_audio::announceGameWinner( winner, level.postRoundTime / 2 );
  1277.  
  1278.         players = level.players;
  1279.         for ( index = 0; index < players.size; index++ )
  1280.         {
  1281.             player = players[index];
  1282.             team = player.pers["team"];
  1283.    
  1284.             if ( level.splitscreen )
  1285.             {
  1286.                 if ( winner == "tie" )
  1287.                 {
  1288.                     player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "DRAW" );
  1289.                 }                      
  1290.                 else
  1291.                 {
  1292.                     if ( winner == team )
  1293.                     {  
  1294.                         music = game["music"]["victory_" + player.team];
  1295.                         player maps\mp\gametypes\_globallogic_audio::set_music_on_player( music );         
  1296.                     }
  1297.                     else
  1298.                     {
  1299.                         player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "LOSE" );
  1300.                     }
  1301.                 }
  1302.             }
  1303.             else
  1304.             {
  1305.                 if ( winner == "tie" ) player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "DRAW" );         
  1306.                 else
  1307.                 {
  1308.                     if ( winner == team )
  1309.                     {
  1310.                         music = game["music"]["victory_" + player.team];
  1311.                         player maps\mp\gametypes\_globallogic_audio::set_music_on_player( music );
  1312.                     }
  1313.                     else
  1314.                     {
  1315.                         player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "LOSE" );
  1316.                     }
  1317.                 }
  1318.             }
  1319.         }
  1320.     }
  1321.     }
  1322.     bbPrint( "session_epilogs", "reason %s", endReasonText );
  1323.     bbPrint( "mpmatchfacts", "gametime %d winner %s killstreakcount %d", gettime(), winner, level.killstreak_counter );
  1324.     roundEndWait( level.postRoundTime, true );
  1325. }
  1326.  
  1327. getEndReasonText() //checked matches bo3 _globallogic.gsc within reason
  1328. {
  1329.     while (IsDefined(level.endReasonText)) return level.endReasonText;
  1330.    
  1331.     if ( hitRoundLimit() || hitRoundWinLimit() )
  1332.         return  game["strings"]["round_limit_reached"];
  1333.     else if ( hitScoreLimit() )
  1334.         return  game["strings"]["score_limit_reached"];
  1335.  
  1336.     if ( level.forcedEnd )
  1337.     {
  1338.         if ( level.hostForcedEnd )
  1339.             return &"MP_HOST_ENDED_GAME";
  1340.         else
  1341.             return &"MP_ENDED_GAME";
  1342.     }
  1343.     return game["strings"]["time_limit_reached"];
  1344. }
  1345.  
  1346. resetOutcomeForAllPlayers() //checked matches bo3 _globallogic.gsc within reason
  1347. {
  1348.     players = level.players;
  1349.     for ( index = 0; index < players.size; index++ )
  1350.     {
  1351.         player = players[index];
  1352.         player notify ( "reset_outcome" );
  1353.     }
  1354. }
  1355.  
  1356. startNextRound( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason
  1357. {
  1358.     if ( !isOneRound() )
  1359.     {
  1360.         displayRoundEnd( winner, endReasonText );
  1361.  
  1362.         maps\mp\gametypes\_globallogic_utils::executePostRoundEvents();
  1363.        
  1364.         if ( !wasLastRound() )
  1365.         {
  1366.             while ( checkRoundSwitch() )
  1367.             {
  1368.                 displayRoundSwitch( winner, endReasonText );
  1369.             }
  1370.            
  1371.             if ( is_true( level.nextRoundIsOvertime ) )
  1372.             {
  1373.                 if ( !IsDefined( game["overtime_round"] ) )
  1374.                 {
  1375.                     game["overtime_round"] = 1;
  1376.                 }
  1377.                 else
  1378.                 {
  1379.                     game["overtime_round"]++;
  1380.                 }
  1381.             }
  1382.  
  1383.             SetMatchTalkFlag( "DeadChatWithDead", level.voip.deadChatWithDead );
  1384.             SetMatchTalkFlag( "DeadChatWithTeam", level.voip.deadChatWithTeam );
  1385.             SetMatchTalkFlag( "DeadHearTeamLiving", level.voip.deadHearTeamLiving );
  1386.             SetMatchTalkFlag( "DeadHearAllLiving", level.voip.deadHearAllLiving );
  1387.             SetMatchTalkFlag( "EveryoneHearsEveryone", level.voip.everyoneHearsEveryone );
  1388.             SetMatchTalkFlag( "DeadHearKiller", level.voip.deadHearKiller );
  1389.             SetMatchTalkFlag( "KillersHearVictim", level.voip.killersHearVictim );
  1390.                
  1391.             game["state"] = "playing";
  1392.             level.allowBattleChatter = GetGametypeSetting( "allowBattleChatter" );
  1393.             map_restart( true );
  1394.             return true;
  1395.         }
  1396.     }
  1397.     return false;
  1398. }
  1399.  
  1400.    
  1401. setTopPlayerStats( ) //checked matches bo3 _globallogic.gsc within reason
  1402. {
  1403.     if( level.rankedMatch || level.wagerMatch )
  1404.     {
  1405.         placement = level.placement["all"];
  1406.         topThreePlayers = min( 3, placement.size );
  1407.            
  1408.         for ( index = 0; index < topThreePlayers; index++ )
  1409.         {
  1410.             if ( level.placement["all"][index].score )
  1411.             {
  1412.                 if ( !index )
  1413.                 {
  1414.                     level.placement["all"][index] AddPlayerStatWithGameType( "TOPPLAYER", 1 );
  1415.                     level.placement["all"][index] notify( "topplayer" );
  1416.                 }
  1417.                 else
  1418.                     level.placement["all"][index] notify( "nottopplayer" );
  1419.                
  1420.                 level.placement["all"][index] AddPlayerStatWithGameType( "TOP3", 1 );
  1421.                 level.placement["all"][index] notify( "top3" );
  1422.             }
  1423.         }
  1424.        
  1425.         for ( index = 3 ; index < placement.size ; index++ )
  1426.         {
  1427.             level.placement["all"][index] notify( "nottop3" );
  1428.             level.placement["all"][index] notify( "nottopplayer" );
  1429.         }
  1430.  
  1431.         if ( level.teambased )
  1432.         {      
  1433.             foreach ( team in level.teams )
  1434.             {
  1435.                 setTopTeamStats(team);
  1436.             }
  1437.         }
  1438.     }
  1439. }
  1440.  
  1441. setTopTeamStats(team) //checked matches bo3 _globallogic.gsc within reason
  1442. {
  1443.     placementTeam = level.placement[team];
  1444.     topThreeTeamPlayers = min( 3, placementTeam.size );
  1445.     // should have at least 5 players on the team
  1446.     if ( placementTeam.size < 5 )
  1447.         return;
  1448.        
  1449.     for ( index = 0; index < topThreeTeamPlayers; index++ )
  1450.     {
  1451.         if ( placementTeam[index].score )
  1452.         {
  1453.             //placementTeam[index] AddPlayerStat( "BASIC_TOP_3_TEAM", 1 );
  1454.             placementTeam[index] AddPlayerStatWithGameType( "TOP3TEAM", 1 );
  1455.         }
  1456.     }
  1457. }
  1458.  
  1459. getGameLength() //checked does not exist in bo3 _globallogic.gsc
  1460. {
  1461.     if ( !level.timeLimit || level.forcedEnd )
  1462.     {
  1463.         gameLength = maps\mp\gametypes\_globallogic_utils::getTimePassed() / 1000;     
  1464.         // cap it at 20 minutes to avoid exploiting
  1465.         gameLength = min( gameLength, 1200 );
  1466.     }
  1467.     else
  1468.     {
  1469.         gameLength = level.timeLimit * 60;
  1470.     }
  1471.    
  1472.     return gameLength;
  1473. }
  1474.  
  1475. endGame( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason
  1476. {
  1477.     // return if already ending via host quit or victory
  1478.     if ( game["state"] == "postgame" || level.gameEnded )
  1479.         return;
  1480.  
  1481.     if ( isDefined( level.onEndGame ) )
  1482.         [[level.onEndGame]]( winner );
  1483.  
  1484.     //This wait was added possibly for wager match issues, but we think is no longer necessary.
  1485.     //It was creating issues with multiple players calling this fuction when checking game score. In modes like HQ,
  1486.     //The game score is given to every player on the team that captured the HQ, so when the points are dished out it loops through
  1487.     //all players on that team and checks if the score limit has been reached. But since this wait occured before the game["state"]
  1488.     //could be set to "postgame" the check score thread would send the next player that reached the score limit into this function,
  1489.     //when the following code should only be hit once. If this wait turns out to be needed, we need to try pulling the game["state"] = "postgame";
  1490.     //up above the wait.
  1491.     //wait 0.05;
  1492.    
  1493.     if ( !level.wagerMatch ) setMatchFlag( "enable_popups", 0 );
  1494.     if ( !isdefined( level.disableOutroVisionSet ) || level.disableOutroVisionSet == false )
  1495.     {
  1496.         if ( SessionModeIsZombiesGame() && level.forcedEnd )
  1497.         {
  1498.             visionSetNaked( "zombie_last_stand", 2.0 );
  1499.         }
  1500.         else
  1501.         {
  1502.             visionSetNaked( "mpOutro", 2.0 );
  1503.         }
  1504.     }
  1505.    
  1506.     setmatchflag( "cg_drawSpectatorMessages", 0 );
  1507.     setmatchflag( "game_ended", 1 );
  1508.  
  1509.     game["state"] = "postgame";
  1510.     level.gameEndTime = getTime();
  1511.     level.gameEnded = true;
  1512.     SetDvar( "g_gameEnded", 1 );
  1513.     level.inGracePeriod = false;
  1514.     level notify ( "game_ended" );
  1515.     level.allowBattleChatter = false;
  1516.     maps\mp\gametypes\_globallogic_audio::flushDialog();
  1517.  
  1518.     foreach ( team in level.teams ) game["lastroundscore"][team] = getteamscore(team);
  1519.     if ( !IsDefined( game["overtime_round"] ) || wasLastRound() ) // Want to treat all overtime rounds as a single round
  1520.     {
  1521.         game["roundsplayed"]++;
  1522.         game["roundwinner"][game["roundsplayed"]] = winner;
  1523.    
  1524.         //Added "if" check for FFA - Leif
  1525.         if( level.teambased )
  1526.         {
  1527.             game["roundswon"][winner]++;   
  1528.         }
  1529.     }
  1530.  
  1531.     if ( isdefined( winner ) && level.teambased && isdefined( level.teams[winner] ) ) level.finalKillCam_winner = winner;
  1532.     else level.finalKillCam_winner = "none";
  1533.    
  1534.     setGameEndTime( 0 ); // stop/hide the timers
  1535.     updatePlacement();
  1536.     updateRankedMatch( winner );
  1537.     players = level.players;
  1538.     newTime = getTime();
  1539.     gameLength = getGameLength();
  1540.     SetMatchTalkFlag( "EveryoneHearsEveryone", 1 );
  1541.     bbGameOver = 0;
  1542.     if ( isOneRound() || wasLastRound() )
  1543.     {
  1544.         bbGameOver = 1;
  1545.     }
  1546.     /*  if ( level.teambased )
  1547.         {
  1548.             if ( winner == "tie" )
  1549.             {
  1550.                 recordGameResult( "draw" );
  1551.             }
  1552.             else
  1553.             {
  1554.                 recordGameResult( winner );
  1555.             }
  1556.         }
  1557.         else
  1558.         {
  1559.             if ( !isDefined( winner ) )
  1560.             {
  1561.                 recordGameResult( "draw" );
  1562.             }
  1563.             else
  1564.             {
  1565.                 recordGameResult( winner.team );
  1566.             }
  1567.         }
  1568.     }*/
  1569.       for ( index = 0; index < players.size; index++ )
  1570.       {
  1571.         player = players[index];
  1572.         player maps\mp\gametypes\_globallogic_player::freezePlayerForRoundEnd();
  1573.         player thread roundEndDoF( 4 );
  1574.         player maps\mp\gametypes\_globallogic_ui::freeGameplayHudElems();
  1575.        
  1576.         // Update weapon usage stats
  1577.         player maps\mp\gametypes\_weapons::updateWeaponTimings( newTime );
  1578.        
  1579.         player bbPlayerMatchEnd( gameLength, endReasonText, bbGameOver );
  1580.  
  1581.         if(isPregame()) continue;
  1582.  
  1583.         while( level.rankedMatch || level.wagerMatch || level.leagueMatch && !player IsSplitscreen() )
  1584.         {
  1585.              if (level.leaguematch)
  1586.              {
  1587.                  player setdstat("AfterActionReportStats", "lobbyPopup", "leaguesummary");
  1588.              }
  1589.              else
  1590.              {
  1591.                 if ( isDefined( player.setPromotion ) )
  1592.                     player setDStat( "AfterActionReportStats", "lobbyPopup", "promotion" );
  1593.                 else
  1594.                     player setDStat( "AfterActionReportStats", "lobbyPopup", "summary" );
  1595.              }
  1596.         }
  1597.     }
  1598.  
  1599.     maps\mp\_music::setmusicstate( "SILENT" );
  1600.  
  1601. // temporarily disabling round end sound call to prevent the final killcam from not having sound
  1602.     if ( !level.inFinalKillcam )
  1603.     {
  1604. //      clientnotify ( "snd_end_rnd" );
  1605.     }
  1606.  
  1607.     maps\mp\_gamerep::gameRepUpdateInformationForRound();
  1608.     maps\mp\gametypes\_wager::finalizeWagerRound();
  1609.     //maps\mp\gametypes\_gametype_variants::onRoundEnd(); --BO3 ONLY?
  1610.     thread maps\mp\_challenges::roundEnd( winner );
  1611.  
  1612.     if ( startNextRound( winner, endReasonText ) )
  1613.     {
  1614.         return;
  1615.     }
  1616.    
  1617.     ///////////////////////////////////////////
  1618.     // After this the match is really ending //
  1619.     ///////////////////////////////////////////
  1620.  
  1621.     if ( !isOneRound() && !level.gameforfeited)
  1622.     {
  1623.         if ( isDefined( level.onRoundEndGame ) )
  1624.             winner = [[level.onRoundEndGame]]( winner );
  1625.  
  1626.         endReasonText = getEndReasonText();
  1627.     }
  1628.     while (!(level.wagermatch) && !(sessionmodeiszombiesgame()))
  1629.         maps/mp/gametypes/_globallogic_score::updatewinlossstats(winner);
  1630.     if (level.teambased)
  1631.     {
  1632.         if (winner == "tie") recordgameresult("draw");
  1633.         else recordgameresult(winner);
  1634.     }
  1635.     else
  1636.     {
  1637.         if (!isDefined(winner)) recordgameresult("draw");
  1638.         else recordgameresult(winner.team);
  1639.     }
  1640.     skillUpdate( winner, level.teamBased );
  1641.     recordLeagueWinner( winner );
  1642.     setTopPlayerStats();
  1643.     thread maps\mp\_challenges::gameEnd( winner );
  1644.  
  1645.     if ( IsDefined( winner ) && !isDefined( level.skipGameEnd ) || !level.skipGameEnd )
  1646.     {
  1647.         if (isDefined(level.preendgamefunction)) thread [[level.preendgamefunction]](level.postroundtime);
  1648.         displaygameend(winner, endreasontext);
  1649.     }
  1650.    
  1651.     if (isOneRound()) maps\mp\gametypes\_globallogic_utils::executePostRoundEvents();
  1652.     level.intermission = true;
  1653.     maps\mp\_gamerep::gameRepAnalyzeAndReport();
  1654.    
  1655.     if( !isPregame() )
  1656.         thread sendAfterActionReport();
  1657.     maps\mp\gametypes\_wager::finalizeWagerGame();
  1658.    
  1659.     SetMatchTalkFlag( "EveryoneHearsEveryone", 1 );
  1660.  
  1661.     //regain players array since some might've disconnected during the wait above
  1662.     players = level.players;
  1663.     for ( index = 0; index < players.size; index++ )
  1664.     {
  1665.         player = players[index];
  1666.        
  1667.         recordPlayerStats( player, "presentAtEnd", 1 );
  1668.  
  1669.         player closeMenu();
  1670.         player closeInGameMenu();
  1671.         player notify ( "reset_outcome" );
  1672.         player thread [[level.spawnIntermission]]();
  1673.         player setClientUIVisibilityFlag( "hud_visible", 1 );
  1674.     }
  1675.     if (isDefined(level.endgamefunction)) level thread [[level.endgamefunction]]();
  1676.     level notify ( "sfade");
  1677.     logstring( "game ended" );
  1678.    
  1679.     if ( !isDefined( level.skipGameEnd ) || !level.skipGameEnd )
  1680.         wait 5;
  1681.    
  1682.     exitLevel( false );
  1683. }
  1684.  
  1685. bbPlayerMatchEnd( gameLength, endReasonString, gameOver ) // self == player //checked does not exist in bo3 _globallogic.gsc leaving in
  1686. {        
  1687.     playerRank = getPlacementForPlayer( self );
  1688.    
  1689.     totalTimePlayed = 0;
  1690.     if ( isDefined( self.timePlayed ) && isDefined( self.timePlayed["total"] ) )
  1691.     {
  1692.         totalTimePlayed = self.timePlayed["total"];
  1693.         if ( totalTimePlayed > gameLength )
  1694.         {
  1695.             totalTimePlayed = gameLength;
  1696.         }
  1697.     }
  1698.     xuid = self GetXUID();
  1699.     bbprint("mpplayermatchfacts", "score %d momentum %d endreason %s sessionrank %d playtime %d xuid %s gameover %d team %s", self.pers["score"], self.pers["momentum"], endreasonstring, playerrank, totaltimeplayed, xuid, gameover, self.pers["team"]);
  1700. }
  1701.  
  1702. roundEndWait( defaultDelay, matchBonus ) //checked matches bo3 _globallogic.gsc within reason
  1703. {
  1704.   notifiesDone = false;
  1705.   if ( !notifiesDone )
  1706.   {
  1707.       players = level.players;
  1708.       notifiesDone = true;
  1709.       for ( index = 0; index < players.size; index++ )
  1710.       {
  1711.           if ( !isdefined( players[index].doingNotify ) || !players[index].doingNotify )
  1712.             continue;
  1713.           notifiesDone = false;
  1714.       }
  1715.       wait 0.5;
  1716.   }
  1717.   if ( !matchBonus )
  1718.   {
  1719.      wait defaultDelay;
  1720.      level notify ( "round_end_done" );
  1721.      return;
  1722.   }
  1723.  
  1724.   wait ( defaultDelay / 2 );
  1725.   level notify ( "give_match_bonus" );
  1726.   wait ( defaultDelay / 2 );
  1727.  
  1728.   notifiesDone = false;
  1729.   if ( !notifiesDone )
  1730.   {
  1731.     players = level.players;
  1732.     notifiesDone = true;
  1733.     for ( index = 0; index < players.size; index++ )
  1734.     {
  1735.         if ( !isdefined( players[index].doingNotify ) || !players[index].doingNotify )
  1736.             continue;
  1737.         notifiesDone = false;
  1738.     }
  1739.     wait 0.5;
  1740.   }
  1741.   level notify ( "round_end_done" );
  1742.  }
  1743.  
  1744.  
  1745. roundEndDOF( time ) //checked matches bo3 _globallogic.gsc within reason
  1746. {
  1747.     self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
  1748. }
  1749.  
  1750.  
  1751. checkTimeLimit() //checked matches bo3 _globallogic.gsc within reason
  1752. {
  1753.     if ( is_true( level.timeLimitOverride ) )
  1754.         return;
  1755.    
  1756.     if ( game["state"] != "playing" )
  1757.     {
  1758.         setGameEndTime( 0 );
  1759.         return;
  1760.     }
  1761.        
  1762.     if ( level.timeLimit <= 0 )
  1763.     {
  1764.         setGameEndTime( 0 );
  1765.         return;
  1766.     }
  1767.        
  1768.     if ( level.inPrematchPeriod )
  1769.     {
  1770.         setGameEndTime( 0 );
  1771.         return;
  1772.     }
  1773.    
  1774.     if ( level.timerStopped )
  1775.     {
  1776.         setGameEndTime( 0 );
  1777.         return;
  1778.     }
  1779.    
  1780.     if ( !isdefined( level.startTime ) )
  1781.         return;
  1782.    
  1783.     timeLeft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining();
  1784.    
  1785.     // want this accurate to the millisecond
  1786.     setGameEndTime( getTime() + int(timeLeft) );
  1787.    
  1788.     if ( timeLeft > 0 )
  1789.         return;
  1790.    
  1791.     [[level.onTimeLimit]]();
  1792. }
  1793.  
  1794. allTeamsUnderScoreLimit() //checked does not exist in bo3 _globallogic.gsc leaving in
  1795. {
  1796.     foreach ( team in level.teams )
  1797.     {
  1798.         if ( game["teamScores"][team] >= level.scoreLimit )
  1799.             return false;
  1800.     }
  1801.     return true;
  1802. }
  1803.  
  1804. checkScoreLimit() //checked matches bo3 _globallogic.gsc within reason
  1805. {
  1806.     if ( game["state"] != "playing" )
  1807.         return false;
  1808.  
  1809.     if ( level.scoreLimit <= 0 )
  1810.         return false;
  1811.  
  1812.     if ( level.teamBased )
  1813.     {
  1814.         if( allTeamsUnderScoreLimit() )
  1815.             return false;
  1816.     }
  1817.     else
  1818.     {
  1819.         if ( !isPlayer( self ) )
  1820.             return false;
  1821.  
  1822.         if ( self.score < level.scoreLimit )
  1823.             return false;
  1824.     }
  1825.  
  1826.     [[level.onScoreLimit]]();
  1827. }
  1828.  
  1829.  
  1830. updateGameTypeDvars() //checked matches bo3 _globallogic.gsc within reason
  1831. {
  1832.     level endon ( "game_ended" );
  1833.    
  1834.     while ( game["state"] == "playing" )
  1835.     {
  1836.         roundlimit = clamp( GetGametypeSetting( "roundLimit" ), level.roundLimitMin, level.roundLimitMax );
  1837.         if ( roundlimit != level.roundlimit )
  1838.         {
  1839.             level.roundlimit = roundlimit;
  1840.             level notify ( "update_roundlimit" );
  1841.         }
  1842.  
  1843.         timeLimit = [[level.getTimeLimit]]();
  1844.         if ( timeLimit != level.timeLimit )
  1845.         {
  1846.             level.timeLimit = timeLimit;
  1847.             SetDvar( "ui_timelimit", level.timeLimit );
  1848.             level notify ( "update_timelimit" );
  1849.         }
  1850.         thread checkTimeLimit();
  1851.  
  1852.         scoreLimit = clamp( GetGametypeSetting( "scoreLimit" ), level.scoreLimitMin, level.scoreLimitMax );
  1853.         if ( scoreLimit != level.scoreLimit )
  1854.         {
  1855.             level.scoreLimit = scoreLimit;
  1856.             SetDvar( "ui_scorelimit", level.scoreLimit );
  1857.             level notify ( "update_scorelimit" );
  1858.         }
  1859.         thread checkScoreLimit();
  1860.        
  1861.         // make sure we check time limit right when game ends
  1862.         if ( isdefined( level.startTime ) )
  1863.         {
  1864.             if ( maps\mp\gametypes\_globallogic_utils::getTimeRemaining() < 3000 )
  1865.             {
  1866.                 wait .1;
  1867.                 continue;
  1868.             }
  1869.         }
  1870.         wait 1;
  1871.     }
  1872. }
  1873.  
  1874.  
  1875. removeDisconnectedPlayerFromPlacement() //checked matches bo3 _globallogic.gsc within reason
  1876. {
  1877.     offset = 0;
  1878.     numPlayers = level.placement["all"].size;
  1879.     found = false;
  1880.     for ( i = 0; i < numPlayers; i++ )
  1881.     {
  1882.         if ( level.placement["all"][i] == self )
  1883.             found = true;
  1884.        
  1885.         if ( found )
  1886.             level.placement["all"][i] = level.placement["all"][ i + 1 ];
  1887.     }
  1888.     if ( !found )
  1889.         return;
  1890.    
  1891.     level.placement["all"][ numPlayers - 1 ] = undefined;
  1892.     assert( level.placement["all"].size == numPlayers - 1 );
  1893.         /*
  1894.     /#
  1895.     maps\mp\gametypes\_globallogic_utils::assertProperPlacement();
  1896.     #/
  1897.         */
  1898.     updateTeamPlacement();
  1899.    
  1900.     if ( level.teamBased )
  1901.         return;
  1902.        
  1903.     numPlayers = level.placement["all"].size;
  1904.     for ( i = 0; i < numPlayers; i++ )
  1905.     {
  1906.         player = level.placement["all"][i];
  1907.         player notify( "update_outcome" );
  1908.     }
  1909.    
  1910. }
  1911.  
  1912. updateplacement()
  1913. {
  1914.     if (!level.players.size)
  1915.     {
  1916.         return;
  1917.     }
  1918.     level.placement["all"] = [];
  1919.     index = 0;
  1920.     while (index < level.players.size)
  1921.     {
  1922.         if (isDefined(level.teams[level.players[index].team]))
  1923.         {
  1924.             level.placement["all"][level.placement["all"].size] = level.players[index];
  1925.         }
  1926.         index++;
  1927.     }
  1928.     placementall = level.placement["all"];
  1929.     if (level.teambased)
  1930.     {
  1931.         i = 1;
  1932.         while (i < placementall.size)
  1933.         {
  1934.             player = placementall[i];
  1935.             playerscore = player.score;
  1936.             j = i - 1;
  1937.             while (j >= 0 && playerscore > placementall[j].score || playerscore == placementall[j].score && player.deaths < placementall[j].deaths)
  1938.             {
  1939.                 placementall[j + 1] = placementall[j];
  1940.                 j--;
  1941.             }
  1942.             placementall[j + 1] = player;
  1943.             i++;
  1944.         }
  1945.     }
  1946.     else
  1947.     {
  1948.         i = 1;
  1949.         while (i < placementall.size)
  1950.         {
  1951.             player = placementall[i];
  1952.             playerscore = player.pointstowin;
  1953.             j = i - 1;
  1954.             while (j >= 0 && playerscore > placementall[j].pointstowin || playerscore == placementall[j].pointstowin && player.deaths < placementall[j].deaths)
  1955.             {
  1956.                 placementall[j + 1] = placementall[j];
  1957.                 j--;
  1958.             }
  1959.             placementall[j + 1] = player;
  1960.             i++;
  1961.         }
  1962.     }
  1963.     level.placement["all"] = placementall;
  1964.     updateteamplacement();
  1965. }
  1966.  
  1967.  
  1968. updateTeamPlacement() //checked matches bo3 _globallogic.gsc within reason
  1969. {
  1970.     foreach( team in level.teams )
  1971.     {
  1972.         placement[team]    = [];
  1973.     }
  1974.     placement["spectator"] = [];
  1975.    
  1976.     if ( !level.teamBased )
  1977.         return;
  1978.    
  1979.     placementAll = level.placement["all"];
  1980.     placementAllSize = placementAll.size;
  1981.    
  1982.     for ( i = 0; i < placementAllSize; i++ )
  1983.     {
  1984.         player = placementAll[i];
  1985.         team = player.pers["team"];
  1986.        
  1987.         placement[team][ placement[team].size ] = player;
  1988.     }
  1989.    
  1990.     foreach( team in level.teams )
  1991.     {
  1992.         level.placement[team] = placement[team];
  1993.     }
  1994. }
  1995.  
  1996. getPlacementForPlayer( player ) //checked matches bo3 _globallogic.gsc within reason
  1997. {
  1998.     updatePlacement();
  1999.  
  2000.     playerRank = -1;
  2001.     placement = level.placement["all"];
  2002.     for ( placementIndex = 0; placementIndex < placement.size; placementIndex++ )
  2003.     {
  2004.         if ( level.placement["all"][placementIndex] == player )
  2005.         {
  2006.             playerRank = (placementIndex + 1);
  2007.             break;
  2008.         }              
  2009.     }
  2010.  
  2011.     return playerRank;
  2012. }
  2013.  
  2014. sortDeadPlayers( team ) //checked matches bo3 _globallogic.gsc within reason
  2015. {
  2016.     // only need to sort if we are running queued respawn
  2017.     if ( !level.playerQueuedRespawn )
  2018.         return;
  2019.        
  2020.     // sort by death time
  2021.     for ( i = 1; i < level.deadPlayers[team].size; i++ )
  2022.     {
  2023.         player = level.deadPlayers[team][i];
  2024.         for ( j = i - 1; j >= 0 && player.deathTime < level.deadPlayers[team][j].deathTime; j-- )
  2025.             level.deadPlayers[team][j + 1] = level.deadPlayers[team][j];
  2026.         level.deadPlayers[team][j + 1] = player;
  2027.     }
  2028.    
  2029.     for ( i = 0; i < level.deadPlayers[team].size; i++ )
  2030.     {
  2031.         if ( level.deadPlayers[team][i].spawnQueueIndex != i )
  2032.         {
  2033.             level.spawnQueueModified[team] = true;
  2034.         }
  2035.         level.deadPlayers[team][i].spawnQueueIndex = i;
  2036.     }
  2037. }
  2038.  
  2039. totalAliveCount()
  2040. {
  2041.     count = 0;
  2042.     foreach( team in level.teams )
  2043.     {
  2044.         count += level.aliveCount[team];
  2045.     }
  2046.     return count;
  2047. }
  2048.  
  2049. totalPlayerLives() //checked matches bo3 _globallogic.gsc within reason
  2050. {
  2051.     count = 0;
  2052.     foreach( team in level.teams )
  2053.     {
  2054.         count += level.playerLives[team];
  2055.     }
  2056.     return count;
  2057. }
  2058.  
  2059. totalPlayerCount() //checked does not exist in bo3 _globallogic.gsc
  2060. {
  2061.     count = 0;
  2062.     foreach( team in level.teams )
  2063.     {
  2064.         count += level.playerCount[team];
  2065.     }
  2066.     return count;
  2067. }
  2068.  
  2069. initTeamVariables( team ) //checked matches bo3 _globallogic.gsc within reason
  2070. {
  2071.    
  2072.     if ( !isdefined( level.aliveCount ) )
  2073.         level.aliveCount = [];
  2074.    
  2075.     level.aliveCount[team] = 0;
  2076.     level.lastAliveCount[team] = 0;
  2077.    
  2078.     level.everExisted[team] = false;
  2079.     level.waveDelay[team] = 0;
  2080.     level.lastWave[team] = 0;
  2081.     level.wavePlayerSpawnIndex[team] = 0;
  2082.  
  2083.     resetTeamVariables( team );
  2084. }
  2085.  
  2086. resetTeamVariables( team ) //checked matches bo3 _globallogic.gsc within reason
  2087. {
  2088.     level.playerCount[team] = 0;
  2089.     level.botsCount[team] = 0;
  2090.     level.lastAliveCount[team] = level.aliveCount[team];
  2091.     level.aliveCount[team] = 0;
  2092.     level.playerLives[team] = 0;
  2093.     level.alivePlayers[team] = [];
  2094.     level.deadPlayers[team] = [];
  2095.     level.squads[team] = [];
  2096.     level.spawnQueueModified[team] = false;
  2097. }
  2098.  
  2099. updateTeamStatus() //checked matches bo3 _globallogic.gsc within reason
  2100. {
  2101.     // run only once per frame, at the end of the frame.
  2102.     level notify("updating_team_status");
  2103.     level endon("updating_team_status");
  2104.     level endon ( "game_ended" );
  2105.     waittillframeend;
  2106.    
  2107.     wait 0; // Required for Callback_PlayerDisconnect to complete before updateTeamStatus can execute
  2108.  
  2109.     if ( game["state"] == "postgame" )
  2110.         return;
  2111.  
  2112.     resetTimeout();
  2113.    
  2114.     foreach( team in level.teams )
  2115.     {
  2116.         resetTeamVariables( team );
  2117.     }
  2118.    
  2119.       level.activePlayers = [];
  2120.  
  2121.       players = level.players;
  2122.       for ( i = 0; i < players.size; i++ )
  2123.       {
  2124.       player = players[i];
  2125.      
  2126.       if ( !isdefined( player ) && level.splitscreen )
  2127.       continue;
  2128.  
  2129.         if ( level.teambased || player.team == "spectator" ) team = player.team;
  2130.         else team = "free";
  2131.         class = player.class;
  2132.        
  2133.         if ( team != "spectator" && isDefined( class ) && class != "" )
  2134.         {
  2135.             level.playerCount[team]++;
  2136.            
  2137.             if( isDefined( player.pers["isBot"] ) )
  2138.                 level.botsCount[team]++;
  2139.            
  2140.             if ( player.sessionstate == "playing" )
  2141.             {
  2142.                 level.aliveCount[team]++;
  2143.                 level.playerLives[team]++;
  2144.                 player.spawnQueueIndex = -1;
  2145.                
  2146.                 if ( isAlive( player ) )
  2147.                 {
  2148.                     level.alivePlayers[team][level.alivePlayers[team].size] = player;
  2149.                     level.activeplayers[ level.activeplayers.size ] = player;
  2150.                 }
  2151.                 else
  2152.                 {
  2153.                     level.deadPlayers[team][level.deadPlayers[team].size] = player;
  2154.                 }
  2155.             }
  2156.             else
  2157.             {
  2158.                 level.deadPlayers[team][level.deadPlayers[team].size] = player;
  2159.                 if ( player maps\mp\gametypes\_globallogic_spawn::maySpawn() )
  2160.                     level.playerLives[team]++;
  2161.             }
  2162.         }
  2163.     }
  2164.    
  2165.     totalAlive = totalAliveCount();
  2166.    
  2167.     if ( totalAlive > level.maxPlayerCount )
  2168.         level.maxPlayerCount = totalAlive;
  2169.    
  2170.     foreach( team in level.teams )
  2171.     {
  2172.         if (level.aliveCount[team])
  2173.         {
  2174.             game["everExisted"][team] = true;
  2175.             level.everExisted[team] = true;
  2176.         }
  2177.         sortDeadPlayers( team );
  2178.     }
  2179.     level updateGameEvents();
  2180. }
  2181.  
  2182. checkTeamScoreLimitSoon( team ) //checked matches bo3 _globallogic.gsc within reason
  2183. {
  2184.     //assert( IsDefined( team ) );
  2185.    
  2186.     if ( level.scoreLimit <= 0 ) return;
  2187.        
  2188.     if ( !level.teamBased ) return;
  2189.        
  2190.     // Give the data a minute to converge/settle
  2191.     if ( maps\mp\gametypes\_globallogic_utils::getTimePassed() < ( 60 * 1000 ) ) return;
  2192.    
  2193.     timeLeft = maps\mp\gametypes\_globallogic_utils::getEstimatedTimeUntilScoreLimit( team );
  2194.    
  2195.     if ( timeLeft < 1 )
  2196.     {
  2197.         level notify( "match_ending_soon", "score" );
  2198.         //maps\mp\_gameadvertisement::teamScoreLimitSoon( true ); //--NOT IN BO3?
  2199.     }
  2200. }
  2201.  
  2202. checkplayerscorelimitsoon()
  2203. {
  2204.     if (level.scorelimit <= 0) return;
  2205.     if (level.teambased) return;
  2206.     if (maps/mp/gametypes/_globallogic_utils::gettimepassed() < 60000) return;
  2207.     timeleft = maps/mp/gametypes/_globallogic_utils::getestimatedtimeuntilscorelimit(undefined);
  2208.     if (timeleft < 1) level notify("match_ending_soon", "score");
  2209. }
  2210. timeLimitClock() //checked matches bo3 _globallogic.gsc within reason
  2211. {
  2212.     level endon ( "game_ended" );
  2213.    
  2214.     wait .05;
  2215.    
  2216.     clockObject = spawn( "script_origin", (0,0,0) );
  2217.    
  2218.     while ( game["state"] == "playing" )
  2219.     {
  2220.         if ( !level.timerStopped && level.timeLimit )
  2221.         {
  2222.             timeLeft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining() / 1000;
  2223.             timeLeftInt = int(timeLeft + 0.5); // adding .5 and flooring rounds it.
  2224.            
  2225.             if ( timeLeftInt == 601  )
  2226.                 clientnotify ( "notify_10" );
  2227.            
  2228.             if ( timeLeftInt == 301  )
  2229.                 clientnotify ( "notify_5" );
  2230.                
  2231.             if ( timeLeftInt == 60  )
  2232.                 clientnotify ( "notify_1" );
  2233.                
  2234.             if ( timeLeftInt == 12 )
  2235.                 clientnotify ( "notify_count" );
  2236.            
  2237.             if ( timeLeftInt >= 40 && timeLeftInt <= 60 )
  2238.                 level notify ( "match_ending_soon", "time" );
  2239.  
  2240.             if ( timeLeftInt >= 30 && timeLeftInt <= 40 )
  2241.                 level notify ( "match_ending_pretty_soon", "time" );
  2242.                
  2243.             if( timeLeftInt <= 32 )
  2244.                 level notify ( "match_ending_vox" );   
  2245.  
  2246.             if ( timeLeftInt <= 10 || timeLeftInt <= 30 && timeLeftInt % 2 == 0 )
  2247.             {
  2248.                 level notify ( "match_ending_very_soon", "time" );
  2249.                 // don't play a tick at exactly 0 seconds, that's when something should be happening!
  2250.                 if ( timeLeftInt == 0 )
  2251.                     break;
  2252.                 else clockObject playSound( "mpl_ui_timer_countdown" );
  2253.             }
  2254.            
  2255.             // synchronize to be exactly on the second
  2256.             if ( timeLeft - floor(timeLeft) >= .05 )
  2257.                 wait timeLeft - floor(timeLeft);
  2258.         }
  2259.         wait 1;
  2260.     }
  2261. }
  2262.  
  2263. timeLimitClock_Intermission( waitTime ) //checked matches bo3 _globallogic.gsc within reason
  2264. {
  2265.     setGameEndTime( getTime() + int(waitTime*1000) );
  2266.     clockObject = spawn( "script_origin", (0,0,0) );
  2267.    
  2268.     if ( waitTime >= 10.0 )
  2269.         wait waitTime - 10.0 ;
  2270.        
  2271.     for ( ;; )
  2272.     {
  2273.         clockObject playSound( "mpl_ui_timer_countdown" );
  2274.         wait ( 1.0 );
  2275.     }  
  2276. }
  2277.  
  2278.  
  2279. startGame() //checked does not match bo3 _globallogic.gsc did not change
  2280. {
  2281.     thread maps/mp/gametypes/_globallogic_utils::gametimer();
  2282.     level.timerstopped = 0;
  2283.     setmatchtalkflag("DeadChatWithDead", level.voip.deadchatwithdead);
  2284.     setmatchtalkflag("DeadChatWithTeam", level.voip.deadchatwithteam);
  2285.     setmatchtalkflag("DeadHearTeamLiving", level.voip.deadhearteamliving);
  2286.     setmatchtalkflag("DeadHearAllLiving", level.voip.deadhearallliving);
  2287.     setmatchtalkflag("EveryoneHearsEveryone", level.voip.everyonehearseveryone);
  2288.     setmatchtalkflag("DeadHearKiller", level.voip.deadhearkiller);
  2289.     setmatchtalkflag("KillersHearVictim", level.voip.killershearvictim);
  2290.     prematchperiod();
  2291.     level notify("prematch_over");
  2292.     thread timelimitclock();
  2293.     thread graceperiod();
  2294.     thread watchmatchendingsoon();
  2295.     thread maps/mp/gametypes/_globallogic_audio::musiccontroller();
  2296.     recordmatchbegin();
  2297.  }
  2298.  
  2299.  
  2300. waitForPlayers() //checked does not match bo3 _globallogic.gsc did not change
  2301. {
  2302.     while ( GetNumConnectedPlayers() < 1 )
  2303.     {
  2304.         wait 0.05;
  2305.         while (getTime() - starttime > 120000) exitlevel(0);
  2306.     }
  2307. }  
  2308.  
  2309. prematchPeriod() //checked matches bo3 _globallogic.gsc within reason
  2310. {
  2311.     setMatchFlag( "hud_hardcore", level.hardcoreMode );
  2312.     level endon( "game_ended" );
  2313.    
  2314.     if ( level.prematchPeriod > 0 )
  2315.     {
  2316.         thread matchStartTimer();
  2317.  
  2318.         waitForPlayers();
  2319.  
  2320.         wait level.prematchPeriod;
  2321.     }
  2322.     else
  2323.     {
  2324.         matchStartTimerSkip();
  2325.         wait 0.05;
  2326.     }
  2327.    
  2328.     level.inPrematchPeriod = false;
  2329.    
  2330.     for ( index = 0; index < level.players.size; index++ )
  2331.     {      
  2332.         level.players[index] freeze_player_controls( false );
  2333.         level.players[index] enableWeapons();
  2334.     }
  2335.    
  2336.     maps\mp\gametypes\_wager::prematchPeriod();
  2337.  
  2338.     if ( game["state"] != "playing" )
  2339.         return;
  2340. }
  2341.    
  2342. gracePeriod() //checked matches bo3 _globallogic.gsc within reason
  2343. {
  2344.     level endon("game_ended");
  2345.    
  2346.     if ( IsDefined( level.gracePeriodFunc ) )
  2347.     {
  2348.         [[ level.gracePeriodFunc ]]();
  2349.     }
  2350.     else
  2351.     {
  2352.         wait ( level.gracePeriod );
  2353.     }
  2354.    
  2355.     level notify ( "grace_period_ending" );
  2356.     wait 0.05;
  2357.    
  2358.     level.inGracePeriod = false;
  2359.    
  2360.     if ( game["state"] != "playing" )
  2361.         return;
  2362.    
  2363.     if ( level.numLives )
  2364.     {
  2365.         // Players on a team but without a weapon show as dead since they can not get in this round
  2366.         players = level.players;
  2367.        
  2368.         for ( i = 0; i < players.size; i++ )
  2369.         {
  2370.             player = players[i];
  2371.             if ( !player.hasSpawned && player.sessionteam != "spectator" && !isAlive( player ) )
  2372.                 player.statusicon = "hud_status_dead";
  2373.         }
  2374.     }
  2375.     level thread updateTeamStatus();
  2376. }
  2377.  
  2378. watchMatchEndingSoon() //checked matches bo3 _globallogic.gsc within reason
  2379. {
  2380.     SetDvar( "xblive_matchEndingSoon", 0 );
  2381.     level waittill( "match_ending_soon", reason );
  2382.     SetDvar( "xblive_matchEndingSoon", 1 );
  2383. }
  2384.  
  2385. assertTeamVariables( ) //checked matches bo3 _globallogic.gsc within reason
  2386. {
  2387.     // these are defined in the teamset file
  2388.     if ( !level.createFX_enabled && !SessionModeIsZombiesGame() )
  2389.     {
  2390.         foreach ( team in level.teams )
  2391.         {
  2392.             /*
  2393.             Assert( IsDefined( game["strings"][ team + "_win"] ) );
  2394.             Assert( IsDefined( game["strings"][ team + "_win_round"] ) );
  2395.             Assert( IsDefined( game["strings"][ team + "_mission_accomplished"] ) );
  2396.             Assert( IsDefined( game["strings"][ team + "_eliminated"] ) );
  2397.             Assert( IsDefined( game["strings"][ team + "_forfeited"] ) );
  2398.             Assert( IsDefined( game["strings"][ team + "_name"] ) );
  2399.             Assert( IsDefined( game["music"]["spawn_" + team] ) );
  2400.             Assert( IsDefined( game["music"]["victory_" + team] ) );
  2401.             Assert( IsDefined( game["icons"][team] ) );
  2402.             Assert( IsDefined( game["voice"][team] ) );
  2403.             */
  2404.         }
  2405.     }
  2406. }
  2407.  
  2408. anyTeamHasWaveDelay() //checked matches bo3 _globallogic.gsc within reason
  2409. {
  2410.     foreach ( team in level.teams )
  2411.     {
  2412.         if ( level.waveDelay[team] )
  2413.             return true;
  2414.     }
  2415.    
  2416.     return false;
  2417. }
  2418.  
  2419. Callback_StartGameType() //checked does not match bo3 _globallogic.gsc did not change
  2420. {
  2421.     level.prematchPeriod = 0;
  2422.     level.intermission = false;
  2423.  
  2424.     setmatchflag( "cg_drawSpectatorMessages", 1 );
  2425.     setmatchflag( "game_ended", 0 );
  2426.    
  2427.     if ( !isDefined( game["gamestarted"] ) )
  2428.     {
  2429.         // defaults if not defined in level script
  2430.         if ( !isDefined( game["allies"] ) )
  2431.             game["allies"] = "seals";
  2432.         if ( !isDefined( game["axis"] ) )
  2433.             game["axis"] = "pmc";
  2434.         if ( !isDefined( game["attackers"] ) )
  2435.             game["attackers"] = "allies";
  2436.         if (  !isDefined( game["defenders"] ) )
  2437.             game["defenders"] = "axis";
  2438.  
  2439.         // if this hits the teams are not setup right
  2440.         //assert( game["attackers"] != game["defenders"] );
  2441.        
  2442.         // TODO MTEAM - need to update this valid team
  2443.         foreach( team in level.teams )
  2444.         {
  2445.             if ( !isDefined( game[team] ) )
  2446.                 game[team] = "pmc";
  2447.         }
  2448.  
  2449.         if ( !isDefined( game["state"] ) )
  2450.             game["state"] = "playing";
  2451.        
  2452.         precacheRumble( "damage_heavy" );
  2453.         precacheRumble( "damage_light" );
  2454.  
  2455.         precacheShader( "white" );
  2456.         precacheShader( "black" );
  2457.        
  2458.         makeDvarServerInfo( "scr_allies", "marines" );
  2459.         makeDvarServerInfo( "scr_axis", "nva" );
  2460.        
  2461.         makeDvarServerInfo( "cg_thirdPersonAngle", 354 );
  2462.  
  2463.         SetDvar( "cg_thirdPersonAngle", 354 );
  2464.  
  2465.         game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN";
  2466.         if ( level.teamBased )
  2467.         {
  2468.             game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_TEAMS";
  2469.             game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN";
  2470.         }
  2471.         else
  2472.         {
  2473.             game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_PLAYERS";
  2474.             game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN";
  2475.         }
  2476.         game["strings"]["match_starting_in"] = &"MP_MATCH_STARTING_IN";
  2477.         game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND";
  2478.         game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN";
  2479.         game["strings"]["waiting_to_spawn_ss"] = &"MP_WAITING_TO_SPAWN_SS";
  2480.         //game["strings"]["waiting_to_safespawn"] = &"MP_WAITING_TO_SAFESPAWN";
  2481.         game["strings"]["you_will_spawn"] = &"MP_YOU_WILL_RESPAWN";
  2482.         game["strings"]["match_starting"] = &"MP_MATCH_STARTING";
  2483.         game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN";
  2484.         game["strings"]["last_stand"] = &"MPUI_LAST_STAND";
  2485.        
  2486.         game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT";
  2487.        
  2488.         game["strings"]["tie"] = &"MP_MATCH_TIE";
  2489.         game["strings"]["round_draw"] = &"MP_ROUND_DRAW";
  2490.  
  2491.         game["strings"]["enemies_eliminated"] = &"MP_ENEMIES_ELIMINATED";
  2492.         game["strings"]["score_limit_reached"] = &"MP_SCORE_LIMIT_REACHED";
  2493.         game["strings"]["round_limit_reached"] = &"MP_ROUND_LIMIT_REACHED";
  2494.         game["strings"]["time_limit_reached"] = &"MP_TIME_LIMIT_REACHED";
  2495.         game["strings"]["players_forfeited"] = &"MP_PLAYERS_FORFEITED";
  2496.  
  2497.         assertTeamVariables();
  2498.  
  2499.         [[level.onPrecacheGameType]]();
  2500.  
  2501.         game["gamestarted"] = true;
  2502.        
  2503.         game["totalKills"] = 0;
  2504.  
  2505.         foreach( team in level.teams )
  2506.         {
  2507.             game["teamScores"][team] = 0;
  2508.             game["totalKillsTeam"][team] = 0;
  2509.         }
  2510.  
  2511.         if ( !level.splitscreen && !isPreGame() )
  2512.             level.prematchPeriod = GetGametypeSetting( "prematchperiod" );
  2513.  
  2514.         if ( GetDvarint( "xblive_clanmatch" ) != 0 )
  2515.         {
  2516.             // TODO MTEAM is this code used anymore?
  2517.             foreach( team in level.teams ) game["icons"][team] = "composite_emblem_team_axis";
  2518.             game["icons"]["allies"] = "composite_emblem_team_allies";
  2519.             game["icons"]["axis"] = "composite_emblem_team_axis";
  2520.         }
  2521.     }
  2522.     else
  2523.     {
  2524.         if (!level.splitscreen) level.prematchperiod = getgametypesetting("preroundperiod");
  2525.     }
  2526.     if(!isdefined(game["timepassed"]))
  2527.         game["timepassed"] = 0;
  2528.  
  2529.     if(!isdefined(game["roundsplayed"]))
  2530.         game["roundsplayed"] = 0;
  2531.     SetRoundsPlayed( game["roundsplayed"] );
  2532.    
  2533.     if ( IsDefined( game["overtime_round"] ) ) SetMatchFlag( "overtime", 1 );
  2534.     else SetMatchFlag( "overtime", 0 );
  2535.    
  2536.     if(!isdefined(game["roundwinner"] )) game["roundwinner"] = [];
  2537.  
  2538.     if(!isdefined(game["roundswon"])) game["roundswon"] = [];
  2539.  
  2540.     if(!isdefined(game["roundswon"]["tie"] )) game["roundswon"]["tie"] = 0;
  2541.  
  2542.     foreach ( team in level.teams )
  2543.     {
  2544.         if(!isdefined(game["roundswon"][team] ))
  2545.             game["roundswon"][team] = 0;
  2546.  
  2547.         level.teamSpawnPoints[team] = [];
  2548.         level.spawn_point_team_class_names[team] = [];
  2549.     }
  2550.  
  2551.     level.skipVote = false;
  2552.     level.gameEnded = false;
  2553.     SetDvar( "g_gameEnded", 0 );
  2554.  
  2555.     level.objIDStart = 0;
  2556.     level.forcedEnd = false;
  2557.     level.hostForcedEnd = false;
  2558.  
  2559.     level.hardcoreMode = GetGametypeSetting( "hardcoreMode" );
  2560.     if ( level.hardcoreMode )
  2561.     {
  2562.         logstring( "game mode: hardcore" );
  2563.        
  2564.         //set up friendly fire delay for hardcore
  2565.         if( !isDefined(level.friendlyFireDelayTime)) level.friendlyFireDelayTime = 0;
  2566.     }
  2567.  
  2568.     if ( GetDvar( "scr_max_rank" ) == "" )
  2569.             SetDvar( "scr_max_rank", "0" );
  2570.     level.rankCap = GetDvarint( "scr_max_rank" );
  2571.    
  2572.     if ( GetDvar( "scr_min_prestige" ) == "" )
  2573.     {
  2574.         SetDvar( "scr_min_prestige", "0" );
  2575.     }
  2576.     level.minPrestige = GetDvarint( "scr_min_prestige" );
  2577.  
  2578.     // this gets set to false when someone takes damage or a gametype-specific event happens.
  2579.     level.useStartSpawns = true;
  2580.  
  2581.     level.roundscorecarry = getgametypesetting("roundscorecarry");
  2582.     level.allowhitmarkers = getgametypesetting("allowhitmarkers");
  2583.     level.playerqueuedrespawn = getgametypesetting("playerQueuedRespawn");
  2584.     level.playerforcerespawn = getgametypesetting("playerForceRespawn");
  2585.     level.roundstartexplosivedelay = getgametypesetting("roundStartExplosiveDelay");
  2586.     level.roundstartkillstreakdelay = getgametypesetting("roundStartKillstreakDelay");
  2587.     level.perksenabled = getgametypesetting("perksEnabled");
  2588.     level.disableattachments = getgametypesetting("disableAttachments");
  2589.     level.disabletacinsert = getgametypesetting("disableTacInsert");
  2590.     level.disablecac = getgametypesetting("disableCAC");
  2591.     level.disableclassselection = getgametypesetting("disableClassSelection");
  2592.     level.disableweapondrop = getgametypesetting("disableweapondrop");
  2593.     level.onlyheadshots = getgametypesetting("onlyHeadshots");
  2594.     level.minimumallowedteamkills = getgametypesetting("teamKillPunishCount") - 1;
  2595.     level.teamkillreducedpenalty = getgametypesetting("teamKillReducedPenalty");
  2596.     level.teamkillpointloss = getgametypesetting("teamKillPointLoss");
  2597.     level.teamkillspawndelay = getgametypesetting("teamKillSpawnDelay");
  2598.     level.deathpointloss = getgametypesetting("deathPointLoss");
  2599.     level.leaderbonus = getgametypesetting("leaderBonus");
  2600.     level.forceradar = getgametypesetting("forceRadar");
  2601.     level.playersprinttime = getgametypesetting("playerSprintTime");
  2602.     level.bulletdamagescalar = getgametypesetting("bulletDamageScalar");
  2603.     level.playermaxhealth = getgametypesetting("playerMaxHealth");
  2604.     level.playerhealthregentime = getgametypesetting("playerHealthRegenTime");
  2605.     level.playerrespawndelay = getgametypesetting("playerRespawnDelay");
  2606.     level.playerobjectiveheldrespawndelay = getgametypesetting("playerObjectiveHeldRespawnDelay");
  2607.     level.waverespawndelay = getgametypesetting("waveRespawnDelay");
  2608.     level.suicidespawndelay = getgametypesetting("spawnsuicidepenalty");
  2609.     level.teamkilledspawndelay = getgametypesetting("spawnteamkilledpenalty");
  2610.     level.maxsuicidesbeforekick = getgametypesetting("maxsuicidesbeforekick");
  2611.     level.spectatetype = getgametypesetting("spectateType");
  2612.     level.voip = spawnstruct();
  2613.     level.voip.deadchatwithdead = getgametypesetting("voipDeadChatWithDead");
  2614.     level.voip.deadchatwithteam = getgametypesetting("voipDeadChatWithTeam");
  2615.     level.voip.deadhearallliving = getgametypesetting("voipDeadHearAllLiving");
  2616.     level.voip.deadhearteamliving = getgametypesetting("voipDeadHearTeamLiving");
  2617.     level.voip.everyonehearseveryone = getgametypesetting("voipEveryoneHearsEveryone");
  2618.     level.voip.deadhearkiller = getgametypesetting("voipDeadHearKiller");
  2619.     level.voip.killershearvictim = getgametypesetting("voipKillersHearVictim");
  2620.  
  2621.     if( GetDvar( "r_reflectionProbeGenerate" ) == "1" )
  2622.         level waittill( "eternity" );
  2623.        
  2624.     if( SessionModeIsZombiesGame() )
  2625.     {
  2626.         level.prematchPeriod = 0;
  2627.  
  2628.  
  2629.         //thread maps\mp\gametypes\_persistence::init();
  2630.         level.persistentDataInfo = [];
  2631.         level.maxRecentStats = 10;
  2632.         level.maxHitLocations = 19;
  2633.         level.globalShotsFired = 0;
  2634.         //thread maps\mp\gametypes\_class::init();
  2635.  
  2636.  
  2637.         thread maps/mp/gametypes/_hud::init();
  2638.         thread maps/mp/gametypes/_serversettings::init();
  2639.         thread maps/mp/gametypes/_clientids::init();
  2640.         thread maps/mp/gametypes/_weaponobjects::init();
  2641.         thread maps/mp/gametypes/_scoreboard::init();
  2642.         thread maps/mp/gametypes/_killcam::init();
  2643.         thread maps/mp/gametypes/_shellshock::init();
  2644.         thread maps/mp/gametypes/_deathicons::init();
  2645.         thread maps/mp/gametypes/_spectating::init();
  2646.         thread maps/mp/gametypes/_objpoints::init();
  2647.         thread maps/mp/gametypes/_gameobjects::init();
  2648.         thread maps/mp/gametypes/_spawnlogic::init();
  2649.         thread maps/mp/gametypes/_globallogic_audio::init();
  2650.         thread maps/mp/gametypes/_wager::init();
  2651.         thread maps/mp/bots/_bot::init();
  2652.         thread maps/mp/_decoy::init();
  2653.     }
  2654.     else
  2655.     {
  2656.         thread maps/mp/gametypes/_persistence::init();
  2657.         thread maps/mp/gametypes/_menus::init();
  2658.         thread maps/mp/gametypes/_hud::init();
  2659.         thread maps/mp/gametypes/_serversettings::init();
  2660.         thread maps/mp/gametypes/_clientids::init();
  2661.         thread maps/mp/teams/_teams::init();
  2662.         thread maps/mp/gametypes/_weapons::init();
  2663.         thread maps/mp/gametypes/_scoreboard::init();
  2664.         thread maps/mp/gametypes/_killcam::init();
  2665.         thread maps/mp/gametypes/_shellshock::init();
  2666.         thread maps/mp/gametypes/_deathicons::init();
  2667.         thread maps/mp/gametypes/_damagefeedback::init();
  2668.         thread maps/mp/gametypes/_healthoverlay::init();
  2669.         thread maps/mp/gametypes/_spectating::init();
  2670.         thread maps/mp/gametypes/_objpoints::init();
  2671.         thread maps/mp/gametypes/_gameobjects::init();
  2672.         thread maps/mp/gametypes/_spawnlogic::init();
  2673.         thread maps/mp/gametypes/_battlechatter_mp::init();
  2674.         thread maps/mp/killstreaks/_killstreaks::init();
  2675.         thread maps/mp/gametypes/_globallogic_audio::init();
  2676.         thread maps/mp/gametypes/_wager::init();
  2677.         thread maps/mp/bots/_bot::init();
  2678.         thread maps/mp/_decoy::init();
  2679.         thread maps/mp/_bb::init();
  2680.     }
  2681.  
  2682.     if ( level.teamBased )
  2683.         thread maps\mp\gametypes\_friendicons::init();
  2684.        
  2685.     thread maps\mp\gametypes\_hud_message::init();
  2686.     thread maps\mp\_multi_extracam::init();
  2687.  
  2688.     stringNames = getArrayKeys( game["strings"] );
  2689.     for ( index = 0; index < stringNames.size; index++ )
  2690.     {
  2691.         precacheString( game[ "strings" ][ stringNames[ index ] ] );
  2692.     }
  2693.     foreach( team in level.teams )
  2694.     {
  2695.         initTeamVariables( team );
  2696.     }
  2697.    
  2698.     level.maxPlayerCount = 0;
  2699.     level.activePlayers = [];
  2700.  
  2701.     level.allowAnnouncer = GetGametypeSetting( "allowAnnouncer" );
  2702.  
  2703.     if ( !isDefined( level.timeLimit ) )
  2704.         registerTimeLimit( 1, 1440 );
  2705.        
  2706.     if ( !isDefined( level.scoreLimit ) )
  2707.         registerScoreLimit( 1, 500 );
  2708.  
  2709.     if ( !isDefined( level.roundLimit ) )
  2710.         registerRoundLimit( 0, 10 );
  2711.  
  2712.     if ( !isDefined( level.roundWinLimit ) )
  2713.         registerRoundWinLimit( 0, 10 );
  2714.    
  2715.     // The order the following functions are registered in are the order they will get called
  2716.     maps/mp/gametypes/_globallogic_utils::registerpostroundevent(::postroundfinalkillcam);
  2717.     maps/mp/gametypes/_globallogic_utils::registerpostroundevent(::postroundsidebet);
  2718.     makeDvarServerInfo( "ui_scorelimit" );
  2719.     makeDvarServerInfo( "ui_timelimit" );
  2720.     makeDvarServerInfo( "ui_allow_classchange", GetDvar( "ui_allow_classchange" ) );
  2721.  
  2722.     waveDelay = level.waveRespawnDelay;
  2723.     if ( waveDelay && !isPreGame() )
  2724.     {
  2725.         foreach ( team in level.teams )
  2726.         {
  2727.             level.waveDelay[team] = waveDelay;
  2728.             level.lastWave[team] = 0;
  2729.         }
  2730.        
  2731.         level thread [[level.waveSpawnTimer]]();
  2732.     }
  2733.    
  2734.     level.inPrematchPeriod = true;
  2735.    
  2736.     if ( level.prematchPeriod > 2.0 )
  2737.         level.prematchPeriod = level.prematchPeriod + (randomFloat( 4 ) - 2); // live host obfuscation
  2738.  
  2739.     if ( level.numLives || anyTeamHasWaveDelay() || level.playerQueuedRespawn )
  2740.         level.gracePeriod = 15;
  2741.     else
  2742.         level.gracePeriod = 5;
  2743.        
  2744.     level.inGracePeriod = true;
  2745.    
  2746.     level.roundEndDelay = 5;
  2747.     level.halftimeRoundEndDelay = 3;
  2748.    
  2749.     maps\mp\gametypes\_globallogic_score::updateAllTeamScores();
  2750.    
  2751.     level.killstreaksenabled = GetGametypeSetting( "killstreaksenabled" );
  2752.    
  2753.     if ( GetDvar( "scr_game_rankenabled" ) == "" )
  2754.         SetDvar( "scr_game_rankenabled", true );
  2755.     level.rankEnabled = GetDvarint( "scr_game_rankenabled" );
  2756.    
  2757.     if ( GetDvar( "scr_game_medalsenabled" ) == "" )
  2758.         SetDvar( "scr_game_medalsenabled", true );
  2759.     level.medalsEnabled = GetDvarint( "scr_game_medalsenabled" );
  2760.  
  2761.     if( level.hardcoreMode && level.rankedMatch && GetDvar( "scr_game_friendlyFireDelay" ) == "" )
  2762.         SetDvar( "scr_game_friendlyFireDelay", true );
  2763.     level.friendlyFireDelay = GetDvarint( "scr_game_friendlyFireDelay" );
  2764.  
  2765.     // level gametype and features globals should be defaulted before this, and level.onstartgametype should reset them if desired
  2766.     if(GetDvar("createfx") == "")
  2767.     {
  2768.         [[level.onStartGameType]]();
  2769.     }
  2770.  
  2771.     // disable killstreaks for custom game modes
  2772.     if( GetDvarInt( "custom_killstreak_mode" ) == 1 )
  2773.     {
  2774.         level.killstreaksenabled = 0;
  2775.     }
  2776.    
  2777.     // this must be after onstartgametype for scr_showspawns to work when set at start of game
  2778.         /*
  2779.     /#
  2780.     thread maps\mp\gametypes\_dev::init();
  2781.     #/
  2782.         */
  2783.     /* 
  2784. /#
  2785.     PrintLn( "Globallogic Callback_StartGametype() isPregame() = " + isPregame() + "\n" );
  2786. #/
  2787.     */
  2788.     level thread maps\mp\gametypes\_killcam::doFinalKillcam();
  2789.  
  2790.     thread startGame();
  2791.     level thread updateGameTypeDvars();
  2792.     /*
  2793. /#
  2794.     if( GetDvarint( "scr_writeconfigstrings" ) == 1 )
  2795.     {
  2796.         level.skipGameEnd = true;
  2797.         level.roundLimit = 1;
  2798.        
  2799.         // let things settle
  2800.         wait(1);
  2801. //      level.forcedEnd = true;
  2802.         thread forceEnd( false );
  2803. //      thread endgame( "tie","" );
  2804.     }
  2805.     if( GetDvarint( "scr_hostmigrationtest" ) == 1 )
  2806.     {
  2807.         thread ForceDebugHostMigration();
  2808.     }
  2809. #/
  2810.     */
  2811. }
  2812.  
  2813.  
  2814. ForceDebugHostMigration()
  2815. {  
  2816.         /*
  2817.     /#
  2818.     while (1)
  2819.     {
  2820.         maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  2821.         wait(60);
  2822.         starthostmigration();
  2823.         maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  2824.         //thread forceEnd( false );
  2825.     }
  2826.     #/
  2827.         */
  2828. }
  2829.  
  2830.  
  2831. registerFriendlyFireDelay( dvarString, defaultValue, minValue, maxValue ) //checked matches bo3 _globallogic.gsc within reason
  2832. {
  2833.     dvarString = ("scr_" + dvarString + "_friendlyFireDelayTime");
  2834.     if ( getDvar( dvarString ) == "" )
  2835.         setDvar( dvarString, defaultValue );
  2836.        
  2837.     if ( getDvarInt( dvarString ) > maxValue )
  2838.         setDvar( dvarString, maxValue );
  2839.     else if ( getDvarInt( dvarString ) < minValue )
  2840.         setDvar( dvarString, minValue );
  2841.  
  2842.     level.friendlyFireDelayTime = getDvarInt( dvarString );
  2843. }
  2844.  
  2845. checkRoundSwitch() //checked matches bo3 _globallogic.gsc within reason
  2846. {
  2847.     if ( !isdefined( level.roundSwitch ) || !level.roundSwitch )
  2848.         return false;
  2849.     if ( !isdefined( level.onRoundSwitch ) )
  2850.         return false;
  2851.    
  2852.     //assert( game["roundsplayed"] > 0 );
  2853.    
  2854.     if ( game["roundsplayed"] % level.roundswitch == 0 )
  2855.     {
  2856.         [[level.onRoundSwitch]]();
  2857.         return true;
  2858.     }
  2859.        
  2860.     return false;
  2861. }
  2862.  
  2863.  
  2864. listenForGameEnd() //checked matches bo3 _globallogic.gsc within reason
  2865. {
  2866.     self waittill( "host_sucks_end_game" );
  2867.     //if ( level.console )
  2868.     //  endparty();
  2869.     level.skipVote = true;
  2870.  
  2871.     if ( !level.gameEnded )
  2872.         level thread maps\mp\gametypes\_globallogic::forceEnd(true);
  2873. }
  2874.  
  2875.  
  2876. getKillStreaks( player ) //checked matches bo3 _globallogic.gsc within reason
  2877. {
  2878.     for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ )
  2879.     {
  2880.         killstreak[ killstreakNum ] = "killstreak_null";
  2881.     }
  2882.    
  2883.     if ( isPlayer( player ) && !level.oldschool && level.disableCAC != 1 && !isdefined( player.pers["isBot"] ) && isdefined( player.killstreak ) )
  2884.     {
  2885.         currentKillstreak = 0;
  2886.         for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ )
  2887.         {
  2888.                 if ( isDefined( player.killstreak[ killstreakNum ] ) )
  2889.                 {
  2890.                     killstreak[ currentKillstreak ] = player.killstreak[ killstreakNum ];
  2891.                     currentKillstreak++;
  2892.                 }
  2893.         }
  2894.     }
  2895.    
  2896.     return killstreak;
  2897. }
  2898.  
  2899. updateRankedMatch(winner) //checked matches bo3 _globallogic.gsc within reason
  2900. {
  2901.     if ( level.rankedMatch )
  2902.     {
  2903.         if ( hostIdledOut() )
  2904.         {
  2905.             level.hostForcedEnd = true;
  2906.             logstring( "host idled out" );
  2907.             endLobby();
  2908.         }
  2909.     }
  2910.     if ( !level.wagerMatch && !SessionModeIsZombiesGame() )
  2911.     {
  2912.         maps\mp\gametypes\_globallogic_score::updateMatchBonusScores( winner );
  2913.         maps\mp\gametypes\_globallogic_score::updateWinLossStats( winner );
  2914.     }
  2915. }
  2916.  
  2917.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement