1 #using scripts\shared\bb_shared;
2 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\challenges_shared;
6 #using scripts\shared\damagefeedback_shared;
7 #using scripts\shared\demo_shared;
8 #using scripts\shared\gameobjects_shared;
9 #using scripts\shared\hostmigration_shared;
10 #using scripts\shared\hud_shared;//DO NOT REMOVE - needed for system registration
11 #using scripts\shared\hud_message_shared;
12 #using scripts\shared\hud_util_shared;
13 #using scripts\shared\math_shared;
14 #using scripts\shared\music_shared;
15 #using scripts\shared\objpoints_shared;
16 #using scripts\shared\persistence_shared;
17 #using scripts\shared\rank_shared;
18 #using scripts\shared\util_shared;
19 #using scripts\shared\simple_hostmigration;
20 #using scripts\shared\system_shared;
21 #using scripts\shared\tweakables_shared;
22 #using scripts\shared\visionset_mgr_shared;
23 #using scripts\shared\lui_shared;
24 #using scripts\shared\weapons\_hive_gun;
25 #using scripts\shared\weapons\_weapon_utils;
26 #using scripts\shared\weapons\_weapons;
27 #using scripts\mp\gametypes\_dogtags;
29 #using scripts\shared\bots\_bot;
31 #using scripts\mp\gametypes\_battlechatter;//DO NOT REMOVE - needed for system registration
32 #using scripts\mp\gametypes\_clientids;//DO NOT REMOVE - needed for system registration
33 #using scripts\mp\gametypes\_deathicons;//DO NOT REMOVE - needed for system registration
34 #using scripts\mp\gametypes\_dev;
35 #using scripts\mp\gametypes\_friendicons;
36 #using scripts\mp\gametypes\_globallogic_audio;
37 #using scripts\mp\gametypes\_globallogic_defaults;
38 #using scripts\mp\gametypes\_globallogic_player;
39 #using scripts\mp\gametypes\_globallogic_score;
40 #using scripts\mp\gametypes\_globallogic_spawn;
41 #using scripts\mp\gametypes\_globallogic_ui;
42 #using scripts\mp\gametypes\_globallogic_utils;
43 #using scripts\mp\gametypes\_healthoverlay;//DO NOT REMOVE - needed for system registration
44 #using scripts\mp\gametypes\_hostmigration;
45 #using scripts\mp\gametypes\_hud_message;
46 #using scripts\mp\gametypes\_killcam;//DO NOT REMOVE - needed for system registration
47 #using scripts\mp\gametypes\_loadout;
48 #using scripts\mp\gametypes\_menus;//DO NOT REMOVE - needed for system registration
49 #using scripts\mp\gametypes\_scoreboard;//DO NOT REMOVE - needed for system registration
50 #using scripts\mp\gametypes\_serversettings;//DO NOT REMOVE - needed for system registration
51 #using scripts\mp\gametypes\_shellshock;
52 #using scripts\mp\gametypes\_spawning;//DO NOT REMOVE - needed for system registration
53 #using scripts\mp\gametypes\_spawnlogic;//DO NOT REMOVE - needed for system registration
54 #using scripts\mp\gametypes\_spectating;//DO NOT REMOVE - needed for system registration
55 #using scripts\mp\gametypes\_weapon_utils;
56 #using scripts\mp\gametypes\_weapons;//DO NOT REMOVE - needed for system registration
58 #using scripts\mp\_arena;
59 #using scripts\mp\_behavior_tracker;
60 #using scripts\mp\_challenges;
61 #using scripts\mp\_gameadvertisement;
62 #using scripts\mp\_gamerep;
63 #using scripts\mp\_rat;
64 #using scripts\mp\_teamops;
65 #using scripts\mp\_util;
66 #using scripts\mp\bots\_bot;//DO NOT REMOVE - needed for system registration
67 #using scripts\mp\killstreaks\_dogs;
68 #using scripts\mp\killstreaks\_killstreaks;//DO NOT REMOVE - needed for system registration
69 #using scripts\mp\teams\_teams;//DO NOT REMOVE - needed for system registration
71 #insert scripts\mp\gametypes\_globallogic.gsh;
73 #insert scripts\shared\shared.gsh;
74 #insert scripts\shared\version.gsh;
77 #define MATCH_KICKED 2
79 #define MATCH_FINISHED 4
81 #define TAUNT_TYPE_FIRST_PLACE 0
83 #define GESTURE_TYPE_GOOD_GAME 0
84 #define GESTURE_TYPE_THREATEN 1
85 #define GESTURE_TYPE_BOAST 2
86 #define GESTURE_TYPE_MAX 7
88 #define OTHER_LOOTXP_UPLOADSTAT_WAITTIME 1.0
89 #define WAIT_TIME_BEFORE_AWARDING_LOOT_XP 3.0
91 #namespace globallogic;
93 #precache( "model", "tag_origin" );
95 #precache( "statusicon", "hud_status_dead" );
96 #precache( "statusicon", "hud_status_connecting" );
98 #precache( "material", "white" );
99 #precache( "material", "black" );
101 #precache( "string", "PLATFORM_PRESS_TO_SPAWN" );
102 #precache( "string", "MP_WAITING_FOR_TEAMS" );
103 #precache( "string", "MP_OPPONENT_FORFEITING_IN" );
104 #precache( "string", "MP_WAITING_FOR_PLAYERS" );
105 #precache( "string", "MP_OPPONENT_FORFEITING_IN" );
106 #precache( "string", "MP_MATCH_STARTING_IN" );
107 #precache( "string", "MP_SPAWN_NEXT_ROUND" );
108 #precache( "string", "MP_WAITING_TO_SPAWN" );
109 #precache( "string", "MP_WAITING_TO_SPAWN_SS" );
110 #precache( "string", "MP_YOU_WILL_RESPAWN" );
111 #precache( "string", "MP_MATCH_STARTING" );
112 #precache( "string", "MP_CHANGE_CLASS_NEXT_SPAWN" );
113 #precache( "string", "MPUI_LAST_STAND" );
114 #precache( "string", "PLATFORM_COWARDS_WAY_OUT" );
115 #precache( "string", "MP_MATCH_TIE" );
116 #precache( "string", "MP_ROUND_DRAW" );
117 #precache( "string", "MP_ENEMIES_ELIMINATED" );
118 #precache( "string", "MP_SCORE_LIMIT_REACHED" );
119 #precache( "string", "MP_ROUND_LIMIT_REACHED" );
120 #precache( "string", "MP_TIME_LIMIT_REACHED" );
121 #precache( "string", "MP_PLAYERS_FORFEITED" );
122 #precache( "string", "MP_OTHER_TEAMS_FORFEITED" );
124 #precache( "eventstring", "prematch_waiting_for_players" );
125 #precache( "eventstring", "create_prematch_timer" );
126 #precache( "eventstring", "prematch_timer_ended" );
127 #precache( "eventstring", "force_scoreboard" );
129 #precache( "menu", "T7Hud_MP" );
143 level.splitscreen = isSplitScreen();
144 level.xenon = (GetDvarString(
"xenonGame") ==
"true");
145 level.ps3 = (GetDvarString(
"ps3Game") ==
"true");
146 level.wiiu = (GetDvarString(
"wiiuGame") ==
"true");
147 level.orbis = (GetDvarString(
"orbisGame") ==
"true");
148 level.durango = (GetDvarString(
"durangoGame") ==
"true");
150 level.onlineGame = SessionModeIsOnlineGame();
151 level.systemLink = SessionModeIsSystemlink();
152 level.console = (level.xenon || level.ps3 || level.wiiu || level.orbis || level.durango);
154 level.rankedMatch = ( GameModeIsUsingXP() );
155 level.leagueMatch =
false;
157 level.arenaMatch = GameModeIsArena();
159 level.mpCustomMatch = level.customMatch;
161 level.contractsEnabled = !GetGametypeSetting(
"disableContracts" );
163 level.contractsEnabled =
false;
165 level.disableVehicleBurnDamage =
true;
167 level.script = toLower( GetDvarString(
"mapname" ) );
168 level.gametype = toLower( GetDvarString(
"g_gametype" ) );
170 level.teamBased =
false;
171 level.teamCount = GetGametypeSetting(
"teamCount" );
172 level.multiTeam = ( level.teamCount > 2 );
178 level.teamIndex = [];
180 teamCount = level.teamCount;
182 if ( level.teamCount == 1 )
185 level.teams[
"free" ] =
"free";
188 level.teams[
"allies" ] =
"allies";
189 level.teams[
"axis" ] =
"axis";
191 level.teamIndex[
"neutral" ] = 0;
192 level.teamIndex[
"allies" ] = 1;
193 level.teamIndex[
"axis" ] = 2;
195 for( teamIndex = 3; teamIndex <= teamCount; teamIndex++ )
197 level.teams[
"team" + teamIndex ] =
"team" + teamIndex;
198 level.teamIndex[
"team" + teamIndex ] = teamIndex;
201 level.overrideTeamScore =
false;
202 level.overridePlayerScore =
false;
203 level.displayHalftimeText =
false;
204 level.displayRoundEndText =
true;
206 level.clampScoreLimit =
true;
207 level.endGameOnScoreLimit =
true;
208 level.endGameOnTimeLimit =
true;
209 level.scoreRoundWinBased =
false;
210 level.resetPlayerScoreEveryRound =
false;
211 level.doEndgameScoreboard =
true;
213 level.gameForfeited=
false;
214 level.forceAutoAssign =
false;
216 level.halftimeType =
"halftime";
217 level.halftimeSubCaption = &
"MP_SWITCHING_SIDES_CAPS";
219 level.lastStatusTime = 0;
220 level.wasWinning = [];
222 level.lastSlowProcessFrame = 0;
224 level.placement = [];
225 foreach( team
in level.teams )
227 level.placement[team] = [];
229 level.placement[
"all"] = [];
231 level.postRoundTime = 7.0;
233 level.inOvertime =
false;
235 level.defaultOffenseRadius = 560;
236 level.defaultOffenseRadiusSQ = level.defaultOffenseRadius * level.defaultOffenseRadius;
238 level.dropTeam = GetDvarint(
"sv_maxclients" );
240 level.inFinalKillcam =
false;
247 level.oldschool = GetGametypeSetting(
"oldschoolMode" );
251 if ( !isdefined( game[
"tiebreaker"] ) )
252 game[
"tiebreaker"] =
false;
258 level.disableChallenges =
false;
260 if ( level.leagueMatch || ( GetDvarInt(
"scr_disableChallenges" ) > 0 ) )
262 level.disableChallenges =
true;
265 level.disableStatTracking = ( GetDvarInt(
"scr_disableStatTracking" ) > 0 );
287 level.playersDrivingVehiclesBecomeInvulnerable =
false;
297 if ( GetDvarString(
"ui_guncycle" ) ==
"" )
298 SetDvar(
"ui_guncycle", 0 );
302 if ( GetDvarString(
"ui_weapon_tiers" ) ==
"" )
303 SetDvar(
"ui_weapon_tiers", 0 );
306 SetDvar(
"ui_text_endreason",
"");
309 setMatchFlag(
"bomb_timer", 0 );
311 if ( GetDvarString(
"scr_vehicle_damage_scalar" ) ==
"" )
312 SetDvar(
"scr_vehicle_damage_scalar",
"1" );
314 level.vehicleDamageScalar = GetDvarfloat(
"scr_vehicle_damage_scalar");
316 level.fire_audio_repeat_duration = GetDvarint(
"fire_audio_repeat_duration" );
317 level.fire_audio_random_max_duration = GetDvarint(
"fire_audio_random_max_duration" );
319 teamName = getcustomteamname( level.teamIndex[
"allies" ] );
320 if( isdefined( teamName ) )
321 SetDvar(
"g_customTeamName_Allies", teamName );
323 SetDvar(
"g_customTeamName_Allies",
"" );
325 teamName = getcustomteamname( level.teamIndex[
"axis" ] );
326 if( isdefined( teamName ) )
327 SetDvar(
"g_customTeamName_Axis", teamName );
329 SetDvar(
"g_customTeamName_Axis",
"" );
333 function blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 )
351 level.onSpawnPlayer =&
blank;
355 level.onRespawnDelay =&
blank;
362 level.onDeadEvent = undefined;
382 level.onPrecacheGametype =&
blank;
383 level.onStartGameType =&
blank;
384 level.onPlayerConnect =&
blank;
385 level.onPlayerDisconnect =&
blank;
386 level.onPlayerDamage =&
blank;
387 level.onPlayerKilled =&
blank;
388 level.onPlayerKilledExtraUnthreadedCBs = [];
396 level.onMedalAwarded =&
blank;
407 hardcoreMode = GetGametypeSetting(
"hardcoreMode" );
408 if( !isdefined( hardcoreMode ) )
410 hardcoreMode =
false;
413 arenaMode = IsArenaMode();
428 friendLeaderboardA =
"LB_MP_FRIEND_A" + postfix;
429 friendLeaderboardB =
" LB_MP_FRIEND_B" + postfix;
431 precacheLeaderboards( friendLeaderboardA + friendLeaderboardB );
438 hardcoreMode = GetGametypeSetting(
"hardcoreMode" );
439 if( !isdefined( hardcoreMode ) )
441 hardcoreMode =
false;
444 arenaMode = IsArenaMode();
459 anticheatLeaderboard =
"LB_MP_ANTICHEAT_" + level.gametype + postfix;
461 if( level.gametype !=
"fr" )
463 anticheatLeaderboard = anticheatLeaderboard +
" LB_MP_ANTICHEAT_GLOBAL";
466 precacheLeaderboards( anticheatLeaderboard );
471 mapname = GetDvarString(
"mapname" );
473 hardcoreMode = GetGametypeSetting(
"hardcoreMode" );
474 if( !isdefined( hardcoreMode ) )
476 hardcoreMode =
false;
479 arenaMode = IsArenaMode();
480 freerunMode = ( level.gametype ==
"fr" );
489 frLeaderboard =
" LB_MP_GM_FR_" + getsubstr( mapname, 3, mapname.size );
491 precacheLeaderboards( frLeaderboard );
494 else if( hardcoreMode )
503 careerLeaderboard =
" LB_MP_GB_SCORE" + postfix;
504 prestigeLB =
" LB_MP_GB_XPPRESTIGE";
505 gamemodeLeaderboard =
"LB_MP_GM_" + level.gametype + postfix;
507 arenaLeaderboard =
"";
510 arenaSlot = ArenaGetSlot();
511 arenaLeaderboard =
" LB_MP_ARENA_MASTERS_0" + arenaSlot;
514 precacheLeaderboards( gamemodeLeaderboard + careerLeaderboard + prestigeLB + arenaLeaderboard );
519 customLeaderboards =
"LB_MP_CG_" + level.gametype;
521 precacheLeaderboards(
"LB_MP_CG_GENERAL " + customLeaderboards );
533 if( level.rankedMatch || level.gametype ==
"fr" )
547 if ( !level.rankedMatch )
549 setscoreboardcolumns( col1, col2, col3, col4, col5,
"sbtimeplayed",
"shotshit",
"shotsmissed",
"victory" );
553 setscoreboardcolumns( col1, col2, col3, col4, col5 );
561 if ( teamA ==
"tie" )
565 if ( previous_winner_score < game[gameStat][teamB] )
568 else if ( game[gameStat][teamA] == game[gameStat][teamB] )
570 else if ( game[gameStat][teamB] > game[gameStat][teamA] )
580 teamKeys = GetArrayKeys(level.teams);
581 winner = teamKeys[0];
582 previous_winner_score = game[gameStat][winner];
584 for ( teamIndex = 1; teamIndex < teamKeys.size; teamIndex++ )
588 if ( winner !=
"tie" )
590 previous_winner_score = game[gameStat][winner];
600 teamBScore = [[level._getTeamScore]]( teamB );
602 if ( teamA ==
"tie" )
606 if ( previous_winner_score < teamBScore )
612 teamAScore = [[level._getTeamScore]]( teamA );
614 if ( teamBScore == teamAScore )
616 else if ( teamBScore > teamAScore )
626 teamKeys = GetArrayKeys(level.teams);
627 winner = teamKeys[0];
628 previous_winner_score = [[level._getTeamScore]]( winner );
630 for ( teamIndex = 1; teamIndex < teamKeys.size; teamIndex++ )
634 if ( winner !=
"tie" )
636 previous_winner_score = [[level._getTeamScore]]( winner );
645 if (!isdefined(hostsucks))
648 if ( level.hostForcedEnd || level.forcedEnd )
653 if ( level.teamBased )
662 if ( isdefined( winner ) )
663 print(
"host ended game, win: " + winner.name );
665 print(
"host ended game, tie" );
669 level.forcedEnd =
true;
670 level.hostForcedEnd =
true;
674 endString = &
"MP_HOST_SUCKS";
678 if ( level.splitscreen )
679 endString = &
"MP_ENDED_GAME";
681 endString = &
"MP_HOST_ENDED_GAME";
684 setMatchFlag(
"disableIngameMenu", 1 );
686 SetDvar(
"ui_text_endreason", endString );
687 thread
endGame( winner, endString );
692 if ( level.hostForcedEnd || level.forcedEnd )
697 if ( level.teamBased )
706 if ( isdefined( winner ) )
707 print(
"host ended game, win: " + winner.name );
709 print(
"host ended game, tie" );
713 level.forcedEnd =
true;
714 level.hostForcedEnd =
true;
716 level.killserver =
true;
718 endString = &
"MP_HOST_ENDED_GAME";
722 PrintLn(
"kill server; ending game\n");
725 thread
endGame( winner, endString );
732 foreach ( team
in level.teams )
734 if ( level.playerCount[team] != 0 )
740 if ( valid_count < 2 )
750 if ( !game[
"everExisted"][team] )
764 valid_team = undefined;
766 foreach( team
in level.teams )
772 if ( !level.multiTeam )
774 thread [[level.onForfeit]]( team );
784 if ( level.multiTeam && ( forfeit_count == ( level.teams.size - 1 ) ) )
786 thread [[level.onForfeit]]( valid_team );
795 foreach( team
in level.teams )
797 if ( level.spawnQueueModified[team] )
799 [[level.onAliveCountChange]]( team );
806 return (level.everExisted[team] && !level.aliveCount[team] && !level.playerLives[team] );
811 foreach( team
in level.teams )
826 everExistedCount = 0;
827 aliveTeam = undefined;
828 foreach( team
in level.teams )
831 if ( level.everExisted[team] )
842 if ( ( everExistedCount > 1 ) && ( count == 1 ) )
852 if ( level.teamBased )
857 [[level.onDeadEvent]](
"all" );
861 if ( !isdefined( level.onDeadEvent ) )
864 if ( isdefined( lastTeamAlive ) )
866 [[level.onLastTeamAliveEvent]]( lastTeamAlive );
872 foreach( team
in level.teams )
877 [[level.onDeadEvent]]( team );
888 [[level.onDeadEvent]](
"all" );
898 return (level.lastAliveCount[team] > 1 && level.aliveCount[team] == 1 && level.playerLives[team] == 1 );
904 if ( level.teamBased )
906 foreach( team
in level.teams )
911 [[level.onOneLeftEvent]]( team );
921 [[level.onOneLeftEvent]](
"all" );
931 if ( ( level.rankedMatch || level.wagerMatch || level.leagueMatch ) && !level.inGracePeriod )
933 if ( level.teamBased )
935 if (!level.gameForfeited )
946 level.gameForfeited =
false;
947 level notify(
"abort forfeit" );
953 if (!level.gameForfeited)
957 thread [[level.onForfeit]]();
965 level.gameForfeited =
false;
966 level notify(
"abort forfeit" );
972 if ( !level.playerQueuedRespawn && !level.numLives && !level.inOverTime )
975 if ( level.inGracePeriod )
978 if ( level.playerQueuedRespawn )
996 for ( player_index = 0; player_index < level.players.size; player_index++ )
1021 countTime = int( level.prematchPeriod );
1023 if ( countTime >= 2 )
1025 while ( countTime > 0 && !level.gameEnded )
1027 LUINotifyEvent( &
"create_prematch_timer", 1, GetTime() + ( countTime * 1000 ) );
1029 if ( countTime == 2 )
1034 if( countTime == 3 )
1037 foreach ( player
in level.players )
1039 if ( player.hasSpawned || player.pers[
"team"] ==
"spectator" )
1048 foreach ( player
in level.players )
1050 player PlayLocalSound(
"uin_start_count_down" );
1056 LUINotifyEvent( &
"prematch_timer_ended", 0 );
1066 level waittill(
"game_ended" );
1072 visionSetNaked( GetDvarString(
"mapname" ), 0 );
1083 if ( time - level.lastWave[team] > (level.waveDelay[team] * 1000) )
1085 level notify (
"wave_respawn_" + team );
1086 level.lastWave[team] = time;
1087 level.wavePlayerSpawnIndex[team] = 0;
1093 level endon(
"game_ended" );
1095 while ( game[
"state"] ==
"playing" )
1099 foreach( team
in level.teams )
1113 if ( isdefined( hostPlayer ) && !hostPlayer.hasSpawned && !isdefined( hostPlayer.selectedClass ) )
1121 self AddDStat(
"gameHistory", gameMode,
"modeHistory", playedOrHosted, stat, 1 );
1126 self SetDStat(
"gameHistory", gameMode,
"modeHistory", playedOrHosted, stat, 1 );
1131 playerTeam =
self.pers[
"team"];
1133 score = getTeamScore( playerTeam );
1137 foreach ( team
in level.teams )
1139 if ( team == playerTeam )
1142 otherTeamScore += getTeamScore( team );
1145 if ( level.teams.size > 1 )
1147 otherTeamScore = otherTeamScore / ( level.teams.size - 1 );
1150 if ( otherTeamScore != 0 )
1151 return (
float( score ) / float( otherTeamScore ) );
1159 highestScore = -999999999;
1160 for ( index = 0; index < level.players.size; index++ )
1162 player = level.players[index];
1164 if ( player.score > highestScore )
1165 highestScore = player.score;
1168 return highestScore;
1173 highestScore = -999999999;
1174 for ( index = 0; index < level.players.size; index++ )
1176 player = level.players[index];
1178 if ( player.score >= score )
1181 if ( player.score > highestScore )
1182 highestScore = player.score;
1185 return highestScore;
1191 avgKillDistance = 0;
1192 percentTimeMoving = 0;
1193 avgSpeedOfPlayerWhenMoving = 0;
1194 totalKillDistances = float(
self.pers[
"kill_distances"] );
1195 numKillDistanceEntries = float(
self.pers[
"num_kill_distance_entries"] );
1196 timePlayedMoving = float(
self.pers[
"time_played_moving"] );
1197 timePlayedAlive = float(
self.pers[
"time_played_alive"] );
1198 totalSpeedsWhenMoving = float(
self.pers[
"total_speeds_when_moving"] );
1199 numSpeedsWhenMovingEntries = float(
self.pers[
"num_speeds_when_moving_entries"] );
1200 totalDistanceTravelled = float(
self.pers[
"total_distance_travelled"] );
1201 movementUpdateCount = float(
self.pers[
"movement_Update_Count"]);
1202 if ( numKillDistanceEntries > 0 )
1203 avgKillDistance = totalKillDistances / numKillDistanceEntries;
1205 movementUpdateDenom = int(movementUpdateCount/5);
1206 if ( movementUpdateDenom > 0 )
1207 percentTimeMoving = ( numSpeedsWhenMovingEntries / movementUpdateDenom ) * 100.0;
1209 if ( numSpeedsWhenMovingEntries > 0 )
1210 avgSpeedOfPlayerWhenMoving = totalSpeedsWhenMoving / numSpeedsWhenMovingEntries;
1212 recordPlayerStats(
self,
"totalKillDistances", totalKillDistances );
1213 recordPlayerStats(
self,
"numKillDistanceEntries", numKillDistanceEntries );
1214 recordPlayerStats(
self,
"timePlayedMoving", timePlayedMoving );
1215 recordPlayerStats(
self,
"timePlayedAlive", timePlayedAlive );
1216 recordPlayerStats(
self,
"totalSpeedsWhenMoving", totalSpeedsWhenMoving );
1217 recordPlayerStats(
self,
"numSpeedsWhenMovingEntries", numSpeedsWhenMovingEntries );
1218 recordPlayerStats(
self,
"averageKillDistance", avgKillDistance );
1219 recordPlayerStats(
self,
"percentageOfTimeMoving", percentTimeMoving );
1220 recordPlayerStats(
self,
"averageSpeedDuringMatch", avgSpeedOfPlayerWhenMoving );
1221 recordPlayerStats(
self,
"totalDistanceTravelled", totalDistanceTravelled );
1226 for ( index = 0; index < level.players.size; index++ )
1228 player = level.players[index];
1235 if ( player.name ==
name )
1245 for ( index = 0; index < level.players.size; index++ )
1247 player = level.players[index];
1255 nemesis = player.pers[
"nemesis_name"];
1257 if( !isdefined( player.pers[
"killed_players"][nemesis] ) )
1258 player.pers[
"killed_players"][nemesis] = 0;
1259 if( !isdefined( player.pers[
"killed_by"][nemesis] ) )
1260 player.pers[
"killed_by"][nemesis] = 0;
1263 spread = player.kills - player.deaths;
1265 if( player.pers[
"cur_kill_streak"] > player.pers[
"best_kill_streak"] )
1266 player.pers[
"best_kill_streak"] = player.pers[
"cur_kill_streak"];
1268 if ( ( level.rankedMatch || level.leagueMatch ) )
1273 player setNemesisXuid( player.pers[
"nemesis_xuid"] );
1281 if ( isDefined( nemesisPlayerEnt ) )
1301 alliesScore = globallogic_score::_getteamscore(
"allies" );
1302 if( isdefined( alliesScore ) )
1307 axisScore = globallogic_score::_getteamscore(
"axis" );
1308 if( isdefined( axisScore ) )
1320 for ( index = 0; index < level.players.size; index++ )
1322 player = level.players[index];
1334 nemesis = player.pers[
"nemesis_name"];
1336 if( !isdefined( player.pers[
"killed_players"][nemesis] ) )
1337 player.pers[
"killed_players"][nemesis] = 0;
1338 if( !isdefined( player.pers[
"killed_by"][nemesis] ) )
1339 player.pers[
"killed_by"][nemesis] = 0;
1342 spread = player.kills - player.deaths;
1344 if( player.pers[
"cur_kill_streak"] > player.pers[
"best_kill_streak"] )
1345 player.pers[
"best_kill_streak"] = player.pers[
"cur_kill_streak"];
1347 if ( level.onlineGame )
1351 if ( scoreboardPosition < 0 )
1352 scoreboardPosition = level.players.size;
1354 player GameHistoryFinishMatch(
MATCH_FINISHED, player.kills, player.deaths, player.score, scoreboardPosition, teamScoreRatio );
1356 placement = level.placement[
"all"];
1357 for ( otherPlayerIndex = 0; otherPlayerIndex < placement.size; otherPlayerIndex++ )
1359 if ( level.placement[
"all"][otherPlayerIndex] == player )
1361 recordPlayerStats( player,
"position", otherPlayerIndex );
1365 if ( isdefined( player.pers[
"matchesPlayedStatsTracked"] ) )
1370 if ( isdefined( player.pers[
"matchesHostedStatsTracked"] ) )
1373 player.pers[
"matchesHostedStatsTracked"] = undefined;
1376 player.pers[
"matchesPlayedStatsTracked"] = undefined;
1379 recordPlayerStats( player,
"highestKillStreak", player.pers[
"best_kill_streak"] );
1382 recordPlayerStats( player,
"numDogsKills", player.pers[
"dog_kills"] );
1386 recordPlayerMatchEnd( player );
1387 RecordPlayerStats(player,
"presentAtEnd", 1 );
1391 finalizeMatchRecord();
1398 if ( scoreboardPosition < 0 )
1399 scoreboardPosition = level.players.size;
1401 assert( isdefined(
self.kills ) );
1402 assert( isdefined(
self.deaths ) );
1403 assert( isdefined(
self.score ) );
1404 assert( isdefined( scoreboardPosition ) );
1405 assert( isdefined( teamScoreRatio ) );
1407 self GameHistoryFinishMatch(
MATCH_KICKED,
self.kills,
self.deaths,
self.score, scoreboardPosition, teamScoreRatio );
1409 if ( isdefined(
self.pers[
"matchesPlayedStatsTracked"] ) )
1414 self.pers[
"matchesPlayedStatsTracked"] = undefined;
1417 UploadStats(
self );
1427 if ( scoreboardPosition < 0 )
1428 scoreboardPosition = level.players.size;
1430 self GameHistoryFinishMatch(
MATCH_QUIT,
self.kills,
self.deaths,
self.score, scoreboardPosition, teamScoreRatio );
1432 if ( isdefined(
self.pers[
"matchesPlayedStatsTracked"] ) )
1437 if ( isdefined(
self.pers[
"matchesHostedStatsTracked"] ) )
1440 self.pers[
"matchesHostedStatsTracked"] = undefined;
1443 self.pers[
"matchesPlayedStatsTracked"] = undefined;
1446 UploadStats(
self );
1448 if ( !
self IsHost() )
1457 if ( level.displayRoundEndText )
1459 if ( level.teamBased )
1461 if ( winner ==
"tie" )
1471 setmatchflag(
"cg_drawSpectatorMessages", 0 );
1472 players = level.players;
1473 for ( index = 0; index < players.size; index++ )
1475 player = players[index];
1479 player notify(
"round_ended" );
1481 if ( !isdefined( player.pers[
"team"] ) )
1483 player [[level.spawnIntermission]]( true );
1487 if ( level.teamBased )
1489 player thread [[level.onTeamOutcomeNotify]]( winner,
"roundend", endReasonText );
1494 player thread [[level.onOutcomeNotify]]( winner,
true, endReasonText );
1498 player setClientUIVisibilityFlag(
"hud_visible", 0 );
1499 player setClientUIVisibilityFlag(
"g_compassShowEnemies", 0 );
1516 switchType = level.halftimeType;
1518 if ( switchType ==
"halftime" )
1520 if ( isdefined( level.nextRoundIsOvertime ) && level.nextRoundIsOvertime )
1522 switchType =
"overtime";
1526 if ( level.roundLimit )
1528 if ( (game[
"roundsplayed"] * 2) == level.roundLimit )
1529 switchType =
"halftime";
1531 switchType =
"intermission";
1533 else if ( level.scoreLimit )
1535 if ( isdefined( level.roundswitch ) && level.roundSwitch == 1 )
1537 switchtype =
"intermission";
1539 else if ( game[
"roundsplayed"] == (level.scoreLimit - 1) )
1541 switchType =
"halftime";
1545 switchType =
"intermission";
1550 switchType =
"intermission";
1558 SetMatchTalkFlag(
"EveryoneHearsEveryone", 1 );
1560 players = level.players;
1561 for ( index = 0; index < players.size; index++ )
1563 player = players[index];
1565 if ( !isdefined( player.pers[
"team"] ) )
1567 player [[level.spawnIntermission]]( true );
1573 player thread [[level.onTeamOutcomeNotify]]( winner, switchType, level.halftimeSubCaption );
1574 player setClientUIVisibilityFlag(
"hud_visible", 0 );
1582 SetMatchTalkFlag(
"EveryoneHearsEveryone", 1 );
1583 setmatchflag(
"cg_drawSpectatorMessages", 0 );
1589 if ( level.teambased )
1591 if ( winner ==
"tie" )
1601 players = level.players;
1602 for ( index = 0; index < players.size; index++ )
1604 player = players[index];
1606 if ( !isdefined( player.pers[
"team"] ) )
1608 player [[level.spawnIntermission]]( true );
1612 if ( level.teamBased )
1614 player thread [[level.onTeamOutcomeNotify]]( winner,
"gameend", endReasonText );
1620 player thread [[level.onOutcomeNotify]]( winner,
false, endReasonText );
1627 else if ( isdefined( winner ) && player == winner )
1631 else if ( !level.splitScreen )
1637 player setClientUIVisibilityFlag(
"hud_visible", 0 );
1638 player setClientUIVisibilityFlag(
"g_compassShowEnemies", 0 );
1643 if ( level.teamBased )
1645 players = level.players;
1646 for ( index = 0; index < players.size; index++ )
1648 player = players[index];
1649 team = player.pers[
"team"];
1651 if ( level.splitscreen )
1657 else if ( winner ==
"tie" )
1661 else if ( winner == team )
1676 else if ( winner ==
"tie" )
1680 else if ( winner == team )
1697 players = level.players;
1698 for ( index = 0; index < players.size; index++ )
1706 if ( isdefined( level.endReasonText ) )
1708 return level.endReasonText;
1712 return game[
"strings"][
"round_limit_reached"];
1714 return game[
"strings"][
"score_limit_reached"];
1716 return game[
"strings"][
"round_score_limit_reached"];
1718 if ( level.forcedEnd )
1720 if ( level.hostForcedEnd )
1721 return &
"MP_HOST_ENDED_GAME";
1723 return &
"MP_ENDED_GAME";
1725 return game[
"strings"][
"time_limit_reached"];
1730 players = level.players;
1731 for ( index = 0; index < players.size; index++ )
1733 player = players[index];
1734 player notify (
"reset_outcome" );
1740 players = level.players;
1741 for ( index = 0; index < players.size; index++ )
1743 player = players[index];
1760 if ( level.scoreRoundWinBased )
1762 foreach( team
in level.teams )
1764 [[level._setTeamScore]]( team, game[
"roundswon"][team] );
1771 if ( isdefined( level.nextRoundIsOvertime ) && level.nextRoundIsOvertime )
1773 if ( !isdefined( game[
"overtime_round"] ) )
1775 game[
"overtime_round"] = 1;
1779 game[
"overtime_round"]++;
1783 SetMatchTalkFlag(
"DeadChatWithDead", level.voip.deadChatWithDead );
1784 SetMatchTalkFlag(
"DeadChatWithTeam", level.voip.deadChatWithTeam );
1785 SetMatchTalkFlag(
"DeadHearTeamLiving", level.voip.deadHearTeamLiving );
1786 SetMatchTalkFlag(
"DeadHearAllLiving", level.voip.deadHearAllLiving );
1787 SetMatchTalkFlag(
"EveryoneHearsEveryone", level.voip.everyoneHearsEveryone );
1788 SetMatchTalkFlag(
"DeadHearKiller", level.voip.deadHearKiller );
1789 SetMatchTalkFlag(
"KillersHearVictim", level.voip.killersHearVictim );
1791 game[
"state"] =
"playing";
1792 map_restart(
true );
1803 if( level.rankedMatch )
1805 placement = level.placement[
"all"];
1806 topThreePlayers = min( 3, placement.size );
1808 for ( index = 0; index < topThreePlayers; index++ )
1810 if ( level.placement[
"all"][index].score )
1814 level.placement[
"all"][index] AddPlayerStatWithGameType(
"TOPPLAYER", 1 );
1815 level.placement[
"all"][index] notify(
"topplayer" );
1818 level.placement[
"all"][index] notify(
"nottopplayer" );
1820 level.placement[
"all"][index] AddPlayerStatWithGameType(
"TOP3", 1 );
1821 level.placement[
"all"][index] AddPlayerStat(
"TOP3ANY", 1 );
1822 if ( level.hardcoreMode )
1824 level.placement[
"all"][index] AddPlayerStat(
"TOP3ANY_HC", 1 );
1826 if ( level.multiTeam )
1828 level.placement[
"all"][index] AddPlayerStat(
"TOP3ANY_MULTITEAM", 1 );
1830 level.placement[
"all"][index] notify(
"top3" );
1834 for ( index = 3 ; index < placement.size ; index++ )
1836 level.placement[
"all"][index] notify(
"nottop3" );
1837 level.placement[
"all"][index] notify(
"nottopplayer" );
1840 if ( level.teambased )
1842 foreach ( team
in level.teams )
1852 placementTeam = level.placement[team];
1853 topThreeTeamPlayers = min( 3, placementTeam.size );
1855 if ( placementTeam.size < 5 )
1858 for ( index = 0; index < topThreeTeamPlayers; index++ )
1860 if ( placementTeam[index].score )
1862 placementTeam[index] AddPlayerStat(
"TOP3TEAM", 1 );
1863 placementTeam[index] AddPlayerStat(
"TOP3ANY", 1 );
1864 if ( level.hardcoreMode )
1866 placementTeam[index] AddPlayerStat(
"TOP3ANY_HC", 1 );
1868 if ( level.multiTeam )
1870 placementTeam[index] AddPlayerStat(
"TOP3ANY_MULTITEAM", 1 );
1872 placementTeam[index] AddPlayerStatWithGameType(
"TOP3TEAM", 1 );
1879 if ( !isdefined( winner ) )
1882 if ( IsEntity( winner ) )
1883 return ( isdefined( winner.team ) ? winner.team :
"none" );
1890 if ( !level.timeLimit || level.forcedEnd )
1894 gameLength = min( gameLength, 1200 );
1898 gameLength = level.timeLimit * 60;
1913 if ( isPlayer( player ) )
1915 UploadStats( player );
1921 if ( !isdefined( level.awardOtherLootXPfunctions ) )
1922 level.awardOtherLootXPfunctions = [];
1924 ARRAY_ADD( level.awardOtherLootXPfunctions, func );
1931 if ( !isdefined( level.awardOtherLootXPfunctions ) )
1934 if ( !isPlayer( player ) )
1939 foreach( func
in level.awardOtherLootXPfunctions )
1941 if ( !isdefined( func ) )
1944 lootXP += player [[ func ]]();
1953 if ( game[
"state"] ==
"postgame" || level.gameEnded )
1956 if ( isdefined( level.onEndGame ) )
1957 [[level.onEndGame]]( winner );
1959 if ( !isdefined( level.disableOutroVisionSet ) || level.disableOutroVisionSet == false )
1961 visionSetNaked(
"mpOutro", 2.0 );
1964 setmatchflag(
"cg_drawSpectatorMessages", 0 );
1965 setmatchflag(
"game_ended", 1 );
1967 game[
"state"] =
"postgame";
1968 level.gameEndTime = getTime();
1969 level.gameEnded =
true;
1970 SetDvar(
"g_gameEnded", 1 );
1971 level.inGracePeriod =
false;
1972 level notify (
"game_ended" );
1976 foreach( team
in level.teams )
1978 game[
"lastroundscore"][team] = getTeamScore( team );
1983 matchRecordRoundEnd();
1988 if ( isdefined( game[
"overtime_round"] ) && isdefined( game[
"overtimeroundswon"][winning_team] ) )
1990 game[
"overtimeroundswon"][winning_team]++;
1995 game[
"roundsplayed"]++;
1996 game[
"roundwinner"][game[
"roundsplayed"]] = winner;
1998 if ( isdefined( game[
"roundswon"][winning_team] ) )
1999 game[
"roundswon"][winning_team]++;
2002 if ( isdefined( winner ) && isdefined( level.teams[ winning_team ] ) )
2004 level.finalKillCam_winner = winner;
2008 level.finalKillCam_winner =
"none";
2011 level.finalKillCam_winnerPicked =
true;
2013 setGameEndTime( 0 );
2020 players = level.players;
2022 newTime = getTime();
2025 SetMatchTalkFlag(
"EveryoneHearsEveryone", 1 );
2034 if( RandomFloat(1) <= GetDvarFloat(
"survey_chance") )
2035 surveyId = RandomIntRange(1, GetDvarInt(
"survey_count" ) + 1 );
2037 for ( index = 0; index < players.size; index++ )
2039 player = players[index];
2041 player thread roundEndDoF( 4.0 );
2045 player.pers[
"lastroundscore"] = player.pointstowin;
2055 player.pers[
"totalTimePlayed"] += player.timePlayed[
"total"];
2059 if ( level.leagueMatch )
2061 player setAARStat(
"lobbyPopup",
"leaguesummary" );
2065 player setAARStat(
"lobbyPopup",
"summary" );
2069 player setAARStat(
"surveyId", surveyId );
2070 player setAARStat(
"hardcore", level.hardcoreMode );
2076 if ( !level.inFinalKillcam )
2085 game_winner = winner;
2088 game_winner = [[level.determineWinner]]( winner );
2103 if ( isdefined( level.onRoundEndGame ) )
2104 winner = [[level.onRoundEndGame]]( winner );
2112 if( level.rankedmatch || level.arenaMatch )
2117 if( level.arenaMatch )
2124 if ( level.teambased )
2126 if ( winner ==
"tie" )
2137 if ( !isDefined( winner ) )
2150 players = level.players;
2151 for ( index = 0; index < players.size; index++ )
2153 player = players[index];
2157 skillUpdate( winner, level.teamBased );
2158 recordLeagueWinner( winner );
2167 level.finalGameEnd =
true;
2169 if ( !isdefined( level.skipGameEnd ) || !level.skipGameEnd )
2172 level.finalGameEnd = undefined;
2179 level.intermission =
true;
2193 stopdemorecording();
2195 SetMatchTalkFlag(
"EveryoneHearsEveryone", 1 );
2198 players = level.players;
2199 for ( index = 0; index < players.size; index++ )
2201 player = players[index];
2203 player notify (
"reset_outcome" );
2204 player thread [[level.spawnIntermission]](
false, level.useXCamsForEndGame );
2205 player setClientUIVisibilityFlag(
"hud_visible", 1 );
2212 if ( isdefined ( level.endGameFunction ) )
2214 level thread [[level.endGameFunction]]();
2217 level notify (
"sfade");
2218 /#print(
"game ended" );#/
2220 if ( !isdefined( level.skipGameEnd ) || !level.skipGameEnd )
2223 if( isDefined( level.end_game_video ) )
2225 level thread
lui::play_movie( level.end_game_video.name,
"fullscreen",
true );
2226 wait( level.end_game_video.duration + 4.5 );
2236 foreach( player
in players )
2238 if ( !isdefined( player ) )
2247 if ( level.exitLevel )
2250 level.exitLevel =
true;
2260 if ( level.teambased && isdefined(winner) && isdefined( level.placement[winning_team] ) )
2262 topscorers = level.placement[winning_team];
2266 topscorers = level.placement[
"all"];
2269 if ( topscorers.size )
2271 level.doTopScorers =
true;
2275 level.doTopScorers =
false;
2280 for ( i = 0; i < 3 && i < topscorers.size; i++ )
2282 player = topscorers[i];
2292 if ( !isDefined( showcase_weapon ) )
2294 SetTopScorer( i, player, tauntIndex, gesture0Index, gesture1Index, gesture2Index, GetWeapon(
"ar_standard") );
2298 SetTopScorer( i, player, tauntIndex, gesture0Index, gesture1Index, gesture2Index, showcase_weapon[
"weapon"], showcase_weapon[
"options"], showcase_weapon[
"acvi"] );
2305 self endon(
"disconnect" );
2307 fieldName =
"playTop" + topPlayerIndex +
"Gesture";
2315 if (
self actionSlotOneButtonPressed() )
2320 else if (
self actionSlotThreeButtonPressed() )
2325 else if (
self actionSlotFourButtonPressed() )
2343 self notify (
"setGestureClientField" );
2344 self endon (
"setGestureClientField" );
2357 level notify (
"endgame_sequence" );
2359 preloadingEnabled = GetDvarInt(
"sv_mapSwitchPreloadFrontend", 0 );
2360 if ( level.doTopScorers && isDefined(
struct::get(
"endgame_top_players_struct",
"targetname" ) ) )
2363 setMatchFlag(
"enable_popups", 1 );
2366 ClearPlayerCorpses();
2372 if( preloadingEnabled )
2373 SwitchMap_Preload(
"core_frontend" );
2379 setMatchFlag(
"enable_popups", 0 );
2381 else if ( level.doEndgameScoreboard )
2383 if( preloadingEnabled )
2384 SwitchMap_Preload(
"core_frontend" );
2385 LUINotifyEvent( &
"force_scoreboard", 0 );
2391 totalTimePlayed = 0;
2392 if ( isdefined(
self.pers[
"totalTimePlayed"] ) )
2394 totalTimePlayed =
self.pers[
"totalTimePlayed"];
2395 if ( totalTimePlayed > maxLength )
2397 totalTimePlayed = maxLength;
2400 return totalTimePlayed;
2405 totalTimePlayed = 0;
2406 if ( isdefined(
self.timePlayed ) && isdefined(
self.timePlayed[
"total"] ) )
2408 totalTimePlayed =
self.timePlayed[
"total"];
2409 if ( totalTimePlayed > roundLength )
2411 totalTimePlayed = roundLength;
2414 return totalTimePlayed;
2423 notifiesDone =
false;
2424 while ( !notifiesDone )
2426 players = level.players;
2427 notifiesDone =
true;
2428 for ( index = 0; index < players.size; index++ )
2430 if ( !isdefined( players[index].doingNotify ) || !players[index].doingNotify )
2433 notifiesDone =
false;
2440 wait ( defaultDelay );
2441 level notify (
"round_end_done" );
2445 wait ( defaultDelay / 2 );
2446 level notify (
"give_match_bonus" );
2447 wait ( defaultDelay / 2 );
2449 notifiesDone =
false;
2450 while ( !notifiesDone )
2452 players = level.players;
2453 notifiesDone =
true;
2454 for ( index = 0; index < players.size; index++ )
2456 if ( !isdefined( players[index].doingNotify ) || !players[index].doingNotify )
2459 notifiesDone =
false;
2464 level notify (
"round_end_done" );
2470 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
2476 if ( isdefined( level.timeLimitOverride ) && level.timeLimitOverride )
2479 if ( game[
"state"] !=
"playing" )
2481 setGameEndTime( 0 );
2485 if ( level.timeLimit <= 0 )
2487 setGameEndTime( 0 );
2491 if ( level.inPrematchPeriod )
2493 setGameEndTime( 0 );
2497 if(
IS_TRUE( level.timerPaused ) )
2500 if ( timeRemaining > 30000 )
2503 setGameEndTime( -
int(timeRemaining - 999) );
2508 setGameEndTime( -
int(timeRemaining - 99) );
2513 if ( level.timerStopped )
2515 setGameEndTime( 0 );
2519 if ( !isdefined( level.startTime ) )
2525 setGameEndTime( getTime() +
int(timeLeft) );
2530 [[level.onTimeLimit]]();
2535 if ( game[
"state"] !=
"playing" )
2538 if ( level.scoreLimit <= 0 )
2541 if ( level.teamBased )
2548 if ( !isPlayer(
self ) )
2551 if (
self.pointstowin < level.scoreLimit )
2555 [[level.onScoreLimit]]();
2560 if ( game[
"state"] !=
"playing" )
2563 if ( level.roundScoreLimit <= 0 )
2566 if ( level.teamBased )
2568 if( !game[
"teamSuddenDeath"][team] )
2576 [[level.onScoreLimit]]();
2581 if ( game[
"state"] !=
"playing" )
2584 if ( level.roundScoreLimit <= 0 )
2587 if ( level.teamBased )
2594 if ( !isPlayer(
self ) )
2599 if (
self.pointstowin < roundScoreLimit )
2603 [[level.onRoundScoreLimit]]();
2608 level endon (
"game_ended" );
2610 while ( game[
"state"] ==
"playing" )
2612 roundlimit =
math::clamp( GetGametypeSetting(
"roundLimit" ), level.roundLimitMin, level.roundLimitMax );
2613 if ( roundlimit != level.roundlimit )
2615 level.roundlimit = roundlimit;
2616 level notify (
"update_roundlimit" );
2619 timeLimit = [[level.getTimeLimit]]();
2620 if ( timeLimit != level.timeLimit )
2622 level.timeLimit = timeLimit;
2623 SetDvar(
"ui_timelimit", level.timeLimit );
2624 level notify (
"update_timelimit" );
2628 scoreLimit =
math::clamp( GetGametypeSetting(
"scoreLimit" ), level.scoreLimitMin, level.scoreLimitMax );
2629 if ( scoreLimit != level.scoreLimit )
2631 level.scoreLimit = scoreLimit;
2632 SetDvar(
"ui_scorelimit", level.scoreLimit );
2633 level notify (
"update_scorelimit" );
2637 roundScoreLimit =
math::clamp( GetGametypeSetting(
"roundScoreLimit" ), level.roundScoreLimitMin, level.roundScoreLimitMax );
2638 if ( roundScoreLimit != level.roundScoreLimit )
2640 level.roundScoreLimit = roundScoreLimit;
2641 level notify (
"update_roundScoreLimit" );
2646 if ( isdefined( level.startTime ) )
2662 numPlayers = level.placement[
"all"].size;
2664 for ( i = 0; i < numPlayers; i++ )
2666 if ( level.placement[
"all"][i] ==
self )
2670 level.placement[
"all"][i] = level.placement[
"all"][ i + 1 ];
2675 level.placement[
"all"][ numPlayers - 1 ] = undefined;
2676 assert( level.placement[
"all"].size == numPlayers - 1 );
2680 if ( level.teamBased )
2683 numPlayers = level.placement[
"all"].size;
2684 for ( i = 0; i < numPlayers; i++ )
2686 player = level.placement[
"all"][i];
2687 player notify(
"update_outcome" );
2695 if ( !level.players.size )
2698 level.placement[
"all"] = [];
2699 foreach ( player
in level.players )
2701 if ( !level.teambased || isdefined( level.teams[ player.team ] ) )
2702 level.placement[
"all"][level.placement[
"all"].size] = player;
2705 placementAll = level.placement[
"all"];
2707 if ( level.teamBased )
2709 for ( i = 1; i < placementAll.size; i++ )
2711 player = placementAll[i];
2712 playerScore = player.score;
2713 for ( j = i - 1; j >= 0 && (playerScore > placementAll[j].score || (playerScore == placementAll[j].score && player.deaths < placementAll[j].deaths)); j-- )
2714 placementAll[j + 1] = placementAll[j];
2715 placementAll[j + 1] = player;
2720 for ( i = 1; i < placementAll.size; i++ )
2722 player = placementAll[i];
2723 playerScore = player.pointstowin;
2724 for ( j = i - 1; j >= 0 && (playerScore > placementAll[j].pointstowin || (playerScore == placementAll[j].pointstowin && player.deaths < placementAll[j].deaths) || (playerScore == placementAll[j].pointstowin && player.deaths == placementAll[j].deaths && player.lastKillTime > placementAll[j].lastKillTime)); j-- )
2725 placementAll[j + 1] = placementAll[j];
2726 placementAll[j + 1] = player;
2730 level.placement[
"all"] = placementAll;
2739 foreach( team
in level.teams )
2741 placement[team] = [];
2743 placement[
"spectator"] = [];
2745 if ( !level.teamBased )
2748 placementAll = level.placement[
"all"];
2749 placementAllSize = placementAll.size;
2751 for ( i = 0; i < placementAllSize; i++ )
2753 player = placementAll[i];
2754 team = player.pers[
"team"];
2756 placement[team][ placement[team].size ] = player;
2759 foreach( team
in level.teams )
2761 level.placement[team] = placement[team];
2770 placement = level.placement[
"all"];
2771 for ( placementIndex = 0; placementIndex < placement.size; placementIndex++ )
2773 if ( level.placement[
"all"][placementIndex] == player )
2775 playerRank = (placementIndex + 1);
2785 topScoringPlayer =
false;
2788 assert( level.placement[
"all"].size > 0 );
2789 if ( level.placement[
"all"].size == 0 )
2794 if ( level.teambased )
2796 topScore = level.placement[
"all"][0].score;
2797 for ( index = 0; index < level.placement[
"all"].size; index++ )
2799 if ( level.placement[
"all"][index].score == 0 )
2803 if ( topScore > level.placement[
"all"][index].score )
2807 if ( player == level.placement[
"all"][index] )
2809 topScoringPlayer =
true;
2816 topScore = level.placement[
"all"][0].pointsToWin;
2817 for ( index = 0; index < level.placement[
"all"].size; index++ )
2819 if ( level.placement[
"all"][index].pointsToWin == 0 )
2823 if ( topScore > level.placement[
"all"][index].pointsToWin )
2827 if ( player == level.placement[
"all"][index] )
2829 topScoringPlayer =
true;
2834 return topScoringPlayer;
2840 if ( !level.playerQueuedRespawn )
2844 for ( i = 1; i < level.deadPlayers[team].size; i++ )
2846 player = level.deadPlayers[team][i];
2847 for ( j = i - 1; j >= 0 && player.deathTime < level.deadPlayers[team][j].deathTime; j-- )
2848 level.deadPlayers[team][j + 1] = level.deadPlayers[team][j];
2849 level.deadPlayers[team][j + 1] = player;
2852 for ( i = 0; i < level.deadPlayers[team].size; i++ )
2854 if ( level.deadPlayers[team][i].spawnQueueIndex != i )
2856 level.spawnQueueModified[team] =
true;
2858 level.deadPlayers[team][i].spawnQueueIndex = i;
2865 foreach( team
in level.teams )
2867 count += level.aliveCount[team];
2875 foreach( team
in level.teams )
2877 count += level.playerLives[team];
2885 if ( !isdefined( level.aliveCount ) )
2886 level.aliveCount = [];
2888 level.aliveCount[team] = 0;
2889 level.lastAliveCount[team] = 0;
2891 if ( !isdefined( game[
"everExisted"] ) )
2893 game[
"everExisted"] = [];
2895 if ( !isdefined( game[
"everExisted"][team] ) )
2897 game[
"everExisted"][team] =
false;
2899 level.everExisted[team] =
false;
2900 level.waveDelay[team] = 0;
2901 level.lastWave[team] = 0;
2902 level.wavePlayerSpawnIndex[team] = 0;
2908 level.playerCount[team] = 0;
2909 level.botsCount[team] = 0;
2910 level.lastAliveCount[team] = level.aliveCount[team];
2911 level.aliveCount[team] = 0;
2912 level.playerLives[team] = 0;
2913 level.alivePlayers[team] = [];
2914 level.spawningPlayers[team] = [];
2915 level.deadPlayers[team] = [];
2916 level.squads[team] = [];
2917 level.spawnQueueModified[team] =
false;
2923 level notify(
"updating_team_status");
2924 level endon(
"updating_team_status");
2925 level endon (
"game_ended" );
2930 if ( game[
"state"] ==
"postgame" )
2935 foreach( team
in level.teams )
2940 if ( !level.teambased )
2945 level.activePlayers = [];
2947 players = level.players;
2948 for ( i = 0; i < players.size; i++ )
2950 player = players[i];
2952 if ( !isdefined( player ) && level.splitscreen )
2955 if ( level.teambased || player.team ==
"spectator" )
2964 playerclass = player.curClass;
2966 if ( team !=
"spectator" && (isdefined( playerclass ) && playerclass !=
"") )
2968 level.playerCount[team]++;
2970 if( isdefined( player.pers[
"isBot"] ) )
2971 level.botsCount[team]++;
2973 not_quite_dead =
false;
2976 if ( isdefined( player.overridePlayerDeadStatus ) )
2978 not_quite_dead = player [[ player.overridePlayerDeadStatus ]]();
2981 if ( player.sessionstate ==
"playing" )
2983 level.aliveCount[team]++;
2984 level.playerLives[team]++;
2985 player.spawnQueueIndex = -1;
2987 if ( isAlive( player ) )
2989 level.alivePlayers[team][level.alivePlayers[team].size] = player;
2990 level.activeplayers[ level.activeplayers.size ] = player;
2994 level.deadPlayers[team][level.deadPlayers[team].size] = player;
2997 else if ( not_quite_dead )
2999 level.aliveCount[team]++;
3000 level.playerLives[team]++;
3001 level.alivePlayers[team][level.alivePlayers[team].size] = player;
3005 level.deadPlayers[team][level.deadPlayers[team].size] = player;
3007 level.playerLives[team]++;
3014 if ( totalAlive > level.maxPlayerCount )
3015 level.maxPlayerCount = totalAlive;
3017 foreach( team
in level.teams )
3019 if ( level.aliveCount[team] )
3021 game[
"everExisted"][team] =
true;
3022 level.everExisted[team] =
true;
3033 level.aliveTimesAverage[team] = 0;
3035 if ( game[
"state"] ==
"postgame" )
3038 total_player_count = 0;
3039 average_player_spawn_time = 0;
3040 total_value_count = 0;
3042 foreach( player
in level.alivePlayers[team] )
3046 foreach( time
in player.aliveTimes )
3050 average_time += time;
3057 total_value_count += count;
3058 average_player_spawn_time += average_time / count;
3059 total_player_count++;
3063 foreach( player
in level.deadPlayers[team] )
3067 foreach( time
in player.aliveTimes )
3071 average_time += time;
3078 total_value_count += count;
3079 average_player_spawn_time += average_time / count;
3080 total_player_count++;
3085 if ( total_player_count == 0 || total_value_count < 3 )
3087 level.aliveTimesAverage[team] = 0;
3091 level.aliveTimesAverage[team] = average_player_spawn_time / total_player_count;
3096 foreach( team
in level.teams )
3104 assert( isdefined( team ) );
3106 if ( level.scoreLimit <= 0 )
3109 if ( !level.teamBased )
3120 level notify(
"match_ending_soon",
"score" );
3126 assert( IsPlayer(
self ) );
3128 if ( level.scoreLimit <= 0 )
3131 if ( level.teamBased )
3142 level notify(
"match_ending_soon",
"score" );
3148 level endon (
"game_ended" );
3152 clockObject =
spawn(
"script_origin", (0,0,0) );
3154 while ( game[
"state"] ==
"playing" )
3156 if ( !level.timerStopped && level.timeLimit )
3159 timeLeftInt = int(timeLeft + 0.5);
3161 if ( timeLeftInt == 601 )
3164 if ( timeLeftInt == 301 )
3167 if ( timeLeftInt == 60 )
3170 if ( timeLeftInt == 12 )
3173 if ( timeLeftInt >= 40 && timeLeftInt <= 60 )
3174 level notify (
"match_ending_soon",
"time" );
3176 if ( timeLeftInt >= 30 && timeLeftInt <= 40 )
3177 level notify (
"match_ending_pretty_soon",
"time" );
3179 if( timeLeftInt <= 32 )
3180 level notify (
"match_ending_vox" );
3182 if ( timeLeftInt <= 10 || (timeLeftInt <= 30 && timeLeftInt % 2 == 0) )
3184 level notify (
"match_ending_very_soon",
"time" );
3186 if ( timeLeftInt == 0 )
3189 clockObject playSound(
"mpl_ui_timer_countdown" );
3193 if ( timeLeft - floor(timeLeft) >= .05 )
3194 wait timeLeft - floor(timeLeft);
3203 setGameEndTime( getTime() +
int(waitTime*1000) );
3204 clockObject =
spawn(
"script_origin", (0,0,0) );
3206 if ( waitTime >= 10.0 )
3207 wait ( waitTime - 10.0 );
3211 clockObject playSound(
"mpl_ui_timer_countdown" );
3217 level endon (
"game_ended" );
3221 for ( i = 0; i < level.players.size; i++ )
3223 player = level.players[i];
3224 if( isAlive( player ) )
3226 RecordBreadcrumbDataForPlayer( player, player.lastShotBy );
3238 level.timerStopped =
false;
3239 level.playableTimerStopped =
false;
3243 SetMatchTalkFlag(
"DeadChatWithDead", level.voip.deadChatWithDead );
3244 SetMatchTalkFlag(
"DeadChatWithTeam", level.voip.deadChatWithTeam );
3245 SetMatchTalkFlag(
"DeadHearTeamLiving", level.voip.deadHearTeamLiving );
3246 SetMatchTalkFlag(
"DeadHearAllLiving", level.voip.deadHearAllLiving );
3247 SetMatchTalkFlag(
"EveryoneHearsEveryone", level.voip.everyoneHearsEveryone );
3248 SetMatchTalkFlag(
"DeadHearKiller", level.voip.deadHearKiller );
3249 SetMatchTalkFlag(
"KillersHearVictim", level.voip.killersHearVictim );
3253 if(IsDefined(level.custom_prematch_period))
3255 [[level.custom_prematch_period]]();
3262 level notify(
"prematch_over");
3263 level.prematch_over =
true;
3284 matchRecordRoundStart();
3286 if ( isdefined( game[
"overtime_round"] ) )
3288 matchRecordOvertimeRound();
3300 if ( level.prematchRequirement == 0 )
3303 if ( level.teamBased )
3305 if ( activeTeamCount.size <= 1 )
3308 foreach( teamCount
in activeTeamCount )
3310 if ( teamCount != level.prematchRequirement )
3316 if ( activeTeamCount[
"free"] != level.prematchRequirement )
3324 level endon(
"game_ended" );
3327 playerReady =
false;
3328 activePlayerCount = 0;
3329 acceptTestClient =
false;
3331 activeTeamCount = [];
3334 while ( !playerReady || activePlayerCount == 0 || !isprematchRequirementConditionMet(activeTeamCount) )
3336 activePlayerCount = 0;
3338 if ( level.teamBased )
3340 foreach( team
in level.teams )
3342 activeTeamCount[team] = 0;
3347 activeTeamCount[
"free"] = 0;
3350 temp_player_ready = [];
3352 foreach( player
in level.players )
3355 if ( player istestclient() && acceptTestClient ==
false )
3358 if ( player.team !=
"spectator" )
3360 activePlayerCount++;
3362 player_num = player GetEntityNumber();
3363 if ( isDefined( player_ready[player_num] ) )
3365 temp_player_ready[player_num] = player_ready[player_num];
3369 temp_player_ready[player_num] = GetTime();
3376 if ( ((temp_player_ready[player_num] + 5000) < GetTime()) || player isStreamerReady( -1,
true ) )
3378 if ( level.teamBased )
3380 activeTeamCount[player.team]++;
3384 activeTeamCount[
"free"]++;
3389 if( player isStreamerReady( -1,
true ) )
3391 if ( playerReady ==
false )
3393 level notify(
"first_player_ready", player );
3400 player_read = temp_player_ready;
3405 if ( level.rankedmatch ==
false && level.arenamatch ==
false )
3407 acceptTestClient =
true;
3411 if( level.rankedMatch && ((getTime() -
startTime) > ( 120 * 1000 )) )
3427 if ( level.prematchRequirement != 0 )
3429 level waittill (
"first_player_ready", player );
3430 LUINotifyEvent( &
"prematch_waiting_for_players" );
3436 setMatchFlag(
"hud_hardcore", level.hardcoreMode );
3438 level endon(
"game_ended" );
3442 if ( level.prematchPeriod > 0 )
3449 wait ( level.prematchPeriod );
3458 level.inPrematchPeriod =
false;
3461 for ( index = 0; index < level.players.size; index++ )
3464 level.players[index] enableWeapons();
3467 if ( game[
"state"] !=
"playing" )
3473 level endon(
"game_ended");
3475 if ( isdefined( level.gracePeriodFunc ) )
3477 [[ level.gracePeriodFunc ]]();
3481 wait ( level.gracePeriod );
3484 level notify (
"grace_period_ending" );
3487 level.inGracePeriod =
false;
3489 if ( game[
"state"] !=
"playing" )
3492 if ( level.numLives )
3495 players = level.players;
3497 for ( i = 0; i < players.size; i++ )
3499 player = players[i];
3501 if ( !player.hasSpawned && player.sessionteam !=
"spectator" && !isAlive( player ) )
3502 player.statusicon =
"hud_status_dead";
3512 SetDvar(
"xblive_matchEndingSoon", 0 );
3513 level waittill(
"match_ending_soon", reason );
3514 SetDvar(
"xblive_matchEndingSoon", 1 );
3520 foreach ( team
in level.teams )
3522 Assert( isdefined( game[
"strings"][ team +
"_win"] ),
"game[\"strings\"][\"" + team +
"_win\"] does not exist" );
3523 Assert( isdefined( game[
"strings"][ team +
"_win_round"] ),
"game[\"strings\"][\"" + team +
"_win_round\"] does not exist" );
3524 Assert( isdefined( game[
"strings"][ team +
"_mission_accomplished"] ),
"game[\"strings\"][\"" + team +
"_mission_accomplished\"] does not exist" );
3525 Assert( isdefined( game[
"strings"][ team +
"_eliminated"] ),
"game[\"strings\"][\"" + team +
"_eliminated\"] does not exist" );
3526 Assert( isdefined( game[
"strings"][ team +
"_forfeited"] ),
"game[\"strings\"][\"" + team +
"_forfeited\"] does not exist" );
3527 Assert( isdefined( game[
"strings"][ team +
"_name"] ),
"game[\"strings\"][\"" + team +
"_name\"] does not exist" );
3528 Assert( isdefined( game[
"music"][
"spawn_" + team] ),
"game[\"music\"][\"spawn_" + team +
"\"] does not exist" );
3529 Assert( isdefined( game[
"music"][
"victory_" + team] ),
"game[\"music\"][\"victory_" + team +
"\"] does not exist" );
3530 Assert( isdefined( game[
"icons"][team] ),
"game[\"icons\"][\"" + team +
"\"] does not exist" );
3531 Assert( isdefined( game[
"voice"][team] ),
"game[\"voice\"][\"" + team +
"\"] does not exist" );
3537 foreach ( team
in level.teams )
3539 if ( level.waveDelay[team] )
3548 level.prematchRequirement = 0;
3549 level.prematchPeriod = 0;
3550 level.intermission =
false;
3552 setmatchflag(
"cg_drawSpectatorMessages", 1 );
3553 setmatchflag(
"game_ended", 0 );
3555 if ( !isdefined( game[
"gamestarted"] ) )
3558 if ( !isdefined( game[
"allies"] ) )
3559 game[
"allies"] =
"seals";
3560 if ( !isdefined( game[
"axis"] ) )
3561 game[
"axis"] =
"pmc";
3562 if ( !isdefined( game[
"attackers"] ) )
3563 game[
"attackers"] =
"allies";
3564 if ( !isdefined( game[
"defenders"] ) )
3565 game[
"defenders"] =
"axis";
3568 assert( game[
"attackers"] != game[
"defenders"] );
3571 foreach( team
in level.teams )
3573 if ( !isdefined( game[team] ) )
3577 if ( !isdefined( game[
"state"] ) )
3578 game[
"state"] =
"playing";
3582 SetDvar(
"cg_thirdPersonAngle", 354 );
3584 game[
"strings"][
"press_to_spawn"] = &
"PLATFORM_PRESS_TO_SPAWN";
3585 if ( level.teamBased )
3587 game[
"strings"][
"waiting_for_teams"] = &
"MP_WAITING_FOR_TEAMS";
3588 game[
"strings"][
"opponent_forfeiting_in"] = &
"MP_OPPONENT_FORFEITING_IN";
3592 game[
"strings"][
"waiting_for_teams"] = &
"MP_WAITING_FOR_PLAYERS";
3593 game[
"strings"][
"opponent_forfeiting_in"] = &
"MP_OPPONENT_FORFEITING_IN";
3595 game[
"strings"][
"match_starting_in"] = &
"MP_MATCH_STARTING_IN";
3596 game[
"strings"][
"spawn_next_round"] = &
"MP_SPAWN_NEXT_ROUND";
3597 game[
"strings"][
"waiting_to_spawn"] = &
"MP_WAITING_TO_SPAWN";
3598 game[
"strings"][
"waiting_to_spawn_ss"] = &
"MP_WAITING_TO_SPAWN_SS";
3600 game[
"strings"][
"you_will_spawn"] = &
"MP_YOU_WILL_RESPAWN";
3601 game[
"strings"][
"match_starting"] = &
"MP_MATCH_STARTING";
3602 game[
"strings"][
"change_class"] = &
"MP_CHANGE_CLASS_NEXT_SPAWN";
3603 game[
"strings"][
"last_stand"] = &
"MPUI_LAST_STAND";
3605 game[
"strings"][
"cowards_way"] = &
"PLATFORM_COWARDS_WAY_OUT";
3607 game[
"strings"][
"tie"] = &
"MP_MATCH_TIE";
3608 game[
"strings"][
"round_draw"] = &
"MP_ROUND_DRAW";
3610 game[
"strings"][
"enemies_eliminated"] = &
"MP_ENEMIES_ELIMINATED";
3611 game[
"strings"][
"score_limit_reached"] = &
"MP_SCORE_LIMIT_REACHED";
3612 game[
"strings"][
"round_score_limit_reached"] = &
"MP_SCORE_LIMIT_REACHED";
3613 game[
"strings"][
"round_limit_reached"] = &
"MP_ROUND_LIMIT_REACHED";
3614 game[
"strings"][
"time_limit_reached"] = &
"MP_TIME_LIMIT_REACHED";
3615 game[
"strings"][
"players_forfeited"] = &
"MP_PLAYERS_FORFEITED";
3616 game[
"strings"][
"other_teams_forfeited"] = &
"MP_OTHER_TEAMS_FORFEITED";
3620 [[level.onPrecacheGameType]]();
3622 game[
"gamestarted"] =
true;
3624 game[
"totalKills"] = 0;
3626 foreach( team
in level.teams )
3628 if ( !isdefined( game[
"migratedHost"] ) )
3629 game[
"teamScores"][team] = 0;
3631 game[
"teamSuddenDeath"][team] =
false;
3633 game[
"totalKillsTeam"][team] = 0;
3636 level.prematchRequirement = GetGametypeSetting(
"prematchRequirement" );
3637 level.prematchPeriod = GetGametypeSetting(
"prematchperiod" );
3639 if ( GetDvarint(
"xblive_clanmatch" ) != 0 )
3642 foreach( team
in level.teams )
3644 game[
"icons"][team] =
"composite_emblem_team_axis";
3647 game[
"icons"][
"allies"] =
"composite_emblem_team_allies";
3648 game[
"icons"][
"axis"] =
"composite_emblem_team_axis";
3653 if ( !level.splitscreen )
3654 level.prematchPeriod = GetGametypeSetting(
"preroundperiod" );
3658 DEFAULT( game[
"playabletimepassed"], 0 );
3659 DEFAULT( game[
"roundsplayed"], 0 );
3661 SetRoundsPlayed( game[
"roundsplayed"] );
3663 if ( isdefined( game[
"overtime_round"] ) )
3665 SetRoundsPlayed( game[
"roundsplayed"] + game[
"overtime_round"] - 1 );
3666 SetMatchFlag(
"overtime", 1 );
3670 SetMatchFlag(
"overtime", 0 );
3673 if(!isdefined(game[
"roundwinner"] ))
3674 game[
"roundwinner"] = [];
3676 if(!isdefined(game[
"lastroundscore"] ))
3677 game[
"lastroundscore"] = [];
3679 if(!isdefined(game[
"roundswon"] ))
3680 game[
"roundswon"] = [];
3682 if(!isdefined(game[
"roundswon"][
"tie"] ))
3683 game[
"roundswon"][
"tie"] = 0;
3685 if(!isdefined(game[
"overtimeroundswon"] ))
3686 game[
"overtimeroundswon"] = [];
3688 if(!isdefined(game[
"overtimeroundswon"][
"tie"] ))
3689 game[
"overtimeroundswon"][
"tie"] = 0;
3691 foreach ( team
in level.teams )
3693 if(!isdefined(game[
"roundswon"][team] ))
3694 game[
"roundswon"][team] = 0;
3695 if(!isdefined(game[
"overtimeroundswon"][team] ))
3696 game[
"overtimeroundswon"][team] = 0;
3698 level.teamSpawnPoints[team] = [];
3699 level.spawn_point_team_class_names[team] = [];
3702 level.skipVote =
false;
3703 level.gameEnded =
false;
3704 level.exitLevel =
false;
3706 SetDvar(
"g_gameEnded", 0 );
3708 level.objIDStart = 0;
3709 level.forcedEnd =
false;
3710 level.hostForcedEnd =
false;
3712 level.hardcoreMode = GetGametypeSetting(
"hardcoreMode" );
3713 if ( level.hardcoreMode )
3715 /#print(
"game mode: hardcore" );#/
3718 if( !isdefined(level.friendlyFireDelayTime) )
3719 level.friendlyFireDelayTime = 0;
3722 if ( GetDvarString(
"scr_max_rank" ) ==
"" )
3723 SetDvar(
"scr_max_rank",
"0" );
3724 level.rankCap = GetDvarint(
"scr_max_rank" );
3726 if ( GetDvarString(
"scr_min_prestige" ) ==
"" )
3728 SetDvar(
"scr_min_prestige",
"0" );
3730 level.minPrestige = GetDvarint(
"scr_min_prestige" );
3733 level.useStartSpawns =
true;
3734 level.alwaysUseStartSpawns =
false;
3735 level.useXCamsForEndGame =
true;
3737 level.cumulativeRoundScores = GetGametypeSetting(
"cumulativeRoundScores" );
3739 level.allowHitMarkers = GetGametypeSetting(
"allowhitmarkers" );
3740 level.playerQueuedRespawn = GetGametypeSetting(
"playerQueuedRespawn" );
3741 level.playerForceRespawn = GetGametypeSetting(
"playerForceRespawn" );
3743 level.roundStartExplosiveDelay = GetGametypeSetting(
"roundStartExplosiveDelay" );
3744 level.roundStartKillstreakDelay = GetGametypeSetting(
"roundStartKillstreakDelay" );
3746 level.perksEnabled = GetGametypeSetting(
"perksEnabled" );
3747 level.disableAttachments = GetGametypeSetting(
"disableAttachments" );
3748 level.disableTacInsert = GetGametypeSetting(
"disableTacInsert" );
3749 level.disableCAC = GetGametypeSetting(
"disableCAC" );
3750 level.disableClassSelection = GetGametypeSetting(
"disableClassSelection" );
3751 level.disableWeaponDrop = GetGametypeSetting(
"disableweapondrop" );
3752 level.onlyHeadShots = GetGametypeSetting(
"onlyHeadshots" );
3755 level.minimumAllowedTeamKills = GetGametypeSetting(
"teamKillPunishCount" ) - 1;
3756 level.teamKillReducedPenalty = GetGametypeSetting(
"teamKillReducedPenalty" );
3757 level.teamKillPointLoss = GetGametypeSetting(
"teamKillPointLoss" );
3758 level.teamKillSpawnDelay = GetGametypeSetting(
"teamKillSpawnDelay" );
3760 level.deathPointLoss = GetGametypeSetting(
"deathPointLoss" );
3761 level.leaderBonus = GetGametypeSetting(
"leaderBonus" );
3762 level.forceRadar = GetGametypeSetting(
"forceRadar" );
3763 level.playerSprintTime = GetGametypeSetting(
"playerSprintTime" );
3764 level.bulletDamageScalar = GetGametypeSetting(
"bulletDamageScalar" );
3766 level.playerMaxHealth = GetGametypeSetting(
"playerMaxHealth" );
3767 level.playerHealthRegenTime = GetGametypeSetting(
"playerHealthRegenTime" );
3768 level.scoreResetOnDeath = GetGametypeSetting(
"scoreResetOnDeath" );
3770 level.playerRespawnDelay = GetGametypeSetting(
"playerRespawnDelay" );
3771 level.playerIncrementalRespawnDelay = GetGametypeSetting(
"incrementalSpawnDelay" );
3773 level.playerObjectiveHeldRespawnDelay = GetGametypeSetting(
"playerObjectiveHeldRespawnDelay" );
3774 level.waveRespawnDelay = GetGametypeSetting(
"waveRespawnDelay" );
3775 level.suicideSpawnDelay = GetGametypeSetting(
"spawnsuicidepenalty" );
3776 level.teamKilledSpawnDelay = GetGametypeSetting(
"spawnteamkilledpenalty" );
3777 level.maxSuicidesBeforeKick = GetGametypeSetting(
"maxsuicidesbeforekick" );
3779 level.spectateType = GetGametypeSetting(
"spectateType" );
3781 level.voip = SpawnStruct();
3782 level.voip.deadChatWithDead = GetGametypeSetting(
"voipDeadChatWithDead" );
3783 level.voip.deadChatWithTeam = GetGametypeSetting(
"voipDeadChatWithTeam" );
3784 level.voip.deadHearAllLiving = GetGametypeSetting(
"voipDeadHearAllLiving" );
3785 level.voip.deadHearTeamLiving = GetGametypeSetting(
"voipDeadHearTeamLiving" );
3786 level.voip.everyoneHearsEveryone = GetGametypeSetting(
"voipEveryoneHearsEveryone" );
3787 level.voip.deadHearKiller = GetGametypeSetting(
"voipDeadHearKiller" );
3788 level.voip.killersHearVictim = GetGametypeSetting(
"voipKillersHearVictim" );
3790 level.droppedTagRespawn = GetGametypeSetting(
"droppedTagRespawn" );
3792 level.disableVehicleSpawners = GetGametypeSetting(
"disableVehicleSpawners" );
3794 if(
IS_TRUE( level.droppedTagRespawn ) )
3804 foreach( team
in level.teams )
3809 if ( !level.teambased )
3814 level.maxPlayerCount = 0;
3815 level.activePlayers = [];
3817 level.aliveTimeMaxCount = 3;
3818 level.aliveTimesAverage = [];
3819 foreach( team
in level.teams )
3821 level.aliveTimesAverage[team] = 0;
3824 if( !isdefined( level.livesDoNotReset ) || !level.livesDoNotReset )
3826 foreach( team
in level.teams )
3828 game[team+
"_lives"] = level.numTeamLives;
3832 level.allowAnnouncer = GetGametypeSetting(
"allowAnnouncer" );
3834 if ( !isdefined( level.timeLimit ) )
3837 if ( !isdefined( level.scoreLimit ) )
3840 if ( !isdefined( level.roundScoreLimit ) )
3843 if ( !isdefined( level.roundLimit ) )
3846 if ( !isdefined( level.roundWinLimit ) )
3856 waveDelay = level.waveRespawnDelay;
3859 foreach ( team
in level.teams )
3861 level.waveDelay[team] = waveDelay;
3862 level.lastWave[team] = 0;
3865 level thread [[level.waveSpawnTimer]]();
3868 level.inPrematchPeriod =
true;
3870 if ( level.prematchPeriod > 2.0 && level.rankedMatch )
3871 level.prematchPeriod = level.prematchPeriod + (randomFloat( 4 ) - 2);
3874 level.gracePeriod = 15;
3876 level.gracePeriod = 5;
3878 level.inGracePeriod =
true;
3880 level.roundEndDelay = 5;
3881 level.halftimeRoundEndDelay = 3;
3885 level.killstreaksenabled = 1;
3886 level.missileLockPlaySpaceCheckEnabled =
true;
3887 level.missileLockPlaySpaceCheckExtraRadius = 5000;
3889 if ( GetDvarString(
"scr_game_rankenabled" ) ==
"" )
3890 SetDvar(
"scr_game_rankenabled",
true );
3891 level.rankEnabled = GetDvarint(
"scr_game_rankenabled" );
3893 if ( GetDvarString(
"scr_game_medalsenabled" ) ==
"" )
3894 SetDvar(
"scr_game_medalsenabled",
true );
3895 level.medalsEnabled = GetDvarint(
"scr_game_medalsenabled" );
3897 if( level.hardcoreMode && level.rankedMatch && GetDvarString(
"scr_game_friendlyFireDelay" ) ==
"" )
3898 SetDvar(
"scr_game_friendlyFireDelay",
true );
3899 level.friendlyFireDelay = GetDvarint(
"scr_game_friendlyFireDelay" );
3902 [[level.onStartGameType]]();
3905 if( GetDvarInt(
"custom_killstreak_mode" ) == 1 )
3907 level.killstreaksenabled = 0;
3914 level thread simple_hostmigration::UpdateHostMigrationData();
3919 dvarString = (
"scr_" + dvarString +
"_friendlyFireDelayTime");
3920 if ( GetDvarString( dvarString ) ==
"" )
3921 SetDvar( dvarString, defaultValue );
3923 if ( getDvarInt( dvarString ) > maxValue )
3924 SetDvar( dvarString, maxValue );
3925 else if ( getDvarInt( dvarString ) < minValue )
3926 SetDvar( dvarString, minValue );
3928 level.friendlyFireDelayTime = getDvarInt( dvarString );
3933 if ( !isdefined( level.roundSwitch ) || !level.roundSwitch )
3935 if ( !isdefined( level.onRoundSwitch ) )
3938 assert( game[
"roundsplayed"] > 0 );
3940 if ( game[
"roundsplayed"] % level.roundswitch == 0 )
3942 [[level.onRoundSwitch]]();
3952 self waittill(
"host_sucks_end_game" );
3955 level.skipVote =
true;
3957 if ( !level.gameEnded )
3964 for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ )
3966 killstreak[ killstreakNum ] =
"killstreak_null";
3969 if ( isPlayer( player ) &&
3970 level.disableClassSelection != 1 &&
3971 !isdefined( player.pers[
"isBot"] ) &&
3972 isdefined( player.killstreak) )
3974 currentKillstreak = 0;
3975 for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ )
3977 if ( isdefined( player.killstreak[ killstreakNum ] ) )
3979 killstreak[ currentKillstreak ] = player.killstreak[ killstreakNum ];
3980 currentKillstreak++;
3990 if ( level.rankedMatch )
3994 level.hostForcedEnd =
true;
3995 /#print(
"host idled out" );#/
4005 if ( weapon.fusetime != 0 )
4006 wait( weapon.fusetime * 0.001 );
4010 if ( !isdefined(
self ) )
4015 self playsoundtoplayer(
"evt_annihilation", attacker );
4016 self playsoundtoallbutplayer(
"evt_annihilation_npc", attacker );
4018 CodeSetClientField(
self,
"annihilate_effect", 1);
4023 if ( !isdefined(
self ) )
4034 self waittill(
"actor_corpse",body);
4036 if ( weapon.fusetime != 0 )
4037 wait( weapon.fusetime * 0.001 );
4041 if ( !isdefined(
self ) )
4046 self playsoundtoplayer(
"evt_annihilation", attacker );
4047 self playsoundtoallbutplayer(
"evt_annihilation_npc", attacker );
4049 if ( !isdefined( body ) )
4054 CodeSetClientField(body,
"annihilate_effect", 1);
4064 if ( !isdefined(
self ) )
4069 playsoundatposition (
"evt_annihilation_npc", (
self.origin));
4070 CodeSetClientField(
self,
"pineapplegun_effect", 1);
4074 if ( !isdefined(
self ) )
4086 if ( !isdefined(
self ) )
4091 playsoundatposition (
"evt_annihilation_npc", (
self.origin));
4092 CodeSetClientField(
self,
"annihilate_effect", 1);
4095 if ( !isdefined(
self ) )
4106 self waittill(
"actor_corpse",body);
4109 if ( !isdefined(
self ) )
4114 playsoundatposition (
"evt_annihilation_npc", (
self.origin));
4116 if ( !isdefined( body ) )
4121 CodeSetClientField(body,
"pineapplegun_effect", 1);
4131 if( IsDefined(n_delay) && (n_delay > 0) )
4137 nMagnitude = shake_size;
4138 nduration = shake_time;
4140 v_pos =
self.origin;
4141 Earthquake( nMagnitude, nDuration, v_pos, nRadius );
4144 for( i=0; i<rumble_num; i++ )
4146 self PlayRumbleOnEntity(
"damage_heavy" );
4153 if( weapon.name==
"hero_pineapplegun" && isPlayer( attacker ) && sMeansOfDeath ==
"MOD_GRENADE" )
4155 attacker playLocalSound(
"wpn_pineapple_grenade_explode_flesh_2D" );
4159 #define ANNIHILATE_PUSH_SCALE 100
4160 #define ANNIHILATE_UPPUSH_SCALE 25
4163 if ( weapon.doannihilate&& isPlayer( attacker ) && ( sMeansOfDeath ==
"MOD_IMPACT" || sMeansOfDeath ==
"MOD_GRENADE" ) )
4174 else if( sMeansOfDeath ==
"MOD_BURNED" )
4176 if( !IsActor(body) )
4181 else if( weapon.isheroweapon == 1 && isPlayer( attacker ) )
4198 if ( weapon.name ==
"hero_firefly_swarm" )
4200 value = RandomInt(2) + 1;
4201 if( !IsActor(body) )
4203 CodeSetClientField(body,
"firefly_effect", value);
4209 #define CORPSE_BURN_DURATION 3
4212 self endon(
"death" );
4213 CodeSetClientField(
self,
"burned_effect", 1 );
4215 CodeSetClientField(
self,
"burned_effect", 0 );