Advertisement
Guest User

_Globallogic.gsc - Black Ops 2

a guest
Apr 27th, 2020
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 91.50 KB | None | 0 0
  1. #include maps/mp/gametypes/_globallogic;
  2. #include maps/mp/gametypes/_hostmigration;
  3. #include maps/mp/gametypes/_dev;
  4. #include maps/mp/_multi_extracam;
  5. #include maps/mp/gametypes/_friendicons;
  6. #include maps/mp/_bb;
  7. #include maps/mp/gametypes/_battlechatter_mp;
  8. #include maps/mp/gametypes/_healthoverlay;
  9. #include maps/mp/gametypes/_damagefeedback;
  10. #include maps/mp/teams/_teams;
  11. #include maps/mp/gametypes/_menus;
  12. #include maps/mp/_decoy;
  13. #include maps/mp/gametypes/_spawnlogic;
  14. #include maps/mp/gametypes/_gameobjects;
  15. #include maps/mp/gametypes/_objpoints;
  16. #include maps/mp/gametypes/_spectating;
  17. #include maps/mp/gametypes/_deathicons;
  18. #include maps/mp/gametypes/_shellshock;
  19. #include maps/mp/gametypes/_killcam;
  20. #include maps/mp/gametypes/_scoreboard;
  21. #include maps/mp/gametypes/_weaponobjects;
  22. #include maps/mp/gametypes/_clientids;
  23. #include maps/mp/gametypes/_serversettings;
  24. #include maps/mp/_challenges;
  25. #include maps/mp/_music;
  26. #include maps/mp/gametypes/_weapons;
  27. #include maps/mp/gametypes/_globallogic_player;
  28. #include maps/mp/_demo;
  29. #include maps/mp/killstreaks/_killstreaks;
  30. #include maps/mp/gametypes/_wager;
  31. #include maps/mp/gametypes/_persistence;
  32. #include maps/mp/gametypes/_hud;
  33. #include maps/mp/gametypes/_globallogic_utils;
  34. #include maps/mp/bots/_bot;
  35. #include maps/mp/gametypes/_hud_message;
  36. #include maps/mp/gametypes/_globallogic_defaults;
  37. #include maps/mp/gametypes/_globallogic_score;
  38. #include maps/mp/gametypes/_globallogic_spawn;
  39. #include maps/mp/_gamerep;
  40. #include maps/mp/_gameadvertisement;
  41. #include maps/mp/gametypes/_globallogic_audio;
  42. #include maps/mp/gametypes/_class;
  43. #include maps/mp/gametypes/_globallogic_ui;
  44. #include maps/mp/gametypes/_tweakables;
  45. #include common_scripts/utility;
  46. #include maps/mp/_busing;
  47. #include maps/mp/_burnplayer;
  48. #include maps/mp/gametypes/_hud_util;
  49. #include maps/mp/_utility;
  50.  
  51.  
  52. init()
  53. {
  54.     if (!isDefined(level.tweakablesinitialized))
  55.     {
  56.         maps/mp/gametypes/_tweakables::init();
  57.     }
  58.     init_session_mode_flags();
  59.     level.splitscreen = issplitscreen();
  60.     level.xenon = getDvar(#"0xe0dde627") == "true";
  61.     level.ps3 = getDvar(#"0xc15079f5") == "true";
  62.     level.wiiu = getDvar(#"0xde5d2cdd") == "true";
  63.     level.onlinegame = sessionmodeisonlinegame();
  64.     level.systemlink = sessionmodeissystemlink();
  65.     level.console = level.wiiu;
  66.     level.rankedmatch = !(ispregame());
  67.     level.leaguematch = gamemodeismode(level.gamemode_league_match);
  68.     level.contractsenabled = !(getgametypesetting("disableContracts"));
  69.     level.contractsenabled = 0;
  70.     level.script = tolower(getDvar(#"0xb4b895c4"));
  71.     level.gametype = tolower(getDvar(#"0x4f118387"));
  72.     level.teambased = 0;
  73.     level.teamcount = getgametypesetting("teamCount");
  74.     level.multiteam = level.teamcount > 2;
  75.     while (sessionmodeiszombiesgame())
  76.     {
  77.         level.zombie_team_index = level.teamcount + 1;
  78.         if (2 == level.zombie_team_index)
  79.         {
  80.             level.zombie_team = "axis";
  81.         }
  82.         else
  83.         {
  84.             level.zombie_team = "team" + level.zombie_team_index;
  85.         }
  86.     }
  87.     level.teams = [];
  88.     level.teamindex = [];
  89.     teamcount = level.teamcount;
  90.     level.teams["allies"] = "allies";
  91.     level.teams["axis"] = "axis";
  92.     level.teamindex["neutral"] = 0;
  93.     level.teamindex["allies"] = 1;
  94.     level.teamindex["axis"] = 2;
  95.     teamindex = 3;
  96.     while (teamindex <= teamcount)
  97.     {
  98.         level.teams["team" + teamindex] = "team" + teamindex;
  99.         level.teamindex["team" + teamindex] = teamindex;
  100.         teamindex++;
  101.     }
  102.     level.overrideteamscore = 0;
  103.     level.overrideplayerscore = 0;
  104.     level.displayhalftimetext = 0;
  105.     level.displayroundendtext = 1;
  106.     level.endgameonscorelimit = 1;
  107.     level.endgameontimelimit = 1;
  108.     level.scoreroundbased = 0;
  109.     level.resetplayerscoreeveryround = 0;
  110.     level.gameforfeited = 0;
  111.     level.forceautoassign = 0;
  112.     level.halftimetype = "halftime";
  113.     level.halftimesubcaption = &"MP_SWITCHING_SIDES_CAPS";
  114.     level.laststatustime = 0;
  115.     level.waswinning = [];
  116.     level.lastslowprocessframe = 0;
  117.     level.placement = [];
  118.     _a106 = level.teams;
  119.     _k106 = getFirstArrayKey(_a106);
  120.     while (isDefined(_k106))
  121.     {
  122.         team = _a106[_k106];
  123.         level.placement[team] = [];
  124.         _k106 = getNextArrayKey(_a106, _k106);
  125.     }
  126.     level.placement["all"] = [];
  127.     level.postroundtime = 7;
  128.     level.inovertime = 0;
  129.     level.defaultoffenseradius = 560;
  130.     level.dropteam = getDvarInt(#"0x851b42e5");
  131.     level.infinalkillcam = 0;
  132.     maps/mp/gametypes/_globallogic_ui::init();
  133.     registerdvars();
  134.     maps/mp/gametypes/_class::initperkdvars();
  135.     level.oldschool = getDvarInt(#"0x38f47b13") == 1;
  136.     if (level.oldschool)
  137.     {
  138.         logstring("game mode: oldschool");
  139.         setdvar("jump_height", 64);
  140.         setdvar("jump_slowdownEnable", 0);
  141.         setdvar("bg_fallDamageMinHeight", 256);
  142.         setdvar("bg_fallDamageMaxHeight", 512);
  143.         setdvar("player_clipSizeMultiplier", 2);
  144.     }
  145.     precachemodel("tag_origin");
  146.     precacherumble("dtp_rumble");
  147.     precacherumble("slide_rumble");
  148.     precachestatusicon("hud_status_dead");
  149.     precachestatusicon("hud_status_connecting");
  150.     precache_mp_leaderboards();
  151.     maps/mp/_burnplayer::initburnplayer();
  152.     if (!isDefined(game["tiebreaker"]))
  153.     {
  154.         game["tiebreaker"] = 0;
  155.     }
  156.     maps/mp/gametypes/_globallogic_audio::registerdialoggroup("introboost", 1);
  157.     maps/mp/gametypes/_globallogic_audio::registerdialoggroup("status", 1);
  158.     thread maps/mp/_gameadvertisement::init();
  159.     thread maps/mp/_gamerep::init();
  160.     level.disablechallenges = 0;
  161.     while (level.leaguematch || getDvarInt(#"0x8d5c0c16") > 0)
  162.     {
  163.         level.disablechallenges = 1;
  164.     }
  165.     level.disablestattracking = getDvarInt(#"0x742cbfaf") > 0;
  166. }
  167.  
  168. registerdvars()
  169. {
  170.     if (getDvar(#"0x38f47b13") == "")
  171.     {
  172.         setdvar("scr_oldschool", "0");
  173.     }
  174.     makedvarserverinfo("scr_oldschool");
  175.     if (getDvar(#"0x6017b9c") == "")
  176.     {
  177.         setdvar("ui_guncycle", 0);
  178.     }
  179.     makedvarserverinfo("ui_guncycle");
  180.     if (getDvar(#"0x41a6c572") == "")
  181.     {
  182.         setdvar("ui_weapon_tiers", 0);
  183.     }
  184.     makedvarserverinfo("ui_weapon_tiers");
  185.     setdvar("ui_text_endreason", "");
  186.     makedvarserverinfo("ui_text_endreason", "");
  187.     setmatchflag("bomb_timer", 0);
  188.     setmatchflag("enable_popups", 1);
  189.     setmatchflag("pregame", ispregame());
  190.     if (getDvar(#"0x23853f1f") == "")
  191.     {
  192.         setdvar("scr_vehicle_damage_scalar", "1");
  193.     }
  194.     level.vehicledamagescalar = getDvarFloat(#"0x23853f1f");
  195.     level.fire_audio_repeat_duration = getDvarInt(#"0x917e4521");
  196.     level.fire_audio_random_max_duration = getDvarInt(#"0xc2dcbc26");
  197.     teamname = getcustomteamname(level.teamindex["allies"]);
  198.     if (isDefined(teamname))
  199.     {
  200.         setdvar("g_customTeamName_Allies", teamname);
  201.     }
  202.     else
  203.     {
  204.         setdvar("g_customTeamName_Allies", "");
  205.     }
  206.     teamname = getcustomteamname(level.teamindex["axis"]);
  207.     if (isDefined(teamname))
  208.     {
  209.         setdvar("g_customTeamName_Axis", teamname);
  210.     }
  211.     else
  212.     {
  213.         setdvar("g_customTeamName_Axis", "");
  214.     }
  215. }
  216.  
  217. blank(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)
  218. {
  219. }
  220.  
  221. setupcallbacks()
  222. {
  223.     level.spawnplayer = ::spawnplayer;
  224.     level.spawnplayerprediction = ::spawnplayerprediction;
  225.     level.spawnclient = ::spawnclient;
  226.     level.spawnspectator = ::spawnspectator;
  227.     level.spawnintermission = ::spawnintermission;
  228.     level.onplayerscore = ::default_onplayerscore;
  229.     level.onteamscore = ::default_onteamscore;
  230.     level.wavespawntimer = ::wavespawntimer;
  231.     level.spawnmessage = ::default_spawnmessage;
  232.     level.onspawnplayer = ::blank;
  233.     level.onspawnplayerunified = ::blank;
  234.     level.onspawnspectator = ::default_onspawnspectator;
  235.     level.onspawnintermission = ::default_onspawnintermission;
  236.     level.onrespawndelay = ::blank;
  237.     level.onforfeit = ::default_onforfeit;
  238.     level.ontimelimit = ::default_ontimelimit;
  239.     level.onscorelimit = ::default_onscorelimit;
  240.     level.onalivecountchange = ::default_onalivecountchange;
  241.     level.ondeadevent = undefined;
  242.     level.ononeleftevent = ::default_ononeleftevent;
  243.     level.giveteamscore = ::giveteamscore;
  244.     level.onlastteamaliveevent = ::default_onlastteamaliveevent;
  245.     level.gettimelimit = ::default_gettimelimit;
  246.     level.getteamkillpenalty = ::default_getteamkillpenalty;
  247.     level.getteamkillscore = ::default_getteamkillscore;
  248.     level.iskillboosting = ::default_iskillboosting;
  249.     level._setteamscore = ::_setteamscore;
  250.     level._setplayerscore = ::_setplayerscore;
  251.     level._getteamscore = ::_getteamscore;
  252.     level._getplayerscore = ::_getplayerscore;
  253.     level.onprecachegametype = ::blank;
  254.     level.onstartgametype = ::blank;
  255.     level.onplayerconnect = ::blank;
  256.     level.onplayerdisconnect = ::blank;
  257.     level.onplayerdamage = ::blank;
  258.     level.onplayerkilled = ::blank;
  259.     level.onplayerkilledextraunthreadedcbs = [];
  260.     level.onteamoutcomenotify = ::teamoutcomenotify;
  261.     level.onoutcomenotify = ::outcomenotify;
  262.     level.onteamwageroutcomenotify = ::teamwageroutcomenotify;
  263.     level.onwageroutcomenotify = ::wageroutcomenotify;
  264.     level.setmatchscorehudelemforteam = ::setmatchscorehudelemforteam;
  265.     level.onendgame = ::blank;
  266.     level.onroundendgame = ::default_onroundendgame;
  267.     level.onmedalawarded = ::blank;
  268.     maps/mp/gametypes/_globallogic_ui::setupcallbacks();
  269. }
  270.  
  271. precache_mp_leaderboards()
  272. {
  273.     if (maps/mp/bots/_bot::is_bot_ranked_match())
  274.     {
  275.         return;
  276.     }
  277.     if (sessionmodeiszombiesgame())
  278.     {
  279.         return;
  280.     }
  281.     if (!level.rankedmatch)
  282.     {
  283.         return;
  284.     }
  285.     mapname = getDvar(#"0xb4b895c4");
  286.     globalleaderboards = "LB_MP_GB_XPPRESTIGE LB_MP_GB_SCORE LB_MP_GB_KDRATIO LB_MP_GB_KILLS LB_MP_GB_WINS LB_MP_GB_DEATHS LB_MP_GB_XPMAXPERGAME LB_MP_GB_TACTICALINSERTS LB_MP_GB_TACTICALINSERTSKILLS LB_MP_GB_PRESTIGEXP LB_MP_GB_HEADSHOTS LB_MP_GB_WEAPONS_PRIMARY LB_MP_GB_WEAPONS_SECONDARY";
  287.     careerleaderboard = "";
  288.     switch (level.gametype)
  289.     {
  290.         case "gun":
  291.         case "oic":
  292.         case "sas":
  293.         case "shrp":
  294.             break;
  295.  
  296.         default:
  297.             careerleaderboard = " LB_MP_GB_SCOREPERMINUTE";
  298.             break;
  299.  
  300.     }
  301.     gamemodeleaderboard = " LB_MP_GM_" + level.gametype;
  302.     gamemodeleaderboardext = " LB_MP_GM_" + level.gametype + "_EXT";
  303.     gamemodehcleaderboard = "";
  304.     gamemodehcleaderboardext = "";
  305.     hardcoremode = getgametypesetting("hardcoreMode");
  306.     if (isDefined(hardcoremode) && hardcoremode)
  307.     {
  308.         gamemodehcleaderboard = gamemodeleaderboard + "_HC";
  309.         gamemodehcleaderboardext = gamemodeleaderboardext + "_HC";
  310.     }
  311.     mapleaderboard = " LB_MP_MAP_" + getsubstr(mapname, 3, mapname.size);
  312.     precacheleaderboards(globalleaderboards + careerleaderboard + gamemodeleaderboard + gamemodeleaderboardext + gamemodehcleaderboard + gamemodehcleaderboardext + mapleaderboard);
  313. }
  314.  
  315. compareteambygamestat(gamestat, teama, teamb, previous_winner_score)
  316. {
  317.     winner = undefined;
  318.     if (teama == "tie")
  319.     {
  320.         winner = "tie";
  321.         if (previous_winner_score < game[gamestat][teamb])
  322.         {
  323.             winner = teamb;
  324.         }
  325.     }
  326.     else
  327.     {
  328.         if (game[gamestat][teama] == game[gamestat][teamb])
  329.         {
  330.             winner = "tie";
  331.         }
  332.         else
  333.         {
  334.             if (game[gamestat][teamb] > game[gamestat][teama])
  335.             {
  336.                 winner = teamb;
  337.             }
  338.             else
  339.             {
  340.                 winner = teama;
  341.             }
  342.         }
  343.     }
  344.     return winner;
  345. }
  346.  
  347. determineteamwinnerbygamestat(gamestat)
  348. {
  349.     teamkeys = getarraykeys(level.teams);
  350.     winner = teamkeys[0];
  351.     previous_winner_score = game[gamestat][winner];
  352.     teamindex = 1;
  353.     while (teamindex < teamkeys.size)
  354.     {
  355.         winner = compareteambygamestat(gamestat, winner, teamkeys[teamindex], previous_winner_score);
  356.         if (winner != "tie")
  357.         {
  358.             previous_winner_score = game[gamestat][winner];
  359.         }
  360.         teamindex++;
  361.     }
  362.     return winner;
  363. }
  364.  
  365. compareteambyteamscore(teama, teamb, previous_winner_score)
  366. {
  367.     winner = undefined;
  368.     teambscore = [[level._getteamscore]](teamb);
  369.     if (teama == "tie")
  370.     {
  371.         winner = "tie";
  372.         if (previous_winner_score < teambscore)
  373.         {
  374.             winner = teamb;
  375.         }
  376.         return winner;
  377.     }
  378.     teamascore = [[level._getteamscore]](teama);
  379.     if (teambscore == teamascore)
  380.     {
  381.         winner = "tie";
  382.     }
  383.     else
  384.     {
  385.         if (teambscore > teamascore)
  386.         {
  387.             winner = teamb;
  388.         }
  389.         else
  390.         {
  391.             winner = teama;
  392.         }
  393.     }
  394.     return winner;
  395. }
  396.  
  397. determineteamwinnerbyteamscore()
  398. {
  399.     teamkeys = getarraykeys(level.teams);
  400.     winner = teamkeys[0];
  401.     previous_winner_score = [[level._getteamscore]](winner);
  402.     teamindex = 1;
  403.     while (teamindex < teamkeys.size)
  404.     {
  405.         winner = compareteambyteamscore(winner, teamkeys[teamindex], previous_winner_score);
  406.         if (winner != "tie")
  407.         {
  408.             previous_winner_score = [[level._getteamscore]](winner);
  409.         }
  410.         teamindex++;
  411.     }
  412.     return winner;
  413. }
  414.  
  415. forceend(hostsucks)
  416. {
  417.     if (!isDefined(hostsucks))
  418.     {
  419.         hostsucks = 0;
  420.     }
  421.     if (level.hostforcedend || level.forcedend)
  422.     {
  423.         return;
  424.     }
  425.     winner = undefined;
  426.     if (level.teambased)
  427.     {
  428.         winner = determineteamwinnerbygamestat("teamScores");
  429.         maps/mp/gametypes/_globallogic_utils::logteamwinstring("host ended game", winner);
  430.     }
  431.     else
  432.     {
  433.         winner = maps/mp/gametypes/_globallogic_score::gethighestscoringplayer();
  434.         if (isDefined(winner))
  435.         {
  436.             logstring("host ended game, win: " + winner.name);
  437.         }
  438.         else
  439.         {
  440.             logstring("host ended game, tie");
  441.         }
  442.     }
  443.     level.forcedend = 1;
  444.     level.hostforcedend = 1;
  445.     if (hostsucks)
  446.     {
  447.         endstring = &"MP_HOST_SUCKS";
  448.     }
  449.     else
  450.     {
  451.         if (level.splitscreen)
  452.         {
  453.             endstring = &"MP_ENDED_GAME";
  454.         }
  455.         else
  456.         {
  457.             endstring = &"MP_HOST_ENDED_GAME";
  458.         }
  459.     }
  460.     setmatchflag("disableIngameMenu", 1);
  461.     makedvarserverinfo("ui_text_endreason", endstring);
  462.     setdvar("ui_text_endreason", endstring);
  463.     thread endgame(winner, endstring);
  464. }
  465.  
  466. killserverpc()
  467. {
  468.     if (level.hostforcedend || level.forcedend)
  469.     {
  470.         return;
  471.     }
  472.     winner = undefined;
  473.     if (level.teambased)
  474.     {
  475.         winner = determineteamwinnerbygamestat("teamScores");
  476.         maps/mp/gametypes/_globallogic_utils::logteamwinstring("host ended game", winner);
  477.     }
  478.     else
  479.     {
  480.         winner = maps/mp/gametypes/_globallogic_score::gethighestscoringplayer();
  481.         if (isDefined(winner))
  482.         {
  483.             logstring("host ended game, win: " + winner.name);
  484.         }
  485.         else
  486.         {
  487.             logstring("host ended game, tie");
  488.         }
  489.     }
  490.     level.forcedend = 1;
  491.     level.hostforcedend = 1;
  492.     level.killserver = 1;
  493.     endstring = &"MP_HOST_ENDED_GAME";
  494.     thread endgame(winner, endstring);
  495. }
  496.  
  497. atleasttwoteams()
  498. {
  499.     valid_count = 0;
  500.     _a504 = level.teams;
  501.     _k504 = getFirstArrayKey(_a504);
  502.     while (isDefined(_k504))
  503.     {
  504.         team = _a504[_k504];
  505.         if (level.playercount[team] != 0)
  506.         {
  507.             valid_count++;
  508.         }
  509.         _k504 = getNextArrayKey(_a504, _k504);
  510.     }
  511.     if (valid_count < 2)
  512.     {
  513.         return 0;
  514.     }
  515.     return 1;
  516. }
  517.  
  518. checkifteamforfeits(team)
  519. {
  520.     if (!game["everExisted"][team])
  521.     {
  522.         return 0;
  523.     }
  524.     if (level.playercount[team] < 1 && totalplayercount() > 0)
  525.     {
  526.         return 1;
  527.     }
  528.     return 0;
  529. }
  530.  
  531. checkforforfeit()
  532. {
  533.     forfeit_count = 0;
  534.     valid_team = undefined;
  535.     _a538 = level.teams;
  536.     _k538 = getFirstArrayKey(_a538);
  537.     while (isDefined(_k538))
  538.     {
  539.         team = _a538[_k538];
  540.         if (checkifteamforfeits(team))
  541.         {
  542.             forfeit_count++;
  543.             if (!level.multiteam)
  544.             {
  545.                 thread [[level.onforfeit]](team);
  546.                 return 1;
  547.             }
  548.         }
  549.         else
  550.         {
  551.             valid_team = team;
  552.         }
  553.         _k538 = getNextArrayKey(_a538, _k538);
  554.     }
  555.     if (level.multiteam && forfeit_count == level.teams.size - 1)
  556.     {
  557.         thread [[level.onforfeit]](valid_team);
  558.         return 1;
  559.     }
  560.     return 0;
  561. }
  562.  
  563. dospawnqueueupdates()
  564. {
  565.     _a567 = level.teams;
  566.     _k567 = getFirstArrayKey(_a567);
  567.     while (isDefined(_k567))
  568.     {
  569.         team = _a567[_k567];
  570.         if (level.spawnqueuemodified[team])
  571.         {
  572.             [[level.onalivecountchange]](team);
  573.         }
  574.         _k567 = getNextArrayKey(_a567, _k567);
  575.     }
  576. }
  577.  
  578. isteamalldead(team)
  579. {
  580.     return !(level.playerlives[team]);
  581. }
  582.  
  583. areallteamsdead()
  584. {
  585.     _a583 = level.teams;
  586.     _k583 = getFirstArrayKey(_a583);
  587.     while (isDefined(_k583))
  588.     {
  589.         team = _a583[_k583];
  590.         if (!isteamalldead(team))
  591.         {
  592.             return 0;
  593.         }
  594.         _k583 = getNextArrayKey(_a583, _k583);
  595.     }
  596.     return 1;
  597. }
  598.  
  599. getlastteamalive()
  600. {
  601.     count = 0;
  602.     everexistedcount = 0;
  603.     aliveteam = undefined;
  604.     _a600 = level.teams;
  605.     _k600 = getFirstArrayKey(_a600);
  606.     while (isDefined(_k600))
  607.     {
  608.         team = _a600[_k600];
  609.         if (level.everexisted[team])
  610.         {
  611.             if (!isteamalldead(team))
  612.             {
  613.                 aliveteam = team;
  614.                 count++;
  615.             }
  616.             everexistedcount++;
  617.         }
  618.         _k600 = getNextArrayKey(_a600, _k600);
  619.     }
  620.     if (everexistedcount > 1 && count == 1)
  621.     {
  622.         return aliveteam;
  623.     }
  624.     return undefined;
  625. }
  626.  
  627. dodeadeventupdates()
  628. {
  629.     if (level.teambased)
  630.     {
  631.         if (areallteamsdead())
  632.         {
  633.             [[level.ondeadevent]]("all");
  634.             return 1;
  635.         }
  636.         if (!isDefined(level.ondeadevent))
  637.         {
  638.             lastteamalive = getlastteamalive();
  639.             if (isDefined(lastteamalive))
  640.             {
  641.                 [[level.onlastteamaliveevent]](lastteamalive);
  642.                 return 1;
  643.             }
  644.         }
  645.         else
  646.         {
  647.             _a644 = level.teams;
  648.             _k644 = getFirstArrayKey(_a644);
  649.             while (isDefined(_k644))
  650.             {
  651.                 team = _a644[_k644];
  652.                 if (isteamalldead(team))
  653.                 {
  654.                     [[level.ondeadevent]](team);
  655.                     return 1;
  656.                 }
  657.                 _k644 = getNextArrayKey(_a644, _k644);
  658.             }
  659.         }
  660.     }
  661.     else
  662.     {
  663.         if (totalalivecount() == 0 && totalplayerlives() == 0 && level.maxplayercount > 1)
  664.         {
  665.             [[level.ondeadevent]]("all");
  666.             return 1;
  667.         }
  668.     }
  669.     return 0;
  670. }
  671.  
  672. isonlyoneleftaliveonteam(team)
  673. {
  674.     return level.playerlives[team] == 1;
  675. }
  676.  
  677. doonelefteventupdates()
  678. {
  679.     if (level.teambased)
  680.     {
  681.         _a678 = level.teams;
  682.         _k678 = getFirstArrayKey(_a678);
  683.         while (isDefined(_k678))
  684.         {
  685.             team = _a678[_k678];
  686.             if (isonlyoneleftaliveonteam(team))
  687.             {
  688.                 [[level.ononeleftevent]](team);
  689.                 return 1;
  690.             }
  691.             _k678 = getNextArrayKey(_a678, _k678);
  692.         }
  693.     }
  694.     else
  695.     {
  696.         if (totalalivecount() == 1 && totalplayerlives() == 1 && level.maxplayercount > 1)
  697.         {
  698.             [[level.ononeleftevent]]("all");
  699.             return 1;
  700.         }
  701.     }
  702.     return 0;
  703. }
  704.  
  705. updategameevents()
  706. {
  707.     if (level.rankedmatch || level.wagermatch || level.leaguematch && !(level.ingraceperiod))
  708.     {
  709.         if (level.teambased)
  710.         {
  711.             if (!level.gameforfeited)
  712.             {
  713.                 if (game["state"] == "playing" && checkforforfeit())
  714.                 {
  715.                     return;
  716.                 }
  717.             }
  718.             else
  719.             {
  720.                 if (atleasttwoteams())
  721.                 {
  722.                     level.gameforfeited = 0;
  723.                     level notify("abort forfeit");
  724.                 }
  725.             }
  726.         }
  727.         else
  728.         {
  729.             if (!level.gameforfeited)
  730.             {
  731.                 if (totalplayercount() == 1 && level.maxplayercount > 1)
  732.                 {
  733.                     thread [[level.onforfeit]]();
  734.                     return;
  735.                 }
  736.             }
  737.             else
  738.             {
  739.                 if (totalplayercount() > 1)
  740.                 {
  741.                     level.gameforfeited = 0;
  742.                     level notify("abort forfeit");
  743.                 }
  744.             }
  745.         }
  746.     }
  747.     if (!(level.playerqueuedrespawn) && !(level.numlives) && !(level.inovertime))
  748.     {
  749.         return;
  750.     }
  751.     if (level.ingraceperiod)
  752.     {
  753.         return;
  754.     }
  755.     while (level.playerqueuedrespawn)
  756.     {
  757.         dospawnqueueupdates();
  758.     }
  759.     if (dodeadeventupdates())
  760.     {
  761.         return;
  762.     }
  763.     if (doonelefteventupdates())
  764.     {
  765.         return;
  766.     }
  767. }
  768.  
  769. matchstarttimer()
  770. {
  771.     visionsetnaked("mpIntro", 0);
  772.     matchstarttext = createserverfontstring("objective", 1,5);
  773.     matchstarttext setpoint("CENTER", "CENTER", 0, -40);
  774.     matchstarttext.sort = 1001;
  775.     matchstarttext settext(game["strings"]["waiting_for_teams"]);
  776.     matchstarttext.foreground = 0;
  777.     matchstarttext.hidewheninmenu = 1;
  778.     waitforplayers();
  779.     matchstarttext settext(game["strings"]["match_starting_in"]);
  780.     matchstarttimer = createserverfontstring("big", 2,2);
  781.     matchstarttimer setpoint("CENTER", "CENTER", 0, 0);
  782.     matchstarttimer.sort = 1001;
  783.     matchstarttimer.color = (1, 1, 0);
  784.     matchstarttimer.foreground = 0;
  785.     matchstarttimer.hidewheninmenu = 1;
  786.     matchstarttimer maps/mp/gametypes/_hud::fontpulseinit();
  787.     counttime = int(level.prematchperiod);
  788.     if (counttime >= 2)
  789.     {
  790.         while (counttime > 0 && !(level.gameended))
  791.         {
  792.             matchstarttimer setvalue(counttime);
  793.             matchstarttimer thread maps/mp/gametypes/_hud::fontpulse(level);
  794.             if (counttime == 2)
  795.             {
  796.                 visionsetnaked(getDvar(#"0xb4b895c4"), 3);
  797.             }
  798.             counttime--;
  799.             _a804 = level.players;
  800.             _k804 = getFirstArrayKey(_a804);
  801.             while (isDefined(_k804))
  802.             {
  803.                 player = _a804[_k804];
  804.                 player playlocalsound("uin_start_count_down");
  805.                 _k804 = getNextArrayKey(_a804, _k804);
  806.             }
  807.             wait 1;
  808.         }
  809.     }
  810.     else
  811.     {
  812.         visionsetnaked(getDvar(#"0xb4b895c4"), 1);
  813.     }
  814.     matchstarttimer destroyelem();
  815.     matchstarttext destroyelem();
  816. }
  817.  
  818. matchstarttimerskip()
  819. {
  820.     if (!ispregame())
  821.     {
  822.         visionsetnaked(getDvar(#"0xb4b895c4"), 0);
  823.     }
  824.     else
  825.     {
  826.         visionsetnaked("mpIntro", 0);
  827.     }
  828. }
  829.  
  830. notifyteamwavespawn(team, time)
  831. {
  832.     if (time - level.lastwave[team] > level.wavedelay[team] * 1000)
  833.     {
  834.         level notify("wave_respawn_" + team);
  835.         level.lastwave[team] = time;
  836.         level.waveplayerspawnindex[team] = 0;
  837.     }
  838. }
  839.  
  840. wavespawntimer()
  841. {
  842.     level endon("game_ended");
  843.     while (game["state"] == "playing")
  844.     {
  845.         time = getTime();
  846.         _a847 = level.teams;
  847.         _k847 = getFirstArrayKey(_a847);
  848.         while (isDefined(_k847))
  849.         {
  850.             team = _a847[_k847];
  851.             notifyteamwavespawn(team, time);
  852.             _k847 = getNextArrayKey(_a847, _k847);
  853.         }
  854.         wait 0.05;
  855.     }
  856. }
  857.  
  858. hostidledout()
  859. {
  860.     hostplayer = gethostplayer();
  861.     if (isDefined(hostplayer) && !(hostplayer.hasspawned) && !(isDefined(hostplayer.selectedclass)))
  862.     {
  863.         return 1;
  864.     }
  865.     return 0;
  866. }
  867.  
  868. incrementmatchcompletionstat(gamemode, playedorhosted, stat)
  869. {
  870.     self adddstat("gameHistory", gamemode, "modeHistory", playedorhosted, stat, 1);
  871. }
  872.  
  873. setmatchcompletionstat(gamemode, playedorhosted, stat)
  874. {
  875.     self setdstat("gameHistory", gamemode, "modeHistory", playedorhosted, stat, 1);
  876. }
  877.  
  878. getcurrentgamemode()
  879. {
  880.     while (gamemodeismode(level.gamemode_league_match))
  881.     {
  882.         return "leaguematch";
  883.     }
  884.     return "publicmatch";
  885. }
  886.  
  887. getteamscoreratio()
  888. {
  889.     playerteam = self.pers["team"];
  890.     score = getteamscore(playerteam);
  891.     otherteamscore = 0;
  892.     _a898 = level.teams;
  893.     _k898 = getFirstArrayKey(_a898);
  894.     while (isDefined(_k898))
  895.     {
  896.         team = _a898[_k898];
  897.         if (team == playerteam)
  898.         {
  899.         }
  900.         else
  901.         {
  902.             otherteamscore = otherteamscore + getteamscore(team);
  903.         }
  904.         _k898 = getNextArrayKey(_a898, _k898);
  905.     }
  906.     if (level.teams.size > 1)
  907.     {
  908.         otherteamscore = otherteamscore / level.teams.size - 1;
  909.     }
  910.     if (otherteamscore != 0)
  911.     {
  912.         return float(score) / float(otherteamscore);
  913.     }
  914.     return score;
  915. }
  916.  
  917. gethighestscore()
  918. {
  919.     highestscore = -999999999;
  920.     index = 0;
  921.     while (index < level.players.size)
  922.     {
  923.         player = level.players[index];
  924.         if (player.score > highestscore)
  925.         {
  926.             highestscore = player.score;
  927.         }
  928.         index++;
  929.     }
  930.     return highestscore;
  931. }
  932.  
  933. getnexthighestscore(score)
  934. {
  935.     highestscore = -999999999;
  936.     index = 0;
  937.     while (index < level.players.size)
  938.     {
  939.         player = level.players[index];
  940.         if (player.score >= score)
  941.         {
  942.         }
  943.         else
  944.         {
  945.             if (player.score > highestscore)
  946.             {
  947.                 highestscore = player.score;
  948.             }
  949.         }
  950.         index++;
  951.     }
  952.     return highestscore;
  953. }
  954.  
  955. sendafteractionreport()
  956. {
  957.     if (!level.onlinegame)
  958.     {
  959.         return;
  960.     }
  961.     if (ispregame())
  962.     {
  963.         return;
  964.     }
  965.     if (sessionmodeiszombiesgame())
  966.     {
  967.         return;
  968.     }
  969.     index = 0;
  970.     while (index < level.players.size)
  971.     {
  972.         player = level.players[index];
  973.         if (player is_bot())
  974.         {
  975.         }
  976.         else
  977.         {
  978.             nemesis = player.pers["nemesis_name"];
  979.             if (!isDefined(player.pers["killed_players"][nemesis]))
  980.             {
  981.                 player.pers["killed_players"][nemesis] = 0;
  982.             }
  983.             if (!isDefined(player.pers["killed_by"][nemesis]))
  984.             {
  985.                 player.pers["killed_by"][nemesis] = 0;
  986.             }
  987.             spread = player.kills - player.deaths;
  988.             if (player.pers["cur_kill_streak"] > player.pers["best_kill_streak"])
  989.             {
  990.                 player.pers["best_kill_streak"] = player.pers["cur_kill_streak"];
  991.             }
  992.             if (level.rankedmatch || level.wagermatch || level.leaguematch)
  993.             {
  994.                 player maps/mp/gametypes/_persistence::setafteractionreportstat("privateMatch", 0);
  995.             }
  996.             else
  997.             {
  998.                 player maps/mp/gametypes/_persistence::setafteractionreportstat("privateMatch", 1);
  999.             }
  1000.             player setnemesisxuid(player.pers["nemesis_xuid"]);
  1001.             player maps/mp/gametypes/_persistence::setafteractionreportstat("nemesisName", nemesis);
  1002.             player maps/mp/gametypes/_persistence::setafteractionreportstat("nemesisRank", player.pers["nemesis_rank"]);
  1003.             player maps/mp/gametypes/_persistence::setafteractionreportstat("nemesisRankIcon", player.pers["nemesis_rankIcon"]);
  1004.             player maps/mp/gametypes/_persistence::setafteractionreportstat("nemesisKills", player.pers["killed_players"][nemesis]);
  1005.             player maps/mp/gametypes/_persistence::setafteractionreportstat("nemesisKilledBy", player.pers["killed_by"][nemesis]);
  1006.             player maps/mp/gametypes/_persistence::setafteractionreportstat("bestKillstreak", player.pers["best_kill_streak"]);
  1007.             player maps/mp/gametypes/_persistence::setafteractionreportstat("kills", player.kills);
  1008.             player maps/mp/gametypes/_persistence::setafteractionreportstat("deaths", player.deaths);
  1009.             player maps/mp/gametypes/_persistence::setafteractionreportstat("headshots", player.headshots);
  1010.             player maps/mp/gametypes/_persistence::setafteractionreportstat("score", player.score);
  1011.             player maps/mp/gametypes/_persistence::setafteractionreportstat("xpEarned", int(player.pers["summary"]["xp"]));
  1012.             player maps/mp/gametypes/_persistence::setafteractionreportstat("cpEarned", int(player.pers["summary"]["codpoints"]));
  1013.             player maps/mp/gametypes/_persistence::setafteractionreportstat("miscBonus", int(player.pers["summary"]["challenge"] + player.pers["summary"]["misc"]));
  1014.             player maps/mp/gametypes/_persistence::setafteractionreportstat("matchBonus", int(player.pers["summary"]["match"]));
  1015.             player maps/mp/gametypes/_persistence::setafteractionreportstat("demoFileID", getdemofileid());
  1016.             player maps/mp/gametypes/_persistence::setafteractionreportstat("leagueTeamID", player getleagueteamid());
  1017.             teamscoreratio = player getteamscoreratio();
  1018.             scoreboardposition = getplacementforplayer(player);
  1019.             if (scoreboardposition < 0)
  1020.             {
  1021.                 scoreboardposition = level.players.size;
  1022.             }
  1023.             player gamehistoryfinishmatch(4, player.kills, player.deaths, player.score, scoreboardposition, teamscoreratio);
  1024.             placement = level.placement["all"];
  1025.             otherplayerindex = 0;
  1026.             while (otherplayerindex < placement.size)
  1027.             {
  1028.                 while (level.placement["all"][otherplayerindex] == player)
  1029.                 {
  1030.                     recordplayerstats(player, "position", otherplayerindex);
  1031.                 }
  1032.                 otherplayerindex++;
  1033.             }
  1034.             if (level.wagermatch)
  1035.             {
  1036.                 recordplayerstats(player, "wagerPayout", player.wagerwinnings);
  1037.                 player maps/mp/gametypes/_wager::setwagerafteractionreportstats();
  1038.                 player maps/mp/gametypes/_persistence::setafteractionreportstat("wagerMatch", 1);
  1039.             }
  1040.             else
  1041.             {
  1042.                 player maps/mp/gametypes/_persistence::setafteractionreportstat("wagerMatch", 0);
  1043.             }
  1044.             player maps/mp/gametypes/_persistence::setafteractionreportstat("wagerMatchFailed", 0);
  1045.             if (level.rankedmatch || level.wagermatch || level.leaguematch)
  1046.             {
  1047.                 player maps/mp/gametypes/_persistence::setafteractionreportstat("valid", 1);
  1048.             }
  1049.             if (isDefined(player.pers["matchesPlayedStatsTracked"]))
  1050.             {
  1051.                 gamemode = getcurrentgamemode();
  1052.                 player incrementmatchcompletionstat(gamemode, "played", "completed");
  1053.                 if (isDefined(player.pers["matchesHostedStatsTracked"]))
  1054.                 {
  1055.                     player incrementmatchcompletionstat(gamemode, "hosted", "completed");
  1056.                     player.pers["matchesHostedStatsTracked"] = undefined;
  1057.                 }
  1058.                 player.pers["matchesPlayedStatsTracked"] = undefined;
  1059.             }
  1060.             recordplayerstats(player, "highestKillStreak", player.pers["best_kill_streak"]);
  1061.             recordplayerstats(player, "numUavCalled", player maps/mp/killstreaks/_killstreaks::getkillstreakusage("uav_used"));
  1062.             recordplayerstats(player, "numDogsCalleD", player maps/mp/killstreaks/_killstreaks::getkillstreakusage("dogs_used"));
  1063.             recordplayerstats(player, "numDogsKills", player.pers["dog_kills"]);
  1064.             recordplayermatchend(player);
  1065.             recordplayerstats(player, "presentAtEnd", 1);
  1066.         }
  1067.         index++;
  1068.     }
  1069. }
  1070.  
  1071. gamehistoryplayerkicked()
  1072. {
  1073.     teamscoreratio = self getteamscoreratio();
  1074.     scoreboardposition = getplacementforplayer(self);
  1075.     if (scoreboardposition < 0) scoreboardposition = level.players.size;
  1076.     self gamehistoryfinishmatch(2, self.kills, self.deaths, self.score, scoreboardposition, teamscoreratio);
  1077.     if (isDefined(self.pers["matchesPlayedStatsTracked"]))
  1078.     {
  1079.         gamemode = getcurrentgamemode();
  1080.         self incrementmatchcompletionstat(gamemode, "played", "kicked");
  1081.         self.pers["matchesPlayedStatsTracked"] = undefined;
  1082.     }
  1083.     uploadstats(self);
  1084.     wait 1;
  1085. }
  1086.  
  1087. gamehistoryplayerquit()
  1088. {
  1089.     teamscoreratio = self getteamscoreratio();
  1090.     scoreboardposition = getplacementforplayer(self);
  1091.     if (scoreboardposition < 0)
  1092.     {
  1093.         scoreboardposition = level.players.size;
  1094.     }
  1095.     self gamehistoryfinishmatch(3, self.kills, self.deaths, self.score, scoreboardposition, teamscoreratio);
  1096.     if (isDefined(self.pers["matchesPlayedStatsTracked"]))
  1097.     {
  1098.         gamemode = getcurrentgamemode();
  1099.         self incrementmatchcompletionstat(gamemode, "played", "quit");
  1100.         if (isDefined(self.pers["matchesHostedStatsTracked"]))
  1101.         {
  1102.             self incrementmatchcompletionstat(gamemode, "hosted", "quit");
  1103.             self.pers["matchesHostedStatsTracked"] = undefined;
  1104.         }
  1105.         self.pers["matchesPlayedStatsTracked"] = undefined;
  1106.     }
  1107.     uploadstats(self);
  1108.     if (!self ishost())
  1109.     {
  1110.         wait 1;
  1111.     }
  1112. }
  1113.  
  1114. displayroundend(winner, endreasontext)
  1115. {
  1116.     while (level.displayroundendtext)
  1117.     {
  1118.         while (level.teambased)
  1119.         {
  1120.             if (winner == "tie")
  1121.             {
  1122.                 maps/mp/_demo::gameresultbookmark("round_result", level.teamindex["neutral"], level.teamindex["neutral"]);
  1123.             }
  1124.             else
  1125.             {
  1126.                 maps/mp/_demo::gameresultbookmark("round_result", level.teamindex[winner], level.teamindex["neutral"]);
  1127.             }
  1128.         }
  1129.         setmatchflag("cg_drawSpectatorMessages", 0);
  1130.         players = level.players;
  1131.         index = 0;
  1132.         while (index < players.size)
  1133.         {
  1134.             player = players[index];
  1135.             if (!waslastround())
  1136.             {
  1137.                 player notify("round_ended");
  1138.             }
  1139.             if (!isDefined(player.pers["team"]))
  1140.             {
  1141.                 player [[level.spawnintermission]](1);
  1142.                 player closemenu();
  1143.                 player closeingamemenu();
  1144.             }
  1145.             else
  1146.             {
  1147.                 if (level.wagermatch)
  1148.                 {
  1149.                     if (level.teambased)
  1150.                     {
  1151.                         player thread [[level.onteamwageroutcomenotify]](winner, 1, endreasontext);
  1152.                     }
  1153.                     else
  1154.                     {
  1155.                         player thread [[level.onwageroutcomenotify]](winner, endreasontext);
  1156.                     }
  1157.                 }
  1158.                 else
  1159.                 {
  1160.                     if (level.teambased)
  1161.                     {
  1162.                         player thread [[level.onteamoutcomenotify]](winner, 1, endreasontext);
  1163.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player("ROUND_END");
  1164.                     }
  1165.                     else
  1166.                     {
  1167.                         player thread [[level.onoutcomenotify]](winner, 1, endreasontext);
  1168.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player("ROUND_END");
  1169.                     }
  1170.                 }
  1171.                 player setclientuivisibilityflag("hud_visible", 0);
  1172.                 player setclientuivisibilityflag("g_compassShowEnemies", 0);
  1173.             }
  1174.             index++;
  1175.         }
  1176.     }
  1177.     if (waslastround())
  1178.     {
  1179.         roundendwait(level.roundenddelay, 0);
  1180.     }
  1181.     else
  1182.     {
  1183.         thread maps/mp/gametypes/_globallogic_audio::announceroundwinner(winner, level.roundenddelay / 4);
  1184.         roundendwait(level.roundenddelay, 1);
  1185.     }
  1186. }
  1187.  
  1188. displayroundswitch(winner, endreasontext)
  1189. {
  1190.     switchtype = level.halftimetype;
  1191.     if (switchtype == "halftime")
  1192.     {
  1193.         if (isDefined(level.nextroundisovertime) && level.nextroundisovertime)
  1194.         {
  1195.             switchtype = "overtime";
  1196.         }
  1197.         else
  1198.         {
  1199.             if (level.roundlimit)
  1200.             {
  1201.                 if (game["roundsplayed"] * 2 == level.roundlimit)
  1202.                 {
  1203.                     switchtype = "halftime";
  1204.                 }
  1205.                 else
  1206.                 {
  1207.                     switchtype = "intermission";
  1208.                 }
  1209.             }
  1210.             else
  1211.             {
  1212.                 if (level.scorelimit)
  1213.                 {
  1214.                     if (game["roundsplayed"] == level.scorelimit - 1)
  1215.                     {
  1216.                         switchtype = "halftime";
  1217.                     }
  1218.                     else
  1219.                     {
  1220.                         switchtype = "intermission";
  1221.                     }
  1222.                 }
  1223.                 else
  1224.                 {
  1225.                     switchtype = "intermission";
  1226.                 }
  1227.             }
  1228.         }
  1229.     }
  1230.     leaderdialog = maps/mp/gametypes/_globallogic_audio::getroundswitchdialog(switchtype);
  1231.     setmatchtalkflag("EveryoneHearsEveryone", 1);
  1232.     players = level.players;
  1233.     index = 0;
  1234.     while (index < players.size)
  1235.     {
  1236.         player = players[index];
  1237.         if (!isDefined(player.pers["team"]))
  1238.         {
  1239.             player [[level.spawnintermission]](1);
  1240.             player closemenu();
  1241.             player closeingamemenu();
  1242.         }
  1243.         else
  1244.         {
  1245.             player maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer(leaderdialog);
  1246.             player maps/mp/gametypes/_globallogic_audio::set_music_on_player("ROUND_SWITCH");
  1247.             if (level.wagermatch)
  1248.             {
  1249.                 player thread [[level.onteamwageroutcomenotify]](switchtype, 1, level.halftimesubcaption);
  1250.             }
  1251.             else
  1252.             {
  1253.                 player thread [[level.onteamoutcomenotify]](switchtype, 0, level.halftimesubcaption);
  1254.             }
  1255.             player setclientuivisibilityflag("hud_visible", 0);
  1256.         }
  1257.         index++;
  1258.     }
  1259.     roundendwait(level.halftimeroundenddelay, 0);
  1260. }
  1261.  
  1262. displaygameend(winner, endreasontext)
  1263. {
  1264.     setmatchtalkflag("EveryoneHearsEveryone", 1);
  1265.     setmatchflag("cg_drawSpectatorMessages", 0);
  1266.     while (level.teambased)
  1267.     {
  1268.         if (winner == "tie")
  1269.         {
  1270.             maps/mp/_demo::gameresultbookmark("game_result", level.teamindex["neutral"], level.teamindex["neutral"]);
  1271.         }
  1272.         else
  1273.         {
  1274.             maps/mp/_demo::gameresultbookmark("game_result", level.teamindex[winner], level.teamindex["neutral"]);
  1275.         }
  1276.     }
  1277.     players = level.players;
  1278.     index = 0;
  1279.     while (index < players.size)
  1280.     {
  1281.         player = players[index];
  1282.         if (!isDefined(player.pers["team"]))
  1283.         {
  1284.             player [[level.spawnintermission]](1);
  1285.             player closemenu();
  1286.             player closeingamemenu();
  1287.         }
  1288.         else
  1289.         {
  1290.             if (level.wagermatch)
  1291.             {
  1292.                 if (level.teambased)
  1293.                 {
  1294.                     player thread [[level.onteamwageroutcomenotify]](winner, 0, endreasontext);
  1295.                 }
  1296.                 else
  1297.                 {
  1298.                     player thread [[level.onwageroutcomenotify]](winner, endreasontext);
  1299.                 }
  1300.             }
  1301.             else
  1302.             {
  1303.                 if (level.teambased)
  1304.                 {
  1305.                     player thread [[level.onteamoutcomenotify]](winner, 0, endreasontext);
  1306.                 }
  1307.                 else
  1308.                 {
  1309.                     player thread [[level.onoutcomenotify]](winner, 0, endreasontext);
  1310.                     if (isDefined(winner) && player == winner)
  1311.                     {
  1312.                         music = game["music"]["victory_" + player.team];
  1313.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player(music);
  1314.                     }
  1315.                     else
  1316.                     {
  1317.                         if (!level.splitscreen)
  1318.                         {
  1319.                             player maps/mp/gametypes/_globallogic_audio::set_music_on_player("LOSE");
  1320.                         }
  1321.                     }
  1322.                 }
  1323.             }
  1324.             player setclientuivisibilityflag("hud_visible", 0);
  1325.             player setclientuivisibilityflag("g_compassShowEnemies", 0);
  1326.         }
  1327.         index++;
  1328.     }
  1329.     while (level.teambased)
  1330.     {
  1331.         thread maps/mp/gametypes/_globallogic_audio::announcegamewinner(winner, level.postroundtime / 2);
  1332.         players = level.players;
  1333.         index = 0;
  1334.         while (index < players.size)
  1335.         {
  1336.             player = players[index];
  1337.             team = player.pers["team"];
  1338.             if (level.splitscreen)
  1339.             {
  1340.                 if (winner == "tie")
  1341.                 {
  1342.                     player maps/mp/gametypes/_globallogic_audio::set_music_on_player("DRAW");
  1343.                 }
  1344.                 else
  1345.                 {
  1346.                     if (winner == team)
  1347.                     {
  1348.                         music = game["music"]["victory_" + player.team];
  1349.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player(music);
  1350.                     }
  1351.                     else
  1352.                     {
  1353.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player("LOSE");
  1354.                     }
  1355.                 }
  1356.             }
  1357.             else
  1358.             {
  1359.                 if (winner == "tie")
  1360.                 {
  1361.                     player maps/mp/gametypes/_globallogic_audio::set_music_on_player("DRAW");
  1362.                 }
  1363.                 else
  1364.                 {
  1365.                     if (winner == team)
  1366.                     {
  1367.                         music = game["music"]["victory_" + player.team];
  1368.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player(music);
  1369.                     }
  1370.                     else
  1371.                     {
  1372.                         player maps/mp/gametypes/_globallogic_audio::set_music_on_player("LOSE");
  1373.                     }
  1374.                 }
  1375.             }
  1376.             index++;
  1377.         }
  1378.     }
  1379.     bbprint("session_epilogs", "reason %s", endreasontext);
  1380.     bbprint("mpmatchfacts", "gametime %d winner %s killstreakcount %d", getTime(), winner, level.killstreak_counter);
  1381.     roundendwait(level.postroundtime, 1);
  1382. }
  1383.  
  1384. getendreasontext()
  1385. {
  1386.     while (isDefined(level.endreasontext))
  1387.     {
  1388.         return level.endreasontext;
  1389.     }
  1390.     if (hitroundlimit() || hitroundwinlimit())
  1391.     {
  1392.         return game["strings"]["round_limit_reached"];
  1393.     }
  1394.     else
  1395.     {
  1396.         if (hitscorelimit())
  1397.         {
  1398.             return game["strings"]["score_limit_reached"];
  1399.         }
  1400.     }
  1401.     if (level.forcedend)
  1402.     {
  1403.         if (level.hostforcedend)
  1404.         {
  1405.             return &"MP_HOST_ENDED_GAME";
  1406.         }
  1407.         else
  1408.         {
  1409.             return &"MP_ENDED_GAME";
  1410.         }
  1411.     }
  1412.     return game["strings"]["time_limit_reached"];
  1413. }
  1414.  
  1415. resetoutcomeforallplayers()
  1416. {
  1417.     players = level.players;
  1418.     index = 0;
  1419.     while (index < players.size)
  1420.     {
  1421.         player = players[index];
  1422.         player notify("reset_outcome");
  1423.         index++;
  1424.     }
  1425. }
  1426.  
  1427. startnextround(winner, endreasontext)
  1428. {
  1429.     if (!isoneround())
  1430.     {
  1431.         displayroundend(winner, endreasontext);
  1432.         maps/mp/gametypes/_globallogic_utils::executepostroundevents();
  1433.         if (!waslastround())
  1434.         {
  1435.             while (checkroundswitch())
  1436.             {
  1437.                 displayroundswitch(winner, endreasontext);
  1438.             }
  1439.             if (isDefined(level.nextroundisovertime) && level.nextroundisovertime)
  1440.             {
  1441.                 if (!isDefined(game["overtime_round"]))
  1442.                 {
  1443.                     game["overtime_round"] = 1;
  1444.                 }
  1445.                 else
  1446.                 {
  1447.                     game["overtime_round"]++;
  1448.                 }
  1449.             }
  1450.             setmatchtalkflag("DeadChatWithDead", level.voip.deadchatwithdead);
  1451.             setmatchtalkflag("DeadChatWithTeam", level.voip.deadchatwithteam);
  1452.             setmatchtalkflag("DeadHearTeamLiving", level.voip.deadhearteamliving);
  1453.             setmatchtalkflag("DeadHearAllLiving", level.voip.deadhearallliving);
  1454.             setmatchtalkflag("EveryoneHearsEveryone", level.voip.everyonehearseveryone);
  1455.             setmatchtalkflag("DeadHearKiller", level.voip.deadhearkiller);
  1456.             setmatchtalkflag("KillersHearVictim", level.voip.killershearvictim);
  1457.             game["state"] = "playing";
  1458.             level.allowbattlechatter = getgametypesetting("allowBattleChatter");
  1459.             map_restart(1);
  1460.             return 1;
  1461.         }
  1462.     }
  1463.     return 0;
  1464. }
  1465.  
  1466. settopplayerstats()
  1467. {
  1468.     while (level.rankedmatch || level.wagermatch)
  1469.     {
  1470.         placement = level.placement["all"];
  1471.         topthreeplayers = min(3, placement.size);
  1472.         index = 0;
  1473.         while (index < topthreeplayers)
  1474.         {
  1475.             if (level.placement["all"][index].score)
  1476.             {
  1477.                 if (!index)
  1478.                 {
  1479.                     level.placement["all"][index] addplayerstatwithgametype("TOPPLAYER", 1);
  1480.                     level.placement["all"][index] notify("topplayer");
  1481.                 }
  1482.                 else
  1483.                 {
  1484.                     level.placement["all"][index] notify("nottopplayer");
  1485.                 }
  1486.                 level.placement["all"][index] addplayerstatwithgametype("TOP3", 1);
  1487.                 level.placement["all"][index] addplayerstat("TOP3ANY", 1);
  1488.                 while (level.hardcoremode)
  1489.                 {
  1490.                     level.placement["all"][index] addplayerstat("TOP3ANY_HC", 1);
  1491.                 }
  1492.                 while (level.multiteam)
  1493.                 {
  1494.                     level.placement["all"][index] addplayerstat("TOP3ANY_MULTITEAM", 1);
  1495.                 }
  1496.                 level.placement["all"][index] notify("top3");
  1497.             }
  1498.             index++;
  1499.         }
  1500.         index = 3;
  1501.         while (index < placement.size)
  1502.         {
  1503.             level.placement["all"][index] notify("nottop3");
  1504.             level.placement["all"][index] notify("nottopplayer");
  1505.             index++;
  1506.         }
  1507.         while (level.teambased)
  1508.         {
  1509.             _a1500 = level.teams;
  1510.             _k1500 = getFirstArrayKey(_a1500);
  1511.             while (isDefined(_k1500))
  1512.             {
  1513.                 team = _a1500[_k1500];
  1514.                 settopteamstats(team);
  1515.                 _k1500 = getNextArrayKey(_a1500, _k1500);
  1516.             }
  1517.         }
  1518.     }
  1519. }
  1520.  
  1521. settopteamstats(team)
  1522. {
  1523.     placementteam = level.placement[team];
  1524.     topthreeteamplayers = min(3, placementteam.size);
  1525.     if (placementteam.size < 5)
  1526.     {
  1527.         return;
  1528.     }
  1529.     index = 0;
  1530.     while (index < topthreeteamplayers)
  1531.     {
  1532.         while (placementteam[index].score)
  1533.         {
  1534.             placementteam[index] addplayerstat("TOP3TEAM", 1);
  1535.             placementteam[index] addplayerstat("TOP3ANY", 1);
  1536.             while (level.hardcoremode)
  1537.             {
  1538.                 placementteam[index] addplayerstat("TOP3ANY_HC", 1);
  1539.             }
  1540.             while (level.multiteam)
  1541.             {
  1542.                 placementteam[index] addplayerstat("TOP3ANY_MULTITEAM", 1);
  1543.             }
  1544.             placementteam[index] addplayerstatwithgametype("TOP3TEAM", 1);
  1545.         }
  1546.         index++;
  1547.     }
  1548. }
  1549.  
  1550. getgamelength()
  1551. {
  1552.     if (!(level.timelimit) || level.forcedend)
  1553.     {
  1554.         gamelength = maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000;
  1555.         gamelength = min(gamelength, 1200);
  1556.     }
  1557.     else
  1558.     {
  1559.         gamelength = level.timelimit * 60;
  1560.     }
  1561.     return gamelength;
  1562. }
  1563.  
  1564. endgame(winner, endreasontext)
  1565. {
  1566.     if (game["state"] == "postgame" || level.gameended)
  1567.     {
  1568.         return;
  1569.     }
  1570.     if (isDefined(level.onendgame))
  1571.     {
  1572.         [[level.onendgame]](winner);
  1573.     }
  1574.     if (!level.wagermatch)
  1575.     {
  1576.         setmatchflag("enable_popups", 0);
  1577.     }
  1578.     if (!(isDefined(level.disableoutrovisionset)) || level.disableoutrovisionset == 0)
  1579.     {
  1580.         if (sessionmodeiszombiesgame() && level.forcedend)
  1581.         {
  1582.             visionsetnaked("zombie_last_stand", 2);
  1583.         }
  1584.         else
  1585.         {
  1586.             visionsetnaked("mpOutro", 2);
  1587.         }
  1588.     }
  1589.     setmatchflag("cg_drawSpectatorMessages", 0);
  1590.     setmatchflag("game_ended", 1);
  1591.     game["state"] = "postgame";
  1592.     level.gameendtime = getTime();
  1593.     level.gameended = 1;
  1594.     setdvar("g_gameEnded", 1);
  1595.     level.ingraceperiod = 0;
  1596.     level notify("game_ended");
  1597.     level.allowbattlechatter = 0;
  1598.     maps/mp/gametypes/_globallogic_audio::flushdialog();
  1599.     _a1595 = level.teams;
  1600.     _k1595 = getFirstArrayKey(_a1595);
  1601.     while (isDefined(_k1595))
  1602.     {
  1603.         team = _a1595[_k1595];
  1604.         game["lastroundscore"][team] = getteamscore(team);
  1605.         _k1595 = getNextArrayKey(_a1595, _k1595);
  1606.     }
  1607.     if (!(isDefined(game["overtime_round"])) || waslastround())
  1608.     {
  1609.         game["roundsplayed"]++;
  1610.         game["roundwinner"][game["roundsplayed"]] = winner;
  1611.         if (level.teambased)
  1612.         {
  1613.             game["roundswon"][winner]++;
  1614.         }
  1615.     }
  1616.     if (isDefined(winner) && level.teambased && isDefined(level.teams[winner]))
  1617.     {
  1618.         level.finalkillcam_winner = winner;
  1619.     }
  1620.     else
  1621.     {
  1622.         level.finalkillcam_winner = "none";
  1623.     }
  1624.     setgameendtime(0);
  1625.     updateplacement();
  1626.     updaterankedmatch(winner);
  1627.     players = level.players;
  1628.     newtime = getTime();
  1629.     gamelength = getgamelength();
  1630.     setmatchtalkflag("EveryoneHearsEveryone", 1);
  1631.     bbgameover = 0;
  1632.     if (isoneround() || waslastround())
  1633.     {
  1634.         bbgameover = 1;
  1635.     }
  1636.     index = 0;
  1637.     while (index < players.size)
  1638.     {
  1639.         player = players[index];
  1640.         player maps/mp/gametypes/_globallogic_player::freezeplayerforroundend();
  1641.         player thread roundenddof(4);
  1642.         player maps/mp/gametypes/_globallogic_ui::freegameplayhudelems();
  1643.         player maps/mp/gametypes/_weapons::updateweapontimings(newtime);
  1644.         player bbplayermatchend(gamelength, endreasontext, bbgameover);
  1645.         if (ispregame())
  1646.         {
  1647.         }
  1648.         else
  1649.         {
  1650.             while (level.rankedmatch || level.wagermatch || level.leaguematch && !(player issplitscreen()))
  1651.             {
  1652.                 if (level.leaguematch)
  1653.                 {
  1654.                     player setdstat("AfterActionReportStats", "lobbyPopup", "leaguesummary");
  1655.                 }
  1656.                 else
  1657.                 {
  1658.                     if (isDefined(player.setpromotion))
  1659.                     {
  1660.                         player setdstat("AfterActionReportStats", "lobbyPopup", "promotion");
  1661.                     }
  1662.                     else
  1663.                     {
  1664.                         player setdstat("AfterActionReportStats", "lobbyPopup", "summary");
  1665.                     }
  1666.                 }
  1667.             }
  1668.         }
  1669.         index++;
  1670.     }
  1671.     maps/mp/_music::setmusicstate("SILENT");
  1672.     if (!level.infinalkillcam)
  1673.     {
  1674.     }
  1675.     maps/mp/_gamerep::gamerepupdateinformationforround();
  1676.     maps/mp/gametypes/_wager::finalizewagerround();
  1677.     thread maps/mp/_challenges::roundend(winner);
  1678.     if (startnextround(winner, endreasontext))
  1679.     {
  1680.         return;
  1681.     }
  1682.     if (!(isoneround()) && !(level.gameforfeited))
  1683.     {
  1684.         if (isDefined(level.onroundendgame))
  1685.         {
  1686.             winner = [[level.onroundendgame]](winner);
  1687.         }
  1688.         endreasontext = getendreasontext();
  1689.     }
  1690.     while (!(level.wagermatch) && !(sessionmodeiszombiesgame()))
  1691.     {
  1692.         maps/mp/gametypes/_globallogic_score::updatewinlossstats(winner);
  1693.     }
  1694.     if (level.teambased)
  1695.     {
  1696.         if (winner == "tie")
  1697.         {
  1698.             recordgameresult("draw");
  1699.         }
  1700.         else
  1701.         {
  1702.             recordgameresult(winner);
  1703.         }
  1704.     }
  1705.     else
  1706.     {
  1707.         if (!isDefined(winner))
  1708.         {
  1709.             recordgameresult("draw");
  1710.         }
  1711.         else
  1712.         {
  1713.             recordgameresult(winner.team);
  1714.         }
  1715.     }
  1716.     skillupdate(winner, level.teambased);
  1717.     recordleaguewinner(winner);
  1718.     settopplayerstats();
  1719.     thread maps/mp/_challenges::gameend(winner);
  1720.     if (!(isDefined(level.skipgameend)) || !(level.skipgameend))
  1721.     {
  1722.         if (isDefined(level.preendgamefunction))
  1723.         {
  1724.             thread [[level.preendgamefunction]](level.postroundtime);
  1725.         }
  1726.         displaygameend(winner, endreasontext);
  1727.     }
  1728.     if (isoneround())
  1729.     {
  1730.         maps/mp/gametypes/_globallogic_utils::executepostroundevents();
  1731.     }
  1732.     level.intermission = 1;
  1733.     maps/mp/_gamerep::gamerepanalyzeandreport();
  1734.     if (!ispregame())
  1735.     {
  1736.         thread sendafteractionreport();
  1737.     }
  1738.     maps/mp/gametypes/_wager::finalizewagergame();
  1739.     setmatchtalkflag("EveryoneHearsEveryone", 1);
  1740.     players = level.players;
  1741.     index = 0;
  1742.     while (index < players.size)
  1743.     {
  1744.         player = players[index];
  1745.         recordplayerstats(player, "presentAtEnd", 1);
  1746.         player closemenu();
  1747.         player closeingamemenu();
  1748.         player notify("reset_outcome");
  1749.         player thread [[level.spawnintermission]]();
  1750.         player setclientuivisibilityflag("hud_visible", 1);
  1751.         index++;
  1752.     }
  1753.     if (isDefined(level.endgamefunction))
  1754.     {
  1755.         level thread [[level.endgamefunction]]();
  1756.     }
  1757.     level notify("sfade");
  1758.     logstring("game ended");
  1759.     if (!(isDefined(level.skipgameend)) || !(level.skipgameend))
  1760.     {
  1761.         wait 5;
  1762.     }
  1763.     exitlevel(0);
  1764. }
  1765.  
  1766. bbplayermatchend(gamelength, endreasonstring, gameover)
  1767. {
  1768.     playerrank = getplacementforplayer(self);
  1769.     totaltimeplayed = 0;
  1770.     if (isDefined(self.timeplayed) && isDefined(self.timeplayed["total"]))
  1771.     {
  1772.         totaltimeplayed = self.timeplayed["total"];
  1773.         if (totaltimeplayed > gamelength)
  1774.         {
  1775.             totaltimeplayed = gamelength;
  1776.         }
  1777.     }
  1778.     xuid = self getxuid();
  1779.     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"]);
  1780. }
  1781.  
  1782. roundendwait(defaultdelay, matchbonus)
  1783. {
  1784.     notifiesdone = 0;
  1785.     if (!notifiesdone)
  1786.     {
  1787.         players = level.players;
  1788.         notifiesdone = 1;
  1789.         index = 0;
  1790.         while (index < players.size)
  1791.         {
  1792.             if (!(isDefined(players[index].doingnotify)) || !(players[index].doingnotify))
  1793.             {
  1794.             }
  1795.             else
  1796.             {
  1797.                 notifiesdone = 0;
  1798.             }
  1799.             index++;
  1800.         }
  1801.         wait 0.5;
  1802.     }
  1803.     if (!matchbonus)
  1804.     {
  1805.         wait defaultdelay;
  1806.         level notify("round_end_done");
  1807.         return;
  1808.     }
  1809.     wait defaultdelay / 2;
  1810.     level notify("give_match_bonus");
  1811.     wait defaultdelay / 2;
  1812.     notifiesdone = 0;
  1813.     if (!notifiesdone)
  1814.     {
  1815.         players = level.players;
  1816.         notifiesdone = 1;
  1817.         index = 0;
  1818.         while (index < players.size)
  1819.         {
  1820.             if (!(isDefined(players[index].doingnotify)) || !(players[index].doingnotify))
  1821.             {
  1822.             }
  1823.             else
  1824.             {
  1825.                 notifiesdone = 0;
  1826.             }
  1827.             index++;
  1828.         }
  1829.         wait 0.5;
  1830.     }
  1831.     level notify("round_end_done");
  1832. }
  1833.  
  1834. roundenddof(time)
  1835. {
  1836.     self setdepthoffield(0, 128, 512, 4000, 6, 1.8);
  1837. }
  1838.  
  1839. checktimelimit()
  1840. {
  1841.     if (isDefined(level.timelimitoverride) && level.timelimitoverride)
  1842.     {
  1843.         return;
  1844.     }
  1845.     if (game["state"] != "playing")
  1846.     {
  1847.         setgameendtime(0);
  1848.         return;
  1849.     }
  1850.     if (level.timelimit <= 0)
  1851.     {
  1852.         setgameendtime(0);
  1853.         return;
  1854.     }
  1855.     if (level.inprematchperiod)
  1856.     {
  1857.         setgameendtime(0);
  1858.         return;
  1859.     }
  1860.     if (level.timerstopped)
  1861.     {
  1862.         setgameendtime(0);
  1863.         return;
  1864.     }
  1865.     if (!isDefined(level.starttime))
  1866.     {
  1867.         return;
  1868.     }
  1869.     timeleft = maps/mp/gametypes/_globallogic_utils::gettimeremaining();
  1870.     setgameendtime(getTime() + int(timeleft));
  1871.     if (timeleft > 0)
  1872.     {
  1873.         return;
  1874.     }
  1875.     [[level.ontimelimit]]();
  1876. }
  1877.  
  1878. allteamsunderscorelimit()
  1879. {
  1880.     _a1917 = level.teams;
  1881.     _k1917 = getFirstArrayKey(_a1917);
  1882.     while (isDefined(_k1917))
  1883.     {
  1884.         team = _a1917[_k1917];
  1885.         if (game["teamScores"][team] >= level.scorelimit)
  1886.         {
  1887.             return 0;
  1888.         }
  1889.         _k1917 = getNextArrayKey(_a1917, _k1917);
  1890.     }
  1891.     return 1;
  1892. }
  1893.  
  1894. checkscorelimit()
  1895. {
  1896.     if (game["state"] != "playing")
  1897.     {
  1898.         return 0;
  1899.     }
  1900.     if (level.scorelimit <= 0)
  1901.     {
  1902.         return 0;
  1903.     }
  1904.     if (level.teambased)
  1905.     {
  1906.         if (allteamsunderscorelimit())
  1907.         {
  1908.             return 0;
  1909.         }
  1910.     }
  1911.     else
  1912.     {
  1913.         if (!isplayer(self))
  1914.         {
  1915.             return 0;
  1916.         }
  1917.         if (self.pointstowin < level.scorelimit)
  1918.         {
  1919.             return 0;
  1920.         }
  1921.     }
  1922.     [[level.onscorelimit]]();
  1923. }
  1924.  
  1925. updategametypedvars()
  1926. {
  1927.     level endon("game_ended");
  1928.     while (game["state"] == "playing")
  1929.     {
  1930.         roundlimit = clamp(getgametypesetting("roundLimit"), level.roundlimitmin, level.roundlimitmax);
  1931.         if (roundlimit != level.roundlimit)
  1932.         {
  1933.             level.roundlimit = roundlimit;
  1934.             level notify("update_roundlimit");
  1935.         }
  1936.         timelimit = [[level.gettimelimit]]();
  1937.         if (timelimit != level.timelimit)
  1938.         {
  1939.             level.timelimit = timelimit;
  1940.             setdvar("ui_timelimit", level.timelimit);
  1941.             level notify("update_timelimit");
  1942.         }
  1943.         thread checktimelimit();
  1944.         scorelimit = clamp(getgametypesetting("scoreLimit"), level.scorelimitmin, level.scorelimitmax);
  1945.         if (scorelimit != level.scorelimit)
  1946.         {
  1947.             level.scorelimit = scorelimit;
  1948.             setdvar("ui_scorelimit", level.scorelimit);
  1949.             level notify("update_scorelimit");
  1950.         }
  1951.         thread checkscorelimit();
  1952.         while (isDefined(level.starttime))
  1953.         {
  1954.             while (maps/mp/gametypes/_globallogic_utils::gettimeremaining() < 3000)
  1955.             {
  1956.                 wait 0.1;
  1957.             }
  1958.         }
  1959.         wait 1;
  1960.     }
  1961. }
  1962.  
  1963. removedisconnectedplayerfromplacement()
  1964. {
  1965.     offset = 0;
  1966.     numplayers = level.placement["all"].size;
  1967.     found = 0;
  1968.     i = 0;
  1969.     while (i < numplayers)
  1970.     {
  1971.         if (level.placement["all"][i] == self)
  1972.         {
  1973.             found = 1;
  1974.         }
  1975.         if (found)
  1976.         {
  1977.             level.placement["all"][i] = level.placement["all"][i + 1];
  1978.         }
  1979.         i++;
  1980.     }
  1981.     if (!found)
  1982.     {
  1983.         return;
  1984.     }
  1985.     level.placement["all"][numplayers - 1] = undefined;
  1986.     updateteamplacement();
  1987.     if (level.teambased)
  1988.     {
  1989.         return;
  1990.     }
  1991.     numplayers = level.placement["all"].size;
  1992.     i = 0;
  1993.     while (i < numplayers)
  1994.     {
  1995.         player = level.placement["all"][i];
  1996.         player notify("update_outcome");
  1997.         i++;
  1998.     }
  1999. }
  2000.  
  2001. updateplacement()
  2002. {
  2003.     if (!level.players.size)
  2004.     {
  2005.         return;
  2006.     }
  2007.     level.placement["all"] = [];
  2008.     index = 0;
  2009.     while (index < level.players.size)
  2010.     {
  2011.         if (isDefined(level.teams[level.players[index].team]))
  2012.         {
  2013.             level.placement["all"][level.placement["all"].size] = level.players[index];
  2014.         }
  2015.         index++;
  2016.     }
  2017.     placementall = level.placement["all"];
  2018.     if (level.teambased)
  2019.     {
  2020.         i = 1;
  2021.         while (i < placementall.size)
  2022.         {
  2023.             player = placementall[i];
  2024.             playerscore = player.score;
  2025.             j = i - 1;
  2026.             while (j >= 0 && playerscore > placementall[j].score || playerscore == placementall[j].score && player.deaths < placementall[j].deaths)
  2027.             {
  2028.                 placementall[j + 1] = placementall[j];
  2029.                 j--;
  2030.             }
  2031.             placementall[j + 1] = player;
  2032.             i++;
  2033.         }
  2034.     }
  2035.     else
  2036.     {
  2037.         i = 1;
  2038.         while (i < placementall.size)
  2039.         {
  2040.             player = placementall[i];
  2041.             playerscore = player.pointstowin;
  2042.             j = i - 1;
  2043.             while (j >= 0 && playerscore > placementall[j].pointstowin || playerscore == placementall[j].pointstowin && player.deaths < placementall[j].deaths)
  2044.             {
  2045.                 placementall[j + 1] = placementall[j];
  2046.                 j--;
  2047.             }
  2048.             placementall[j + 1] = player;
  2049.             i++;
  2050.         }
  2051.     }
  2052.     level.placement["all"] = placementall;
  2053.     updateteamplacement();
  2054. }
  2055.  
  2056. updateteamplacement()
  2057. {
  2058.     _a2085 = level.teams;
  2059.     _k2085 = getFirstArrayKey(_a2085);
  2060.     while (isDefined(_k2085))
  2061.     {
  2062.         team = _a2085[_k2085];
  2063.         placement[team] = [];
  2064.         _k2085 = getNextArrayKey(_a2085, _k2085);
  2065.     }
  2066.     placement["spectator"] = [];
  2067.     if (!level.teambased)
  2068.     {
  2069.         return;
  2070.     }
  2071.     placementall = level.placement["all"];
  2072.     placementallsize = placementall.size;
  2073.     i = 0;
  2074.     while (i < placementallsize)
  2075.     {
  2076.         player = placementall[i];
  2077.         team = player.pers["team"];
  2078.         placement[team][placement[team].size] = player;
  2079.         i++;
  2080.     }
  2081.     _a2105 = level.teams;
  2082.     _k2105 = getFirstArrayKey(_a2105);
  2083.     while (isDefined(_k2105))
  2084.     {
  2085.         team = _a2105[_k2105];
  2086.         level.placement[team] = placement[team];
  2087.         _k2105 = getNextArrayKey(_a2105, _k2105);
  2088.     }
  2089. }
  2090.  
  2091. getplacementforplayer(player)
  2092. {
  2093.     updateplacement();
  2094.     playerrank = -1;
  2095.     placement = level.placement["all"];
  2096.     placementindex = 0;
  2097.     while (placementindex < placement.size)
  2098.     {
  2099.         if (level.placement["all"][placementindex] == player)
  2100.         {
  2101.             playerrank = placementindex + 1;
  2102.         }
  2103.         else
  2104.         {
  2105.             placementindex++;
  2106.         }
  2107.     }
  2108.     return playerrank;
  2109. }
  2110.  
  2111. istopscoringplayer(player)
  2112. {
  2113.     topplayer = 0;
  2114.     updateplacement();
  2115.     if (level.placement["all"].size == 0)
  2116.     {
  2117.         return 0;
  2118.     }
  2119.     if (level.teambased)
  2120.     {
  2121.         topscore = level.placement["all"][0].score;
  2122.         index = 0;
  2123.         while (index < level.placement["all"].size)
  2124.         {
  2125.             if (level.placement["all"][index].score == 0)
  2126.             {
  2127.             }
  2128.             else
  2129.             {
  2130.                 if (topscore > level.placement["all"][index].score)
  2131.                 {
  2132.                 }
  2133.                 else
  2134.                 {
  2135.                     if (self == level.placement["all"][index])
  2136.                     {
  2137.                         topscoringplayer = 1;
  2138.                     }
  2139.                     else
  2140.                     {
  2141.                         index++;
  2142.                     }
  2143.                 }
  2144.             }
  2145.         }
  2146.     }
  2147.     else
  2148.     {
  2149.         topscore = level.placement["all"][0].pointstowin;
  2150.         index = 0;
  2151.         while (index < level.placement["all"].size)
  2152.         {
  2153.             if (level.placement["all"][index].pointstowin == 0)
  2154.             {
  2155.             }
  2156.             else
  2157.             {
  2158.                 if (topscore > level.placement["all"][index].pointstowin)
  2159.                 {
  2160.                 }
  2161.                 else
  2162.                 {
  2163.                     if (self == level.placement["all"][index])
  2164.                     {
  2165.                         topplayer = 1;
  2166.                     }
  2167.                     else
  2168.                     {
  2169.                         index++;
  2170.                     }
  2171.                 }
  2172.             }
  2173.         }
  2174.     }
  2175.     return topplayer;
  2176. }
  2177.  
  2178. sortdeadplayers(team)
  2179. {
  2180.     if (!level.playerqueuedrespawn)
  2181.     {
  2182.         return;
  2183.     }
  2184.     i = 1;
  2185.     while (i < level.deadplayers[team].size)
  2186.     {
  2187.         player = level.deadplayers[team][i];
  2188.         j = i - 1;
  2189.         while (j >= 0 && player.deathtime < level.deadplayers[team][j].deathtime)
  2190.         {
  2191.             level.deadplayers[team][j + 1] = level.deadplayers[team][j];
  2192.             j--;
  2193.         }
  2194.         level.deadplayers[team][j + 1] = player;
  2195.         i++;
  2196.     }
  2197.     i = 0;
  2198.     while (i < level.deadplayers[team].size)
  2199.     {
  2200.         if (level.deadplayers[team][i].spawnqueueindex != i)
  2201.         {
  2202.             level.spawnqueuemodified[team] = 1;
  2203.         }
  2204.         level.deadplayers[team][i].spawnqueueindex = i;
  2205.         i++;
  2206.     }
  2207. }
  2208.  
  2209. totalalivecount()
  2210. {
  2211.     count = 0;
  2212.     _a2211 = level.teams;
  2213.     _k2211 = getFirstArrayKey(_a2211);
  2214.     while (isDefined(_k2211))
  2215.     {
  2216.         team = _a2211[_k2211];
  2217.         count = count + level.alivecount[team];
  2218.         _k2211 = getNextArrayKey(_a2211, _k2211);
  2219.     }
  2220.     return count;
  2221. }
  2222.  
  2223. totalplayerlives()
  2224. {
  2225.     count = 0;
  2226.     _a2221 = level.teams;
  2227.     _k2221 = getFirstArrayKey(_a2221);
  2228.     while (isDefined(_k2221))
  2229.     {
  2230.         team = _a2221[_k2221];
  2231.         count = count + level.playerlives[team];
  2232.         _k2221 = getNextArrayKey(_a2221, _k2221);
  2233.     }
  2234.     return count;
  2235. }
  2236.  
  2237. totalplayercount()
  2238. {
  2239.     count = 0;
  2240.     _a2231 = level.teams;
  2241.     _k2231 = getFirstArrayKey(_a2231);
  2242.     while (isDefined(_k2231))
  2243.     {
  2244.         team = _a2231[_k2231];
  2245.         count = count + level.playercount[team];
  2246.         _k2231 = getNextArrayKey(_a2231, _k2231);
  2247.     }
  2248.     return count;
  2249. }
  2250.  
  2251. initteamvariables(team)
  2252. {
  2253.     if (!isDefined(level.alivecount))
  2254.     {
  2255.         level.alivecount = [];
  2256.     }
  2257.     level.alivecount[team] = 0;
  2258.     level.lastalivecount[team] = 0;
  2259.     if (!isDefined(game["everExisted"]))
  2260.     {
  2261.         game["everExisted"] = [];
  2262.     }
  2263.     if (!isDefined(game["everExisted"][team]))
  2264.     {
  2265.         game["everExisted"][team] = 0;
  2266.     }
  2267.     level.everexisted[team] = 0;
  2268.     level.wavedelay[team] = 0;
  2269.     level.lastwave[team] = 0;
  2270.     level.waveplayerspawnindex[team] = 0;
  2271.     resetteamvariables(team);
  2272. }
  2273.  
  2274. resetteamvariables(team)
  2275. {
  2276.     level.playercount[team] = 0;
  2277.     level.botscount[team] = 0;
  2278.     level.lastalivecount[team] = level.alivecount[team];
  2279.     level.alivecount[team] = 0;
  2280.     level.playerlives[team] = 0;
  2281.     level.aliveplayers[team] = [];
  2282.     level.deadplayers[team] = [];
  2283.     level.squads[team] = [];
  2284.     level.spawnqueuemodified[team] = 0;
  2285. }
  2286.  
  2287. updateteamstatus()
  2288. {
  2289.     level notify("updating_team_status");
  2290.     level endon("updating_team_status");
  2291.     level endon("game_ended");
  2292.     waitTillFrameEnd;
  2293.     wait 0;
  2294.     if (game["state"] == "postgame")
  2295.     {
  2296.         return;
  2297.     }
  2298.     resettimeout();
  2299.     _a2291 = level.teams;
  2300.     _k2291 = getFirstArrayKey(_a2291);
  2301.     while (isDefined(_k2291))
  2302.     {
  2303.         team = _a2291[_k2291];
  2304.         resetteamvariables(team);
  2305.         _k2291 = getNextArrayKey(_a2291, _k2291);
  2306.     }
  2307.     level.activeplayers = [];
  2308.     players = level.players;
  2309.     i = 0;
  2310.     while (i < players.size)
  2311.     {
  2312.         player = players[i];
  2313.         if (!(isDefined(player)) && level.splitscreen)
  2314.         {
  2315.         }
  2316.         else
  2317.         {
  2318.             team = player.team;
  2319.             class = player.class;
  2320.             if (team != "spectator" && isDefined(class) && class != "")
  2321.             {
  2322.                 level.playercount[team]++;
  2323.                 if (isDefined(player.pers["isBot"]))
  2324.                 {
  2325.                     level.botscount[team]++;
  2326.                 }
  2327.                 if (player.sessionstate == "playing")
  2328.                 {
  2329.                     level.alivecount[team]++;
  2330.                     level.playerlives[team]++;
  2331.                     player.spawnqueueindex = -1;
  2332.                     if (isalive(player))
  2333.                     {
  2334.                         level.aliveplayers[team][level.aliveplayers[team].size] = player;
  2335.                         level.activeplayers[level.activeplayers.size] = player;
  2336.                     }
  2337.                     else
  2338.                     {
  2339.                         level.deadplayers[team][level.deadplayers[team].size] = player;
  2340.                     }
  2341.                 }
  2342.                 else
  2343.                 {
  2344.                     level.deadplayers[team][level.deadplayers[team].size] = player;
  2345.                     if (player maps/mp/gametypes/_globallogic_spawn::mayspawn())
  2346.                     {
  2347.                         level.playerlives[team]++;
  2348.                     }
  2349.                 }
  2350.             }
  2351.         }
  2352.         i++;
  2353.     }
  2354.     totalalive = totalalivecount();
  2355.     if (totalalive > level.maxplayercount)
  2356.     {
  2357.         level.maxplayercount = totalalive;
  2358.     }
  2359.     _a2346 = level.teams;
  2360.     _k2346 = getFirstArrayKey(_a2346);
  2361.     while (isDefined(_k2346))
  2362.     {
  2363.         team = _a2346[_k2346];
  2364.         if (level.alivecount[team])
  2365.         {
  2366.             game["everExisted"][team] = 1;
  2367.             level.everexisted[team] = 1;
  2368.         }
  2369.         sortdeadplayers(team);
  2370.         _k2346 = getNextArrayKey(_a2346, _k2346);
  2371.     }
  2372.     level updategameevents();
  2373. }
  2374.  
  2375. checkteamscorelimitsoon(team)
  2376. {
  2377.     if (level.scorelimit <= 0)
  2378.     {
  2379.         return;
  2380.     }
  2381.     if (!level.teambased)
  2382.     {
  2383.         return;
  2384.     }
  2385.     if (maps/mp/gametypes/_globallogic_utils::gettimepassed() < 60000)
  2386.     {
  2387.         return;
  2388.     }
  2389.     timeleft = maps/mp/gametypes/_globallogic_utils::getestimatedtimeuntilscorelimit(team);
  2390.     if (timeleft < 1)
  2391.     {
  2392.         level notify("match_ending_soon", "score");
  2393.     }
  2394. }
  2395.  
  2396. checkplayerscorelimitsoon()
  2397. {
  2398.     if (level.scorelimit <= 0)
  2399.     {
  2400.         return;
  2401.     }
  2402.     if (level.teambased)
  2403.     {
  2404.         return;
  2405.     }
  2406.     if (maps/mp/gametypes/_globallogic_utils::gettimepassed() < 60000)
  2407.     {
  2408.         return;
  2409.     }
  2410.     timeleft = maps/mp/gametypes/_globallogic_utils::getestimatedtimeuntilscorelimit(undefined);
  2411.     if (timeleft < 1)
  2412.     {
  2413.         level notify("match_ending_soon", "score");
  2414.     }
  2415. }
  2416.  
  2417. timelimitclock()
  2418. {
  2419.     level endon("game_ended");
  2420.     wait 0.05;
  2421.     clockobject = spawn("script_origin", (0, 0, 0));
  2422.     while (game["state"] == "playing")
  2423.     {
  2424.         if (!(level.timerstopped) && level.timelimit)
  2425.         {
  2426.             timeleft = maps/mp/gametypes/_globallogic_utils::gettimeremaining() / 1000;
  2427.             timeleftint = int(timeleft + 0.5);
  2428.             if (timeleftint == 601)
  2429.             {
  2430.                 clientnotify("notify_10");
  2431.             }
  2432.             if (timeleftint == 301)
  2433.             {
  2434.                 clientnotify("notify_5");
  2435.             }
  2436.             if (timeleftint == 60)
  2437.             {
  2438.                 clientnotify("notify_1");
  2439.             }
  2440.             if (timeleftint == 12)
  2441.             {
  2442.                 clientnotify("notify_count");
  2443.             }
  2444.             if (timeleftint >= 40 && timeleftint <= 60)
  2445.             {
  2446.                 level notify("match_ending_soon", "time");
  2447.             }
  2448.             if (timeleftint >= 30 && timeleftint <= 40)
  2449.             {
  2450.                 level notify("match_ending_pretty_soon", "time");
  2451.             }
  2452.             if (timeleftint <= 32)
  2453.             {
  2454.                 level notify("match_ending_vox");
  2455.             }
  2456.             if (timeleftint <= 10 || timeleftint <= 30 && timeleftint % 2 == 0)
  2457.             {
  2458.                 level notify("match_ending_very_soon", "time");
  2459.                 if (timeleftint == 0)
  2460.                 {
  2461.                 }
  2462.                 else
  2463.                 {
  2464.                     clockobject playsound("mpl_ui_timer_countdown");
  2465.                 }
  2466.                 if (timeleft - floor(timeleft) >= 0.05)
  2467.                 {
  2468.                     wait timeleft - floor(timeleft);
  2469.                 }
  2470.             }
  2471.             wait 1;
  2472.         }
  2473.     }
  2474. }
  2475.  
  2476. timelimitclock_intermission(waittime)
  2477. {
  2478.     setgameendtime(getTime() + int(waittime * 1000));
  2479.     clockobject = spawn("script_origin", (0, 0, 0));
  2480.     if (waittime >= 10)
  2481.     {
  2482.         wait waittime - 10;
  2483.     }
  2484.     clockobject playsound("mpl_ui_timer_countdown");
  2485.     wait 1;
  2486. }
  2487.  
  2488. startgame()
  2489. {
  2490.     thread maps/mp/gametypes/_globallogic_utils::gametimer();
  2491.     level.timerstopped = 0;
  2492.     setmatchtalkflag("DeadChatWithDead", level.voip.deadchatwithdead);
  2493.     setmatchtalkflag("DeadChatWithTeam", level.voip.deadchatwithteam);
  2494.     setmatchtalkflag("DeadHearTeamLiving", level.voip.deadhearteamliving);
  2495.     setmatchtalkflag("DeadHearAllLiving", level.voip.deadhearallliving);
  2496.     setmatchtalkflag("EveryoneHearsEveryone", level.voip.everyonehearseveryone);
  2497.     setmatchtalkflag("DeadHearKiller", level.voip.deadhearkiller);
  2498.     setmatchtalkflag("KillersHearVictim", level.voip.killershearvictim);
  2499.     prematchperiod();
  2500.     level notify("prematch_over");
  2501.     thread timelimitclock();
  2502.     thread graceperiod();
  2503.     thread watchmatchendingsoon();
  2504.     thread maps/mp/gametypes/_globallogic_audio::musiccontroller();
  2505.     recordmatchbegin();
  2506. }
  2507.  
  2508. waitforplayers()
  2509. {
  2510.     starttime = getTime();
  2511.     while (getnumconnectedplayers() < 1)
  2512.     {
  2513.         wait 0.05;
  2514.         while (getTime() - starttime > 120000)
  2515.         {
  2516.             exitlevel(0);
  2517.         }
  2518.     }
  2519. }
  2520.  
  2521. prematchperiod()
  2522. {
  2523.     setmatchflag("hud_hardcore", level.hardcoremode);
  2524.     level endon("game_ended");
  2525.     if (level.prematchperiod > 0)
  2526.     {
  2527.         thread matchstarttimer();
  2528.         waitforplayers();
  2529.         wait level.prematchperiod;
  2530.     }
  2531.     else
  2532.     {
  2533.         matchstarttimerskip();
  2534.         wait 0.05;
  2535.     }
  2536.     level.inprematchperiod = 0;
  2537.     index = 0;
  2538.     while (index < level.players.size)
  2539.     {
  2540.         level.players[index] freeze_player_controls(0);
  2541.         level.players[index] enableweapons();
  2542.         index++;
  2543.     }
  2544.     maps/mp/gametypes/_wager::prematchperiod();
  2545.     if (game["state"] != "playing")
  2546.     {
  2547.         return;
  2548.     }
  2549. }
  2550.  
  2551. graceperiod()
  2552. {
  2553.     level endon("game_ended");
  2554.     if (isDefined(level.graceperiodfunc))
  2555.     {
  2556.         [[level.graceperiodfunc]]();
  2557.     }
  2558.     else
  2559.     {
  2560.         wait level.graceperiod;
  2561.     }
  2562.     level notify("grace_period_ending");
  2563.     wait 0.05;
  2564.     level.ingraceperiod = 0;
  2565.     if (game["state"] != "playing")
  2566.     {
  2567.         return;
  2568.     }
  2569.     while (level.numlives)
  2570.     {
  2571.         players = level.players;
  2572.         i = 0;
  2573.         while (i < players.size)
  2574.         {
  2575.             player = players[i];
  2576.             while (!(player.hasspawned) && player.sessionteam != "spectator" && !(isalive(player)))
  2577.             {
  2578.                 player.statusicon = "hud_status_dead";
  2579.             }
  2580.             i++;
  2581.         }
  2582.     }
  2583.     level thread updateteamstatus();
  2584. }
  2585.  
  2586. watchmatchendingsoon()
  2587. {
  2588.     setdvar("xblive_matchEndingSoon", 0);
  2589.     level waittill("match_ending_soon", reason);
  2590.     setdvar("xblive_matchEndingSoon", 1);
  2591. }
  2592.  
  2593. assertteamvariables()
  2594. {
  2595.     while (!(level.createfx_enabled) && !(sessionmodeiszombiesgame()))
  2596.     {
  2597.         _a2604 = level.teams;
  2598.         _k2604 = getFirstArrayKey(_a2604);
  2599.         while (isDefined(_k2604))
  2600.         {
  2601.             team = _a2604[_k2604];
  2602.             _k2604 = getNextArrayKey(_a2604, _k2604);
  2603.         }
  2604.     }
  2605. }
  2606.  
  2607. anyteamhaswavedelay()
  2608. {
  2609.     _a2622 = level.teams;
  2610.     _k2622 = getFirstArrayKey(_a2622);
  2611.     while (isDefined(_k2622))
  2612.     {
  2613.         team = _a2622[_k2622];
  2614.         if (level.wavedelay[team])
  2615.         {
  2616.             return 1;
  2617.         }
  2618.         _k2622 = getNextArrayKey(_a2622, _k2622);
  2619.     }
  2620.     return 0;
  2621. }
  2622.  
  2623. callback_startgametype()
  2624. {
  2625.     level.prematchperiod = 0;
  2626.     level.intermission = 0;
  2627.     setmatchflag("cg_drawSpectatorMessages", 1);
  2628.     setmatchflag("game_ended", 0);
  2629.     if (!isDefined(game["gamestarted"]))
  2630.     {
  2631.         if (!isDefined(game["allies"]))
  2632.         {
  2633.             game["allies"] = "seals";
  2634.         }
  2635.         if (!isDefined(game["axis"]))
  2636.         {
  2637.             game["axis"] = "pmc";
  2638.         }
  2639.         if (!isDefined(game["attackers"]))
  2640.         {
  2641.             game["attackers"] = "allies";
  2642.         }
  2643.         if (!isDefined(game["defenders"]))
  2644.         {
  2645.             game["defenders"] = "axis";
  2646.         }
  2647.         _a2655 = level.teams;
  2648.         _k2655 = getFirstArrayKey(_a2655);
  2649.         while (isDefined(_k2655))
  2650.         {
  2651.             team = _a2655[_k2655];
  2652.             if (!isDefined(game[team]))
  2653.             {
  2654.                 game[team] = "pmc";
  2655.             }
  2656.             _k2655 = getNextArrayKey(_a2655, _k2655);
  2657.         }
  2658.         if (!isDefined(game["state"]))
  2659.         {
  2660.             game["state"] = "playing";
  2661.         }
  2662.         precacherumble("damage_heavy");
  2663.         precacherumble("damage_light");
  2664.         precacheshader("white");
  2665.         precacheshader("black");
  2666.         makedvarserverinfo("scr_allies", "marines");
  2667.         makedvarserverinfo("scr_axis", "nva");
  2668.         makedvarserverinfo("cg_thirdPersonAngle", 354);
  2669.         setdvar("cg_thirdPersonAngle", 354);
  2670.         game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN";
  2671.         if (level.teambased)
  2672.         {
  2673.             game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_TEAMS";
  2674.             game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN";
  2675.         }
  2676.         else
  2677.         {
  2678.             game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_PLAYERS";
  2679.             game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN";
  2680.         }
  2681.         game["strings"]["match_starting_in"] = &"MP_MATCH_STARTING_IN";
  2682.         game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND";
  2683.         game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN";
  2684.         game["strings"]["waiting_to_spawn_ss"] = &"MP_WAITING_TO_SPAWN_SS";
  2685.         game["strings"]["you_will_spawn"] = &"MP_YOU_WILL_RESPAWN";
  2686.         game["strings"]["match_starting"] = &"MP_MATCH_STARTING";
  2687.         game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN";
  2688.         game["strings"]["last_stand"] = &"MPUI_LAST_STAND";
  2689.         game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT";
  2690.         game["strings"]["tie"] = &"MP_MATCH_TIE";
  2691.         game["strings"]["round_draw"] = &"MP_ROUND_DRAW";
  2692.         game["strings"]["enemies_eliminated"] = &"MP_ENEMIES_ELIMINATED";
  2693.         game["strings"]["score_limit_reached"] = &"MP_SCORE_LIMIT_REACHED";
  2694.         game["strings"]["round_limit_reached"] = &"MP_ROUND_LIMIT_REACHED";
  2695.         game["strings"]["time_limit_reached"] = &"MP_TIME_LIMIT_REACHED";
  2696.         game["strings"]["players_forfeited"] = &"MP_PLAYERS_FORFEITED";
  2697.         game["strings"]["other_teams_forfeited"] = &"MP_OTHER_TEAMS_FORFEITED";
  2698.         assertteamvariables();
  2699.         [[level.onprecachegametype]]();
  2700.         game["gamestarted"] = 1;
  2701.         game["totalKills"] = 0;
  2702.         _a2718 = level.teams;
  2703.         _k2718 = getFirstArrayKey(_a2718);
  2704.         while (isDefined(_k2718))
  2705.         {
  2706.             team = _a2718[_k2718];
  2707.             game["teamScores"][team] = 0;
  2708.             game["totalKillsTeam"][team] = 0;
  2709.             _k2718 = getNextArrayKey(_a2718, _k2718);
  2710.         }
  2711.         if (!ispregame())
  2712.         {
  2713.             level.prematchperiod = getgametypesetting("prematchperiod");
  2714.         }
  2715.         if (getDvarInt(#"0x1e0679b9") != 0)
  2716.         {
  2717.             _a2730 = level.teams;
  2718.             _k2730 = getFirstArrayKey(_a2730);
  2719.             while (isDefined(_k2730))
  2720.             {
  2721.                 team = _a2730[_k2730];
  2722.                 game["icons"][team] = "composite_emblem_team_axis";
  2723.                 _k2730 = getNextArrayKey(_a2730, _k2730);
  2724.             }
  2725.             game["icons"]["allies"] = "composite_emblem_team_allies";
  2726.             game["icons"]["axis"] = "composite_emblem_team_axis";
  2727.         }
  2728.     }
  2729.     else
  2730.     {
  2731.         if (!level.splitscreen)
  2732.         {
  2733.             level.prematchperiod = getgametypesetting("preroundperiod");
  2734.         }
  2735.     }
  2736.     if (!isDefined(game["timepassed"]))
  2737.     {
  2738.         game["timepassed"] = 0;
  2739.     }
  2740.     if (!isDefined(game["roundsplayed"]))
  2741.     {
  2742.         game["roundsplayed"] = 0;
  2743.     }
  2744.     setroundsplayed(game["roundsplayed"]);
  2745.     if (isDefined(game["overtime_round"]))
  2746.     {
  2747.         setmatchflag("overtime", 1);
  2748.     }
  2749.     else
  2750.     {
  2751.         setmatchflag("overtime", 0);
  2752.     }
  2753.     if (!isDefined(game["roundwinner"]))
  2754.     {
  2755.         game["roundwinner"] = [];
  2756.     }
  2757.     if (!isDefined(game["lastroundscore"]))
  2758.     {
  2759.         game["lastroundscore"] = [];
  2760.     }
  2761.     if (!isDefined(game["roundswon"]))
  2762.     {
  2763.         game["roundswon"] = [];
  2764.     }
  2765.     if (!isDefined(game["roundswon"]["tie"]))
  2766.     {
  2767.         game["roundswon"]["tie"] = 0;
  2768.     }
  2769.     _a2773 = level.teams;
  2770.     _k2773 = getFirstArrayKey(_a2773);
  2771.     while (isDefined(_k2773))
  2772.     {
  2773.         team = _a2773[_k2773];
  2774.         if (!isDefined(game["roundswon"][team]))
  2775.         {
  2776.             game["roundswon"][team] = 0;
  2777.         }
  2778.         level.teamspawnpoints[team] = [];
  2779.         level.spawn_point_team_class_names[team] = [];
  2780.         _k2773 = getNextArrayKey(_a2773, _k2773);
  2781.     }
  2782.     level.skipvote = 0;
  2783.     level.gameended = 0;
  2784.     setdvar("g_gameEnded", 0);
  2785.     level.objidstart = 0;
  2786.     level.forcedend = 0;
  2787.     level.hostforcedend = 0;
  2788.     level.hardcoremode = getgametypesetting("hardcoreMode");
  2789.     while (level.hardcoremode)
  2790.     {
  2791.         logstring("game mode: hardcore");
  2792.         if (!isDefined(level.friendlyfiredelaytime))
  2793.         {
  2794.             level.friendlyfiredelaytime = 0;
  2795.         }
  2796.     }
  2797.     if (getDvar(#"0xd16d59fd") == "")
  2798.     {
  2799.         setdvar("scr_max_rank", "0");
  2800.     }
  2801.     level.rankcap = getDvarInt(#"0xd16d59fd");
  2802.     if (getDvar(#"0x4ebe2cf2") == "")
  2803.     {
  2804.         setdvar("scr_min_prestige", "0");
  2805.     }
  2806.     level.minprestige = getDvarInt(#"0x4ebe2cf2");
  2807.     level.usestartspawns = 1;
  2808.     level.roundscorecarry = getgametypesetting("roundscorecarry");
  2809.     level.allowhitmarkers = getgametypesetting("allowhitmarkers");
  2810.     level.playerqueuedrespawn = getgametypesetting("playerQueuedRespawn");
  2811.     level.playerforcerespawn = getgametypesetting("playerForceRespawn");
  2812.     level.roundstartexplosivedelay = getgametypesetting("roundStartExplosiveDelay");
  2813.     level.roundstartkillstreakdelay = getgametypesetting("roundStartKillstreakDelay");
  2814.     level.perksenabled = getgametypesetting("perksEnabled");
  2815.     level.disableattachments = getgametypesetting("disableAttachments");
  2816.     level.disabletacinsert = getgametypesetting("disableTacInsert");
  2817.     level.disablecac = getgametypesetting("disableCAC");
  2818.     level.disableclassselection = getgametypesetting("disableClassSelection");
  2819.     level.disableweapondrop = getgametypesetting("disableweapondrop");
  2820.     level.onlyheadshots = getgametypesetting("onlyHeadshots");
  2821.     level.minimumallowedteamkills = getgametypesetting("teamKillPunishCount") - 1;
  2822.     level.teamkillreducedpenalty = getgametypesetting("teamKillReducedPenalty");
  2823.     level.teamkillpointloss = getgametypesetting("teamKillPointLoss");
  2824.     level.teamkillspawndelay = getgametypesetting("teamKillSpawnDelay");
  2825.     level.deathpointloss = getgametypesetting("deathPointLoss");
  2826.     level.leaderbonus = getgametypesetting("leaderBonus");
  2827.     level.forceradar = getgametypesetting("forceRadar");
  2828.     level.playersprinttime = getgametypesetting("playerSprintTime");
  2829.     level.bulletdamagescalar = getgametypesetting("bulletDamageScalar");
  2830.     level.playermaxhealth = getgametypesetting("playerMaxHealth");
  2831.     level.playerhealthregentime = getgametypesetting("playerHealthRegenTime");
  2832.     level.playerrespawndelay = getgametypesetting("playerRespawnDelay");
  2833.     level.playerobjectiveheldrespawndelay = getgametypesetting("playerObjectiveHeldRespawnDelay");
  2834.     level.waverespawndelay = getgametypesetting("waveRespawnDelay");
  2835.     level.suicidespawndelay = getgametypesetting("spawnsuicidepenalty");
  2836.     level.teamkilledspawndelay = getgametypesetting("spawnteamkilledpenalty");
  2837.     level.maxsuicidesbeforekick = getgametypesetting("maxsuicidesbeforekick");
  2838.     level.spectatetype = getgametypesetting("spectateType");
  2839.     level.voip = spawnstruct();
  2840.     level.voip.deadchatwithdead = getgametypesetting("voipDeadChatWithDead");
  2841.     level.voip.deadchatwithteam = getgametypesetting("voipDeadChatWithTeam");
  2842.     level.voip.deadhearallliving = getgametypesetting("voipDeadHearAllLiving");
  2843.     level.voip.deadhearteamliving = getgametypesetting("voipDeadHearTeamLiving");
  2844.     level.voip.everyonehearseveryone = getgametypesetting("voipEveryoneHearsEveryone");
  2845.     level.voip.deadhearkiller = getgametypesetting("voipDeadHearKiller");
  2846.     level.voip.killershearvictim = getgametypesetting("voipKillersHearVictim");
  2847.     if (getDvar(#"0xf7b30924") == "1")
  2848.     {
  2849.         level waittill("eternity");
  2850.     }
  2851.     if (sessionmodeiszombiesgame())
  2852.     {
  2853.         level.prematchperiod = 0;
  2854.         level.persistentdatainfo = [];
  2855.         level.maxrecentstats = 10;
  2856.         level.maxhitlocations = 19;
  2857.         level.globalshotsfired = 0;
  2858.         thread maps/mp/gametypes/_hud::init();
  2859.         thread maps/mp/gametypes/_serversettings::init();
  2860.         thread maps/mp/gametypes/_clientids::init();
  2861.         thread maps/mp/gametypes/_weaponobjects::init();
  2862.         thread maps/mp/gametypes/_scoreboard::init();
  2863.         thread maps/mp/gametypes/_killcam::init();
  2864.         thread maps/mp/gametypes/_shellshock::init();
  2865.         thread maps/mp/gametypes/_deathicons::init();
  2866.         thread maps/mp/gametypes/_spectating::init();
  2867.         thread maps/mp/gametypes/_objpoints::init();
  2868.         thread maps/mp/gametypes/_gameobjects::init();
  2869.         thread maps/mp/gametypes/_spawnlogic::init();
  2870.         thread maps/mp/gametypes/_globallogic_audio::init();
  2871.         thread maps/mp/gametypes/_wager::init();
  2872.         thread maps/mp/bots/_bot::init();
  2873.         thread maps/mp/_decoy::init();
  2874.     }
  2875.     else
  2876.     {
  2877.         thread maps/mp/gametypes/_persistence::init();
  2878.         thread maps/mp/gametypes/_menus::init();
  2879.         thread maps/mp/gametypes/_hud::init();
  2880.         thread maps/mp/gametypes/_serversettings::init();
  2881.         thread maps/mp/gametypes/_clientids::init();
  2882.         thread maps/mp/teams/_teams::init();
  2883.         thread maps/mp/gametypes/_weapons::init();
  2884.         thread maps/mp/gametypes/_scoreboard::init();
  2885.         thread maps/mp/gametypes/_killcam::init();
  2886.         thread maps/mp/gametypes/_shellshock::init();
  2887.         thread maps/mp/gametypes/_deathicons::init();
  2888.         thread maps/mp/gametypes/_damagefeedback::init();
  2889.         thread maps/mp/gametypes/_healthoverlay::init();
  2890.         thread maps/mp/gametypes/_spectating::init();
  2891.         thread maps/mp/gametypes/_objpoints::init();
  2892.         thread maps/mp/gametypes/_gameobjects::init();
  2893.         thread maps/mp/gametypes/_spawnlogic::init();
  2894.         thread maps/mp/gametypes/_battlechatter_mp::init();
  2895.         thread maps/mp/killstreaks/_killstreaks::init();
  2896.         thread maps/mp/gametypes/_globallogic_audio::init();
  2897.         thread maps/mp/gametypes/_wager::init();
  2898.         thread maps/mp/bots/_bot::init();
  2899.         thread maps/mp/_decoy::init();
  2900.         thread maps/mp/_bb::init();
  2901.     }
  2902.     if (level.teambased)
  2903.     {
  2904.         thread maps/mp/gametypes/_friendicons::init();
  2905.     }
  2906.     thread maps/mp/gametypes/_hud_message::init();
  2907.     thread maps/mp/_multi_extracam::init();
  2908.     stringnames = getarraykeys(game["strings"]);
  2909.     index = 0;
  2910.     while (index < stringnames.size)
  2911.     {
  2912.         precachestring(game["strings"][stringnames][index]);
  2913.         index++;
  2914.     }
  2915.     _a2939 = level.teams;
  2916.     _k2939 = getFirstArrayKey(_a2939);
  2917.     while (isDefined(_k2939))
  2918.     {
  2919.         team = _a2939[_k2939];
  2920.         initteamvariables(team);
  2921.         _k2939 = getNextArrayKey(_a2939, _k2939);
  2922.     }
  2923.     level.maxplayercount = 0;
  2924.     level.activeplayers = [];
  2925.     level.allowannouncer = getgametypesetting("allowAnnouncer");
  2926.     if (!isDefined(level.timelimit))
  2927.     {
  2928.         registertimelimit(1, 1440);
  2929.     }
  2930.     if (!isDefined(level.scorelimit))
  2931.     {
  2932.         registerscorelimit(1, 500);
  2933.     }
  2934.     if (!isDefined(level.roundlimit))
  2935.     {
  2936.         registerroundlimit(0, 10);
  2937.     }
  2938.     if (!isDefined(level.roundwinlimit))
  2939.     {
  2940.         registerroundwinlimit(0, 10);
  2941.     }
  2942.     maps/mp/gametypes/_globallogic_utils::registerpostroundevent(::postroundfinalkillcam);
  2943.     maps/mp/gametypes/_globallogic_utils::registerpostroundevent(::postroundsidebet);
  2944.     makedvarserverinfo("ui_scorelimit");
  2945.     makedvarserverinfo("ui_timelimit");
  2946.     makedvarserverinfo("ui_allow_classchange", getDvar(#"0x53e50c7c"));
  2947.     wavedelay = level.waverespawndelay;
  2948.     if (wavedelay && !(ispregame()))
  2949.     {
  2950.         _a2972 = level.teams;
  2951.         _k2972 = getFirstArrayKey(_a2972);
  2952.         while (isDefined(_k2972))
  2953.         {
  2954.             team = _a2972[_k2972];
  2955.             level.wavedelay[team] = wavedelay;
  2956.             level.lastwave[team] = 0;
  2957.             _k2972 = getNextArrayKey(_a2972, _k2972);
  2958.         }
  2959.         level thread [[level.wavespawntimer]]();
  2960.     }
  2961.     level.inprematchperiod = 1;
  2962.     if (level.prematchperiod > 2)
  2963.     {
  2964.         level.prematchperiod = level.prematchperiod + randomfloat(4) - 2;
  2965.     }
  2966.     if (level.numlives || anyteamhaswavedelay() || level.playerqueuedrespawn)
  2967.     {
  2968.         level.graceperiod = 15;
  2969.     }
  2970.     else
  2971.     {
  2972.         level.graceperiod = 5;
  2973.     }
  2974.     level.ingraceperiod = 1;
  2975.     level.roundenddelay = 5;
  2976.     level.halftimeroundenddelay = 3;
  2977.     maps/mp/gametypes/_globallogic_score::updateallteamscores();
  2978.     level.killstreaksenabled = 1;
  2979.     if (getDvar(#"0xdfd7387c") == "")
  2980.     {
  2981.         setdvar("scr_game_rankenabled", 1);
  2982.     }
  2983.     level.rankenabled = getDvarInt(#"0xdfd7387c");
  2984.     if (getDvar(#"0x273f6466") == "")
  2985.     {
  2986.         setdvar("scr_game_medalsenabled", 1);
  2987.     }
  2988.     level.medalsenabled = getDvarInt(#"0x273f6466");
  2989.     if (level.hardcoremode && level.rankedmatch && getDvar(#"0x9c756af7") == "")
  2990.     {
  2991.         setdvar("scr_game_friendlyFireDelay", 1);
  2992.     }
  2993.     level.friendlyfiredelay = getDvarInt(#"0x9c756af7");
  2994.     if (getDvar(#"0x134d5297") == "")
  2995.     {
  2996.         [[level.onstartgametype]]();
  2997.     }
  2998.     while (getDvarInt(#"0x826eb3b9") == 1)
  2999.     {
  3000.         level.killstreaksenabled = 0;
  3001.     }
  3002.     level thread maps/mp/gametypes/_killcam::dofinalkillcam();
  3003.     thread startgame();
  3004.     level thread updategametypedvars();
  3005. }
  3006.  
  3007. forcedebughostmigration()
  3008. {}
  3009.  
  3010. registerfriendlyfiredelay(dvarstring, defaultvalue, minvalue, maxvalue)
  3011. {
  3012.     dvarstring = "scr_" + dvarstring + "_friendlyFireDelayTime";
  3013.     if (getDvar(#"dvarstring") == "")
  3014.     {
  3015.         setdvar(dvarstring, defaultvalue);
  3016.     }
  3017.     if (getDvarInt(#"dvarstring") > maxvalue)
  3018.     {
  3019.         setdvar(dvarstring, maxvalue);
  3020.     }
  3021.     else
  3022.     {
  3023.         if (getDvarInt(#"dvarstring") < minvalue)
  3024.         {
  3025.             setdvar(dvarstring, minvalue);
  3026.         }
  3027.     }
  3028.     level.friendlyfiredelaytime = getDvarInt(#"dvarstring");
  3029. }
  3030.  
  3031. checkroundswitch()
  3032. {
  3033.     if (!(isDefined(level.roundswitch)) || !(level.roundswitch))
  3034.     {
  3035.         return 0;
  3036.     }
  3037.     if (!isDefined(level.onroundswitch))
  3038.     {
  3039.         return 0;
  3040.     }
  3041.     if (game["roundsplayed"] % level.roundswitch == 0)
  3042.     {
  3043.         [[level.onroundswitch]]();
  3044.         return 1;
  3045.     }
  3046.     return 0;
  3047. }
  3048.  
  3049. listenforgameend()
  3050. {
  3051.     self waittill("host_sucks_end_game");
  3052.     level.skipvote = 1;
  3053.     if (!level.gameended)
  3054.     {
  3055.         level thread maps/mp/gametypes/_globallogic::forceend(1);
  3056.     }
  3057. }
  3058.  
  3059. getkillstreaks(player)
  3060. {
  3061.     killstreaknum = 0;
  3062.     while (killstreaknum < level.maxkillstreaks)
  3063.     {
  3064.         killstreak[killstreaknum] = "killstreak_null";
  3065.         killstreaknum++;
  3066.     }
  3067.     while (isplayer(player) && !(level.oldschool) && level.disableclassselection != 1 && !(isDefined(player.pers["isBot"])) && isDefined(player.killstreak))
  3068.     {
  3069.         currentkillstreak = 0;
  3070.         killstreaknum = 0;
  3071.         while (killstreaknum < level.maxkillstreaks)
  3072.         {
  3073.             if (isDefined(player.killstreak[killstreaknum]))
  3074.             {
  3075.                 killstreak[currentkillstreak] = player.killstreak[killstreaknum];
  3076.                 currentkillstreak++;
  3077.             }
  3078.             killstreaknum++;
  3079.         }
  3080.     }
  3081.     return killstreak;
  3082. }
  3083.  
  3084. updaterankedmatch(winner)
  3085. {
  3086.     if (level.rankedmatch)
  3087.     {
  3088.         if (hostidledout())
  3089.         {
  3090.             level.hostforcedend = 1;
  3091.             logstring("host idled out");
  3092.             endlobby();
  3093.         }
  3094.     }
  3095.     if (!(level.wagermatch) && !(sessionmodeiszombiesgame()))
  3096.     {
  3097.         maps/mp/gametypes/_globallogic_score::updatematchbonusscores(winner);
  3098.     }
  3099. }
  3100.  
  3101. //GLOBALLOGIC.GSC - Black Ops 2 GSC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement