1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\flagsys_shared;
3 #using scripts\shared\hostmigration_shared;
4 #using scripts\shared\hud_message_shared;
5 #using scripts\shared\hud_util_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\clientfield_shared;
9 #insert scripts\shared\shared.gsh;
11 #using scripts\mp\gametypes\_battlechatter;
12 #using scripts\mp\gametypes\_globallogic;
13 #using scripts\mp\gametypes\_globallogic_audio;
14 #using scripts\mp\gametypes\_globallogic_defaults;
15 #using scripts\mp\gametypes\_globallogic_player;
16 #using scripts\mp\gametypes\_globallogic_score;
17 #using scripts\mp\gametypes\_globallogic_ui;
18 #using scripts\mp\gametypes\_globallogic_utils;
19 #using scripts\mp\gametypes\_hostmigration;
20 #using scripts\mp\gametypes\_hud_message;
21 #using scripts\mp\gametypes\_loadout;
22 #using scripts\mp\gametypes\_spawning;
23 #using scripts\mp\gametypes\_spawnlogic;
24 #using scripts\mp\gametypes\_spectating;
26 #using scripts\mp\_util;
27 #using scripts\mp\_vehicle;
28 #using scripts\mp\bots\_bot;
29 #using scripts\mp\killstreaks\_killstreaks;
30 #using scripts\mp\_teamops;
32 #namespace globallogic_spawn;
34 #precache( "eventstring", "player_spawned" );
35 #precache( "eventstring", "show_gametype_objective_hint" );
39 if ( level.inGracePeriod && !
self.hasSpawned )
43 if (
self.hasSpawned )
45 result =
self [[level.onRespawnDelay]]();
49 respawnDelay = level.playerRespawnDelay;
51 if( isdefined( level.playerIncrementalRespawnDelay ) && isdefined(
self.pers[
"spawns"] ) )
52 respawnDelay += level.playerIncrementalRespawnDelay *
self.pers[
"spawns"];
54 if (
self.
suicide && level.suicideSpawnDelay > 0 )
56 respawnDelay += level.suicideSpawnDelay;
59 if (
self.teamKilled && level.teamKilledSpawnDelay > 0 )
61 respawnDelay += level.teamKilledSpawnDelay;
64 if ( includeTeamkillDelay &&
IS_TRUE(
self.teamKillPunish ) )
68 waveBased = (level.waveRespawnDelay > 0);
84 foreach( team
in level.teams )
86 if ( !level.everExisted[ team ] )
95 if ( isdefined( level.maySpawn ) && !(
self [[level.maySpawn]]() ) )
100 if ( level.inOvertime )
103 if ( level.playerQueuedRespawn && !isdefined(
self.allowQueueSpawn) && !level.inGracePeriod && !level.useStartSpawns )
106 if ( level.numLives || level.numTeamLives )
108 if ( level.teamBased )
113 if ( ( level.numLives && !
self.pers[
"lives"] ) || ( level.numTeamLives && !game[
self.team+
"_lives"] ) )
117 else if ( gameHasStarted )
120 if ( !level.inGracePeriod && !
self.hasSpawned && !level.wagerMatch )
130 earliestSpawnTime = gettime() + minimumWait * 1000;
132 lastWaveTime = level.lastWave[
self.pers[
"team"]];
133 waveDelay = level.waveDelay[
self.pers[
"team"]] * 1000;
139 numWavesPassedEarliestSpawnTime = (earliestSpawnTime - lastWaveTime) / waveDelay;
141 numWaves = ceil( numWavesPassedEarliestSpawnTime );
143 timeOfSpawn = lastWaveTime + numWaves * waveDelay;
146 if ( isdefined(
self.waveSpawnIndex ) )
147 timeOfSpawn += 50 *
self.waveSpawnIndex;
149 return (timeOfSpawn - gettime()) / 1000;
154 self endon(
"disconnect");
156 self.inPoisonArea =
false;
157 self.inBurnArea =
false;
158 self.inFlareVisionArea =
false;
159 self.inGroundNapalm =
false;
164 self endon (
"disconnect" );
165 self endon (
"end_respawn" );
166 self endon (
"game_ended" );
167 self endon (
"joined_spectators");
168 self endon (
"spawned");
171 livesLeft = !(level.numLives && !
self.pers[
"lives"]) && !(level.numTeamLives && !game[
self.team+
"_lives"]);
187 self endon(
"disconnect" );
189 self.playLeaderDialog =
true;
191 if( isdefined( level.disablePrematchMessages ) && level.disablePrematchMessages )
196 team =
self.pers[
"team"];
199 while ( level.inPrematchPeriod )
207 self LUINotifyEvent( &
"show_gametype_objective_hint", 1,
hintMessage );
210 if ( isdefined( level.leaderDialog ) )
212 if (
self.pers[
"playedGameMode"] !==
true )
214 if( level.hardcoreMode )
220 if ( team == game[
"attackers"] )
231 self endon(
"disconnect");
232 self endon(
"joined_spectators");
233 self notify(
"spawned");
234 level notify(
"player_spawned");
235 self notify(
"end_respawn");
238 self LUINotifyEvent( &
"player_spawned", 0 );
239 self LUINotifyEventToSpectators( &
"player_spawned", 0 );
241 if ( !isdefined(
self.pers[
"resetMomentumOnSpawn"] ) ||
self.pers[
"resetMomentumOnSpawn"] )
244 self.pers[
"resetMomentumOnSpawn"] =
false;
247 if( globallogic_utils::getroundstartdelay() )
252 self.sessionteam =
self.team;
254 hadSpawned =
self.hasSpawned;
256 self.sessionstate =
"playing";
257 self.spectatorclient = -1;
258 self.killcamentity = -1;
259 self.archivetime = 0;
260 self.psoffsettime = 0;
261 self.spectatekillcam =
false;
262 self.statusicon =
"";
263 self.damagedPlayers = [];
264 if ( GetDvarint(
"scr_csmode" ) > 0 )
265 self.maxhealth = GetDvarint(
"scr_csmode" );
267 self.maxhealth = level.playerMaxHealth;
268 self.health =
self.maxhealth;
269 self.friendlydamage = undefined;
270 self.lastStunnedBy = undefined;
271 self.hasSpawned =
true;
272 self.spawnTime = getTime();
274 if (
self.pers[
"lives"] && ( !isdefined( level.takeLivesOnDeath ) || ( level.takeLivesOnDeath ==
false ) ) )
276 self.pers[
"lives"]--;
277 if (
self.pers[
"lives"] == 0 )
279 level notify(
"player_eliminated" );
280 self notify(
"player_eliminated" );
283 if ( game[
self.team +
"_lives"] && ( !isdefined( level.takeLivesOnDeath ) || ( level.takeLivesOnDeath ==
false ) ) )
285 game[
self.team +
"_lives"]--;
286 if ( game[
self.team +
"_lives"] == 0 )
288 level notify(
"player_eliminated" );
289 self notify(
"player_eliminated" );
293 self.lastStand = undefined;
294 self.resurrect_not_allowed_by = undefined;
295 self.revivingTeammate =
false;
296 self.burning = undefined;
297 self.nextKillstreakFree = undefined;
299 self.deathMachineKills = 0;
301 self.disabledWeapon = 0;
307 self.diedOnVehicle= undefined;
309 self.lastShotBy = 127;
311 if ( !
self.wasAliveAtMatchStart )
314 self.wasAliveAtMatchStart =
true;
317 self setDepthOfField( 0, 0, 512, 512, 4, 0 );
322 self [[level.onSpawnPlayer]](
false);
323 if( isdefined( game[
"teamops"].teamopsName ) )
325 teamops = game[
"teamops"].data[game[
"teamops"].teamopsName];
326 TeamOpsStart( game[
"teamops"].teamOpsID, game[
"teamops"].teamopsRewardIndex, game[
"teamops"].teamopsStartTime, teamops.time );
330 if ( isdefined( level.playerSpawnedCB ) )
332 self [[level.playerSpawnedCB]]();
340 self.sensorGrenadeData = undefined;
344 self.pers[
"momentum_at_spawn_or_game_end"] =
VAL(
self.pers[
"momentum"], 0 );
346 if( SessionModeIsZombiesGame() )
355 if ( GetDvarint(
"tu11_enableClassicMode") == 1 )
357 if (
self.team ==
"allies" )
359 self SetCharacterBodyType( 0 );
363 self SetCharacterBodyType( 2 );
368 if ( level.inPrematchPeriod )
372 team =
self.pers[
"team"];
375 if( isdefined(
self.pers[
"music"].
spawn ) &&
self.pers[
"music"].
spawn ==
false )
378 if (level.wagerMatch)
380 music =
"SPAWN_WAGER";
384 music = game[
"music"][
"spawn_" + team];
387 if( game[
"roundsplayed" ] == 0 )
396 self.pers[
"music"].spawn =
true;
399 if ( level.splitscreen )
401 if ( isdefined( level.playedStartingMusic ) )
404 level.playedStartingMusic =
true;
412 self enableWeapons();
413 if ( !hadSpawned && game[
"state"] ==
"playing" )
418 if( isdefined(
self.pers[
"music"].
spawn ) &&
self.pers[
"music"].
spawn ==
false )
420 music = game[
"music"][
"spawn_" + team];
424 self.pers[
"music"].spawn =
true;
426 if ( level.splitscreen )
428 if ( isdefined( level.playedStartingMusic ) )
431 level.playedStartingMusic =
true;
438 if (
self HasPerk(
"specialty_anteup" ) )
440 anteup_bonus = GetDvarInt(
"perk_killstreakAnteUpResetValue" );
441 if (
self.pers[
"momentum_at_spawn_or_game_end"] < anteup_bonus )
447 if ( GetDvarString(
"scr_showperksonspawn" ) ==
"" )
448 SetDvar(
"scr_showperksonspawn",
"0" );
451 if ( level.hardcoreMode )
452 SetDvar(
"scr_showperksonspawn",
"0" );
454 if ( GetDvarint(
"scr_showperksonspawn" ) == 1 && game[
"state"] !=
"postgame" )
457 if ( level.perksEnabled == 1)
463 if ( isdefined(
self.pers[
"momentum"] ) )
465 self.momentum =
self.pers[
"momentum"];
472 self notify(
"spawned_player" );
484 /#print(
"S " +
self.origin[0] +
" " +
self.origin[1] +
" " +
self.origin[2] +
"\n" );#/
486 SetDvar(
"scr_selecting_location",
"" );
488 if( !SessionModeIsZombiesGame() )
493 if ( game[
"state"] ==
"postgame" )
495 assert( !level.intermission );
505 self endon(
"death" );
506 self endon(
"disconnect" );
507 self endon(
"joined_spectators" );
508 self endon(
"joined_team" );
510 self notify(
"noteMomentumOnGameEnded" );
511 self endon(
"noteMomentumOnGameEnded" );
513 level waittill(
"game_ended" );
515 self.pers[
"momentum_at_spawn_or_game_end"] =
VAL(
self.pers[
"momentum"], 0 );
520 self endon (
"death" );
521 self endon (
"disconnect" );
523 while(level.inPrematchPeriod)
534 self notify(
"spawned");
535 self notify(
"end_respawn");
552 if (
self.pers[
"team"] ==
"spectator" )
555 self.sessionstate =
"spectator";
556 self.spectatorclient = -1;
557 self.killcamentity = -1;
558 self.archivetime = 0;
559 self.psoffsettime = 0;
560 self.spectatekillcam =
false;
561 self.friendlydamage = undefined;
563 if(
self.pers[
"team"] ==
"spectator")
564 self.statusicon =
"";
566 self.statusicon =
"hud_status_dead";
570 [[level.onSpawnSpectator]]( origin, angles );
572 if ( level.teamBased && !level.splitscreen )
580 self endon(
"disconnect");
581 self endon(
"spawned");
583 self notify(
"spectator_thirdperson_thread");
584 self endon(
"spectator_thirdperson_thread");
586 self.spectatingThirdPerson =
false;
591 self endon (
"death" );
592 self endon (
"disconnect" );
593 self endon (
"spawned" );
595 if ( !isdefined( time ) )
602 if (
self.hasSpawned )
605 if (
self.pers[
"team"] ==
"spectator" )
610 self.pers[
"class"] =
"CLASS_CUSTOM1";
611 self.curClass =
self.pers[
"class"];
615 self thread [[level.spawnClient]]();
634 self endon (
"death" );
635 self endon (
"disconnect" );
636 self endon (
"spawned" );
639 if ( GetDvarString(
"scr_kick_time") !=
"" )
640 waittime = GetDvarfloat(
"scr_kick_time");
642 if ( GetDvarString(
"scr_kick_mintime") !=
"" )
643 mintime = GetDvarfloat(
"scr_kick_mintime");
645 starttime = gettime();
649 timePassed = (gettime() - starttime)/1000;
650 if ( timePassed < waittime - .1 && timePassed < mintime )
653 if (
self.hasSpawned )
656 if ( SessionModeIsPrivate() )
661 if (
self.pers[
"team"] ==
"spectator" )
664 if ( !
maySpawn() && (
self.pers[
"time_played_total"] > 0 ) )
669 kick(
self getEntityNumber(),
"EXE_PLAYERKICKED_NOTSPAWNED" );
674 level endon(
"game_ended");
680 self notify(
"spawned");
681 self notify(
"end_respawn");
689 self.sessionstate =
"spectator";
690 self.spectatorclient = -1;
691 self.killcamentity = -1;
692 self.archivetime = 0;
693 self.psoffsettime = 0;
694 self.spectatekillcam =
false;
695 self.friendlydamage = undefined;
698 self SetOrigin(
self.origin );
699 self SetPlayerAngles(
self.angles );
700 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
705 self notify(
"spawned");
706 self notify(
"end_respawn");
707 self endon(
"disconnect");
715 self.sessionstate =
"intermission";
716 self.spectatorclient = -1;
717 self.killcamentity = -1;
718 self.archivetime = 0;
719 self.psoffsettime = 0;
720 self.spectatekillcam =
false;
721 self.friendlydamage = undefined;
723 if ( isdefined( useDefaultCallback ) && useDefaultCallback )
726 [[level.onSpawnIntermission]](
endGame );
727 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
732 player_to_spawn = undefined;
735 for (i = 0; i < level.deadPlayers[team].size; i++)
737 player = level.deadPlayers[team][i];
739 if ( player.waitingToSpawn )
742 player_to_spawn = player;
746 if ( isdefined(player_to_spawn) )
748 player_to_spawn.allowQueueSpawn =
true;
751 player_to_spawn thread [[level.spawnClient]]();
757 if ( !level.playerQueuedRespawn )
762 spawn_team = undefined;
764 if ( isdefined( killer ) && isdefined( killer.team ) && isdefined( level.teams[ killer.team ] ) )
765 spawn_team = killer.team;
767 if ( isdefined( spawn_team ) )
775 foreach( team
in level.teams )
777 if ( team == dead_player_team )
786 if ( !level.teambased )
789 if ( level.scoreLimit <= 1 )
792 foreach( team
in level.teams )
794 if ( !(game[
"teamScores"][team] >= level.scoreLimit - 1) )
809 if ( ( isdefined( level.livesDoNotReset ) && level.livesDoNotReset ) )
828 self thread [[level.spawnMessage]]();
834 assert( isdefined(
self.team ) );
839 currentorigin =
self.origin;
840 currentangles =
self.angles;
844 self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
848 if (
self.waitingToSpawn )
852 self.waitingToSpawn =
true;
853 self.allowQueueSpawn = undefined;
857 if ( isdefined(
self ) )
858 self.waitingToSpawn =
false;
863 self endon (
"disconnect" );
864 self endon (
"end_respawn" );
865 level endon (
"game_ended" );
867 if ( !isdefined( timeAlreadyPassed ) )
868 timeAlreadyPassed = 0;
870 spawnedAsSpectator =
false;
872 if (
IS_TRUE(
self.teamKillPunish ) )
875 if ( teamKillDelay > timeAlreadyPassed )
877 teamKillDelay -= timeAlreadyPassed;
878 timeAlreadyPassed = 0;
882 timeAlreadyPassed -= teamKillDelay;
886 if ( teamKillDelay > 0 )
891 spawnedAsSpectator =
true;
893 wait( teamKillDelay );
896 self.teamKillPunish =
false;
899 if ( !isdefined(
self.waveSpawnIndex ) && isdefined( level.wavePlayerSpawnIndex[
self.team] ) )
901 self.waveSpawnIndex = level.wavePlayerSpawnIndex[
self.team];
902 level.wavePlayerSpawnIndex[
self.team]++;
906 if ( timeUntilSpawn > timeAlreadyPassed )
908 timeUntilSpawn -= timeAlreadyPassed;
909 timeAlreadyPassed = 0;
913 timeAlreadyPassed -= timeUntilSpawn;
917 if ( timeUntilSpawn > 0 )
920 if ( level.playerQueuedRespawn )
922 else if (
self IsSplitscreen() )
927 if ( !spawnedAsSpectator )
929 spawnOrigin =
self.origin + (0, 0, 60);
930 spawnAngles =
self.angles;
931 if ( isdefined ( level.useIntermissionPointsOnWaveSpawn ) && [[level.useIntermissionPointsOnWaveSpawn]]() ==
true )
934 if ( isdefined( spawnPoint ) )
936 spawnOrigin = spawnPoint.origin;
937 spawnAngles = spawnPoint.angles;
943 spawnedAsSpectator =
true;
947 self notify(
"stop_wait_safe_spawn_button");
950 if ( isdefined( level.gametypeSpawnWaiter ) )
952 if ( !spawnedAsSpectator )
954 spawnedAsSpectator =
true;
956 if ( !
self [[level.gametypeSpawnWaiter]]() )
958 self.waitingToSpawn =
false;
962 self.waveSpawnIndex = undefined;
963 self.respawnTimerStartTime = undefined;
969 waveBased = (level.waveRespawnDelay > 0);
970 if ( !level.playerForceRespawn &&
self.hasSpawned && !waveBased && !
self.wantSafeSpawn && !level.playerQueuedRespawn )
974 if ( !spawnedAsSpectator )
976 spawnedAsSpectator =
true;
981 self.waitingToSpawn =
false;
985 self.waveSpawnIndex = undefined;
986 self.respawnTimerStartTime = undefined;
988 if( isdefined( level.playerIncrementalRespawnDelay ) )
990 if( isdefined(
self.pers[
"spawns"] ) )
991 self.pers[
"spawns"]++;
993 self.pers[
"spawns"] = 1;
996 self thread [[level.spawnPlayer]]();
1001 self endon(
"disconnect");
1002 self endon(
"end_respawn");
1006 if (
self useButtonPressed() )
1015 self endon(
"disconnect");
1016 self endon(
"end_respawn");
1018 if ( !level.inGracePeriod && !level.useStartSpawns )
1020 currentorigin =
self.origin;
1021 currentangles =
self.angles;
1023 self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
1025 self waittill(
"queue_respawn" );
1031 if( !level.console )
1034 if ( !isdefined(
self.spectatingThirdPerson ) || value !=
self.spectatingThirdPerson )
1036 self.spectatingThirdPerson = value;
1039 self SetClientThirdPerson( 1 );
1040 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
1044 self SetClientThirdPerson( 0 );
1045 self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
1057 self StopShellshock();
1058 self StopRumble(
"damage_heavy" );