‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_globallogic_spawn.gsc
Go to the documentation of this file.
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;
8 
9 #insert scripts\shared\shared.gsh;
10 
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;
25 
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;
31 
32 #namespace globallogic_spawn;
33 
34 #precache( "eventstring", "player_spawned" );
35 #precache( "eventstring", "show_gametype_objective_hint" );
36 
37 function ‪TimeUntilSpawn( includeTeamkillDelay )
38 {
39  if ( level.inGracePeriod && !self.hasSpawned )
40  return 0;
41 
42  respawnDelay = 0;
43  if ( self.hasSpawned )
44  {
45  ‪result = self [[level.onRespawnDelay]]();
46  if ( isdefined( ‪result ) )
47  respawnDelay = ‪result;
48  else
49  respawnDelay = level.playerRespawnDelay;
50 
51  if( isdefined( level.playerIncrementalRespawnDelay ) && isdefined( self.pers["spawns"] ) )
52  respawnDelay += level.playerIncrementalRespawnDelay * self.pers["spawns"];
53 
54  ‪if ( self.‪suicide && level.suicideSpawnDelay > 0 )
55  {
56  respawnDelay += level.suicideSpawnDelay;
57  }
58 
59  if ( self.teamKilled && level.teamKilledSpawnDelay > 0 )
60  {
61  respawnDelay += level.teamKilledSpawnDelay;
62  }
63 
64  if ( includeTeamkillDelay && ‪IS_TRUE( self.teamKillPunish ) )
65  respawnDelay += ‪globallogic_player::TeamKillDelay();
66  }
67 
68  waveBased = (level.waveRespawnDelay > 0);
69 
70  if ( waveBased )
71  return self ‪TimeUntilWaveSpawn( respawnDelay );
72 
73  //Spawn straight away if player used resurrect ability
74  if ( ‪IS_TRUE(self.usedResurrect) )
75  {
76  return 0;
77  }
78 
79  return respawnDelay;
80 }
81 
83 {
84  foreach( team in level.teams )
85  {
86  if ( !level.everExisted[ team ] )
87  return false;
88  }
89 
90  return true;
91 }
92 
93 function ‪maySpawn()
94 {
95  if ( isdefined( level.maySpawn ) && !( self [[level.maySpawn]]() ) )
96  {
97  return false;
98  }
99 
100  if ( level.inOvertime )
101  return false;
102 
103  if ( level.playerQueuedRespawn && !isdefined(self.allowQueueSpawn) && !level.inGracePeriod && !level.useStartSpawns )
104  return false;
105 
106  if ( level.numLives || level.numTeamLives )
107  {
108  if ( level.teamBased )
109  gameHasStarted = ( ‪allTeamsHaveExisted() );
110  else
111  gameHasStarted = (level.maxPlayerCount > 1) || ( !‪util::isOneRound() && !‪util::isFirstRound() );
112 
113  if ( ( level.numLives && !self.pers["lives"] ) || ( level.numTeamLives && !game[self.team+"_lives"] ) )
114  {
115  return false;
116  }
117  else if ( gameHasStarted )
118  {
119  // disallow spawning for late comers
120  if ( !level.inGracePeriod && !self.hasSpawned && !level.wagerMatch )
121  return false;
122  }
123  }
124  return true;
125 }
126 
127 function ‪TimeUntilWaveSpawn( minimumWait )
128 {
129  // the time we'll spawn if we only wait the minimum wait.
130  earliestSpawnTime = gettime() + minimumWait * 1000;
131 
132  lastWaveTime = level.lastWave[self.pers["team"]];
133  waveDelay = level.waveDelay[self.pers["team"]] * 1000;
134 
135  if( waveDelay == 0 )
136  return 0;
137 
138  // the number of waves that will have passed since the last wave happened, when the minimum wait is over.
139  numWavesPassedEarliestSpawnTime = (earliestSpawnTime - lastWaveTime) / waveDelay;
140  // rounded up
141  numWaves = ceil( numWavesPassedEarliestSpawnTime );
142 
143  timeOfSpawn = lastWaveTime + numWaves * waveDelay;
144 
145  // avoid spawning everyone on the same frame
146  if ( isdefined( self.waveSpawnIndex ) )
147  timeOfSpawn += 50 * self.waveSpawnIndex;
148 
149  return (timeOfSpawn - gettime()) / 1000;
150 }
151 
153 {
154  self endon("disconnect");
155 
156  self.inPoisonArea = false;
157  self.inBurnArea = false;
158  self.inFlareVisionArea = false;
159  self.inGroundNapalm = false;
160 }
161 
163 {
164  self endon ( "disconnect" );
165  self endon ( "end_respawn" );
166  self endon ( "game_ended" );
167  self endon ( "joined_spectators");
168  self endon ( "spawned");
169 
170  // no prediction if we have no lives left.
171  livesLeft = !(level.numLives && !self.pers["lives"]) && !(level.numTeamLives && !game[self.team+"_lives"]);
172  if ( !livesLeft )
173  return;
174 
175  while (1)
176  {
177  // wait some time between predictions
178  wait( 0.5 );
179 
180  // this is slightly inaccurate, we should probably call the gametype specific spawn, however this is prevents us having to pass the arg all the way through each gametype.
182  }
183 }
184 
186 {
187  self endon("disconnect" );
188 
189  self.playLeaderDialog = true;
190 
191  if( isdefined( level.disablePrematchMessages ) && level.disablePrematchMessages )
192  {
193  return;
194  }
195 
196  team = self.pers["team"];
198 
199  while ( level.inPrematchPeriod )
200  {
202  }
203 
205  if ( isdefined( ‪hintMessage ) )
206  {
207  self LUINotifyEvent( &"show_gametype_objective_hint", 1, ‪hintMessage );
208  }
209 
210  if ( isdefined( level.leaderDialog ) )
211  {
212  if ( self.pers["playedGameMode"] !== true )
213  {
214  if( level.hardcoreMode )
215  self ‪globallogic_audio::leader_dialog_on_player( level.leaderDialog.startHcGameDialog );
216  else
217  self ‪globallogic_audio::leader_dialog_on_player( level.leaderDialog.startGameDialog );
218  }
219 
220  if ( team == game["attackers"] )
221  self ‪globallogic_audio::leader_dialog_on_player( level.leaderDialog.offenseOrderDialog );
222  else
223  self ‪globallogic_audio::leader_dialog_on_player( level.leaderDialog.defenseOrderDialog );
224  }
225 }
226 
227 function ‪spawnPlayer()
228 {
229  //profilelog_begintiming( 3, "ship" );
230 
231  self endon("disconnect");
232  self endon("joined_spectators");
233  self notify("spawned");
234  level notify("player_spawned");
235  self notify("end_respawn");
236 
237  self ‪setSpawnVariables();
238  self LUINotifyEvent( &"player_spawned", 0 );
239  self LUINotifyEventToSpectators( &"player_spawned", 0 );
240 
241  if ( !isdefined( self.pers["resetMomentumOnSpawn"] ) || self.pers["resetMomentumOnSpawn"] )
242  {
244  self.pers["resetMomentumOnSpawn"] = false;
245  }
246 
247  if( globallogic_utils::getroundstartdelay() )
248  {
250  }
251 
252  self.sessionteam = self.team;
253 
254  hadSpawned = self.hasSpawned;
255 
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" );
266  else
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();
273  self.afk = false;
274  if ( self.pers["lives"] && ( !isdefined( level.takeLivesOnDeath ) || ( level.takeLivesOnDeath == false ) ) )
275  {
276  self.pers["lives"]--;
277  if ( self.pers["lives"] == 0 )
278  {
279  level notify( "player_eliminated" );
280  self notify( "player_eliminated" );
281  }
282  }
283  if ( game[self.team + "_lives"] && ( !isdefined( level.takeLivesOnDeath ) || ( level.takeLivesOnDeath == false ) ) )
284  {
285  game[self.team + "_lives"]--;
286  if ( game[self.team + "_lives"] == 0 )
287  {
288  level notify( "player_eliminated" );
289  self notify( "player_eliminated" );
290  }
291  }
292 
293  self.lastStand = undefined;
294  self.resurrect_not_allowed_by = undefined;
295  self.revivingTeammate = false;
296  self.burning = undefined;
297  self.nextKillstreakFree = undefined;
298 
299  self.deathMachineKills = 0;
300 
301  self.disabledWeapon = 0;
303 
306 
307  self.diedOnVehicle= undefined;
308 
309  self.lastShotBy = 127; // 0b1111111 == no last shot by
310 
311  if ( !self.wasAliveAtMatchStart )
312  {
313  if ( level.inGracePeriod || ‪globallogic_utils::getTimePassed() < 20 * 1000 )
314  self.wasAliveAtMatchStart = true;
315  }
316 
317  self setDepthOfField( 0, 0, 512, 512, 4, 0 );
318  self resetFov();
319 
320 
321  {
322  self [[level.onSpawnPlayer]](false);
323  if( isdefined( game["teamops"].teamopsName ) )
324  {
325  teamops = game["teamops"].data[game["teamops"].teamopsName];
326  TeamOpsStart( game["teamops"].teamOpsID, game["teamops"].teamopsRewardIndex, game["teamops"].teamopsStartTime, teamops.time );
327  ‪teamops::updateTeamOps( undefined, undefined, self.team );
328  }
329 
330  if ( isdefined( level.playerSpawnedCB ) )
331  {
332  self [[level.playerSpawnedCB]]();
333  }
334  }
335 
336  level thread ‪globallogic::updateTeamStatus();
337 
338  self thread ‪stopPoisoningAndFlareOnSpawn();
339 
340  self.sensorGrenadeData = undefined;
341 
342  assert( ‪globallogic_utils::isValidClass( self.curClass ) );
343 
344  self.pers["momentum_at_spawn_or_game_end"] = ‪VAL( self.pers["momentum"], 0 );
345 
346  if( SessionModeIsZombiesGame() )
347  {
348  self ‪loadout::giveLoadoutLevelSpecific( self.team, self.curClass );
349  }
350  else
351  {
352  self ‪loadout::setClass( self.curClass );
353  self ‪loadout::giveLoadout( self.team, self.curClass );
354 
355  if ( GetDvarint( "tu11_enableClassicMode") == 1 )
356  {
357  if ( self.team == "allies" )
358  {
359  self SetCharacterBodyType( 0 );
360  }
361  else
362  {
363  self SetCharacterBodyType( 2 );
364  }
365  }
366  }
367 
368  if ( level.inPrematchPeriod )
369  {
370  self ‪util::freeze_player_controls( true );
371 
372  team = self.pers["team"];
373 
374 //CDC New music system
375  if( isdefined( self.pers["music"].‪spawn ) && self.pers["music"].‪spawn == false )
376  {
377 
378  if (level.wagerMatch)
379  {
380  music = "SPAWN_WAGER";
381  }
382  else
383  {
384  music = game["music"]["spawn_" + team];
385  }
386 
387  if( game[ "roundsplayed" ] == 0 )
388  {
389  self thread ‪sndDelayedMusicStart("spawnFull");
390  }
391  else
392  {
393  self thread ‪sndDelayedMusicStart("spawnShort");
394  }
395 
396  self.pers["music"].spawn = true;
397  }
398 
399  if ( level.splitscreen )
400  {
401  if ( isdefined( level.playedStartingMusic ) )
402  music = undefined;
403  else
404  level.playedStartingMusic = true;
405  }
406 
407  self thread ‪doInitialSpawnMessaging();
408  }
409  else
410  {
411  self ‪util::freeze_player_controls( false );
412  self enableWeapons();
413  if ( !hadSpawned && game["state"] == "playing" )
414  {
415  team = self.team;
416 
417 //CDC New music system TODO add short spawn music
418  if( isdefined( self.pers["music"].‪spawn ) && self.pers["music"].‪spawn == false )
419  {
420  music = game["music"]["spawn_" + team];
421 
422  self thread ‪sndDelayedMusicStart( "spawnShort" );
423 
424  self.pers["music"].spawn = true;
425  }
426  if ( level.splitscreen )
427  {
428  if ( isdefined( level.playedStartingMusic ) )
429  music = undefined;
430  else
431  level.playedStartingMusic = true;
432  }
433 
434  self thread ‪doInitialSpawnMessaging();
435  }
436  }
437 
438  if ( self HasPerk( "specialty_anteup" ) )
439  {
440  anteup_bonus = GetDvarInt( "perk_killstreakAnteUpResetValue" );
441  if ( self.pers["momentum_at_spawn_or_game_end"] < anteup_bonus )
442  {
443  ‪globallogic_score::_setPlayerMomentum( self, anteup_bonus, false );
444  }
445  }
446 
447  if ( GetDvarString( "scr_showperksonspawn" ) == "" )
448  SetDvar( "scr_showperksonspawn", "0" );
449 
450  // Make sure that we dont show the perks on spawn if we are in hardcore.
451  if ( level.hardcoreMode )
452  SetDvar( "scr_showperksonspawn", "0" );
453 
454  if ( GetDvarint( "scr_showperksonspawn" ) == 1 && game["state"] != "postgame" )
455  {
456  //Checks to make sure perks are allowed. - Leif
457  if ( level.perksEnabled == 1)
458  {
459  self ‪hud::showPerks( );
460  }
461  }
462 
463  if ( isdefined( self.pers["momentum"] ) )
464  {
465  self.momentum = self.pers["momentum"];
466  }
467 
468  self thread ‪noteMomentumOnGameEnded();
469 
470  waittillframeend;
471 
472  self notify( "spawned_player" );
473  ‪callback::callback( #"on_player_spawned" );
474 
476 
481 
483 
484  /#print( "S " + self.origin[0] + " " + self.origin[1] + " " + self.origin[2] + "\n" );#/
485 
486  SetDvar( "scr_selecting_location", "" );
487 
488  if( !SessionModeIsZombiesGame() )
489  {
490  self thread ‪killstreaks::killstreak_waiter();
491  }
492 
493  if ( game["state"] == "postgame" )
494  {
495  assert( !level.intermission );
496  // We're in the victory screen, but before intermission
498  }
499 
501 }
502 
504 {
505  self endon( "death" );
506  self endon( "disconnect" );
507  self endon( "joined_spectators" );
508  self endon( "joined_team" );
509 
510  self notify( "noteMomentumOnGameEnded" );
511  self endon( "noteMomentumOnGameEnded" );
512 
513  level waittill( "game_ended" );
514 
515  self.pers["momentum_at_spawn_or_game_end"] = ‪VAL( self.pers["momentum"], 0 );
516 }
517 
518 function ‪sndDelayedMusicStart(music)
519 {
520  self endon ( "death" );
521  self endon ( "disconnect" );
522 
523  while(level.inPrematchPeriod)
524  {
525  wait(.05);
526  }
527 
528  if( !‪IS_TRUE( level.freerun ) )
529  self thread ‪globallogic_audio::set_music_on_player( music );
530 }
531 
532 function ‪spawnSpectator( origin, angles )
533 {
534  self notify("spawned");
535  self notify("end_respawn");
536  ‪in_spawnSpectator( origin, angles );
537 }
538 
539 // spawnSpectator clone without notifies for spawning between respawn delays
540 function ‪respawn_asSpectator( origin, angles )
541 {
542  ‪in_spawnSpectator( origin, angles );
543 }
544 
545 // spawnSpectator helper
546 function ‪in_spawnSpectator( origin, angles )
547 {
548  self ‪setSpawnVariables();
549 
550  // don't clear lower message if not actually a spectator,
551  // because it probably has important information like when we'll spawn
552  if ( self.pers["team"] == "spectator" )
554 
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;
562 
563  if(self.pers["team"] == "spectator")
564  self.statusicon = "";
565  else
566  self.statusicon = "hud_status_dead";
567 
569 
570  [[level.onSpawnSpectator]]( origin, angles );
571 
572  if ( level.teamBased && !level.splitscreen )
573  self thread ‪spectatorThirdPersonness();
574 
575  level thread ‪globallogic::updateTeamStatus();
576 }
577 
579 {
580  self endon("disconnect");
581  self endon("spawned");
582 
583  self notify("spectator_thirdperson_thread");
584  self endon("spectator_thirdperson_thread");
585 
586  self.spectatingThirdPerson = false;
587 }
588 
589 function ‪forceSpawn( time )
590 {
591  self endon ( "death" );
592  self endon ( "disconnect" );
593  self endon ( "spawned" );
594 
595  if ( !isdefined( time ) )
596  {
597  time = 60;
598  }
599 
600  wait ( time );
601 
602  if ( self.hasSpawned )
603  return;
604 
605  if ( self.pers["team"] == "spectator" )
606  return;
607 
608  if ( !‪globallogic_utils::isValidClass( self.pers["class"] ) )
609  {
610  self.pers["class"] = "CLASS_CUSTOM1";
611  self.curClass = self.pers["class"];
612  }
613 
615  self thread [[level.spawnClient]]();
616 }
617 
618 
620 {
621  if ( self IsHost() )
622  {
623  // don't try to kick the host
624  return;
625  }
626 
628  // clear any client dvars here,
629  // like if we set anything to change the menu appearance to warn them of kickness
630 }
631 
633 {
634  self endon ( "death" );
635  self endon ( "disconnect" );
636  self endon ( "spawned" );
637 
638  waittime = 90;
639  if ( GetDvarString( "scr_kick_time") != "" )
640  waittime = GetDvarfloat( "scr_kick_time");
641  mintime = 45;
642  if ( GetDvarString( "scr_kick_mintime") != "" )
643  mintime = GetDvarfloat( "scr_kick_mintime");
644 
645  starttime = gettime();
646 
647  ‪kickWait( waittime );
648 
649  timePassed = (gettime() - starttime)/1000;
650  if ( timePassed < waittime - .1 && timePassed < mintime )
651  return;
652 
653  if ( self.hasSpawned )
654  return;
655 
656  if ( SessionModeIsPrivate() )
657  {
658  return;
659  }
660 
661  if ( self.pers["team"] == "spectator" )
662  return;
663 
664  if ( !‪maySpawn() && ( self.pers["time_played_total"] > 0 ) )
665  return;
666 
668 
669  kick( self getEntityNumber(), "EXE_PLAYERKICKED_NOTSPAWNED" );
670 }
671 
672 function ‪kickWait( waittime )
673 {
674  level endon("game_ended");
676 }
677 
679 {
680  self notify("spawned");
681  self notify("end_respawn");
682 
683  self ‪setSpawnVariables();
684 
686 
687  self ‪util::freeze_player_controls( false );
688 
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;
696 
698  self SetOrigin( self.origin );
699  self SetPlayerAngles( self.angles );
700  self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
701 }
702 
703 function ‪spawnIntermission( useDefaultCallback, ‪endGame )
704 {
705  self notify("spawned");
706  self notify("end_respawn");
707  self endon("disconnect");
708 
709  self ‪setSpawnVariables();
710 
712 
713  self ‪util::freeze_player_controls( false );
714 
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;
722 
723  if ( isdefined( useDefaultCallback ) && useDefaultCallback )
725  else
726  [[level.onSpawnIntermission]]( ‪endGame );
727  self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
728 }
729 
731 {
732  player_to_spawn = undefined;
733 
734  // find the first dead player who is not already waiting to spawn
735  for (i = 0; i < level.deadPlayers[team].size; i++)
736  {
737  player = level.deadPlayers[team][i];
738 
739  if ( player.waitingToSpawn )
740  continue;
741 
742  player_to_spawn = player;
743  break;
744  }
745 
746  if ( isdefined(player_to_spawn) )
747  {
748  player_to_spawn.allowQueueSpawn = true;
749 
750  player_to_spawn ‪globallogic_ui::closeMenus();
751  player_to_spawn thread [[level.spawnClient]]();
752  }
753 }
754 
755 function ‪spawnQueuedClient( dead_player_team, killer )
756 {
757  if ( !level.playerQueuedRespawn )
758  return;
759 
761 
762  spawn_team = undefined;
763 
764  if ( isdefined( killer ) && isdefined( killer.team ) && isdefined( level.teams[ killer.team ] ) )
765  spawn_team = killer.team;
766 
767  if ( isdefined( spawn_team ) )
768  {
769  ‪spawnQueuedClientOnTeam( spawn_team );
770  return;
771  }
772 
773  // we could not determine the killer team so spawn a player from each team
774  // there may be ways to exploit this by killing someone and the switching to spectator
775  foreach( team in level.teams )
776  {
777  if ( team == dead_player_team )
778  continue;
779 
781  }
782 }
783 
785 {
786  if ( !level.teambased )
787  return false;
788 
789  if ( level.scoreLimit <= 1 )
790  return false;
791 
792  foreach( team in level.teams )
793  {
794  if ( !(game["teamScores"][team] >= level.scoreLimit - 1) )
795  return false;
796  }
797 
798  return true;
799 }
800 
802 {
803  if ( ‪util::wasLastRound() )
804  return false;
805 
806  if ( ‪util::isOneRound() )
807  return false;
808 
809  if ( ( isdefined( level.livesDoNotReset ) && level.livesDoNotReset ) )
810  return false;
811 
813  return false;
814 
815  return true;
816 }
817 
819 {
820  ‪util::setLowerMessage( game["strings"]["spawn_next_round"] );
822 }
823 
825 {
827  {
828  self thread [[level.spawnMessage]]();
829  }
830 }
831 
832 function ‪spawnClient( timeAlreadyPassed )
833 {
834  assert( isdefined( self.team ) );
835  assert( ‪globallogic_utils::isValidClass( self.curClass ) );
836 
837  if ( !self ‪maySpawn() && !‪IS_TRUE(self.usedResurrect) )
838  {
839  currentorigin = self.origin;
840  currentangles = self.angles;
841 
842  self ‪showSpawnMessage();
843 
844  self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
845  return;
846  }
847 
848  if ( self.waitingToSpawn )
849  {
850  return;
851  }
852  self.waitingToSpawn = true;
853  self.allowQueueSpawn = undefined;
854 
855  self ‪waitAndSpawnClient( timeAlreadyPassed );
856 
857  if ( isdefined( self ) )
858  self.waitingToSpawn = false;
859 }
860 
861 function ‪waitAndSpawnClient( timeAlreadyPassed )
862 {
863  self endon ( "disconnect" );
864  self endon ( "end_respawn" );
865  level endon ( "game_ended" );
866 
867  if ( !isdefined( timeAlreadyPassed ) )
868  timeAlreadyPassed = 0;
869 
870  spawnedAsSpectator = false;
871 
872  if ( ‪IS_TRUE( self.teamKillPunish ) )
873  {
874  teamKillDelay = ‪globallogic_player::TeamKillDelay();
875  if ( teamKillDelay > timeAlreadyPassed )
876  {
877  teamKillDelay -= timeAlreadyPassed;
878  timeAlreadyPassed = 0;
879  }
880  else
881  {
882  timeAlreadyPassed -= teamKillDelay;
883  teamKillDelay = 0;
884  }
885 
886  if ( teamKillDelay > 0 )
887  {
888  ‪util::setLowerMessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamKillDelay );
889 
890  self thread ‪respawn_asSpectator( self.origin + (0, 0, 60), self.angles );
891  spawnedAsSpectator = true;
892 
893  wait( teamKillDelay );
894  }
895 
896  self.teamKillPunish = false;
897  }
898 
899  if ( !isdefined( self.waveSpawnIndex ) && isdefined( level.wavePlayerSpawnIndex[self.team] ) )
900  {
901  self.waveSpawnIndex = level.wavePlayerSpawnIndex[self.team];
902  level.wavePlayerSpawnIndex[self.team]++;
903  }
904 
905  timeUntilSpawn = ‪TimeUntilSpawn( false );
906  if ( timeUntilSpawn > timeAlreadyPassed )
907  {
908  timeUntilSpawn -= timeAlreadyPassed;
909  timeAlreadyPassed = 0;
910  }
911  else
912  {
913  timeAlreadyPassed -= timeUntilSpawn;
914  timeUntilSpawn = 0;
915  }
916 
917  if ( timeUntilSpawn > 0 )
918  {
919  // spawn player into spectator on death during respawn delay, if he switches teams during this time, he will respawn next round
920  if ( level.playerQueuedRespawn )
921  ‪util::setLowerMessage( game["strings"]["you_will_spawn"], timeUntilSpawn );
922  else if ( self IsSplitscreen() )
923  ‪util::setLowerMessage( game["strings"]["waiting_to_spawn_ss"], timeUntilSpawn, true );
924  else
925  ‪util::setLowerMessage( game["strings"]["waiting_to_spawn"], timeUntilSpawn );
926 
927  if ( !spawnedAsSpectator )
928  {
929  spawnOrigin = self.origin + (0, 0, 60);
930  spawnAngles = self.angles;
931  if ( isdefined ( level.useIntermissionPointsOnWaveSpawn ) && [[level.useIntermissionPointsOnWaveSpawn]]() == true )
932  {
934  if ( isdefined( spawnPoint ) )
935  {
936  spawnOrigin = spawnPoint.origin;
937  spawnAngles = spawnPoint.angles;
938  }
939  }
940 
941  self thread ‪respawn_asSpectator( spawnOrigin, spawnAngles );
942  }
943  spawnedAsSpectator = true;
944 
945  self ‪globallogic_utils::waitForTimeOrNotify( timeUntilSpawn, "force_spawn" );
946 
947  self notify("stop_wait_safe_spawn_button");
948  }
949 
950  if ( isdefined( level.gametypeSpawnWaiter ) )
951  {
952  if ( !spawnedAsSpectator )
953  self thread ‪respawn_asSpectator( self.origin + (0, 0, 60), self.angles );
954  spawnedAsSpectator = true;
955 
956  if ( !self [[level.gametypeSpawnWaiter]]() )
957  {
958  self.waitingToSpawn = false;
959 
961 
962  self.waveSpawnIndex = undefined;
963  self.respawnTimerStartTime = undefined;
964 
965  return;
966  }
967  }
968 
969  waveBased = (level.waveRespawnDelay > 0);
970  if ( !level.playerForceRespawn && self.hasSpawned && !waveBased && !self.wantSafeSpawn && !level.playerQueuedRespawn )
971  {
972  ‪util::setLowerMessage( game["strings"]["press_to_spawn"] );
973 
974  if ( !spawnedAsSpectator )
975  self thread ‪respawn_asSpectator( self.origin + (0, 0, 60), self.angles );
976  spawnedAsSpectator = true;
977 
979  }
980 
981  self.waitingToSpawn = false;
982 
984 
985  self.waveSpawnIndex = undefined;
986  self.respawnTimerStartTime = undefined;
987 
988  if( isdefined( level.playerIncrementalRespawnDelay ) )
989  {
990  if( isdefined( self.pers["spawns"] ) )
991  self.pers["spawns"]++;
992  else
993  self.pers["spawns"] = 1;
994  }
995 
996  self thread [[level.spawnPlayer]]();
997 }
998 
1000 {
1001  self endon("disconnect");
1002  self endon("end_respawn");
1003 
1004  while (1)
1005  {
1006  if ( self useButtonPressed() )
1007  break;
1008 
1009  wait .05;
1010  }
1011 }
1012 
1014 {
1015  self endon("disconnect");
1016  self endon("end_respawn");
1017 
1018  if ( !level.inGracePeriod && !level.useStartSpawns )
1019  {
1020  currentorigin = self.origin;
1021  currentangles = self.angles;
1022 
1023  self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
1024 
1025  self waittill("queue_respawn" );
1026  }
1027 }
1028 
1029 function ‪setThirdPerson( value )
1030 {
1031  if( !level.console )
1032  return;
1033 
1034  if ( !isdefined( self.spectatingThirdPerson ) || value != self.spectatingThirdPerson )
1035  {
1036  self.spectatingThirdPerson = value;
1037  if ( value )
1038  {
1039  self SetClientThirdPerson( 1 );
1040  self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
1041  }
1042  else
1043  {
1044  self SetClientThirdPerson( 0 );
1045  self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
1046  }
1047  self resetFov();
1048  }
1049 }
1050 
1051 
1053 {
1054  resetTimeout();
1055 
1056  // Stop shellshock and rumble
1057  self StopShellshock();
1058  self StopRumble( "damage_heavy" );
1059 }
‪endGame
‪function endGame(winner, endReasonText)
Definition: _globallogic.gsc:1950
‪forceSpawn
‪function forceSpawn(time)
Definition: _globallogic_spawn.gsc:589
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪waitAndSpawnClient
‪function waitAndSpawnClient(timeAlreadyPassed)
Definition: _globallogic_spawn.gsc:861
‪set_music_on_player
‪function set_music_on_player(state, wait_time=0, save_state=false, return_state=false)
Definition: _globallogic_audio.gsc:1053
‪isOneRound
‪function isOneRound()
Definition: util_shared.gsc:3497
‪spectatorThirdPersonness
‪function spectatorThirdPersonness()
Definition: _globallogic_spawn.gsc:578
‪kickIfIDontSpawnInternal
‪function kickIfIDontSpawnInternal()
Definition: _globallogic_spawn.gsc:632
‪giveLoadout
‪function giveLoadout(team, weaponclass)
Definition: _loadout.gsc:1088
‪showPerks
‪function showPerks()
Definition: hud_util_shared.gsc:904
‪closeMenus
‪function closeMenus()
Definition: _globallogic_ui.gsc:416
‪waitRespawnOrSafeSpawnButton
‪function waitRespawnOrSafeSpawnButton()
Definition: _globallogic_spawn.gsc:999
‪doInitialSpawnMessaging
‪function doInitialSpawnMessaging()
Definition: _globallogic_spawn.gsc:185
‪spawnPlayer
‪function spawnPlayer()
Definition: _globallogic_spawn.gsc:227
‪resetAttackersThisSpawnList
‪function resetAttackersThisSpawnList()
Definition: _globallogic_player.gsc:2395
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪in_spawnSpectator
‪function in_spawnSpectator(origin, angles)
Definition: _globallogic_spawn.gsc:546
‪player_monitor_swimming
‪function player_monitor_swimming()
Definition: _globallogic_player.gsc:474
‪maySpawn
‪function maySpawn()
Definition: _globallogic_spawn.gsc:93
‪sndDelayedMusicStart
‪function sndDelayedMusicStart(music)
Definition: _globallogic_spawn.gsc:518
‪_setPlayerMomentum
‪function _setPlayerMomentum(player, momentum, updateScore=true)
Definition: _globallogic_score.gsc:584
‪set_permissions_for_machine
‪function set_permissions_for_machine()
Definition: _spectating.gsc:184
‪waitLongDurationWithHostMigrationPause
‪function waitLongDurationWithHostMigrationPause(duration)
Definition: hostmigration_shared.gsc:216
‪freezePlayerForRoundEnd
‪function freezePlayerForRoundEnd()
Definition: _globallogic_player.gsc:81
‪spawnQueuedClientOnTeam
‪function spawnQueuedClientOnTeam(team)
Definition: _globallogic_spawn.gsc:730
‪freeze_player_controls
‪function freeze_player_controls(b_frozen=true)
Definition: util_shared.gsc:2474
‪resetPlayerMomentumOnSpawn
‪function resetPlayerMomentumOnSpawn()
Definition: _globallogic_score.gsc:377
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪if
‪if(on_off)
Definition: util_shared.csc:908
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪giveLoadoutLevelSpecific
‪function giveLoadoutLevelSpecific(team, _class)
Definition: _globallogic_spawn.gsc:172
‪gameHistoryPlayerKicked
‪function gameHistoryPlayerKicked()
Definition: _globallogic.gsc:1394
‪noteMomentumOnGameEnded
‪function noteMomentumOnGameEnded()
Definition: _globallogic_spawn.gsc:503
‪player_monitor_slide
‪function player_monitor_slide()
Definition: _globallogic_player.gsc:502
‪set_lighting_state
‪function set_lighting_state(n_state)
Definition: util_shared.gsc:3037
‪wasLastRound
‪function wasLastRound()
Definition: util_shared.gsc:3521
‪resetUsability
‪function resetUsability()
Definition: util_shared.gsc:1130
‪player_monitor_travel_dist
‪function player_monitor_travel_dist()
Definition: _globallogic_player.gsc:368
‪player_monitor_wall_run
‪function player_monitor_wall_run()
Definition: _globallogic_player.gsc:446
‪kickIfDontSpawn
‪function kickIfDontSpawn()
Definition: _globallogic_spawn.gsc:619
‪suicide
‪function suicide()
Definition: _vehicle.gsc:1309
‪TimeUntilSpawn
‪function TimeUntilSpawn(includeTeamkillDelay)
Definition: _globallogic_spawn.gsc:37
‪removeSpawnMessageShortly
‪function removeSpawnMessageShortly(delay)
Definition: _globallogic_ui.gsc:649
‪stopPoisoningAndFlareOnSpawn
‪function stopPoisoningAndFlareOnSpawn()
Definition: _globallogic_spawn.gsc:152
‪updateTeamStatus
‪function updateTeamStatus()
Definition: _globallogic.gsc:2920
‪setThirdPerson
‪function setThirdPerson(value)
Definition: _globallogic_spawn.gsc:1029
‪getTimePassed
‪function getTimePassed()
Definition: _globallogic_utils.gsc:274
‪player_monitor_inactivity
‪function player_monitor_inactivity()
Definition: _globallogic_player.gsc:555
‪waitForTimeOrNotify
‪function waitForTimeOrNotify(time, notifyname)
Definition: _globallogic_utils.gsc:378
‪setClass
‪function setClass(newClass)
Definition: _loadout.gsc:1214
‪showSpawnMessage
‪function showSpawnMessage()
Definition: _globallogic_spawn.gsc:824
‪respawn_asSpectator
‪function respawn_asSpectator(origin, angles)
Definition: _globallogic_spawn.gsc:540
‪default_onSpawnIntermission
‪function default_onSpawnIntermission(endGame)
Definition: _globallogic_defaults.gsc:310
‪allTeamsHaveExisted
‪function allTeamsHaveExisted()
Definition: _globallogic_spawn.gsc:82
‪spawnInterRoundIntermission
‪function spawnInterRoundIntermission()
Definition: _globallogic_spawn.gsc:678
‪isValidClass
‪function isValidClass(c)
Definition: _globallogic_utils.gsc:144
‪showInitialFactionPopup
‪function showInitialFactionPopup(team)
Definition: hud_message_shared.gsc:101
‪onSpawnPlayer
‪function onSpawnPlayer(predictedSpawn)
Definition: _spawning.gsc:688
‪isFirstRound
‪function isFirstRound()
Definition: util_shared.gsc:3505
‪getObjectiveHintText
‪function getObjectiveHintText(team)
Definition: _util.gsc:610
‪player_monitor_doublejump
‪function player_monitor_doublejump()
Definition: _globallogic_player.gsc:528
‪ApplyRoundStartDelay
‪function ApplyRoundStartDelay()
Definition: _globallogic_utils.gsc:255
‪kickWait
‪function kickWait(waittime)
Definition: _globallogic_spawn.gsc:672
‪default_spawnMessage
‪function default_spawnMessage()
Definition: _globallogic_spawn.gsc:818
‪spawnSpectator
‪function spawnSpectator(origin, angles)
Definition: _globallogic_spawn.gsc:532
‪spawnQueuedClient
‪function spawnQueuedClient(dead_player_team, killer)
Definition: _globallogic_spawn.gsc:755
‪killstreak_waiter
‪function killstreak_waiter()
Definition: _killstreaks.gsc:1530
‪hintMessage
‪function hintMessage(hintText, duration)
Definition: hud_message_shared.gsc:79
‪allTeamsNearScoreLimit
‪function allTeamsNearScoreLimit()
Definition: _globallogic_spawn.gsc:784
‪shouldShowRespawnMessage
‪function shouldShowRespawnMessage()
Definition: _globallogic_spawn.gsc:801
‪TeamKillDelay
‪function TeamKillDelay()
Definition: _globallogic_player.gsc:3915
‪setLowerMessage
‪function setLowerMessage(text, time, combineMessageAndTimer)
Definition: _util.gsc:86
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪spawnIntermission
‪function spawnIntermission(useDefaultCallback, endGame)
Definition: _globallogic_spawn.gsc:703
‪spawnClient
‪function spawnClient(timeAlreadyPassed)
Definition: _globallogic_spawn.gsc:832
‪leader_dialog_on_player
‪function leader_dialog_on_player(dialogKey, objectiveKey, killstreakId, dialogBufferKey, introDialog)
Definition: _globallogic_audio.gsc:460
‪resetAttackerList
‪function resetAttackerList()
Definition: _globallogic_player.gsc:2387
‪WaitTillSlowProcessAllowed
‪function WaitTillSlowProcessAllowed()
Definition: util_shared.gsc:2536
‪updateTeamOps
‪function updateTeamOps(event, player, team)
Definition: _teamops.gsc:223
‪get_random_intermission_point
‪function get_random_intermission_point()
Definition: _spawnlogic.gsc:54
‪waitInSpawnQueue
‪function waitInSpawnQueue()
Definition: _globallogic_spawn.gsc:1013
‪spawnPlayerPrediction
‪function spawnPlayerPrediction()
Definition: _globallogic_spawn.gsc:162
‪TimeUntilWaveSpawn
‪function TimeUntilWaveSpawn(minimumWait)
Definition: _globallogic_spawn.gsc:127
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪setSpawnVariables
‪function setSpawnVariables()
Definition: _globallogic_spawn.gsc:1052
‪clearLowerMessage
‪function clearLowerMessage(fadetime)
Definition: _util.gsc:166