‪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\codescripts\struct;
2 
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;
8 
9 #insert scripts\shared\shared.gsh;
10 
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;
22 
23 #using scripts\zm\_util;
24 #using scripts\zm\_zm_perks;
25 
26 #namespace globallogic_spawn;
27 
28 #precache( "eventstring", "player_spawned" );
29 
30 function autoexec ‪init()
31 {
32  ‪DEFAULT(level.giveStartLoadout, &‪giveStartLoadout);
33 }
34 
35 function ‪TimeUntilSpawn( includeTeamkillDelay )
36 {
37  if ( level.inGracePeriod && !self.hasSpawned )
38  return 0;
39 
40  respawnDelay = 0;
41  if ( self.hasSpawned )
42  {
43  ‪result = self [[level.onRespawnDelay]]();
44  if ( isdefined( ‪result ) )
45  respawnDelay = ‪result;
46  else
47  respawnDelay = level.playerRespawnDelay;
48 
49  if ( includeTeamkillDelay && ‪IS_TRUE( self.teamKillPunish ) )
50  respawnDelay += ‪globallogic_player::TeamKillDelay();
51  }
52 
53  waveBased = (level.waveRespawnDelay > 0);
54 
55  if ( waveBased )
56  return self ‪TimeUntilWaveSpawn( respawnDelay );
57 
58  return respawnDelay;
59 }
60 
62 {
63  foreach( team in level.teams )
64  {
65  if ( !level.everExisted[ team ] )
66  return false;
67  }
68 
69  return true;
70 }
71 
72 function ‪maySpawn()
73 {
74  if ( isdefined( level.playerMaySpawn ) && !( self [[level.playerMaySpawn]]() ) )
75  {
76  return false;
77  }
78 
79  if ( level.inOvertime )
80  return false;
81 
82  if ( level.playerQueuedRespawn && !isdefined(self.allowQueueSpawn) && !level.inGracePeriod && !level.useStartSpawns )
83  return false;
84 
85  if ( level.numLives )
86  {
87  if ( level.teamBased )
88  gameHasStarted = ( ‪allTeamsHaveExisted() );
89  else
90  gameHasStarted = (level.maxPlayerCount > 1) || ( !‪util::isOneRound() && !‪util::isFirstRound() );
91 
92  if ( !self.pers["lives"] && gameHasStarted )
93  {
94  return false;
95  }
96  else if ( gameHasStarted )
97  {
98  // disallow spawning for late comers
99  if ( !level.inGracePeriod && !self.hasSpawned && !level.wagerMatch )
100  return false;
101  }
102  }
103  return true;
104 }
105 
106 function ‪TimeUntilWaveSpawn( minimumWait )
107 {
108  // the time we'll spawn if we only wait the minimum wait.
109  earliestSpawnTime = gettime() + minimumWait * 1000;
110 
111  lastWaveTime = level.lastWave[self.pers["team"]];
112  waveDelay = level.waveDelay[self.pers["team"]] * 1000;
113 
114  if( waveDelay == 0 )
115  return 0;
116 
117  // the number of waves that will have passed since the last wave happened, when the minimum wait is over.
118  numWavesPassedEarliestSpawnTime = (earliestSpawnTime - lastWaveTime) / waveDelay;
119  // rounded up
120  numWaves = ceil( numWavesPassedEarliestSpawnTime );
121 
122  timeOfSpawn = lastWaveTime + numWaves * waveDelay;
123 
124  // avoid spawning everyone on the same frame
125  if ( isdefined( self.waveSpawnIndex ) )
126  timeOfSpawn += 50 * self.waveSpawnIndex;
127 
128  return (timeOfSpawn - gettime()) / 1000;
129 }
130 
132 {
133  self endon("disconnect");
134 
135  self.inPoisonArea = false;
136  self.inBurnArea = false;
137  self.inFlareVisionArea = false;
138  self.inGroundNapalm = false;
139 }
140 
142 {
143  self endon ( "disconnect" );
144  self endon ( "end_respawn" );
145  self endon ( "game_ended" );
146  self endon ( "joined_spectators");
147  self endon ( "spawned");
148 
149  while (1)
150  {
151  // wait some time between predictions
152  wait( 0.5 );
153 
154  //pixbeginevent("onSpawnPlayer_Prediction");
155 
156  if ( isdefined( level.onSpawnPlayerUnified )
157  && GetDvarInt( "scr_disableunifiedspawning" ) == 0 )
158  { // this is slightly inaccurate, we should probably call the gametype specific unified spawn, however this is prevents us having to pass the arg all the way through each gametype.
160  }
161  else
162  {
163  self [[level.onSpawnPlayer]](true);
164  }
165 
166  //pixendevent();
167  }
168 }
169 
170 
171 
172 function ‪giveLoadoutLevelSpecific( team, _class )
173 {
174  pixbeginevent("giveLoadoutLevelSpecific");
175 
176  if ( isdefined( level.giveCustomCharacters ) )
177  {
178  self [[level.giveCustomCharacters]]();
179  //TODO: Update the stat lookup to set the correct character index
180  //self SetDStat( "characterContext", "characterIndex", self GetCharacterBodyType() );
181  }
182 
183  if ( isdefined( level.giveStartLoadout ) )
184  {
185  self [[level.giveStartLoadout]]();
186  }
187 
188  self ‪flagsys::set( "loadout_given" );
189  ‪callback::callback( #"on_loadout" );
190 
191  pixendevent();
192 }
193 
194 
196 {
197  if ( isdefined( level.giveCustomLoadout ) )
198  {
199  self [[level.giveCustomLoadout]]();
200  }
201 }
202 
203 
204 
205 
206 function ‪spawnPlayer()
207 {
208  pixbeginevent( "spawnPlayer_preUTS" );
209 
210  //profilelog_begintiming( 3, "ship" );
211 
212  self endon("disconnect");
213  self endon("joined_spectators");
214  self notify("spawned");
215  level notify("player_spawned");
216  self notify("end_respawn");
217 
218  self ‪setSpawnVariables();
219  self LUINotifyEvent( &"player_spawned", 0 );
220 
221  if (!self.hasSpawned)
222  {
223  //if this is the first spawn, kicking off a thread to start the gamplay music
224  self.underscoreChance = 70;
226  }
227 
228  self.sessionteam = self.team;
229 
230  hadSpawned = self.hasSpawned;
231 
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" );
241  else
242  self.maxhealth = level.playerMaxHealth;
243  self.health = self.maxhealth;
244  self.friendlydamage = undefined;
245  self.hasSpawned = true;
246  self.spawnTime = getTime();
247  self.afk = false;
248  if ( self.pers["lives"] && ( !isdefined( level.takeLivesOnDeath ) || ( level.takeLivesOnDeath == false ) ) )
249  {
250  self.pers["lives"]--;
251  if ( self.pers["lives"] == 0 )
252  {
253  level notify( "player_eliminated" );
254  self notify( "player_eliminated" );
255  }
256  }
257  self.lastStand = undefined;
258  self.revivingTeammate = false;
259  self.burning = undefined;
260  self.nextKillstreakFree = undefined;
261 
262  self.activeUAVs = 0;
263  self.activeCounterUAVs = 0;
264  self.activeSatellites = 0;
265  self.deathMachineKills = 0;
266 
267  self.disabledWeapon = 0;
269 
271 
272  self.diedOnVehicle= undefined;
273 
274  if ( !self.wasAliveAtMatchStart )
275  {
276  if ( level.inGracePeriod || ‪globallogic_utils::getTimePassed() < 20 * 1000 )
277  self.wasAliveAtMatchStart = true;
278  }
279 
280  self setDepthOfField( 0, 0, 512, 512, 4, 0 );
281  self resetFov();
282 
283 
284  {
285  pixbeginevent("onSpawnPlayer");
286  if ( isdefined( level.onSpawnPlayerUnified )
287  && GetDvarint( "scr_disableunifiedspawning" ) == 0 )
288  {
289  self [[level.onSpawnPlayerUnified]]();
290  }
291  else
292  {
293  self [[level.onSpawnPlayer]](false);
294  }
295 
296  if ( isdefined( level.playerSpawnedCB ) )
297  {
298  self [[level.playerSpawnedCB]]();
299  }
300  pixendevent();
301  }
302 
303  pixendevent();// "END: spawnPlayer_preUTS"
304 
305  level thread ‪globallogic::updateTeamStatus();
306 
307  pixbeginevent( "spawnPlayer_postUTS" );
308 
309  self thread ‪stopPoisoningAndFlareOnSpawn();
310 
311  assert( ‪globallogic_utils::isValidClass( self.curClass ) );
312 
313  //if( SessionModeIsZombiesGame() )
314  //{
315  self ‪giveLoadoutLevelSpecific( self.team, self.curClass );
316  //}
317  //else
318  //{
319  // self _class::setClass( self.class );
320  // self _class::giveLoadout( self.team, self.class );
321  //}
322 
323  if ( level.inPrematchPeriod )
324  {
325  self ‪util::freeze_player_controls( true );
326 
327  team = self.pers["team"];
328 
329 //CDC New music system
330  if( isdefined( self.pers["music"].‪spawn ) && self.pers["music"].‪spawn == false )
331  {
332 
333  if (level.wagerMatch)
334  {
335  music = "SPAWN_WAGER";
336  }
337  else
338  {
339  music = game["music"]["spawn_" + team];
340  }
341  self thread ‪globallogic_audio::set_music_on_player( music, false, false );
342 
343  self.pers["music"].spawn = true;
344  }
345 
346  if ( level.splitscreen )
347  {
348  if ( isdefined( level.playedStartingMusic ) )
349  music = undefined;
350  else
351  level.playedStartingMusic = true;
352  }
353 
354  if( !isdefined(level.disablePrematchMessages) || (level.disablePrematchMessages==false) )
355  {
357 
358  ‪hintMessage = ‪util::getObjectiveHintText( self.pers["team"] );
359  if ( isdefined( ‪hintMessage ) )
360  {
362  }
363 
364  if ( isdefined( game["dialog"]["gametype"] ) && (!level.splitscreen || self == level.players[0]) )
365  {
366  if( !isdefined( level.inFinalFight ) || !level.inFinalFight )
367  {
368  if( level.hardcoreMode )
369  self ‪globallogic_audio::leaderDialogOnPlayer( "gametype_hardcore" );
370  else
372  }
373  }
374 
375  if ( team == game["attackers"] )
376  self ‪globallogic_audio::leaderDialogOnPlayer( "offense_obj", "introboost" );
377  else
378  self ‪globallogic_audio::leaderDialogOnPlayer( "defense_obj", "introboost" );
379  }
380  }
381  else
382  {
383  self ‪util::freeze_player_controls( false );
384  self enableWeapons();
385  if ( !hadSpawned && game["state"] == "playing" )
386  {
387  pixbeginevent("sound");
388  team = self.team;
389 
390 //CDC New music system TODO add short spawn music
391  if( isdefined( self.pers["music"].‪spawn ) && self.pers["music"].‪spawn == false )
392  {
393  self thread ‪globallogic_audio::set_music_on_player( "SPAWN_SHORT", false, false );
394  self.pers["music"].spawn = true;
395  }
396  if ( level.splitscreen )
397  {
398  if ( isdefined( level.playedStartingMusic ) )
399  music = undefined;
400  else
401  level.playedStartingMusic = true;
402  }
403 
404  if( !isdefined(level.disablePrematchMessages) || (level.disablePrematchMessages==false) )
405  {
407 
408  ‪hintMessage = ‪util::getObjectiveHintText( self.pers["team"] );
409  if ( isdefined( ‪hintMessage ) )
410  {
412  }
413 
414  if ( isdefined( game["dialog"]["gametype"] ) && (!level.splitscreen || self == level.players[0]) )
415  {
416  if( !isdefined( level.inFinalFight ) || !level.inFinalFight )
417  {
418  if( level.hardcoreMode )
419  self ‪globallogic_audio::leaderDialogOnPlayer( "gametype_hardcore" );
420  else
422  }
423  }
424 
425  if ( team == game["attackers"] )
426  self ‪globallogic_audio::leaderDialogOnPlayer( "offense_obj", "introboost" );
427  else
428  self ‪globallogic_audio::leaderDialogOnPlayer( "defense_obj", "introboost" );
429  }
430 
431  pixendevent();//"sound"
432  }
433  }
434 
435  if ( GetDvarString( "scr_showperksonspawn" ) == "" )
436  SetDvar( "scr_showperksonspawn", "0" );
437 
438  // Make sure that we dont show the perks on spawn if we are in hardcore.
439  if ( level.hardcoreMode )
440  SetDvar( "scr_showperksonspawn", "0" );
441 
442  if ( !level.splitscreen && GetDvarint( "scr_showperksonspawn" ) == 1 && game["state"] != "postgame" )
443  {
444  pixbeginevent("showperksonspawn");
445 
446  //Checks to make sure perks are allowed. - Leif
447  if ( level.perksEnabled == 1)
448  {
449  self ‪hud::showPerks( );
450  }
451 
452  pixendevent();//"showperksonspawn"
453  }
454 
455  if ( isdefined( self.pers["momentum"] ) )
456  {
457  self.momentum = self.pers["momentum"];
458  }
459 
460  pixendevent();//"END: spawnPlayer_postUTS"
461 
462  waittillframeend;
463 
464  self notify( "spawned_player" );
465  self ‪callback::callback( #"on_player_spawned" );
466 
467  //self _gametype_variants::onPlayerSpawn();
468 
469 
470 
471  SetDvar( "scr_selecting_location", "" );
472 
473  //if ( self util::is_bot() )
474  //{
475  // pixbeginevent("bot");
476  // self thread _bot::bot_spawn();
477  // pixendevent(); // "bot"
478  //}
479 
480  /*if( !SessionModeIsZombiesGame() )
481  {
482  self thread _killstreaks::killstreakWaiter();
483 
484  self thread _vehicles::vehicleDeathWaiter();
485  self thread _vehicles::turretDeathWaiter();
486  }
487  */
488 
489 
490  // Make sure max health is set back to default - Needed for persistent jugg upgrade
491  // There are numerous places the health is set, this one should override them all as the player is spawned (MikeA: 12/21/12)
492  self ‪zm_perks::perk_set_max_health_if_jugg( "health_reboot", true, false );
493 
494  if ( game["state"] == "postgame" )
495  {
496  assert( !level.intermission );
497  // We're in the victory screen, but before intermission
499  }
500 
503 }
504 
505 function ‪spawnSpectator( origin, angles )
506 {
507  self notify("spawned");
508  self notify("end_respawn");
509  ‪in_spawnSpectator( origin, angles );
510 }
511 
512 // spawnSpectator clone without notifies for spawning between respawn delays
513 function ‪respawn_asSpectator( origin, angles )
514 {
515  ‪in_spawnSpectator( origin, angles );
516 }
517 
518 // spawnSpectator helper
519 function ‪in_spawnSpectator( origin, angles )
520 {
521  pixmarker("BEGIN: in_spawnSpectator");
522  self ‪setSpawnVariables();
523 
524  // don't clear lower message if not actually a spectator,
525  // because it probably has important information like when we'll spawn
526  if ( self.pers["team"] == "spectator" )
528 
529  self.sessionstate = "spectator";
530  self.spectatorclient = -1;
531  self.killcamentity = -1;
532  self.archivetime = 0;
533  self.psoffsettime = 0;
534  self.friendlydamage = undefined;
535 
536  if(self.pers["team"] == "spectator")
537  self.statusicon = "";
538  else
539  self.statusicon = "hud_status_dead";
540 
542 
543  [[level.onSpawnSpectator]]( origin, angles );
544 
545  if ( level.teamBased && !level.splitscreen )
546  self thread ‪spectatorThirdPersonness();
547 
548  level thread ‪globallogic::updateTeamStatus();
549  pixmarker("END: in_spawnSpectator");
550 }
551 
553 {
554  self endon("disconnect");
555  self endon("spawned");
556 
557  self notify("spectator_thirdperson_thread");
558  self endon("spectator_thirdperson_thread");
559 
560  self.spectatingThirdPerson = false;
561 }
562 
563 function ‪forceSpawn( time )
564 {
565  self endon ( "death" );
566  self endon ( "disconnect" );
567  self endon ( "spawned" );
568 
569  if ( !isdefined( time ) )
570  {
571  time = 60;
572  }
573 
574  wait ( time );
575 
576  if ( self.hasSpawned )
577  return;
578 
579  if ( self.pers["team"] == "spectator" )
580  return;
581 
582  if ( !‪globallogic_utils::isValidClass( self.pers["class"] ) )
583  {
584  self.pers["class"] = "CLASS_CUSTOM1";
585  self.curClass = self.pers["class"];
586  }
587 
589  self thread [[level.spawnClient]]();
590 }
591 
592 
594 {
595  if ( self IsHost() )
596  {
597  // don't try to kick the host
598  return;
599  }
600 
602  // clear any client dvars here,
603  // like if we set anything to change the menu appearance to warn them of kickness
604 }
605 
607 {
608  self endon ( "death" );
609  self endon ( "disconnect" );
610  self endon ( "spawned" );
611 
612  waittime = 90;
613  if ( GetDvarString( "scr_kick_time") != "" )
614  waittime = GetDvarfloat( "scr_kick_time");
615  mintime = 45;
616  if ( GetDvarString( "scr_kick_mintime") != "" )
617  mintime = GetDvarfloat( "scr_kick_mintime");
618 
619  starttime = gettime();
620 
621  ‪kickWait( waittime );
622 
623  timePassed = (gettime() - starttime)/1000;
624  if ( timePassed < waittime - .1 && timePassed < mintime )
625  return;
626 
627  if ( self.hasSpawned )
628  return;
629 
630  if ( SessionModeIsPrivate() )
631  {
632  return;
633  }
634 
635  if ( self.pers["team"] == "spectator" )
636  return;
637 
638  kick( self getEntityNumber() );
639 }
640 
641 function ‪kickWait( waittime )
642 {
643  level endon("game_ended");
645 }
646 
648 {
649  self notify("spawned");
650  self notify("end_respawn");
651 
652  self ‪setSpawnVariables();
653 
655 
656  self ‪util::freeze_player_controls( false );
657 
658  self.sessionstate = "spectator";
659  self.spectatorclient = -1;
660  self.killcamentity = -1;
661  self.archivetime = 0;
662  self.psoffsettime = 0;
663  self.friendlydamage = undefined;
664 
666  self SetOrigin( self.origin );
667  self SetPlayerAngles( self.angles );
668  self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
669 }
670 
671 function ‪spawnIntermission( useDefaultCallback )
672 {
673  self notify("spawned");
674  self notify("end_respawn");
675  self endon("disconnect");
676 
677  self ‪setSpawnVariables();
678 
680 
681  self ‪util::freeze_player_controls( false );
682 
683  if ( level.rankedmatch && ‪util::wasLastRound() )
684  {
685 // self popups::displayEndGamePopUps();
686  if (( self.postGameMilestones || self.postGameContracts || self.postGamePromotion ) )
687  {
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" );
694 
695  self closeInGameMenu();
696 
697  waitTime = 4.0;
698  while ( waitTime )
699  {
700  wait ( 0.25 );
701  waitTime -= 0.25;
702  }
703  }
704  }
705 
706  self.sessionstate = "intermission";
707  self.spectatorclient = -1;
708  self.killcamentity = -1;
709  self.archivetime = 0;
710  self.psoffsettime = 0;
711  self.friendlydamage = undefined;
712 
713  if ( isdefined( useDefaultCallback ) && useDefaultCallback )
715  else
716  [[level.onSpawnIntermission]]();
717  self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
718 }
719 
721 {
722  player_to_spawn = undefined;
723 
724  // find the first dead player who is not already waiting to spawn
725  for (i = 0; i < level.deadPlayers[team].size; i++)
726  {
727  player = level.deadPlayers[team][i];
728 
729  if ( player.waitingToSpawn )
730  continue;
731 
732  player_to_spawn = player;
733  break;
734  }
735 
736  if ( isdefined(player_to_spawn) )
737  {
738  player_to_spawn.allowQueueSpawn = true;
739 
740  player_to_spawn ‪globallogic_ui::closeMenus();
741  player_to_spawn thread [[level.spawnClient]]();
742  }
743 }
744 
745 function ‪spawnQueuedClient( dead_player_team, killer )
746 {
747  if ( !level.playerQueuedRespawn )
748  return;
749 
751 
752  spawn_team = undefined;
753 
754  if ( isdefined( killer ) && isdefined( killer.team ) && isdefined( level.teams[ killer.team ] ) )
755  spawn_team = killer.team;
756 
757  if ( isdefined( spawn_team ) )
758  {
759  ‪spawnQueuedClientOnTeam( spawn_team );
760  return;
761  }
762 
763  // we could not determine the killer team so spawn a player from each team
764  // there may be ways to exploit this by killing someone and the switching to spectator
765  foreach( team in level.teams )
766  {
767  if ( team == dead_player_team )
768  continue;
769 
771  }
772 }
773 
775 {
776  if ( !level.teambased )
777  return false;
778 
779  if ( level.scoreLimit <= 1 )
780  return false;
781 
782  foreach( team in level.teams )
783  {
784  if ( !(game["teamScores"][team] >= level.scoreLimit - 1) )
785  return false;
786  }
787 
788  return true;
789 }
790 
792 {
793  if ( ‪util::wasLastRound() )
794  return false;
795 
796  if ( ‪util::isOneRound() )
797  return false;
798 
799  if ( ( isdefined( level.livesDoNotReset ) && level.livesDoNotReset ) )
800  return false;
801 
803  return false;
804 
805  return true;
806 }
807 
809 {
810  ‪util::setLowerMessage( game["strings"]["spawn_next_round"] );
812 }
813 
815 {
817  {
818  self thread [[level.spawnMessage]]();
819  }
820 }
821 
822 function ‪spawnClient( timeAlreadyPassed )
823 {
824  pixbeginevent("spawnClient");
825  assert( isdefined( self.team ) );
826  assert( ‪globallogic_utils::isValidClass( self.curClass ) );
827 
828  if ( !self ‪maySpawn() )
829  {
830  currentorigin = self.origin;
831  currentangles = self.angles;
832 
833  self ‪showSpawnMessage();
834 
835  self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
836  pixendevent();
837  return;
838  }
839 
840  if ( self.waitingToSpawn )
841  {
842  pixendevent();
843  return;
844  }
845  self.waitingToSpawn = true;
846  self.allowQueueSpawn = undefined;
847 
848  self ‪waitAndSpawnClient( timeAlreadyPassed );
849 
850  if ( isdefined( self ) )
851  self.waitingToSpawn = false;
852 
853  pixendevent();
854 }
855 
856 function ‪waitAndSpawnClient( timeAlreadyPassed )
857 {
858  self endon ( "disconnect" );
859  self endon ( "end_respawn" );
860  level endon ( "game_ended" );
861 
862  if ( !isdefined( timeAlreadyPassed ) )
863  timeAlreadyPassed = 0;
864 
865  spawnedAsSpectator = false;
866 
867  if ( ‪IS_TRUE( self.teamKillPunish ) )
868  {
869  teamKillDelay = ‪globallogic_player::TeamKillDelay();
870  if ( teamKillDelay > timeAlreadyPassed )
871  {
872  teamKillDelay -= timeAlreadyPassed;
873  timeAlreadyPassed = 0;
874  }
875  else
876  {
877  timeAlreadyPassed -= teamKillDelay;
878  teamKillDelay = 0;
879  }
880 
881  if ( teamKillDelay > 0 )
882  {
883  ‪util::setLowerMessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamKillDelay );
884 
885  self thread ‪respawn_asSpectator( self.origin + (0, 0, 60), self.angles );
886  spawnedAsSpectator = true;
887 
888  wait( teamKillDelay );
889  }
890 
891  self.teamKillPunish = false;
892  }
893 
894  if ( !isdefined( self.waveSpawnIndex ) && isdefined( level.wavePlayerSpawnIndex[self.team] ) )
895  {
896  self.waveSpawnIndex = level.wavePlayerSpawnIndex[self.team];
897  level.wavePlayerSpawnIndex[self.team]++;
898  }
899 
900  timeUntilSpawn = ‪TimeUntilSpawn( false );
901  if ( timeUntilSpawn > timeAlreadyPassed )
902  {
903  timeUntilSpawn -= timeAlreadyPassed;
904  timeAlreadyPassed = 0;
905  }
906  else
907  {
908  timeAlreadyPassed -= timeUntilSpawn;
909  timeUntilSpawn = 0;
910  }
911 
912  if ( timeUntilSpawn > 0 )
913  {
914  // spawn player into spectator on death during respawn delay, if he switches teams during this time, he will respawn next round
915  if ( level.playerQueuedRespawn )
916  ‪util::setLowerMessage( game["strings"]["you_will_spawn"], timeUntilSpawn );
917  else if ( self IsSplitscreen() )
918  ‪util::setLowerMessage( game["strings"]["waiting_to_spawn_ss"], timeUntilSpawn, true );
919  else
920  ‪util::setLowerMessage( game["strings"]["waiting_to_spawn"], timeUntilSpawn );
921 
922  if ( !spawnedAsSpectator )
923  {
924  spawnOrigin = self.origin + (0, 0, 60);
925  spawnAngles = self.angles;
926  if ( isdefined ( level.useIntermissionPointsOnWaveSpawn ) && [[level.useIntermissionPointsOnWaveSpawn]]() == true )
927  {
929  if ( isdefined( spawnPoint ) )
930  {
931  spawnOrigin = spawnPoint.origin;
932  spawnAngles = spawnPoint.angles;
933  }
934  }
935 
936  self thread ‪respawn_asSpectator( spawnOrigin, spawnAngles );
937  }
938  spawnedAsSpectator = true;
939 
940  self ‪globallogic_utils::waitForTimeOrNotify( timeUntilSpawn, "force_spawn" );
941 
942  self notify("stop_wait_safe_spawn_button");
943  }
944 
945  waveBased = (level.waveRespawnDelay > 0);
946  if ( !level.playerForceRespawn && self.hasSpawned && !waveBased && !self.wantSafeSpawn && !level.playerQueuedRespawn )
947  {
948  ‪util::setLowerMessage( game["strings"]["press_to_spawn"] );
949 
950  if ( !spawnedAsSpectator )
951  self thread ‪respawn_asSpectator( self.origin + (0, 0, 60), self.angles );
952  spawnedAsSpectator = true;
953 
955  }
956 
957 
958  self.waitingToSpawn = false;
959 
961 
962  self.waveSpawnIndex = undefined;
963  self.respawnTimerStartTime = undefined;
964 
965  self thread [[level.spawnPlayer]]();
966 }
967 
969 {
970  self endon("disconnect");
971  self endon("end_respawn");
972 
973  while (1)
974  {
975  if ( self useButtonPressed() )
976  break;
977 
978  wait .05;
979  }
980 }
981 
983 {
984  self endon("disconnect");
985  self endon("end_respawn");
986 
987  if ( !level.inGracePeriod && !level.useStartSpawns )
988  {
989  currentorigin = self.origin;
990  currentangles = self.angles;
991 
992  self thread [[level.spawnSpectator]]( currentorigin + (0, 0, 60), currentangles );
993 
994  self waittill("queue_respawn" );
995  }
996 }
997 
998 function ‪setThirdPerson( value )
999 {
1000  if( !level.console )
1001  return;
1002 
1003  if ( !isdefined( self.spectatingThirdPerson ) || value != self.spectatingThirdPerson )
1004  {
1005  self.spectatingThirdPerson = value;
1006  if ( value )
1007  {
1008  self SetClientThirdPerson( 1 );
1009  self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
1010  }
1011  else
1012  {
1013  self SetClientThirdPerson( 0 );
1014  self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
1015  }
1016  self resetFov();
1017  }
1018 }
1019 
1020 
1022 {
1023  resetTimeout();
1024 
1025  // Stop shellshock and rumble
1026  self StopShellshock();
1027  self StopRumble( "damage_heavy" );
1028 }
‪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
‪init
‪function autoexec init()
Definition: _globallogic_spawn.gsc:30
‪kickIfIDontSpawnInternal
‪function kickIfIDontSpawnInternal()
Definition: _globallogic_spawn.gsc:632
‪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
‪spawnPlayer
‪function spawnPlayer()
Definition: _globallogic_spawn.gsc:227
‪in_spawnSpectator
‪function in_spawnSpectator(origin, angles)
Definition: _globallogic_spawn.gsc:546
‪maySpawn
‪function maySpawn()
Definition: _globallogic_spawn.gsc:93
‪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
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪giveLoadoutLevelSpecific
‪function giveLoadoutLevelSpecific(team, _class)
Definition: _globallogic_spawn.gsc:172
‪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
‪setSpectatePermissionsForMachine
‪function setSpectatePermissionsForMachine()
Definition: _spectating.gsc:211
‪set_sun_shadow_split_distance
‪function set_sun_shadow_split_distance(f_distance)
Definition: util_shared.gsc:3079
‪kickIfDontSpawn
‪function kickIfDontSpawn()
Definition: _globallogic_spawn.gsc:619
‪TimeUntilSpawn
‪function TimeUntilSpawn(includeTeamkillDelay)
Definition: _globallogic_spawn.gsc:37
‪removeSpawnMessageShortly
‪function removeSpawnMessageShortly(delay)
Definition: _globallogic_ui.gsc:649
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪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
‪waitForTimeOrNotify
‪function waitForTimeOrNotify(time, notifyname)
Definition: _globallogic_utils.gsc:378
‪giveStartLoadout
‪function giveStartLoadout()
Definition: _globallogic_spawn.gsc:195
‪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
‪onSpawnPlayer_Unified
‪function onSpawnPlayer_Unified(predictedSpawn)
Definition: _spawning.gsc:524
‪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
‪isFirstRound
‪function isFirstRound()
Definition: util_shared.gsc:3505
‪getObjectiveHintText
‪function getObjectiveHintText(team)
Definition: _util.gsc:610
‪kickWait
‪function kickWait(waittime)
Definition: _globallogic_spawn.gsc:672
‪default_spawnMessage
‪function default_spawnMessage()
Definition: _globallogic_spawn.gsc:818
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪spawnSpectator
‪function spawnSpectator(origin, angles)
Definition: _globallogic_spawn.gsc:532
‪spawnQueuedClient
‪function spawnQueuedClient(dead_player_team, killer)
Definition: _globallogic_spawn.gsc:755
‪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
‪getRandomIntermissionPoint
‪function getRandomIntermissionPoint()
Definition: _spawnlogic.gsc:1435
‪resetAttackerList
‪function resetAttackerList()
Definition: _globallogic_player.gsc:2387
‪WaitTillSlowProcessAllowed
‪function WaitTillSlowProcessAllowed()
Definition: util_shared.gsc:2536
‪waitInSpawnQueue
‪function waitInSpawnQueue()
Definition: _globallogic_spawn.gsc:1013
‪sndStartMusicSystem
‪function sndStartMusicSystem()
Definition: _globallogic_audio.gsc:235
‪leaderDialogOnPlayer
‪function leaderDialogOnPlayer(dialog, group)
Definition: _globallogic_audio.gsc:548
‪spawnPlayerPrediction
‪function spawnPlayerPrediction()
Definition: _globallogic_spawn.gsc:162
‪TimeUntilWaveSpawn
‪function TimeUntilWaveSpawn(minimumWait)
Definition: _globallogic_spawn.gsc:127
‪perk_set_max_health_if_jugg
‪function perk_set_max_health_if_jugg(str_perk, set_preMaxHealth, clamp_health_to_max_health)
Definition: _zm_perks.gsc:791
‪setSpawnVariables
‪function setSpawnVariables()
Definition: _globallogic_spawn.gsc:1052
‪clearLowerMessage
‪function clearLowerMessage(fadetime)
Definition: _util.gsc:166