1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\flagsys_shared;
5 #using scripts\shared\hud_message_shared;
6 #using scripts\shared\hud_util_shared;
7 #using scripts\shared\util_shared;
9 #insert scripts\shared\shared.gsh;
11 #using scripts\zm\gametypes\_globallogic;
12 #using scripts\zm\gametypes\_globallogic_audio;
13 #using scripts\zm\gametypes\_globallogic_defaults;
14 #using scripts\zm\gametypes\_globallogic_player;
15 #using scripts\zm\gametypes\_globallogic_score;
16 #using scripts\zm\gametypes\_globallogic_ui;
17 #using scripts\zm\gametypes\_globallogic_utils;
18 #using scripts\zm\gametypes\_hostmigration;
19 #using scripts\zm\gametypes\_spawning;
20 #using scripts\zm\gametypes\_spawnlogic;
21 #using scripts\zm\gametypes\_spectating;
23 #using scripts\zm\_util;
24 #using scripts\zm\_zm_perks;
26 #namespace globallogic_spawn;
28 #precache( "eventstring", "player_spawned" );
37 if ( level.inGracePeriod && !
self.hasSpawned )
41 if (
self.hasSpawned )
43 result =
self [[level.onRespawnDelay]]();
47 respawnDelay = level.playerRespawnDelay;
49 if ( includeTeamkillDelay &&
IS_TRUE(
self.teamKillPunish ) )
53 waveBased = (level.waveRespawnDelay > 0);
63 foreach( team
in level.teams )
65 if ( !level.everExisted[ team ] )
74 if ( isdefined( level.playerMaySpawn ) && !(
self [[level.playerMaySpawn]]() ) )
79 if ( level.inOvertime )
82 if ( level.playerQueuedRespawn && !isdefined(
self.allowQueueSpawn) && !level.inGracePeriod && !level.useStartSpawns )
87 if ( level.teamBased )
92 if ( !
self.pers[
"lives"] && gameHasStarted )
96 else if ( gameHasStarted )
99 if ( !level.inGracePeriod && !
self.hasSpawned && !level.wagerMatch )
109 earliestSpawnTime = gettime() + minimumWait * 1000;
111 lastWaveTime = level.lastWave[
self.pers[
"team"]];
112 waveDelay = level.waveDelay[
self.pers[
"team"]] * 1000;
118 numWavesPassedEarliestSpawnTime = (earliestSpawnTime - lastWaveTime) / waveDelay;
120 numWaves = ceil( numWavesPassedEarliestSpawnTime );
122 timeOfSpawn = lastWaveTime + numWaves * waveDelay;
125 if ( isdefined(
self.waveSpawnIndex ) )
126 timeOfSpawn += 50 *
self.waveSpawnIndex;
128 return (timeOfSpawn - gettime()) / 1000;
133 self endon(
"disconnect");
135 self.inPoisonArea =
false;
136 self.inBurnArea =
false;
137 self.inFlareVisionArea =
false;
138 self.inGroundNapalm =
false;
143 self endon (
"disconnect" );
144 self endon (
"end_respawn" );
145 self endon (
"game_ended" );
146 self endon (
"joined_spectators");
147 self endon (
"spawned");
156 if ( isdefined( level.onSpawnPlayerUnified )
157 && GetDvarInt(
"scr_disableunifiedspawning" ) == 0 )
163 self [[level.onSpawnPlayer]](
true);
174 pixbeginevent(
"giveLoadoutLevelSpecific");
176 if ( isdefined( level.giveCustomCharacters ) )
178 self [[level.giveCustomCharacters]]();
183 if ( isdefined( level.giveStartLoadout ) )
185 self [[level.giveStartLoadout]]();
197 if ( isdefined( level.giveCustomLoadout ) )
199 self [[level.giveCustomLoadout]]();
208 pixbeginevent(
"spawnPlayer_preUTS" );
212 self endon(
"disconnect");
213 self endon(
"joined_spectators");
214 self notify(
"spawned");
215 level notify(
"player_spawned");
216 self notify(
"end_respawn");
219 self LUINotifyEvent( &
"player_spawned", 0 );
221 if (!
self.hasSpawned)
224 self.underscoreChance = 70;
228 self.sessionteam =
self.team;
230 hadSpawned =
self.hasSpawned;
232 self.sessionstate =
"playing";
233 self.spectatorclient = -1;
234 self.killcamentity = -1;
235 self.archivetime = 0;
236 self.psoffsettime = 0;
237 self.statusicon =
"";
238 self.damagedPlayers = [];
239 if ( GetDvarint(
"scr_csmode" ) > 0 )
240 self.maxhealth = GetDvarint(
"scr_csmode" );
242 self.maxhealth = level.playerMaxHealth;
243 self.health =
self.maxhealth;
244 self.friendlydamage = undefined;
245 self.hasSpawned =
true;
246 self.spawnTime = getTime();
248 if (
self.pers[
"lives"] && ( !isdefined( level.takeLivesOnDeath ) || ( level.takeLivesOnDeath ==
false ) ) )
250 self.pers[
"lives"]--;
251 if (
self.pers[
"lives"] == 0 )
253 level notify(
"player_eliminated" );
254 self notify(
"player_eliminated" );
257 self.lastStand = undefined;
258 self.revivingTeammate =
false;
259 self.burning = undefined;
260 self.nextKillstreakFree = undefined;
263 self.activeCounterUAVs = 0;
264 self.activeSatellites = 0;
265 self.deathMachineKills = 0;
267 self.disabledWeapon = 0;
272 self.diedOnVehicle= undefined;
274 if ( !
self.wasAliveAtMatchStart )
277 self.wasAliveAtMatchStart =
true;
280 self setDepthOfField( 0, 0, 512, 512, 4, 0 );
285 pixbeginevent(
"onSpawnPlayer");
286 if ( isdefined( level.onSpawnPlayerUnified )
287 && GetDvarint(
"scr_disableunifiedspawning" ) == 0 )
289 self [[level.onSpawnPlayerUnified]]();
293 self [[level.onSpawnPlayer]](
false);
296 if ( isdefined( level.playerSpawnedCB ) )
298 self [[level.playerSpawnedCB]]();
307 pixbeginevent(
"spawnPlayer_postUTS" );
323 if ( level.inPrematchPeriod )
327 team =
self.pers[
"team"];
330 if( isdefined(
self.pers[
"music"].
spawn ) &&
self.pers[
"music"].
spawn ==
false )
333 if (level.wagerMatch)
335 music =
"SPAWN_WAGER";
339 music = game[
"music"][
"spawn_" + team];
343 self.pers[
"music"].spawn =
true;
346 if ( level.splitscreen )
348 if ( isdefined( level.playedStartingMusic ) )
351 level.playedStartingMusic =
true;
354 if( !isdefined(level.disablePrematchMessages) || (level.disablePrematchMessages==
false) )
364 if ( isdefined( game[
"dialog"][
"gametype"] ) && (!level.splitscreen ||
self == level.players[0]) )
366 if( !isdefined( level.inFinalFight ) || !level.inFinalFight )
368 if( level.hardcoreMode )
375 if ( team == game[
"attackers"] )
384 self enableWeapons();
385 if ( !hadSpawned && game[
"state"] ==
"playing" )
387 pixbeginevent(
"sound");
391 if( isdefined(
self.pers[
"music"].
spawn ) &&
self.pers[
"music"].
spawn ==
false )
394 self.pers[
"music"].spawn =
true;
396 if ( level.splitscreen )
398 if ( isdefined( level.playedStartingMusic ) )
401 level.playedStartingMusic =
true;
404 if( !isdefined(level.disablePrematchMessages) || (level.disablePrematchMessages==
false) )
414 if ( isdefined( game[
"dialog"][
"gametype"] ) && (!level.splitscreen ||
self == level.players[0]) )
416 if( !isdefined( level.inFinalFight ) || !level.inFinalFight )
418 if( level.hardcoreMode )
425 if ( team == game[
"attackers"] )
435 if ( GetDvarString(
"scr_showperksonspawn" ) ==
"" )
436 SetDvar(
"scr_showperksonspawn",
"0" );
439 if ( level.hardcoreMode )
440 SetDvar(
"scr_showperksonspawn",
"0" );
442 if ( !level.splitscreen && GetDvarint(
"scr_showperksonspawn" ) == 1 && game[
"state"] !=
"postgame" )
444 pixbeginevent(
"showperksonspawn");
447 if ( level.perksEnabled == 1)
455 if ( isdefined(
self.pers[
"momentum"] ) )
457 self.momentum =
self.pers[
"momentum"];
464 self notify(
"spawned_player" );
471 SetDvar(
"scr_selecting_location",
"" );
494 if ( game[
"state"] ==
"postgame" )
496 assert( !level.intermission );
507 self notify(
"spawned");
508 self notify(
"end_respawn");
521 pixmarker(
"BEGIN: in_spawnSpectator");
526 if (
self.pers[
"team"] ==
"spectator" )
529 self.sessionstate =
"spectator";
530 self.spectatorclient = -1;
531 self.killcamentity = -1;
532 self.archivetime = 0;
533 self.psoffsettime = 0;
534 self.friendlydamage = undefined;
536 if(
self.pers[
"team"] ==
"spectator")
537 self.statusicon =
"";
539 self.statusicon =
"hud_status_dead";
543 [[level.onSpawnSpectator]]( origin, angles );
545 if ( level.teamBased && !level.splitscreen )
549 pixmarker(
"END: in_spawnSpectator");
554 self endon(
"disconnect");
555 self endon(
"spawned");
557 self notify(
"spectator_thirdperson_thread");
558 self endon(
"spectator_thirdperson_thread");
560 self.spectatingThirdPerson =
false;
565 self endon (
"death" );
566 self endon (
"disconnect" );
567 self endon (
"spawned" );
569 if ( !isdefined( time ) )
576 if (
self.hasSpawned )
579 if (
self.pers[
"team"] ==
"spectator" )
584 self.pers[
"class"] =
"CLASS_CUSTOM1";
585 self.curClass =
self.pers[
"class"];
589 self thread [[level.spawnClient]]();
608 self endon (
"death" );
609 self endon (
"disconnect" );
610 self endon (
"spawned" );
613 if ( GetDvarString(
"scr_kick_time") !=
"" )
614 waittime = GetDvarfloat(
"scr_kick_time");
616 if ( GetDvarString(
"scr_kick_mintime") !=
"" )
617 mintime = GetDvarfloat(
"scr_kick_mintime");
619 starttime = gettime();
623 timePassed = (gettime() - starttime)/1000;
624 if ( timePassed < waittime - .1 && timePassed < mintime )
627 if (
self.hasSpawned )
630 if ( SessionModeIsPrivate() )
635 if (
self.pers[
"team"] ==
"spectator" )
638 kick(
self getEntityNumber() );
643 level endon(
"game_ended");
649 self notify(
"spawned");
650 self notify(
"end_respawn");
658 self.sessionstate =
"spectator";
659 self.spectatorclient = -1;
660 self.killcamentity = -1;
661 self.archivetime = 0;
662 self.psoffsettime = 0;
663 self.friendlydamage = undefined;
666 self SetOrigin(
self.origin );
667 self SetPlayerAngles(
self.angles );
668 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
673 self notify(
"spawned");
674 self notify(
"end_respawn");
675 self endon(
"disconnect");
686 if ((
self.postGameMilestones ||
self.postGameContracts ||
self.postGamePromotion ) )
688 if (
self.postGamePromotion )
689 self playLocalSound(
"mus_level_up" );
690 else if (
self.postGameContracts )
691 self playLocalSound(
"mus_challenge_complete" );
692 else if (
self.postGameMilestones )
693 self playLocalSound(
"mus_contract_complete" );
695 self closeInGameMenu();
706 self.sessionstate =
"intermission";
707 self.spectatorclient = -1;
708 self.killcamentity = -1;
709 self.archivetime = 0;
710 self.psoffsettime = 0;
711 self.friendlydamage = undefined;
713 if ( isdefined( useDefaultCallback ) && useDefaultCallback )
716 [[level.onSpawnIntermission]]();
717 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
722 player_to_spawn = undefined;
725 for (i = 0; i < level.deadPlayers[team].size; i++)
727 player = level.deadPlayers[team][i];
729 if ( player.waitingToSpawn )
732 player_to_spawn = player;
736 if ( isdefined(player_to_spawn) )
738 player_to_spawn.allowQueueSpawn =
true;
741 player_to_spawn thread [[level.spawnClient]]();
747 if ( !level.playerQueuedRespawn )
752 spawn_team = undefined;
754 if ( isdefined( killer ) && isdefined( killer.team ) && isdefined( level.teams[ killer.team ] ) )
755 spawn_team = killer.team;
757 if ( isdefined( spawn_team ) )
765 foreach( team
in level.teams )
767 if ( team == dead_player_team )
776 if ( !level.teambased )
779 if ( level.scoreLimit <= 1 )
782 foreach( team
in level.teams )
784 if ( !(game[
"teamScores"][team] >= level.scoreLimit - 1) )
799 if ( ( isdefined( level.livesDoNotReset ) && level.livesDoNotReset ) )
818 self thread [[level.spawnMessage]]();
824 pixbeginevent(
"spawnClient");
825 assert( isdefined(
self.team ) );
830 currentorigin =
self.origin;
831 currentangles =
self.angles;
835 self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
840 if (
self.waitingToSpawn )
845 self.waitingToSpawn =
true;
846 self.allowQueueSpawn = undefined;
850 if ( isdefined(
self ) )
851 self.waitingToSpawn =
false;
858 self endon (
"disconnect" );
859 self endon (
"end_respawn" );
860 level endon (
"game_ended" );
862 if ( !isdefined( timeAlreadyPassed ) )
863 timeAlreadyPassed = 0;
865 spawnedAsSpectator =
false;
867 if (
IS_TRUE(
self.teamKillPunish ) )
870 if ( teamKillDelay > timeAlreadyPassed )
872 teamKillDelay -= timeAlreadyPassed;
873 timeAlreadyPassed = 0;
877 timeAlreadyPassed -= teamKillDelay;
881 if ( teamKillDelay > 0 )
886 spawnedAsSpectator =
true;
888 wait( teamKillDelay );
891 self.teamKillPunish =
false;
894 if ( !isdefined(
self.waveSpawnIndex ) && isdefined( level.wavePlayerSpawnIndex[
self.team] ) )
896 self.waveSpawnIndex = level.wavePlayerSpawnIndex[
self.team];
897 level.wavePlayerSpawnIndex[
self.team]++;
901 if ( timeUntilSpawn > timeAlreadyPassed )
903 timeUntilSpawn -= timeAlreadyPassed;
904 timeAlreadyPassed = 0;
908 timeAlreadyPassed -= timeUntilSpawn;
912 if ( timeUntilSpawn > 0 )
915 if ( level.playerQueuedRespawn )
917 else if (
self IsSplitscreen() )
922 if ( !spawnedAsSpectator )
924 spawnOrigin =
self.origin + (0, 0, 60);
925 spawnAngles =
self.angles;
926 if ( isdefined ( level.useIntermissionPointsOnWaveSpawn ) && [[level.useIntermissionPointsOnWaveSpawn]]() ==
true )
929 if ( isdefined( spawnPoint ) )
931 spawnOrigin = spawnPoint.origin;
932 spawnAngles = spawnPoint.angles;
938 spawnedAsSpectator =
true;
942 self notify(
"stop_wait_safe_spawn_button");
945 waveBased = (level.waveRespawnDelay > 0);
946 if ( !level.playerForceRespawn &&
self.hasSpawned && !waveBased && !
self.wantSafeSpawn && !level.playerQueuedRespawn )
950 if ( !spawnedAsSpectator )
952 spawnedAsSpectator =
true;
958 self.waitingToSpawn =
false;
962 self.waveSpawnIndex = undefined;
963 self.respawnTimerStartTime = undefined;
965 self thread [[level.spawnPlayer]]();
970 self endon(
"disconnect");
971 self endon(
"end_respawn");
975 if (
self useButtonPressed() )
984 self endon(
"disconnect");
985 self endon(
"end_respawn");
987 if ( !level.inGracePeriod && !level.useStartSpawns )
989 currentorigin =
self.origin;
990 currentangles =
self.angles;
992 self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
994 self waittill(
"queue_respawn" );
1000 if( !level.console )
1003 if ( !isdefined(
self.spectatingThirdPerson ) || value !=
self.spectatingThirdPerson )
1005 self.spectatingThirdPerson = value;
1008 self SetClientThirdPerson( 1 );
1009 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
1013 self SetClientThirdPerson( 0 );
1014 self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
1026 self StopShellshock();
1027 self StopRumble(
"damage_heavy" );