‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_zonemgr.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\trigger_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\zm\_bb;
9 #insert scripts\shared\shared.gsh;
10 
11 #using scripts\zm\gametypes\_zm_gametype;
12 #using scripts\zm\_util;
13 #using scripts\zm\_zm_utility;
14 
15 #namespace zm_zonemgr;
16 
17 
18 ‪REGISTER_SYSTEM( "zm_zonemgr", &‪__init__, undefined )
19 
20 //
21 // This manages which spawners are valid for the game. The round_spawn function
22 // will use the arrays generated to figure out where to spawn a zombie from.
23 //
24 // Your level will need to set the level.zone_manager_init_func. This function
25 // should specify all of the connections you need to generate for each zone.
26 // Ex.: level.zone_manager_init_func = &cosmodrome_zone_init;
27 //
28 // You will also need to call the zone_manager startup function, manage_zones.
29 // Pass in an array of starting zone names.
30 // Ex.: init_zones[0] = "start_zone";
31 // init_zones[1] = "start_building1_zone";
32 // init_zones[2] = "start_building1b_zone";
33 // level thread zm_zonemgr::manage_zones( init_zones );
34 //
35 // The zone_manager_init_func should contain lines such as the following:
36 //
37 // add_adjacent_zone( "start_zone", "start_zone_roof", "start_exit_power" );
38 // add_adjacent_zone( "start_zone", "start_zone_roof", "start_exit_power2" );
39 // add_adjacent_zone( "start_zone_roof", "north_catwalk_zone", "start_exit_power" );
40 
41 
42 //
43 // Zone Manager initializations
44 //
45 function ‪__init__()
46 {
47 
48 
49  level ‪flag::init( "zones_initialized" );
50 
51  level.zones = [];
52  level.zone_flags = [];
53  level.zone_scanning_active = 0;
54  level.str_zone_mgr_mode = "occupied_and_adjacent";
55 
56  //Default callback. Set local override before load::main
57  level.create_spawner_list_func = &‪create_spawner_list;
58 }
59 
60 
61 //*****************************************************************************
62 // Check to see if a zone is enabled
63 //*****************************************************************************
64 
65 function ‪zone_is_enabled( zone_name )
66 {
67  if ( !IsDefined(level.zones) || !IsDefined(level.zones[ zone_name ]) || !level.zones[ zone_name ].is_enabled )
68  {
69  return false;
70  }
71 
72  return true;
73 }
74 
75 function ‪zone_wait_till_enabled( zone_name )
76 {
77  if ( !‪zone_is_enabled(zone_name) )
78  {
79  level waittill( zone_name );
80  }
81 }
82 
83 
84 //*****************************************************************************
85 // Pass back the zone the player is occupying
86 //*****************************************************************************
87 
88 // self = player
90 {
92 }
93 
94 
95 //*****************************************************************************
96 // Pass back the zone from the position
97 //*****************************************************************************
98 
99 function ‪get_zone_from_position( v_pos, ignore_enabled_check )
100 {
101  zone = undefined;
102 
103  scr_org = ‪spawn( "script_origin", v_pos );
104 
105  keys = GetArrayKeys( level.zones );
106  for( i=0; i<keys.size; i++ )
107  {
108  if( scr_org ‪entity_in_zone( keys[i], ignore_enabled_check ) )
109  {
110  zone = keys[i];
111  break;
112  }
113  }
114 
115  scr_org delete();
116 
117  return( zone );
118 }
119 
120 function ‪get_zone_magic_boxes( zone_name )
121 {
122  if( IsDefined( zone_name ) && !‪zone_is_enabled( zone_name ) )
123  {
124  return undefined;
125  }
126 
127  zone = level.zones[ zone_name ];
128 
129  assert( IsDefined( zone_name ) );
130 
131  return zone.magic_boxes;
132 }
133 
134 function ‪get_zone_zbarriers( zone_name )
135 {
136  if( IsDefined( zone_name ) && !‪zone_is_enabled( zone_name ) )
137  {
138  return undefined;
139  }
140 
141  zone = level.zones[ zone_name ];
142 
143  assert( IsDefined( zone_name ) );
144 
145  return zone.zbarriers;
146 }
147 
148 //*****************************************************************************
149 // Checks to see how many players are in a zone_name volume
150 //*****************************************************************************
151 
152 function ‪get_players_in_zone( zone_name, return_players )
153 {
155 
156  // If the zone hasn't been enabled, don't even bother checking
157  if ( !‪zone_is_enabled( zone_name ) )
158  {
159  return false;
160  }
161  zone = level.zones[ zone_name ];
162 
163  // Okay check to see if a player is in one of the zone volumes
164  num_in_zone = 0;
165  players_in_zone = [];
166  players = GetPlayers();
167  for (i = 0; i < zone.volumes.size; i++)
168  {
169  for (j = 0; j < players.size; j++)
170  {
171  if ( players[j] IsTouching(zone.volumes[i]) )
172  {
173  num_in_zone++;
174  players_in_zone[players_in_zone.size] = players[j];
175  }
176  }
177  }
178  if(isDefined(return_players))
179  {
180  return players_in_zone;
181  }
182  return num_in_zone;
183 }
184 
185 
186 //--------------------------------------------------------------
187 // Checks to see if a player is in a zone_name volume
188 //--------------------------------------------------------------
189 function ‪any_player_in_zone( zone_name )
190 {
191  // If the zone hasn't been enabled, don't even bother checking
192  if ( !‪zone_is_enabled( zone_name ) )
193  {
194  return false;
195  }
196  zone = level.zones[ zone_name ];
197 
198  // Okay check to see if a player is in one of the zone volumes
199  for (i = 0; i < zone.volumes.size; i++)
200  {
201  players = GetPlayers();
202  for (j = 0; j < players.size; j++)
203  {
204  if ( players[j] IsTouching(zone.volumes[i]) && !(players[j].sessionstate == "spectator"))
205  return true;
206  }
207  }
208  return false;
209 }
210 
211 //--------------------------------------------------------------
212 // Checks to see if a entity is in a zone_name volume
213 // self is an entity
214 function ‪entity_in_zone( zone_name, ignore_enabled_check = false )
215 {
216  if ( IsPlayer( self ) && self.sessionstate == "spectator" )
217  {
218  return false;
219  }
220 
221  // If the zone hasn't been enabled, don't even bother checking
222  if ( !‪zone_is_enabled( zone_name ) && !ignore_enabled_check )
223  {
224  return false;
225  }
226 
227  zone = level.zones[ zone_name ];
228 
229  // Okay check to see if an entity is in one of the zone volumes
230  foreach( e_volume in zone.volumes )
231  {
232  if ( self IsTouching( e_volume ) )
233  {
234  return true;
235  }
236  }
237  return false;
238 }
239 
240 
241 // Check to see if an entity is in a currently active zone
242 // self is an entity (do not use a player)
243 function ‪entity_in_active_zone( ignore_enabled_check = false )
244 {
245  if ( IsPlayer( self ) && self.sessionstate == "spectator" )
246  {
247  return false;
248  }
249 
250  foreach( str_adj_zone in level.active_zone_names )
251  {
252  b_in_zone = ‪entity_in_zone( str_adj_zone, ignore_enabled_check );
253  if ( b_in_zone )
254  {
255  return true;
256  }
257  }
258 
259  return false;
260 }
261 
262 
263 //
264 // Disable exterior_goals that have a script_noteworthy. This can prevent zombies from
265 // pathing to a3 goal that the zombie can't path towards the player after entering.
266 // They will be activated later, when the zone gets enabled.
268 {
269  special_goals = ‪struct::get_array("exterior_goal", "targetname");
270  for (i = 0; i < special_goals.size; i++)
271  {
272  if (IsDefined(special_goals[i].script_noteworthy))
273  {
274  special_goals[i].is_active = false;
275  special_goals[i] TriggerEnable( false );
276  }
277  }
278 }
279 
280 
281 //--------------------------------------------------------------
282 // Call this when you want to allow zombies to spawn from a zone
283 // - Must have at least one info_volume with targetname = (name of the zone)
284 // - Have the info_volumes target the zone's spawners
285 //--------------------------------------------------------------
286 function ‪zone_init( zone_name, zone_tag )
287 {
288  if ( IsDefined( level.zones[ zone_name ] ) )
289  {
290  // It's already been activated
291  return;
292  }
293 
294 
295  // Add this to the list of active zones
296  level.zones[ zone_name ] = SpawnStruct();
297  zone = level.zones[ zone_name ];
298 
299  zone.is_enabled = false; // The zone is not enabled. You can stop looking at it
300  // until it is.
301  zone.is_occupied = false; // The zone is not occupied by a player. This is what we
302  // use to determine when to activate adjacent zones
303  zone.is_active = false; // The spawners will not be added to the spawning list
304  // until this true.
305  zone.adjacent_zones = []; // NOTE: These must be defined in a separate level-specific initialization via add_adjacent_zone
306 
307  zone.is_spawning_allowed = false;
308 
309  if( isDefined( zone_tag ) )
310  {
311  zone_name_tokens = StrTok( zone_name, "_" );
312 
313  zone.district = zone_name_tokens[1];
314  zone.area = zone_tag;
315  }
316 
317  //
318  zone.volumes = [];
319  volumes = GetEntArray( zone_name, "targetname" );
320 
321 
322 
323 
324  for ( i=0; i<volumes.size; i++ )
325  {
326  if ( volumes[i].classname == "info_volume" )
327  {
328  zone.volumes[ zone.volumes.size ] = volumes[i];
329  }
330  }
331 
332  assert( IsDefined( zone.volumes[0] ), "zone_init: No volumes found for zone: "+zone_name );
333 
334 /#
335  zone.total_spawn_count = 0;
336  zone.round_spawn_count = 0;
337 #/
338  // Fill in locs array with locations needed.
339  zone.a_loc_types = [];
340  zone.a_loc_types[ "zombie_location" ] = [];
341 
342  zone.zbarriers = [];
343  zone.magic_boxes = [];
344 
345  if ( IsDefined( zone.volumes[0].target ) )
346  {
347  spots = ‪struct::get_array(zone.volumes[0].target, "targetname");
348 
349  barricades = ‪struct::get_array("exterior_goal","targetname");
350  box_locs = ‪struct::get_array( "treasure_chest_use", "targetname" );
351 
352  foreach( spot in spots )
353  {
354  spot.zone_name = zone_name;
355  if(!‪IS_TRUE(spot.is_blocked))
356  {
357  spot.is_enabled = true;
358  }
359  else
360  {
361  spot.is_enabled = false;
362  }
363 
364  // Sort the locations
365  tokens = StrTok( spot.script_noteworthy, " " );
366  foreach ( token in tokens )
367  {
368  switch( token )
369  {
370  // Basic zombie spawn locations
371  case "spawn_location":
372  case "riser_location":
373  case "faller_location":
374  case "custom_spawner_entry":
375  ‪ARRAY_ADD( zone.a_loc_types[ "zombie_location" ], spot );
376  break;
377  default:
378  if ( !isdefined( zone.a_loc_types[ token ] ) )
379  {
380  zone.a_loc_types[ token ] = [];
381  }
382 
383  ‪ARRAY_ADD( zone.a_loc_types[ token ], spot );
384  }
385  }
386 
387  if(IsDefined(spot.script_string))
388  {
389  barricade_id = spot.script_string;
390  //level.exterior_goals probably not yet defined.
391  for (k = 0; k < barricades.size; k++)
392  {
393  if(IsDefined(barricades[k].script_string) && barricades[k].script_string == barricade_id)
394  {
395  nodes = GetNodeArray(barricades[k].target, "targetname");
396  for (j = 0; j < nodes.size; j++)
397  {
398  if( IsDefined(nodes[j].type) && nodes[j].type == "Begin")
399  spot.target = nodes[j].targetname;
400  }
401  }
402  }
403  }
404  }
405 
406  for( i = 0; i < barricades.size; i++ )
407  {
408  targets = GetEntArray( barricades[i].target, "targetname" );
409  for( j = 0; j < targets.size; j++ )
410  {
411  if( targets[j] IsZBarrier() && IsDefined( targets[j].script_string ) && targets[j].script_string == zone_name )
412  {
413  ‪ARRAY_ADD( zone.zbarriers, targets[j] );
414  }
415  }
416  }
417 
418  for( i = 0; i < box_locs.size; i++ )
419  {
420  chest_ent = GetEnt(box_locs[i].script_noteworthy + "_zbarrier", "script_noteworthy");
421  if( chest_ent ‪entity_in_zone( zone_name, true ) )
422  {
423  ‪ARRAY_ADD( zone.magic_boxes, box_locs[i] );
424  }
425  }
426  }
427 }
428 
429 //
430 // Update the spawners
432 {
433  zkeys = GetArrayKeys( level.zones );
434  for ( i = 0; i < level.zones.size; i++ )
435  {
436  zone = level.zones[ zkeys[i] ];
437 
438  // Fill in locs array with locations
439  zone.a_loc_types = [];
440  zone.a_loc_types[ "zombie_location" ] = [];
441 
442  if ( IsDefined( zone.volumes[0].target ) )
443  {
444  spots = ‪struct::get_array(zone.volumes[0].target, "targetname");
445  foreach ( n_index, spot in spots )
446  {
447  spot.zone_name = zkeys[n_index];
448  if(!‪IS_TRUE(spot.is_blocked))
449  {
450  spot.is_enabled = true;
451  }
452  else
453  {
454  spot.is_enabled = false;
455  }
456 
457  // Sort the locations
458  tokens = StrTok( spot.script_noteworthy, " " );
459  foreach ( token in tokens )
460  {
461  switch( token )
462  {
463  // Basic zombie spawn locations
464  case "spawn_location":
465  case "spawner_location":
466  case "riser_location":
467  case "faller_location":
468  case "custom_spawner_entry":
469  ‪ARRAY_ADD( zone.a_loc_types[ "zombie_location" ], spot );
470  break;
471  default:
472  if ( !isdefined( zone.a_a_locs[ token ] ) )
473  {
474  zone.a_loc_types[ token ] = [];
475  }
476 
477  ‪ARRAY_ADD( zone.a_loc_types[ token ], spot );
478  }
479  }
480  }
481  }
482  }
483 }
484 
485 
486 //
487 // Turn on the zone
488 function ‪enable_zone( zone_name )
489 {
490  assert( IsDefined(level.zones) && IsDefined(level.zones[zone_name]), "enable_zone: zone has not been initialized" );
491 
492  if ( level.zones[ zone_name ].is_enabled )
493  {
494  return;
495  }
496 
497  level.zones[ zone_name ].is_enabled = true;
498  level.zones[ zone_name ].is_spawning_allowed = true;
499  level notify( zone_name );
500 
501  // activate any player spawn points
502  //spawn_points = struct::get_array("player_respawn_point", "targetname");
503 
505  for( i = 0; i < spawn_points.size; i++ )
506  {
507  if ( spawn_points[i].script_noteworthy == zone_name )
508  {
509  spawn_points[i].locked = false;
510  }
511  }
512 
513  // Allow zombies to path to the barriers in the zone.
514  // All barriers with a script_noteworthy should initially be triggered off by
515  // deactivate_barrier_goals
516  entry_points = ‪struct::get_array(zone_name+"_barriers", "script_noteworthy");
517  for(i=0;i<entry_points.size;i++)
518  {
519  entry_points[i].is_active = true;
520  entry_points[i] TriggerEnable( true );
521  }
522 }
523 
524 
525 //
526 // Add zone B to zone A's adjacency list
527 //
528 // main_zone_name - zone to be connected to
529 // adj_zone_name - zone to connect
530 // flag_name - flag that will cause the connection to happen
531 function ‪make_zone_adjacent( main_zone_name, adj_zone_name, flag_name )
532 {
533  main_zone = level.zones[ main_zone_name ];
534 
535  // Create the adjacent zone entry if it doesn't exist
536  if ( !IsDefined( main_zone.adjacent_zones[ adj_zone_name ] ) )
537  {
538  main_zone.adjacent_zones[ adj_zone_name ] = SpawnStruct();
539  adj_zone = main_zone.adjacent_zones[ adj_zone_name ];
540  adj_zone.is_connected = false;
541  adj_zone.flags_do_or_check = false;
542  // Create the link condition, the flag that needs to be set to be considered connected
543  if ( IsArray( flag_name ) )
544  {
545  adj_zone.flags = flag_name;
546  }
547  else
548  {
549  adj_zone.flags[0] = flag_name;
550  }
551  }
552  else
553  {
554  // we've already defined a link condition, but we need to add another one and treat
555  // it as an "OR" condition
556  assert( !IsArray( flag_name ), "make_zone_adjacent: can't mix single and arrays of flags" );
557  adj_zone = main_zone.adjacent_zones[ adj_zone_name ];
558  size = adj_zone.flags.size;
559  adj_zone.flags_do_or_check = true;
560  adj_zone.flags[ size ] = flag_name;
561  }
562 }
563 
564 
565 // When the wait_flag gets set (like when a door opens), the add_flags will also get set.
566 // This provides a slightly less clunky way to connect multiple contiguous zones within an area
567 //
568 // wait_flag = flag to wait for
569 // adj_flags = array of flag strings to set when flag is set
570 function ‪add_zone_flags( wait_flag, add_flags )
571 {
572  if (!IsArray(add_flags) )
573  {
574  temp = add_flags;
575  add_flags = [];
576  add_flags[0] = temp;
577  }
578 
579  keys = GetArrayKeys( level.zone_flags );
580  for ( i=0; i<keys.size; i++ )
581  {
582  if ( keys[i] == wait_flag )
583  {
584  level.zone_flags[ keys[i] ] = ArrayCombine( level.zone_flags[ keys[i] ], add_flags, true, false );
585  return;
586  }
587  }
588  level.zone_flags[ wait_flag ] = add_flags;
589 }
590 
591 //
592 // Makes zone_b adjacent to zone_a. If one_way is false, zone_a is also made "adjacent" to zone_b
593 // Note that you may not always want zombies coming from zone B while you are in Zone A, but you
594 // might want them to come from B while in A. It's a rare case though, such as a one-way traversal.
595 function ‪add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way, zone_tag_a, zone_tag_b )
596 {
597  if ( !IsDefined( one_way ) )
598  {
599  one_way = false;
600  }
601 
602  // rsh030110 - added to make sure all our flags are inited before setup_zone_flag_waits()
603  if ( !IsDefined( level.flag[ flag_name ] ) )
604  {
605  level ‪flag::init( flag_name );
606  }
607 
608  // If it's not already activated, this zone_init will activate the zone
609  // If it's already activated, it won't do anything.
610  ‪zone_init( zone_name_a, zone_tag_a );
611  ‪zone_init( zone_name_b, zone_tag_b );
612 
613  // B becomes an adjacent zone of A
614  ‪make_zone_adjacent( zone_name_a, zone_name_b, flag_name );
615 
616  if ( !one_way )
617  {
618  // A becomes an adjacent zone of B
619  ‪make_zone_adjacent( zone_name_b, zone_name_a, flag_name );
620  }
621 }
622 
623 
624 //--------------------------------------------------------------
625 // Gathers all flags that need to be evaluated and sets up waits for them
626 //--------------------------------------------------------------
628 {
629  flags = [];
630  zkeys = GetArrayKeys( level.zones );
631  for( z=0; z<level.zones.size; z++ )
632  {
633  zone = level.zones[ zkeys[z] ];
634  azkeys = GetArrayKeys( zone.adjacent_zones );
635  for ( az = 0; az<zone.adjacent_zones.size; az++ )
636  {
637  azone = zone.adjacent_zones[ azkeys[az] ];
638  for ( f = 0; f< azone.flags.size; f++ )
639  {
640  ‪array::add(flags, azone.flags[f], false );
641  }
642  }
643  }
644 
645  for( i=0; i<flags.size; i++ )
646  {
647  level thread ‪zone_flag_wait( flags[i] );
648  }
649 }
650 
651 
653 {
654  ‪DEFAULT(level.zone_flags_updating,0);
655  while ( level.zone_flags_updating > 0 )
656  {
658  }
659 }
660 
662 {
663  ‪DEFAULT(level.zone_flag_wait_throttle,0);
664  level.zone_flag_wait_throttle++;
665  if ( level.zone_flag_wait_throttle > 3 )
666  {
667  level.zone_flag_wait_throttle=0;
669  }
670 }
671 
672 //
673 // Wait for a zone flag to be set and then update zones
674 //
675 function ‪zone_flag_wait( flag_name )
676 {
677  if ( !IsDefined( level.flag[ flag_name ] ) )
678  {
679  level ‪flag::init( flag_name );
680  }
681  level ‪flag::wait_till( flag_name );
682 
683  ‪DEFAULT(level.zone_flags_updating,0);
684  level.zone_flags_updating++;
685  flags_set = false; // scope declaration
686  // Enable adjacent zones if all flags are set for a connection
687  for( z=0; z<level.zones.size; z++ )
688  {
689  zkeys = GetArrayKeys( level.zones );
690  zone = level.zones[ zkeys[z] ];
691  for ( az = 0; az<zone.adjacent_zones.size; az++ )
692  {
693  azkeys = GetArrayKeys( zone.adjacent_zones );
694  azone = zone.adjacent_zones[ azkeys[az] ];
695  if ( !azone.is_connected )
696  {
697  if ( azone.flags_do_or_check )
698  {
699  // If ANY flag is set, then connect zones
700  flags_set = false;
701  for ( f = 0; f< azone.flags.size; f++ )
702  {
703  if ( level ‪flag::get( azone.flags[f] ) )
704  {
705  flags_set = true;
706  break;
707  }
708  }
709  }
710  else
711  {
712  // See if ALL the flags have been set, otherwise, move on
713  flags_set = true;
714  for ( f = 0; f< azone.flags.size; f++ )
715  {
716  if ( !level ‪flag::get( azone.flags[f] ) )
717  {
718  flags_set = false;
719  }
720  }
721  }
722 
723  if ( flags_set )
724  {
725  ‪enable_zone( zkeys[z] );
726  azone.is_connected = true;
727  if ( !level.zones[ azkeys[az] ].is_enabled )
728  {
729  ‪enable_zone( azkeys[az] );
730  }
731  if(level ‪flag::get("door_can_close"))
732  {
733  azone thread ‪door_close_disconnect(flag_name);
734  }
735  }
736  }
737  }
739  }
740 
741  // Also set any zone flags
742  keys = GetArrayKeys( level.zone_flags );
743  for ( i=0; i<keys.size; i++ )
744  {
745  if ( keys[i] == flag_name )
746  {
747  check_flag = level.zone_flags[ keys[i] ];
748  for ( k=0; k<check_flag.size; k++ )
749  {
750  level ‪flag::set( check_flag[k] );
751  }
752  break;
753  }
755  }
756  level.zone_flags_updating--;
757 }
758 
759 // start thread to watch for door to close.
760 function ‪door_close_disconnect(flag_name)
761 {
762  while(level ‪flag::get(flag_name))
763  {
764  wait(1.0);
765  }
766  self.is_connected = false;
767  level thread ‪zone_flag_wait( flag_name );
768 }
769 //--------------------------------------------------------------
770 // This needs to be called when new zones open up via doors
771 //--------------------------------------------------------------
772 function ‪connect_zones( zone_name_a, zone_name_b, one_way )
773 {
774  if ( !IsDefined( one_way ) )
775  {
776  one_way = false;
777  }
778 
779  // If it's not already activated, it will activate the zone
780  // If it's already activated, it won't do anything.
781  ‪zone_init( zone_name_a );
782  ‪zone_init( zone_name_b );
783 
784  ‪enable_zone( zone_name_a );
785  ‪enable_zone( zone_name_b );
786 
787  // B becomes an adjacent zone of A
788  if ( !IsDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) )
789  {
790  level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] = SpawnStruct();
791  level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = true;
792  }
793 
794  if ( !one_way )
795  {
796  // A becomes an adjacent zone of B
797  if ( !IsDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) )
798  {
799  level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] = SpawnStruct();
800  level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = true;
801  }
802  }
803 }
804 
805 
806 //--------------------------------------------------------------
807 // This one function will handle managing all zones in your map
808 // to turn them on/off - probably the best way to handle this
809 //--------------------------------------------------------------
810 function ‪manage_zones( initial_zone )
811 {
812  assert( IsDefined( initial_zone ), "You must specify an initial zone to manage" );
813 
814  ‪deactivate_initial_barrier_goals(); // Must be called before zone_init
815 
816  level.player_zone_found = true;
817 
818  zone_choke = 0;
819 
820  // Lock player respawn points
821  //spawn_points = struct::get_array("player_respawn_point", "targetname");
823 
824  for( i = 0; i < spawn_points.size; i++ )
825  {
826  assert( IsDefined( spawn_points[i].script_noteworthy ), "player_respawn_point: You must specify a script noteworthy with the zone name" );
827  spawn_points[i].locked = true;
828  }
829 
830  // Setup zone connections
831  if ( IsDefined( level.zone_manager_init_func ) )
832  {
833  [[ level.zone_manager_init_func ]]();
834  }
835 
836 
837 
838  if ( IsArray( initial_zone ) )
839  {
840 
841  for ( i = 0; i < initial_zone.size; i++ )
842  {
843  ‪zone_init( initial_zone[i] );
844  ‪enable_zone( initial_zone[i] );
845  }
846  }
847  else
848  {
849 
850  ‪zone_init( initial_zone );
851  ‪enable_zone( initial_zone );
852  }
853 
855 
856  zkeys = GetArrayKeys( level.zones );
857  level.zone_keys = zkeys;
858  level.newzones = [];
859  for( z=0; z<zkeys.size; z++ )
860  {
861  level.newzones[ zkeys[z] ] = spawnstruct();
862  }
863  oldzone = undefined;
864 
865  level ‪flag::set( "zones_initialized" );
866 
867  level ‪flag::wait_till( "begin_spawning" );
868 
869  // Now iterate through the active zones and see if we need to activate spawners
870 
871  while(GetDvarInt( "noclip") == 0 ||GetDvarInt( "notarget") != 0 )
872  {
874 
875  // clear out active zone flags
876  for( z=0; z<zkeys.size; z++ )
877  {
878  level.newzones[ zkeys[z] ].is_active = false;
879  level.newzones[ zkeys[z] ].is_occupied = false;
880  }
881 
882  // Figure out which zones are active
883  // If a player occupies a zone, then that zone and any of its enabled adjacent zones will activate
884  a_zone_is_active = false; // let's us know if an active zone is found
885  a_zone_is_spawning_allowed = false; // let's us know if an active zone that allows spawning is found
886  level.zone_scanning_active = 1;
887  for( z=0; z<zkeys.size; z++ )
888  {
889  zone = level.zones[ zkeys[z] ];
890  newzone = level.newzones[ zkeys[z] ];
891  if ( !zone.is_enabled )
892  {
893  continue;
894  }
895 
896  if ( isdefined( level.zone_occupied_func ) )
897  {
898  newzone.is_occupied = [[ level.zone_occupied_func ]]( zkeys[z] );
899  }
900  else
901  {
902  newzone.is_occupied = ‪any_player_in_zone( zkeys[z] );
903  }
904 
905  if ( newzone.is_occupied )
906  {
907  newzone.is_active = true;
908  a_zone_is_active = true;
909  if ( zone.is_spawning_allowed )
910  {
911  a_zone_is_spawning_allowed = true;
912  }
913 
914  if( !isdefined( oldzone ) || (oldzone != newzone) )
915  {
916  level notify( "newzoneActive", zkeys[z] );
917  oldzone = newzone;
918  }
919 
920  azkeys = GetArrayKeys( zone.adjacent_zones );
921  for ( az=0; az<zone.adjacent_zones.size; az++ )
922  {
923  if ( zone.adjacent_zones[ azkeys[az] ].is_connected &&
924  level.zones[ azkeys[az] ].is_enabled )
925  {
926  //level.zones[ azkeys[ az ] ].is_active = true;
927  level.newzones[ azkeys[ az ] ].is_active = true;
928  if ( level.zones[ azkeys[ az ] ].is_spawning_allowed )
929  {
930  a_zone_is_spawning_allowed = true;
931  }
932  }
933  }
934  }
935  zone_choke++;
936  if ( zone_choke >= 3 )
937  {
938  zone_choke=0;
941  }
942  }
943  level.zone_scanning_active = 0;
944 
945  for( z=0; z<zkeys.size; z++ )
946  {
947  level.zones[ zkeys[z] ].is_active = level.newzones[ zkeys[z] ].is_active;
948  level.zones[ zkeys[z] ].is_occupied = level.newzones[ zkeys[z] ].is_occupied;
949  }
950 
951  // MM - Special logic for empty spawner list, this is just a failsafe
952  if ( !a_zone_is_active || !a_zone_is_spawning_allowed )
953  {
954  if ( IsArray( initial_zone ) )
955  {
956  level.zones[ initial_zone[0] ].is_active = true;
957  level.zones[ initial_zone[0] ].is_occupied = true;
958  level.zones[ initial_zone[0] ].is_spawning_allowed = true;
959  }
960  else
961  {
962  level.zones[ initial_zone ].is_active = true;
963  level.zones[ initial_zone ].is_occupied = true;
964  level.zones[ initial_zone ].is_spawning_allowed = true;
965  }
966  level.player_zone_found = false;
967  }
968  else
969  {
970  level.player_zone_found = true;
971  }
972 
973  // Okay now we can re-create the spawner list
974  [[ level.create_spawner_list_func ]]( zkeys );
975 
976  /#
978  #/
979 
980  level.active_zone_names = ‪zm_zonemgr::get_active_zone_names();
981 
982  //wait a second before another check
983  wait(1);
984  }
985 }
986 
987 //--------------------------------------------------------------
988 /#
990 {
991  if( ‪IS_TRUE( level.toggle_show_spawn_locations ) )
992  {
993  host_player = util::GetHostPlayer();
994  foreach( location in level.zm_loc_types[ "zombie_location" ] )
995  {
996  distance = Distance( location.origin, host_player.origin );
997  color = (0,0,1);
998  if( distance > ( GetDvarInt( "scr_spawner_location_distance" ) * 12 ) )
999  {
1000  color = (1,0,0);
1001  }
1002  debugstar( location.origin, GetDvarInt( "scr_spawner_location_time" ), color );
1003  //Print3d( location.origin, (distance/12), color, 1, 20 );
1004  }
1005  }
1006 
1007 }
1008 
1009 #/
1010 //--------------------------------------------------------------
1011 // This one function will handle managing all zones in your map
1012 // to turn them on/off - probably the best way to handle this
1013 //--------------------------------------------------------------
1014 function ‪old_manage_zones( initial_zone )
1015 {
1016  assert( IsDefined( initial_zone ), "You must specify an initial zone to manage" );
1017 
1018  ‪deactivate_initial_barrier_goals(); // Must be called before zone_init
1019 
1020  // Lock player respawn points
1021  //spawn_points = struct::get_array("player_respawn_point", "targetname");
1023 
1024  for( i = 0; i < spawn_points.size; i++ )
1025  {
1026  assert( IsDefined( spawn_points[i].script_noteworthy ), "player_respawn_point: You must specify a script noteworthy with the zone name" );
1027  spawn_points[i].locked = true;
1028  }
1029 
1030  // Setup zone connections
1031  if ( IsDefined( level.zone_manager_init_func ) )
1032  {
1033  [[ level.zone_manager_init_func ]]();
1034  }
1035 
1036 
1037 
1038  if ( IsArray( initial_zone ) )
1039  {
1040  for ( i = 0; i < initial_zone.size; i++ )
1041  {
1042  ‪zone_init( initial_zone[i] );
1043  ‪enable_zone( initial_zone[i] );
1044  }
1045  }
1046  else
1047  {
1048  ‪zone_init( initial_zone );
1049  ‪enable_zone( initial_zone );
1050  }
1051 
1053 
1054  zkeys = GetArrayKeys( level.zones );
1055  level.zone_keys = zkeys;
1056 
1057  level ‪flag::set( "zones_initialized" );
1058 
1059  level ‪flag::wait_till( "begin_spawning" );
1060 
1061  // RAVEN BEGIN bhackbarth: Add thread to display zone info for debugging
1062  /#
1063  level thread ‪_debug_zones();
1064  #/
1065  // RAVEN END
1066 
1067  // Now iterate through the active zones and see if we need to activate spawners
1068 
1069  while(GetDvarInt( "noclip") == 0 ||GetDvarInt( "notarget") != 0 )
1070  {
1071  // clear out active zone flags
1072  for( z=0; z<zkeys.size; z++ )
1073  {
1074  level.zones[ zkeys[z] ].is_active = false;
1075  level.zones[ zkeys[z] ].is_occupied = false;
1076  }
1077 
1078  // Figure out which zones are active
1079  // If a player occupies a zone, then that zone and any of its enabled adjacent zones will activate
1080  a_zone_is_active = false; // let's us know if an active zone is found
1081  a_zone_is_spawning_allowed = false; // let's us know if an active zone that allows spawning is found
1082  for( z=0; z<zkeys.size; z++ )
1083  {
1084  zone = level.zones[ zkeys[z] ];
1085  if ( !zone.is_enabled )
1086  {
1087  continue;
1088  }
1089 
1090  if ( isdefined( level.zone_occupied_func ) )
1091  {
1092  zone.is_occupied = [[ level.zone_occupied_func ]]( zkeys[z] );
1093  }
1094  else
1095  {
1096  zone.is_occupied = ‪any_player_in_zone( zkeys[z] );
1097  }
1098 
1099  if ( zone.is_occupied )
1100  {
1101  zone.is_active = true;
1102  a_zone_is_active = true;
1103  if ( zone.is_spawning_allowed )
1104  {
1105  a_zone_is_spawning_allowed = true;
1106  }
1107 
1108  azkeys = GetArrayKeys( zone.adjacent_zones );
1109  for ( az=0; az<zone.adjacent_zones.size; az++ )
1110  {
1111  if ( zone.adjacent_zones[ azkeys[az] ].is_connected &&
1112  level.zones[ azkeys[az] ].is_enabled )
1113  {
1114  level.zones[ azkeys[ az ] ].is_active = true;
1115  if ( level.zones[ azkeys[ az ] ].is_spawning_allowed )
1116  {
1117  a_zone_is_spawning_allowed = true;
1118  }
1119  }
1120  }
1121  }
1122  }
1123 
1124  // MM - Special logic for empty spawner list, this is just a failsafe
1125  if ( !a_zone_is_active || !a_zone_is_spawning_allowed )
1126  {
1127  if ( IsArray( initial_zone ) )
1128  {
1129  level.zones[ initial_zone[0] ].is_active = true;
1130  level.zones[ initial_zone[0] ].is_occupied = true;
1131  level.zones[ initial_zone[0] ].is_spawning_allowed = true;
1132  }
1133  else
1134  {
1135  level.zones[ initial_zone ].is_active = true;
1136  level.zones[ initial_zone ].is_occupied = true;
1137  level.zones[ initial_zone ].is_spawning_allowed = true;
1138  }
1139  }
1140 
1141  // Okay now we can re-create the spawner list
1142  [[ level.create_spawner_list_func ]]( zkeys );
1143 
1144  level.active_zone_names = ‪zm_zonemgr::get_active_zone_names();
1145 
1146  //wait a second before another check
1147  wait(1);
1148  }
1149 }
1150 
1151 //
1152 // Create the list of enemies to be used for spawning
1153 function ‪create_spawner_list( zkeys )
1154 {
1155  // Clear the array lists
1156  foreach( str_index,a_locs in level.zm_loc_types )
1157  {
1158  level.zm_loc_types[ str_index ] = [];
1159  }
1160 
1161 
1162  for( z=0; z<zkeys.size; z++ )
1163  {
1164  zone = level.zones[ zkeys[z] ];
1165 
1166  if ( zone.is_enabled && zone.is_active && zone.is_spawning_allowed )
1167  {
1168  foreach( a_locs in zone.a_loc_types )
1169  {
1170  foreach( loc in a_locs )
1171  {
1172  if ( isdefined( loc.is_enabled ) && loc.is_enabled == false )
1173  {
1174  continue;
1175  }
1176 
1177  // Add the locations
1178  tokens = StrTok( loc.script_noteworthy, " " );
1179  foreach ( token in tokens )
1180  {
1181  switch( token )
1182  {
1183  // Basic zombie spawn locations
1184  case "spawn_location":
1185  case "riser_location":
1186  case "faller_location":
1187  case "custom_spawner_entry":
1188  ‪array::add( level.zm_loc_types[ "zombie_location" ], loc, false );
1189  break;
1190  default:
1191  if ( !isdefined( level.zm_loc_types[ token ] ) )
1192  {
1193  level.zm_loc_types[ token ] = [];
1194  }
1195 
1196  ‪array::add( level.zm_loc_types[ token ], loc, false );
1197  }
1198  }
1199  }
1200  }
1201  }
1202  }
1203 }
1204 
1206 {
1207  ret_list = [];
1208 
1209  if(!isdefined(level.zone_keys))
1210  {
1211  return ret_list;
1212  }
1213 
1214  while ( level.zone_scanning_active )
1216 
1217  for(i = 0; i < level.zone_keys.size; i ++)
1218  {
1219  if(level.zones[level.zone_keys[i]].is_active)
1220  {
1221  ret_list[ret_list.size] = level.zone_keys[i];
1222  }
1223  }
1224 
1225  return ret_list;
1226 }
1227 
1228 
1229 // Get an array of the active zone entities
1231 {
1232  a_player_zones = getentarray( "player_volume", "script_noteworthy" );
1233 
1234  a_active_zones = [];
1235 
1236  for( i=0; i<a_player_zones.size; i++ )
1237  {
1238  e_zone = a_player_zones[i];
1239  zone = level.zones[ e_zone.targetname ];
1240  if( isdefined(zone) && ‪IS_TRUE(zone.is_enabled) )
1241  {
1242  a_active_zones[ a_active_zones.size ] = e_zone;
1243  }
1244  }
1245  return( a_active_zones );
1246 }
1247 
1248 
1249 // RAVEN BEGIN: bhackbarth Debug zone info
1251 {
1252  level.last_debug_zone_index = 0;
1253 
1254  current_y = 30;
1255  current_x = 20;
1256 
1257  xloc = [];
1258  xloc[0] = 50;
1259  xloc[1] = 60;
1260  xloc[2] = 100;
1261  xloc[3] = 130;
1262  xloc[4] = 170;
1263  xloc[5] = 220;
1264 
1265  zkeys = GetArrayKeys( level.zones );
1266  for ( i = 0; i < zkeys.size; i++ )
1267  {
1268  zoneName = zkeys[i];
1269  zone = level.zones[zoneName];
1270 
1271  zone.debug_hud = [];
1272  /#
1273  for ( j = 0; j < 6; j++ )
1274  {
1275  zone.debug_hud[j] = NewDebugHudElem();
1276  if ( !j )
1277  {
1278  zone.debug_hud[j].alignX = "right";
1279  }
1280  else
1281  {
1282  zone.debug_hud[j].alignX = "left";
1283  }
1284  zone.debug_hud[j].x = xloc[j];
1285  zone.debug_hud[j].y = current_y;
1286  }
1287 
1288  if ( i == 40 )
1289  {
1290  // Create a second column
1291  for ( x=0; x < xloc.size; x++ )
1292  {
1293  xloc[x] += 350;
1294  }
1295  current_y = 30;
1296  }
1297  else
1298  {
1299  current_y += 10;
1300  }
1301  zone.debug_hud[0] SetText(zoneName);
1302  #/
1303  }
1304 }
1305 
1307 {
1308  level.last_debug_zone_index = undefined;
1309 
1310  zkeys = GetArrayKeys( level.zones );
1311  for ( i = 0; i < zkeys.size; i++ )
1312  {
1313  zoneName = zkeys[i];
1314  zone = level.zones[zoneName];
1315 
1316  for ( j = 0; j < 6; j++ )
1317  {
1318  zone.debug_hud[j] Destroy();
1319  zone.debug_hud[j] = undefined;
1320  }
1321  }
1322 }
1323 
1324 function ‪_debug_show_zone( zone, color, alpha )
1325 {
1326  if( isDefined( zone ) )
1327  {
1328  foreach( volume in zone.volumes )
1329  {
1330  if( !isDefined( color ) || !isDefined( alpha ) )
1331  {
1332  ShowInfoVolume( volume GetEntityNumber(), (0.2, 0.5, 0), 0.05 );
1333  }
1334  else
1335  {
1336  ShowInfoVolume( volume GetEntityNumber(), color, alpha );
1337  }
1338  }
1339  }
1340 }
1342 {
1343  enabled = false;
1344  if ( GetDvarString("zombiemode_debug_zones") == "" )
1345  {
1346  SetDvar("zombiemode_debug_zones", "0");
1347  }
1348 
1349  InfoVolumeDebugInit();
1350  zkeys = GetArrayKeys( level.zones );
1351  for ( i = 0; i < zkeys.size; i++ )
1352  {
1353  zoneName = zkeys[i];
1354  zone = level.zones[zoneName];
1355  ‪_debug_show_zone( zone, ( RandomFloatRange( 0, 1.0 ), RandomFloatRange( 0, 1.0 ), RandomFloatRange( 0, 1.0 ) ), 0.2 );
1356 
1357  }
1358 
1359  while ( true )
1360  {
1361  wasEnabled = enabled;
1362  enabled = GetDvarInt("zombiemode_debug_zones");
1363  if ( enabled && !wasEnabled )
1364  {
1366  }
1367  else if ( !enabled && wasEnabled )
1368  {
1370  }
1371 
1372  occupied_zone = undefined;
1373 
1374  if ( enabled )
1375  {
1376  zkeys = GetArrayKeys( level.zones );
1377  for ( i = 0; i < zkeys.size; i++ )
1378  {
1379  zoneName = zkeys[i];
1380  zone = level.zones[zoneName];
1381 
1382  text = zoneName;
1383  zone.debug_hud[0] SetText(text);
1384 
1385  if ( zone.is_enabled )
1386  {
1387  text += " Enabled";
1388  zone.debug_hud[1] SetText("Enabled");
1389  }
1390  else
1391  {
1392  zone.debug_hud[1] SetText("");
1393  }
1394  if ( zone.is_active )
1395  {
1396  text += " Active";
1397  zone.debug_hud[2] SetText("Active");
1398  }
1399  else
1400  {
1401  zone.debug_hud[2] SetText("");
1402  }
1403  if ( zone.is_occupied )
1404  {
1405  text += " Occupied";
1406  zone.debug_hud[3] SetText("Occupied");
1407  occupied_zone = zone;
1408  }
1409  else
1410  {
1411  zone.debug_hud[3] SetText("");
1412  }
1413  if ( zone.is_spawning_allowed )
1414  {
1415  text += " SpawnOK";
1416  zone.debug_hud[4] SetText("SpawnOK");
1417  }
1418  else
1419  {
1420  zone.debug_hud[4] SetText("");
1421  }
1422 
1423  /#
1424  text += zone.a_loc_types[ "zombie_location" ].size + " spawn";
1425  zone.debug_hud[5] SetText(zone.a_loc_types[ "zombie_location" ].size + " - " + zone.total_spawn_count + " - " + zone.round_spawn_count );
1426  #/
1427 
1429  }
1430  }
1431 
1432  /* if( IsDefined(occupied_zone) )
1433  {
1434  //Debug draw spawners being used
1435 
1436  //Occupied zone
1437 
1438 
1439  //Adjacent zones
1440  for( i=0; i<adjacent_zones.size; i++ )
1441  {
1442 
1443  }
1444  }*/
1445 
1446  //util::wait_network_frame();
1447  wait( 0.1 );
1448  }
1449 }
1450 // RAVEN END
‪get_current_zone
‪function get_current_zone(return_zone)
Definition: _zm_utility.gsc:3614
‪get_players_in_zone
‪function get_players_in_zone(zone_name, return_players)
Definition: _zm_zonemgr.gsc:152
‪zone_flag_wait_throttle
‪function zone_flag_wait_throttle()
Definition: _zm_zonemgr.gsc:661
‪entity_in_active_zone
‪function entity_in_active_zone(ignore_enabled_check=false)
Definition: _zm_zonemgr.gsc:243
‪get_player_spawns_for_gametype
‪function get_player_spawns_for_gametype()
Definition: _zm_gametype.gsc:589
‪zone_flag_wait
‪function zone_flag_wait(flag_name)
Definition: _zm_zonemgr.gsc:675
‪any_player_in_zone
‪function any_player_in_zone(zone_name)
Definition: _zm_zonemgr.gsc:189
‪manage_zones
‪function manage_zones(initial_zone)
Definition: _zm_zonemgr.gsc:810
‪connect_zones
‪function connect_zones(zone_name_a, zone_name_b, one_way)
Definition: _zm_zonemgr.gsc:772
‪get_zone_from_position
‪function get_zone_from_position(v_pos, ignore_enabled_check)
Definition: _zm_zonemgr.gsc:99
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪make_zone_adjacent
‪function make_zone_adjacent(main_zone_name, adj_zone_name, flag_name)
Definition: _zm_zonemgr.gsc:531
‪deactivate_initial_barrier_goals
‪function deactivate_initial_barrier_goals()
Definition: _zm_zonemgr.gsc:267
‪enable_zone
‪function enable_zone(zone_name)
Definition: _zm_zonemgr.gsc:488
‪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
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪add
‪function add(entity, dyingplayer, team, timeout)
Definition: _deathicons.gsc:43
‪reinit_zone_spawners
‪function reinit_zone_spawners()
Definition: _zm_zonemgr.gsc:431
‪get_player_zone
‪function get_player_zone()
Definition: _zm_zonemgr.gsc:89
‪_debug_zones
‪function _debug_zones()
Definition: _zm_zonemgr.gsc:1341
‪setup_zone_flag_waits
‪function setup_zone_flag_waits()
Definition: _zm_zonemgr.gsc:627
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪__init__
‪function __init__()
Definition: _zm_zonemgr.gsc:45
‪zone_is_enabled
‪function zone_is_enabled(zone_name)
Definition: _zm_zonemgr.gsc:65
‪debug_show_spawn_locations
‪function debug_show_spawn_locations()
Definition: _zm_zonemgr.gsc:989
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪create_spawner_list
‪function create_spawner_list(zkeys)
Definition: _zm_zonemgr.gsc:1153
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪get_zone_magic_boxes
‪function get_zone_magic_boxes(zone_name)
Definition: _zm_zonemgr.gsc:120
‪old_manage_zones
‪function old_manage_zones(initial_zone)
Definition: _zm_zonemgr.gsc:1014
‪init
‪function init()
Definition: struct.csc:1
‪zone_wait_till_enabled
‪function zone_wait_till_enabled(zone_name)
Definition: _zm_zonemgr.gsc:75
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪_debug_show_zone
‪function _debug_show_zone(zone, color, alpha)
Definition: _zm_zonemgr.gsc:1324
‪get_active_zone_names
‪function get_active_zone_names()
Definition: _zm_zonemgr.gsc:1205
‪get_active_zones_entities
‪function get_active_zones_entities()
Definition: _zm_zonemgr.gsc:1230
‪add_zone_flags
‪function add_zone_flags(wait_flag, add_flags)
Definition: _zm_zonemgr.gsc:570
‪get_zone_zbarriers
‪function get_zone_zbarriers(zone_name)
Definition: _zm_zonemgr.gsc:134
‪entity_in_zone
‪function entity_in_zone(zone_name, ignore_enabled_check=false)
Definition: _zm_zonemgr.gsc:214
‪zone_init
‪function zone_init(zone_name, zone_tag)
Definition: _zm_zonemgr.gsc:286
‪wait_zone_flags_updating
‪function wait_zone_flags_updating()
Definition: _zm_zonemgr.gsc:652
‪_init_debug_zones
‪function _init_debug_zones()
Definition: _zm_zonemgr.gsc:1250
‪add_adjacent_zone
‪function add_adjacent_zone(zone_name_a, zone_name_b, flag_name, one_way, zone_tag_a, zone_tag_b)
Definition: _zm_zonemgr.gsc:595
‪door_close_disconnect
‪function door_close_disconnect(flag_name)
Definition: _zm_zonemgr.gsc:760
‪_destroy_debug_zones
‪function _destroy_debug_zones()
Definition: _zm_zonemgr.gsc:1306
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265