‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_spawning.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\util_shared;
6 
7 #insert scripts\shared\shared.gsh;
8 
9 #using scripts\zm\gametypes\_spawnlogic;
10 
11 #using scripts\zm\_util;
12 
13 #namespace spawning;
14 
15 //REGISTER_SYSTEM( "spawning", &__init__, undefined )
16 
17 /*
18 _spawning.gsc
19 function Copyright (c) 2008 Certain Affinity, Inc. All rights reserved.
20 Friday April 25, 2008 3:59pm Stefan S.
21 
22 spawn_point[]:
23 --------------
24 "origin" - worldspace origin
25 "score" - desirability for spawning; calculated by applying influencers plus a small amount of randomness
26 
27 spawn_influencer[]:
28 -------------------
29 "type" - one of: "static", "friend", "enemy", "enemy_weapon", "vehicle", "projectile", "airstrike", "dead_friend", "game_mode", "dog"
30 "shape" - one of: "sphere", "cylinder", "pill", "cone", "box"
31 "forward" - worldspace forward vector
32 "up" - worldspace up vector
33 "origin" - worldspace origin
34 "radius" - for sphere, cylinder, pill, cone
35 "axis_length" - for cylinder, pill, cone
36 "width", "height", "depth" - for box
37 "score" - base influencer score
38 "score_curve" - one of: "constant", "linear" (1->0), "inverse_linear" (0->1), "negative_to_positive" (-1 -> +1)
39 
40 level.recently_deceased["<teamname>"][]:
41 --------------------------
42 deceased.angles - angles of the deceased player at TOD
43 deceased.origin - origin of the deceased player at TOD
44 function deceased.timeOfDeathMillis - GetTime() value (in milliseconds) at TOD
45 */
46 
47 /*QUAKED zm_uspawn_point (1.0 0.549 0.0) (-16 -16 0) (16 16 72)
48 Unified spawn point. A player from any team can spawn here, based on spawn influencers. Use dvar "useUnifiedSpawning" to enable. Use targetname "allies_start" or "axis_start" to put a start influencer at that spawn point.*/
49 
50 /*QUAKED zm_uspawn_influencer (1 0 0) (-16 -16 -16) (16 16 16)
51 Static influencer for unified spawning system
52 "script_shape" Shape of this influencer. Supported shapes for Radiant-placed static influencers are "cylinder" and "sphere".
53 "radius" Radius of the influencer ( whether cylinder or sphere ).
54 "height" Height of the cylinder ( ignored for sphere shapes ).
55 "script_score" The maximum influence this influencer can have.
56 "script_score_curve" The shape of the score falloff as a function of the distance from the primary cylinder axis. Options are: "constant", "linear", "inverse_linear", "negative_to_positive"
57 "script_team" Make this influencer team-specific by specifying "axis" or "allies"
58 "script_gameobjectname" Gametypes for which the influencer is active (space-separated values), can be "[all_modes]" or combination of "dm", "hq", "iwar", "war", "twar", "sd", "dom"
59 "script_twar_flag" Used to associate this influencer with a specific twar flag
60 default:"script_shape" "cylinder"
61 default:"radius" "400"
62 default:"height" "100"
63 default:"script_score" "25"
64 default:"script_score_curve" "constant"
65 default:"script_team" "neutral"
66 default:"script_gameobjectname" "[all_modes]"
67 default:"script_twar_flag" "NONE"
68 */
69 
70 /*QUAKED zm_mobile_spawn (0.0 0.0 1.0) (-16 -16 0) (16 16 72)
71 Mobile spawn point. For use with the mobile spawn killstreak.*/
72 
73 /* ---------- includes */
74 
75 
76 /* ---------- initialization */
77 
78 function ‪__init__()
79 {
80  level ‪init_spawn_system();
81 
82  level.recently_deceased= [];
83  foreach( team in level.teams )
84  {
85  level.recently_deceased[ team ]= ‪util::spawn_array_struct();
86  }
87 
89 
90  level.spawnProtectionTime = GetGametypeSetting( "spawnprotectiontime" );
91  level.spawnProtectionTimeMS = int ( ‪VAL( level.spawnProtectionTime, 0 ) * 1000 );
92 
93  return;
94 }
95 
97 {
98  level.spawnsystem = spawnstruct();
99  spawnsystem = level.spawnsystem;
100 
101  if (!IsDefined( spawnsystem.unifiedSideSwitching ))
102  spawnsystem.unifiedSideSwitching = 1;
103 
104  spawnsystem.objective_facing_bonus = 0.0;
105 
106  spawnsystem.iSPAWN_TEAMMASK = [];
107  spawnsystem.iSPAWN_TEAMMASK_FREE = ( 1 << 0 );
108  spawnsystem.iSPAWN_TEAMMASK["free"] = spawnsystem.iSPAWN_TEAMMASK_FREE;
109  all = spawnsystem.iSPAWN_TEAMMASK_FREE;
110  count = 1;
111  foreach( team in level.teams )
112  {
113  spawnsystem.iSPAWN_TEAMMASK[team] = ( 1 << count );
114  all = all | spawnsystem.iSPAWN_TEAMMASK[team];
115  count++;
116  }
117  spawnsystem.iSPAWN_TEAMMASK["all"] = all;
118 }
119 
120 
121 /*
122 =============
123 onPlayerConnect
124 
125 =============
126 */
128 {
129  level endon ( "game_ended" );
130 
131  self setEnterTime( getTime() );
132 
135  self thread ‪onGrenadeThrow();
136 }
137 
138 
139 /*
140 =============
141 onPlayerSpawned
142 
143 =============
144 */
146 {
147  self endon( "disconnect" );
148  level endon ( "game_ended" );
149 
150  for(;;)
151  {
152  self waittill( "spawned_player" );
153 
154 
155  self ‪enable_player_influencers( true );
156  self thread ‪onDeath();
157  }
158 }
159 
160 
161 /*
162 =============
163 onDeath
164 
165 Drops any carried object when the player dies
166 =============
167 */
168 function ‪onDeath()
169 {
170  self endon( "disconnect" );
171  level endon ( "game_ended" );
172 
173  self waittill ( "death" );
174 
175  self ‪enable_player_influencers( false );
176 
177  // creating on the level so the player does not clean it up
178  level ‪create_friendly_influencer( "friend_dead", self.origin, self.team );
179 }
180 
181 /*
182 =============
183 onTeamChange
184 
185 Changes influencer teams when player changes teams
186 =============
187 */
189 {
190  self endon( "disconnect" );
191  level endon ( "game_ended" );
192 
194 }
195 
196 
197 /*
198 =============
199 onGrenadeThrow
200 
201 Creates an influencer on grenade
202 =============
203 */
205 {
206  self endon( "disconnect" );
207  level endon ( "game_ended" );
208 
209  while(1)
210  {
211  self waittill ( "grenade_fire", grenade, weapon );
212  level thread ‪create_grenade_influencers( self.pers["team"], weapon, grenade );
214  }
215 }
216 
218 {
219  if ( level.teambased )
220  {
221  team_mask = ‪util::getTeamMask( team );
222  }
223  else
224  {
225  team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
226  }
227 
228  return team_mask;
229 }
230 
231 function ‪get_enemy_team_mask( team )
232 {
233  if ( level.teambased )
234  {
235  team_mask = ‪util::getOtherTeamsMask( team );
236  }
237  else
238  {
239  team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
240  }
241 
242  return team_mask;
243 }
244 
245 function ‪create_influencer( ‪name, origin, team_mask )
246 {
247  self.influencers[‪name] = AddInfluencer( ‪name, origin, team_mask );
248 
249  self thread ‪watch_remove_influencer();
250 
251  return self.influencers[‪name];
252 }
253 
254 function ‪create_friendly_influencer( ‪name, origin, team )
255 {
256  team_mask = self ‪get_friendly_team_mask( team );
257 
258  self.influencersFriendly[‪name] = ‪create_influencer( ‪name, origin, team_mask );;
259 
260  return self.influencersFriendly[‪name];
261 }
262 
263 function ‪create_enemy_influencer( ‪name, origin, team )
264 {
265  team_mask = self ‪get_enemy_team_mask( team );
266 
267  self.influencersEnemy[‪name] = ‪create_influencer( ‪name, origin, team_mask );;
268 
269  return self.influencersEnemy[‪name];
270 }
271 
272 function ‪create_entity_influencer( ‪name, team_mask )
273 {
274  self.influencers[‪name] = AddEntityInfluencer( ‪name, self, team_mask );
275  return self.influencers[‪name] ;
276 }
277 
279 {
280  team_mask = self ‪get_friendly_team_mask();
281 
282  return self ‪create_entity_masked_friendly_influencer( ‪name, team_mask );
283 }
284 
286 {
287  team_mask = self ‪get_enemy_team_mask();
288 
289  return self ‪create_entity_masked_enemy_influencer( ‪name, team_mask );
290 }
291 
293 {
294  self.influencersFriendly[‪name] = self ‪create_entity_influencer( ‪name, team_mask );
295 
296  return self.influencersFriendly[‪name];
297 }
298 
300 {
301  self.influencersEnemy[‪name] = self ‪create_entity_influencer( ‪name, team_mask );
302 
303  return self.influencersEnemy[‪name];
304 }
305 
307 {
308  assert( !isdefined(self.influencers) );
309  assert( !isdefined(self.influencers) );
310 
311  if ( !level.teambased )
312  {
313  team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
314  other_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
315  weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
316  }
317  else if ( isdefined( self.pers["team"] ) )
318  {
319  team = self.pers["team"];
320  team_mask = ‪util::getTeamMask( team );
321  enemy_teams_mask = ‪util::getOtherTeamsMask( team );
322  }
323  else
324  {
325  team_mask = 0;
326  enemy_teams_mask = 0;
327  }
328 
329  angles = self.angles;
330  origin = self.origin;
331  up = (0,0,1);
332  forward = (1,0,0);
333 
334  self.influencers = [];
335  self.friendlyInfluencers = [];
336  self.enemyInfluencers = [];
337 
338  self ‪create_entity_masked_enemy_influencer( "enemy", enemy_teams_mask );
339 
340  if ( level.teambased )
341  {
342  self ‪create_entity_masked_friendly_influencer( "friend", team_mask );
343  }
344 
345  if ( !isdefined(self.pers["team"]) || self.pers["team"] == "spectator" )
346  {
347  self ‪enable_influencers( false );
348  }
349 }
350 
352 {
353  foreach ( influencer in self.influencers )
354  {
355  RemoveInfluencer( influencer );
356  }
357 
358  self.influencers = [];
359  if ( IsDefined( self.influencersFriendly ) )
360  {
361  self.influencersFriendly = [];
362  }
363  if ( IsDefined( self.influencersEnemy ) )
364  {
365  self.influencersEnemy = [];
366  }
367 }
368 
370 {
371  self endon("death");
372 
373  self notify("watch_remove_influencer" );
374  self endon("watch_remove_influencer" );
375 
376  self waittill("influencer_removed", index );
377 
378  ArrayRemoveValue( self.influencers, index );
379  ArrayRemoveValue( self.influencersFriendly, index );
380  ArrayRemoveValue( self.influencersEnemy, index );
381 
382  self thread ‪watch_remove_influencer();
383 }
384 
385 
386 function ‪enable_influencers( enabled )
387 {
388  foreach ( influencer in self.influencers )
389  {
390  EnableInfluencer( influencer, enabled );
391  }
392 }
393 
394 function ‪enable_player_influencers( enabled )
395 {
396  if (!isdefined(self.influencers))
398 
399  self ‪enable_influencers( enabled );
400 }
401 
403 {
404  if ( !level.teambased )
405  {
406  team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
407  enemy_teams_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
408  }
409  else
410  {
411  // for the player influencers we need to pay attention to the switchedsides
412  team = self.pers["team"];
413 
414  team_mask = ‪util::getTeamMask( team );
415  enemy_teams_mask = ‪util::getOtherTeamsMask( team );
416  }
417 
418  if ( isDefined( self.influencersFriendly ) )
419  {
420  foreach ( influencer in self.influencersFriendly )
421  {
422  SetInfluencerTeammask( influencer, team_mask );
423  }
424  }
425  if ( isDefined( self.influencersEnemy ) )
426  {
427  foreach ( influencer in self.influencersEnemy )
428  {
429  SetInfluencerTeammask( influencer, enemy_teams_mask );
430  }
431  }
432 }
433 
434 function ‪create_grenade_influencers( parent_team, weapon, grenade )
435 {
436  pixbeginevent("create_grenade_influencers");
437 
438  spawn_influencer = weapon.spawnInfluencer;
439 
440  if ( IsDefined( grenade.origin ) && spawn_influencer != "" )
441  {
442  if ( !level.teambased )
443  {
444  weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
445  }
446  else
447  {
448  weapon_team_mask = ‪util::getOtherTeamsMask( parent_team );
449 
450  // if this is hardcore then we do not want to spawn infront of the weapon either
451  if ( level.friendlyfire )
452  {
453  weapon_team_mask |= ‪util::getTeamMask( parent_team );
454  }
455  }
456 
457  grenade ‪create_entity_masked_enemy_influencer( spawn_influencer, weapon_team_mask );
458  }
459 
460  pixendevent();//"create_grenade_influencers" (moved from the bottom of the file - pix cannot extend over code with wait).
461 }
462 
464 {
465  staticInfluencerEnts = GetEntArray( "mp_uspawn_influencer", "classname" );
466 
467  for ( i = 0; i < staticInfluencerEnts.size; i++ )
468  {
469  staticInfluencerEnt = staticInfluencerEnts[ i ];
470 
471  ‪create_map_placed_influencer(staticInfluencerEnt);
472  }
473 }
474 
475 function ‪create_map_placed_influencer( influencer_entity )
476 {
477  influencer_id = -1;
478 
479  if (isdefined(influencer_entity.script_noteworty))
480  {
481  team_mask = ‪util::getTeamMask(influencer_entity.script_team);
482  level ‪create_enemy_influencer( influencer_entity.script_noteworty, influencer_entity.origin, team_mask );
483  }
484  else
485  {
486  assertmsg( "Radiant-placed spawn influencers require the 'script_noteworty' parameter" );
487  }
488 
489  return influencer_id;
490 }
491 
493 {
494  // force spawn points to get precached
495  foreach( team in level.teams )
496  {
497  ‪gatherSpawnPoints( team );
498  }
499 
501 
502  if ( level.teambased )
503  {
504  foreach( team in level.teams )
505  {
506  ‪spawnlogic::addSpawnPoints( team, level.unified_spawn_points[ team ].a );
507  }
508  }
509  else
510  {
511  foreach( team in level.teams )
512  {
513  ‪spawnlogic::addSpawnPoints( "free", level.unified_spawn_points[ team ].a );
514  }
515  }
516 
517  // this will remove all spawnpoints for the other gametypes which are not used
519 }
520 
521 /* ---------- spawn_point */
522 
523 //void - self= player entity for the player who is spawning
524 function ‪onSpawnPlayer_Unified(predictedSpawn)
525 {
526 
527  if (!isdefined( predictedSpawn ))
528  predictedSpawn = false;
529 
530  use_new_spawn_system= false;;
531  initial_spawn= true;
532 
533  if (isdefined(self.uspawn_already_spawned))
534  {
535  initial_spawn= !self.uspawn_already_spawned;
536  }
537 
538  if ( level.useStartSpawns )
539  {
540  use_new_spawn_system= false;
541  }
542 
543  // no respawn points for search & destroy, so don't run the new spawning system (it would needlessly abort on respawn attempt otherwise)
544  if (level.gametype=="sd")
545  {
546  use_new_spawn_system= false;
547  }
548 
549  ‪util::set_dvar_if_unset("scr_spawn_force_unified", "0");
550 
551 // spawnOverride = self _tacticalinsertion::overrideSpawn(predictedSpawn);
552 /*spawnOverride = undefined;
553  if (use_new_spawn_system || (GetDvarint( "scr_spawn_force_unified")!=0))
554  {
555  if ( !spawnOverride )
556  {
557  // find the most desireable spawn point, and spawn there
558  spawn_point = getSpawnPoint(self, predictedSpawn);
559 
560  if (isdefined(spawn_point))
561  {
562  origin = spawn_point["origin"];
563  angles = spawn_point["angles"];
564 
565  if (predictedSpawn)
566  {
567  // send this point as a message to the client
568  self predictSpawnPoint( origin, angles );
569  // println("predicted spawn - " + spawn_point.origin );
570  }
571  else
572  {
573  // create a negative influencer for the opposition here
574  level create_enemy_influencer( "enemy_spawn", origin, self.pers["team"] );
575  self spawn( origin, angles );
576  // println("spawn - " + spawn_point.origin );
577  }
578  }
579  else
580  {
581 
582  callback::abort_level();
583  }
584  }
585  else
586  {
587  if (predictedSpawn && isdefined( self.tacticalInsertion ))
588  {
589  // get the tactical insertion position
590  // send this point as a message to the client
591  self predictSpawnPoint( self.tacticalInsertion.origin, self.tacticalInsertion.angles );
592  // println("predicted spawn [TI] - " + self.tacticalInsertion.origin );
593  }
594  }
595 
596  if (!predictedSpawn)
597  {
598  self.lastspawntime = gettime();
599  self enable_player_influencers( true );
600  }
601  }
602  else if ( !spawnOverride )*/
603 // {
604  // old spawning logic
605  [[level.onSpawnPlayer]](predictedSpawn);
606 // }
607 
608  if (!predictedSpawn)
609  {
610  // remember that the player has initially spawned
611  self.uspawn_already_spawned= true;
612  }
613 
614  return;
615 }
616 
617 // spawnPoint: .origin, .angles
619  player_entity,
620  predictedSpawn )
621 {
622 
623  if (!isdefined( predictedSpawn ))
624  predictedSpawn = false;
625 
626  if (level.teambased )
627  {
628  point_team = player_entity.pers["team"];
629  influencer_team = player_entity.pers["team"];
630  }
631  else
632  {
633  point_team = "free";
634  influencer_team = "free";
635  }
636 
637  if (level.teambased && isdefined(game["switchedsides"]) && game["switchedsides"] && level.spawnsystem.unifiedSideSwitching)
638  {
639 // TODO MTEAM - how to handle sideswitch
640  point_team = ‪util::getOtherTeam(point_team);
641  }
642 
643  best_spawn = ‪get_best_spawnpoint( point_team, influencer_team, player_entity, predictedSpawn );
644 
645  if (!predictedSpawn)
646  {
647  player_entity.last_spawn_origin = best_spawn["origin"];
648  }
649 
650  return best_spawn;
651 }
652 
653 function ‪get_debug_spawnpoint( player )
654 {
655  if (level.teambased )
656  {
657  team = player.pers["team"];
658  }
659  else
660  {
661  team = "free";
662  }
663 
664  index = level.test_spawn_point_index;
665  level.test_spawn_point_index++;
666 
667  if ( team == "free" )
668  {
669  spawn_counts = 0;
670  foreach( team in level.teams )
671  {
672  spawn_counts += level.unified_spawn_points[ team ].a.size;
673  }
674 
675  if (level.test_spawn_point_index >= spawn_counts)
676  {
677  level.test_spawn_point_index= 0;
678  }
679 
680  count = 0;
681  foreach( team in level.teams )
682  {
683  size = level.unified_spawn_points[ team ].a.size;
684  if (level.test_spawn_point_index < count + size)
685  return level.unified_spawn_points[ team ].a[level.test_spawn_point_index - count];
686 
687  count += size;
688  }
689  }
690  else
691  {
692  if (level.test_spawn_point_index >= level.unified_spawn_points[ team ].a.size)
693  {
694  level.test_spawn_point_index= 0;
695  }
696 
697  return level.unified_spawn_points[ team ].a[level.test_spawn_point_index];
698 
699  }
700 }
701 
702 function ‪get_best_spawnpoint( point_team, influencer_team, player, predictedSpawn )
703 {
704  if (level.teambased )
705  {
706  vis_team_mask = ‪util::getOtherTeamsMask( player.pers["team"] );
707  }
708  else
709  {
710  vis_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
711  }
712 
713  spawn_point = GetBestSpawnPoint( point_team, influencer_team, vis_team_mask, player, predictedSpawn );
714 
715  if( !predictedSpawn )
716  {
717  // don't log predicted spawn points
718  bbPrint( "mpspawnpointsused", "reason %s x %d y %d z %d", "point used", spawn_point["origin"] );
719  }
720 
721  return spawn_point;
722 }
723 
724 // struct.a[] = a contains spawn entities
725 function ‪gatherSpawnPoints( player_team )
726 {
727  // use cached spawn points when they are available
728  if ( !isdefined( level.unified_spawn_points ) )
729  {
730  level.unified_spawn_points = [];
731  }
732  else
733  {
734  if ( isdefined( level.unified_spawn_points[ player_team ] ) )
735  {
736  return level.unified_spawn_points[ player_team ];
737  }
738  }
739 
740  spawn_entities_s = ‪util::spawn_array_struct();
741 
742  // also gather any old-style spawn points (the old world order)
743  spawn_entities_s.a = ‪spawnlogic::getTeamSpawnPoints(player_team);
744  if ( !isdefined(spawn_entities_s.a))
745  {
746  spawn_entities_s.a= [];
747  }
748 
749  level.unified_spawn_points[player_team] = spawn_entities_s;
750 
751  return spawn_entities_s;
752 }
753 
754 /* ---------- private code */
755 
756 /* ---------- spawn_influencer */
757 
758 // These functions add the new influencers to the provided influencers array.
759 
760 function ‪is_hardcore()
761 {
762  return isdefined( level.hardcoreMode )
763  && level.hardcoreMode;
764 }
765 
767  team1,
768  team2)
769 {
770  // If either is undefined, then we don't know; assume they are enemies.
771  // If the game is straight-up deathmatch, everyone is enemies (regardless of their assigned teams).
772  if ( !isdefined( team1 ) || !isdefined( team2 ) || (level.gameType=="dm"))
773  return true;
774 
775  return team1 != "neutral"
776  && team2 != "neutral"
777  && team1 != team2;
778 }
779 
780 // Really would like to get rid of these gametype specific references to spawn points
781 // from this file, however right now there is no way of getting a array of
782 // all spawnpoints in a level. They have to be asked for by classname.
784 {
785  spawn_entity_types = [];
786 
787  // TODO MTEAM - update this funcion for multiteam and just for all the new spawnpoints
788 
789  // dm
790  spawn_entity_types[ spawn_entity_types.size ] = "mp_dm_spawn";
791 
792  // tdm
793  spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_allies_start";
794  spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_axis_start";
795  spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn";
796 
797  // ctf
798  spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_allies_start";
799  spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_axis_start";
800  spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_allies";
801  spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_axis";
802 
803  // dom
804  spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_allies_start";
805  spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_axis_start";
806  spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn";
807 
808  // koth
809  // uses TDM spawns
810 
811  // sab
812  spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_allies_start";
813  spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_axis_start";
814  spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_allies";
815  spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_axis";
816 
817  // sd
818  spawn_entity_types[ spawn_entity_types.size ] = "mp_sd_spawn_attacker";
819  spawn_entity_types[ spawn_entity_types.size ] = "mp_sd_spawn_defender";
820 
821  // twar
822  spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn_axis_start";
823  spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn_allies_start";
824  spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn";
825 
826  for ( i = 0; i < spawn_entity_types.size; i++ )
827  {
828  if ( ‪spawn_point_class_name_being_used( spawn_entity_types[i] ) )
829  continue;
830 
831  spawnpoints = ‪spawnlogic::getSpawnpointArray( spawn_entity_types[i] );
832 
833  ‪delete_all_spawns( spawnpoints );
834  }
835 }
836 
837 function ‪delete_all_spawns( spawnpoints )
838 {
839  for ( i = 0; i < spawnpoints.size; i++ )
840  {
841  spawnpoints[i] delete();
842  }
843 }
844 
846 {
847  if ( !isdefined( level.spawn_point_class_names ) )
848  {
849  return false;
850  }
851 
852  for ( i = 0; i < level.spawn_point_class_names.size; i++ )
853  {
854  if ( level.spawn_point_class_names[i] == ‪name )
855  {
856  return true;
857  }
858  }
859 
860  return false;
861 }
862 
863 // callback to process spawn point changes from Radiant Live Update
865 {
866  // rebuild the legacy spawn points
867  foreach( team in level.teams )
868  {
870  }
871 
872  // make sure the list gets completely rebuilt
873  level.unified_spawn_points = undefined;
875 }
876 
877 function ‪initialSpawnProtection( specialtyName, spawnMonitorSpeed )
878 {
879  self endon( "death" );
880  self endon( "disconnect" );
881 
882 
883  if ( !isdefined( level.spawnProtectionTime ) || level.spawnProtectionTime == 0 )
884  {
885  /*if ( self HasPerk( specialtyName ) && spawnMonitorSpeed )
886  {
887  self thread _airsupport::monitorSpeed( level.spawnProtectionTime );
888  }*/
889 
890  return;
891  }
892 
893  if ( specialtyName == "specialty_nottargetedbyairsupport" )
894  {
895  self.specialty_nottargetedbyairsupport = true;
896  wait level.spawnProtectionTime;
897  self.specialty_nottargetedbyairsupport = undefined;
898  }
899  else if ( !self HasPerk( specialtyName ) )
900  {
901  self setPerk( specialtyName );
902  wait level.spawnProtectionTime;
903  self unsetPerk( specialtyName );
904  }
905  /*else
906  {
907  if ( spawnMonitorSpeed )
908  {
909  self thread _airsupport::monitorSpeed( level.spawnProtectionTime );
910  }
911  }*/
912 }
‪getSpawnpointArray
‪function getSpawnpointArray(classname)
Definition: _spawnlogic.gsc:208
‪get_debug_spawnpoint
‪function get_debug_spawnpoint(player)
Definition: _spawning.gsc:653
‪enable_influencers
‪function enable_influencers(enabled)
Definition: _spawning.gsc:449
‪getTeamMask
‪function getTeamMask(team)
Definition: _util.gsc:373
‪updateAllSpawnPoints
‪function updateAllSpawnPoints()
Definition: _spawning.gsc:551
‪create_enemy_influencer
‪function create_enemy_influencer(name, origin, team)
Definition: _spawning.gsc:285
‪gatherSpawnPoints
‪function gatherSpawnPoints(player_team)
Definition: _spawning.gsc:851
‪watch_remove_influencer
‪function watch_remove_influencer()
Definition: _spawning.gsc:426
‪getSpawnPoint
‪function getSpawnPoint(player_entity, predictedSpawn)
Definition: _spawning.gsc:790
‪onDeath
‪function onDeath()
Definition: _spawning.gsc:184
‪get_best_spawnpoint
‪function get_best_spawnpoint(point_team, influencer_team, player, predictedSpawn)
Definition: _spawning.gsc:835
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪delete_all_spawns
‪function delete_all_spawns(spawnpoints)
Definition: _spawning.gsc:975
‪create_map_placed_influencer
‪function create_map_placed_influencer(influencer_entity)
Definition: _spawning.gsc:534
‪create_friendly_influencer
‪function create_friendly_influencer(name, origin, team)
Definition: _spawning.gsc:276
‪create_influencer
‪function create_influencer(name, origin, team_mask)
Definition: _spawning.gsc:267
‪on_player_spawned
‪function on_player_spawned()
Definition: _spawning.gsc:145
‪remove_unused_spawn_entities
‪function remove_unused_spawn_entities()
Definition: _spawning.gsc:901
‪create_map_placed_influencers
‪function create_map_placed_influencers()
Definition: _spawning.gsc:522
‪on_joined_team
‪function on_joined_team()
Definition: _spawning.gsc:188
‪create_entity_friendly_influencer
‪function create_entity_friendly_influencer(name, team)
Definition: _spawning.gsc:303
‪getOtherTeam
‪function getOtherTeam(team)
Definition: _util.gsc:360
‪spawn_array_struct
‪function spawn_array_struct()
Definition: util_shared.gsc:2896
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪clearSpawnPoints
‪function clearSpawnPoints()
Definition: _spawnlogic.gsc:120
‪player_influencers_set_team
‪function player_influencers_set_team()
Definition: _spawning.gsc:465
‪create_entity_enemy_influencer
‪function create_entity_enemy_influencer(name, team)
Definition: _spawning.gsc:310
‪CodeCallback_UpdateSpawnPoints
‪function CodeCallback_UpdateSpawnPoints()
Definition: _spawning.gsc:1002
‪remove_influencers
‪function remove_influencers()
Definition: _spawning.gsc:405
‪create_entity_masked_enemy_influencer
‪function create_entity_masked_enemy_influencer(name, team_mask)
Definition: _spawning.gsc:324
‪onSpawnPlayer_Unified
‪function onSpawnPlayer_Unified(predictedSpawn)
Definition: _spawning.gsc:524
‪is_hardcore
‪function is_hardcore()
Definition: _spawning.gsc:878
‪create_player_influencers
‪function create_player_influencers()
Definition: _spawning.gsc:331
‪create_entity_masked_friendly_influencer
‪function create_entity_masked_friendly_influencer(name, team_mask)
Definition: _spawning.gsc:317
‪getOtherTeamsMask
‪function getOtherTeamsMask(skip_team)
Definition: _util.gsc:382
‪init_spawn_system
‪function init_spawn_system()
Definition: _spawning.gsc:105
‪enable_player_influencers
‪function enable_player_influencers(enabled)
Definition: _spawning.gsc:457
‪spawn_point_class_name_being_used
‪function spawn_point_class_name_being_used(name)
Definition: _spawning.gsc:983
‪__init__
‪function __init__()
Definition: _spawning.gsc:84
‪initialSpawnProtection
‪function initialSpawnProtection()
Definition: _spawning.gsc:1015
‪rebuildSpawnPoints
‪function rebuildSpawnPoints(team)
Definition: _spawnlogic.gsc:138
‪get_friendly_team_mask
‪function get_friendly_team_mask(team)
Definition: _spawning.gsc:239
‪set_dvar_if_unset
‪function set_dvar_if_unset(dvar, value, reset)
Definition: _util.gsc:420
‪get_enemy_team_mask
‪function get_enemy_team_mask(team)
Definition: _spawning.gsc:253
‪getTeamSpawnPoints
‪function getTeamSpawnPoints(team)
Definition: _spawnlogic.gsc:258
‪onGrenadeThrow
‪function onGrenadeThrow()
Definition: _spawning.gsc:226
‪create_grenade_influencers
‪function create_grenade_influencers(parent_team, weapon, grenade)
Definition: _spawning.gsc:497
‪name
‪class GroundFx name
‪create_entity_influencer
‪function create_entity_influencer(name, team_mask)
Definition: _spawning.gsc:294
‪on_player_connecting
‪function on_player_connecting()
Definition: _spawning.gsc:127
‪on_connecting
‪function on_connecting(func, obj)
Definition: callbacks_shared.gsc:146
‪addSpawnPoints
‪function addSpawnPoints(team, spawnPointName)
Definition: _spawnlogic.gsc:130
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪teams_have_enmity
‪function teams_have_enmity(team1, team2)
Definition: _spawning.gsc:884