‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
trigger_shared.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\hud_util_shared;
6 #using scripts\shared\spawner_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 
10 #insert scripts\shared\shared.gsh;
11 
12 #namespace trigger;
13 
14 ‪REGISTER_SYSTEM( "trigger", &‪__init__, undefined )
15 
16 function ‪__init__()
17 {
18  level.fog_trigger_current = undefined;
19  level.trigger_hint_string = [];
20  level.trigger_hint_func = [];
21 
22  if ( !isdefined( level.trigger_flags ) )
23  {
24  ‪init_flags();
25  }
26 
27  trigger_funcs = [];
28  trigger_funcs[ "trigger_unlock" ] = &‪trigger_unlock;
29  trigger_funcs[ "flag_set" ] = &‪flag_set_trigger;
30  trigger_funcs[ "flag_clear" ] = &‪flag_clear_trigger;
31  trigger_funcs[ "flag_set_touching" ] = &‪flag_set_touching;
32  trigger_funcs[ "friendly_respawn_trigger" ] = &‪friendly_respawn_trigger;
33  trigger_funcs[ "friendly_respawn_clear" ] = &‪friendly_respawn_clear;
34  trigger_funcs[ "trigger_delete" ] = &‪trigger_turns_off;
35  trigger_funcs[ "trigger_delete_on_touch" ] = &‪trigger_delete_on_touch;
36  trigger_funcs[ "trigger_off" ] = &‪trigger_turns_off;
37  trigger_funcs[ "delete_link_chain" ] = &‪delete_link_chain;
38  trigger_funcs[ "no_crouch_or_prone" ] = &‪no_crouch_or_prone_think;
39  trigger_funcs[ "no_prone" ] = &‪no_prone_think;
40  trigger_funcs[ "flood_spawner" ] = &‪spawner::flood_trigger_think;
41  trigger_funcs[ "trigger_spawner" ] = &‪trigger_spawner;
42  trigger_funcs[ "trigger_hint" ] = &‪trigger_hint;
43  trigger_funcs[ "exploder" ] = &‪trigger_exploder;
44 
45  foreach ( trig in ‪get_all( "trigger_radius", "trigger_multiple", "trigger_once", "trigger_box" ) )
46  {
48  {
49  level thread ‪trigger_look( trig );
50  }
51  }
52 
53  foreach ( trig in ‪get_all() )
54  {
55  /#
56  trig ‪check_spawnflags();
57  #/
58 
59  if ( trig.classname != "trigger_damage" )
60  {
61  if ( trig.classname != "trigger_hurt" )
62  {
64  {
65  level thread ‪trigger_spawner( trig );
66  }
67  }
68  }
69 
70  if ( ( trig.classname != "trigger_once" ) && ‪is_trigger_once( trig ) )
71  {
72  level thread ‪trigger_once( trig );
73  }
74 
75  if ( isdefined( trig.script_flag_true ) )
76  {
77  level thread ‪script_flag_true_trigger( trig );
78  }
79 
80  if ( isdefined( trig.script_flag_set ) )
81  {
82  level thread ‪flag_set_trigger( trig, trig.script_flag_set );
83  }
84 
85  if ( isdefined( trig.script_flag_set_on_touching ) || isdefined( trig.script_flag_set_on_cleared ) )
86  {
87  level thread ‪script_flag_set_touching( trig );
88  }
89 
90  if ( isdefined( trig.script_flag_clear ) )
91  {
92  level thread ‪flag_clear_trigger( trig, trig.script_flag_clear );
93  }
94 
95  if ( isdefined( trig.script_flag_false ) )
96  {
97  level thread ‪script_flag_false_trigger( trig );
98  }
99 
100  if ( isdefined( trig.script_trigger_group ) )
101  {
102  trig thread ‪trigger_group();
103  }
104  // MikeD( 06/26/07 ): Added script_notify, which will send out the value set to script_notify as a level notify once triggered
105  if ( isdefined( trig.script_notify ) )
106  {
107  level thread ‪trigger_notify( trig, trig.script_notify );
108  }
109 
110  if ( isdefined( trig.script_fallback ) )
111  {
112  level thread ‪spawner::fallback_think( trig );
113  }
114 
115  if ( isdefined( trig.script_killspawner ) )
116  {
117  level thread ‪kill_spawner_trigger( trig );
118  }
119 
120  if ( isdefined( trig.targetname ) )
121  {
122  // do targetname specific functions
123  if ( isdefined( trigger_funcs[ trig.targetname ] ) )
124  {
125  level thread [[ trigger_funcs[ trig.targetname ] ]]( trig );
126  }
127  }
128  }
129 }
130 
132 {
133  if ( ‪IS_TRUE( self.script_trigger_allplayers )
139  {
140  //Assert( "Triggers using 'script_trigger_allplayers' are not compatible with other entity types. Please unset spawnflags for other types." ); // TODO: put this back in, just didn't want to check in an assert at the end of the day
141  }
142 }
143 
144 function ‪trigger_unlock( trigger )
145 {
146  // trigger unlocks unlock another trigger. When that trigger is hit, all unlocked triggers relock
147  // trigger_unlocks with the same script_noteworthy relock the same triggers
148 
149  noteworthy = "not_set";
150  if( isdefined( trigger.script_noteworthy ) )
151  {
152  noteworthy = trigger.script_noteworthy;
153  }
154 
155  target_triggers = GetEntArray( trigger.target, "targetname" );
156 
157  trigger thread ‪trigger_unlock_death( trigger.target );
158 
159  while ( true )
160  {
161  array::run_all( target_triggers, &TriggerEnable, false );
162 
163  trigger waittill( "trigger" );
164 
165  array::run_all( target_triggers, &TriggerEnable, true );
166 
167  ‪wait_for_an_unlocked_trigger( target_triggers, noteworthy );
168 
169  array::notify_all( target_triggers, "relock" );
170  }
171 }
172 
173 function ‪trigger_unlock_death( target )
174 {
175  self waittill( "death" );
176  target_triggers = GetEntArray( target, "targetname" );
177  array::run_all( target_triggers, &TriggerEnable, false );
178 }
179 
180 function ‪wait_for_an_unlocked_trigger( triggers, noteworthy )
181 {
182  level endon( "unlocked_trigger_hit" + noteworthy );
183  ent = SpawnStruct();
184  for( i = 0; i < triggers.size; i++ )
185  {
186  triggers[i] thread ‪report_trigger( ent, noteworthy );
187  }
188  ent waittill( "trigger" );
189  level notify( "unlocked_trigger_hit" + noteworthy );
190 }
191 
192 function ‪report_trigger( ent, noteworthy )
193 {
194  self endon( "relock" );
195  level endon( "unlocked_trigger_hit" + noteworthy );
196  self waittill( "trigger" );
197  ent notify( "trigger" );
198 }
199 
201 {
202  if ( isdefined( self.target ) )
203  {
204  a_potential_targets = GetEntArray( self.target, "targetname" );
205  a_targets = [];
206 
207  foreach ( target in a_potential_targets )
208  {
209  if ( ‪IS_EQUAL( target.classname, "script_origin" ) )
210  {
211  ‪ARRAY_ADD( a_targets, target );
212  }
213  }
214 
215  a_potential_target_structs = ‪struct::get_array( self.target );
216  a_targets = ArrayCombine( a_targets, a_potential_target_structs, true, false );
217 
218  if ( a_targets.size > 0 )
219  {
220  Assert( a_targets.size == 1, "Look tigger at " + self.origin + " targets multiple origins/structs." );
221  ‪e_target = a_targets[0];
222  }
223  }
224 
225  ‪DEFAULT( ‪e_target, self );
226 
227  return ‪e_target;
228 }
229 
230 function ‪trigger_look( trigger )
231 {
232  trigger endon( "death" );
233 
235 
236  if ( isdefined( trigger.script_flag ) && !isdefined( level.flag[trigger.script_flag] ) )
237  {
238  level ‪flag::init( trigger.script_flag, undefined, true );
239  }
240 
241  a_parameters = [];
242  if ( isdefined( trigger.script_parameters ) )
243  {
244  a_parameters = StrTok( trigger.script_parameters, ",; " );
245  }
246 
247  b_ads_check = IsInArray( a_parameters, "check_ads" );
248 
249  while ( true )
250  {
251  trigger waittill( "trigger", e_other );
252 
253  if ( IsPlayer( e_other ) )
254  {
255  while ( isdefined( e_other ) && e_other IsTouching( trigger ) )
256  {
257  if ( e_other ‪util::is_looking_at( ‪e_target, trigger.script_dot, ‪IS_TRUE( trigger.script_trace ) )
258  && ( !b_ads_check || !e_other ‪util::is_ads() ) )
259  {
260  trigger notify( "trigger_look", e_other );
261 
262  if ( isdefined( trigger.script_flag ) )
263  {
264  level ‪flag::set( trigger.script_flag );
265  }
266  }
267  else
268  {
269  if ( isdefined( trigger.script_flag ) )
270  {
271  level ‪flag::clear( trigger.script_flag );
272  }
273  }
274 
276  }
277 
278  if ( isdefined( trigger.script_flag ) )
279  {
280  level ‪flag::clear( trigger.script_flag );
281  }
282  }
283  else
284  {
285  AssertMsg( "Look triggers only support players." );
286  }
287  }
288 }
289 
290 function ‪trigger_spawner( trigger )
291 {
292  a_spawners = GetSpawnerArray( trigger.target, "targetname" );
293 
294  Assert( a_spawners.size > 0, "Triggers with flag TRIGGER_SPAWN at " + trigger.origin + " must target at least one spawner." );
295 
296  trigger endon( "death" );
297  trigger ‪wait_till();
298 
299  foreach ( sp in a_spawners )
300  {
301  if ( isdefined( sp ) )
302  {
303  sp thread ‪trigger_spawner_spawn();
304  }
305  }
306 }
307 
309 {
310  self endon( "death" );
311 
313  self ‪util::script_delay();
314 
315  self ‪spawner::spawn();
316 }
317 
327 function ‪trigger_notify( trigger, msg )
328 {
329  trigger endon( "death" );
330 
331  other = trigger ‪wait_till();
332 
333  if( isdefined( trigger.target ) )
334  {
335  a_target_ents = GetEntArray( trigger.target, "targetname" );
336 
337  foreach ( notify_ent in a_target_ents )
338  {
339  notify_ent notify( msg, other );
340  }
341  }
342 
343  level notify( msg, other );
344 }
345 
346 function ‪flag_set_trigger( trigger, str_flag )
347 {
348  trigger endon( "death" );
349 
350  ‪DEFAULT( str_flag, trigger.script_flag );
351 
352  if ( !level ‪flag::exists( str_flag ) )
353  {
354  level ‪flag::init( str_flag, undefined, true );
355  }
356 
357  while ( true )
358  {
359  trigger ‪wait_till();
360 
361  if ( isdefined( trigger.targetname ) && ( trigger.targetname == "flag_set" ) )
362  {
363  // this is a "flag_set" trigger so support script_delay
364  // generic triggers don't use script_dealy for flag setting because the
365  // script_delay might be intended for something else
366 
367  trigger ‪util::script_delay();
368  }
369 
370  level ‪flag::set( str_flag );
371  }
372 }
373 
374 function ‪flag_clear_trigger( trigger, str_flag )
375 {
376  trigger endon( "death" );
377 
378  ‪DEFAULT( str_flag, trigger.script_flag );
379 
380  if ( !level ‪flag::exists( str_flag ) )
381  {
382  level ‪flag::init( str_flag, undefined, true );
383  }
384 
385  while ( true )
386  {
387  trigger ‪wait_till();
388 
389  if ( isdefined( trigger.targetname ) && ( trigger.targetname == "flag_clear" ) )
390  {
391  // this is a "level flag::clear" trigger so support script_delay
392  // generic triggers don't use script_dealy for flag clearing because the
393  // script_delay might be intended for something else
394 
395  trigger ‪util::script_delay();
396  }
397 
398  level ‪flag::clear( str_flag );
399  }
400 }
401 
403 {
404  for( i = 0; i < tokens.size; i++ )
405  {
406  flag = tokens[i];
407  if( !isdefined( level.trigger_flags[flag] ) )
408  {
409  level.trigger_flags[flag] = [];
410  }
411 
412  level.trigger_flags[flag][level.trigger_flags[flag].size] = self;
413  }
414 }
415 
416 function ‪script_flag_false_trigger( trigger )
417 {
418  // all of these flags must be false for the trigger to be enabled
419  tokens = ‪util::create_flags_and_return_tokens( trigger.script_flag_false );
420  trigger ‪add_tokens_to_trigger_flags( tokens );
421  trigger ‪update_based_on_flags();
422 }
423 
424 function ‪script_flag_true_trigger( trigger )
425 {
426  // all of these flags must be false for the trigger to be enabled
427  tokens = ‪util::create_flags_and_return_tokens( trigger.script_flag_true );
428  trigger ‪add_tokens_to_trigger_flags( tokens );
429  trigger ‪update_based_on_flags();
430 }
431 
432 function ‪friendly_respawn_trigger( trigger )
433 {
434  trigger endon( "death" );
435 
436  spawners = GetEntArray( trigger.target, "targetname" );
437  assert( spawners.size == 1, "friendly_respawn_trigger targets multiple spawner with targetname " + trigger.target + ". Should target just 1 spawner." );
438  spawner = spawners[0];
439  assert( !isdefined( spawner.script_forcecolor ), "targeted spawner at " + spawner.origin + " should not have script_forcecolor set!" );
440  spawners = undefined;
441 
442  spawner endon( "death" );
443 
444  while ( true )
445  {
446  trigger waittill( "trigger" );
447 
448  // SRS 12/20/2007: updated to allow for multiple color chains to be reinforced from different areas
449  if( isdefined( trigger.script_forcecolor ) )
450  {
451  level.respawn_spawners_specific[trigger.script_forcecolor] = spawner;
452  }
453  else
454  {
455  level.respawn_spawner = spawner;
456  }
457  level ‪flag::set( "respawn_friendlies" );
458  wait( 0.5 );
459  }
460 }
461 
462 function ‪friendly_respawn_clear( trigger )
463 {
464  trigger endon( "death" );
465 
466  while ( true )
467  {
468  trigger waittill( "trigger" );
469  level ‪flag::clear( "respawn_friendlies" );
470  wait 0.5;
471  }
472 }
473 
474 function ‪trigger_turns_off( trigger )
475 {
476  trigger ‪wait_till();
477  trigger TriggerEnable( false );
478 
479  if( !isdefined( trigger.script_linkTo ) )
480  {
481  return;
482  }
483 
484  // also turn off all triggers this trigger links to
485  tokens = Strtok( trigger.script_linkto, " " );
486  for( i = 0; i < tokens.size; i++ )
487  {
488  array::run_all( GetEntArray( tokens[i], "script_linkname" ), &TriggerEnable, false );
489  }
490 }
491 
492 function ‪script_flag_set_touching( trigger )
493 {
494  trigger endon( "death" );
495 
496  if ( isdefined( trigger.script_flag_set_on_touching ) )
497  {
498  level ‪flag::init( trigger.script_flag_set_on_touching, undefined, true );
499  }
500 
501  if ( isdefined( trigger.script_flag_set_on_cleared ) )
502  {
503  level ‪flag::init( trigger.script_flag_set_on_cleared, undefined, true );
504  }
505 
506  trigger thread ‪_detect_touched();
507 
508  while ( true )
509  {
510  trigger.script_touched = false;
511 
513  waittillframeend; // wait for touched variable to update for this frame
514 
515  if ( !trigger.script_touched )
516  {
517  // HACK: wait one more frame if it isn't touched - saw a strange issue where
518  // the trigger thought it wasn't touched for a frame when another player joined
519  // even though the first player was still standing in the trigger
521  waittillframeend;
522  }
523 
524  if ( trigger.script_touched )
525  {
526  if ( isdefined( trigger.script_flag_set_on_touching ) )
527  {
528  level ‪flag::set( trigger.script_flag_set_on_touching );
529  }
530 
531  if ( isdefined( trigger.script_flag_set_on_cleared ) )
532  {
533  level ‪flag::clear( trigger.script_flag_set_on_cleared );
534  }
535  }
536  else
537  {
538  if ( isdefined( trigger.script_flag_set_on_touching ) )
539  {
540  level ‪flag::clear( trigger.script_flag_set_on_touching );
541  }
542 
543  if ( isdefined( trigger.script_flag_set_on_cleared ) )
544  {
545  level ‪flag::set( trigger.script_flag_set_on_cleared );
546  }
547  }
548  }
549 }
550 
552 {
553  self endon( "death" );
554 
555  while ( true )
556  {
557  self waittill( "trigger" );
558  self.script_touched = true;
559  }
560 }
561 
562 function ‪trigger_delete_on_touch( trigger )
563 {
564  while ( true )
565  {
566  trigger waittill( "trigger", other );
567  if( isdefined( other ) )
568  {
569  // might've been removed before we got it
570  other Delete();
571  }
572  }
573 }
574 
575 function ‪flag_set_touching( trigger )
576 {
577  str_flag = trigger.script_flag;
578 
579  if ( !isdefined( level.flag[ str_flag ] ) )
580  {
581  level ‪flag::init( str_flag, undefined, true );
582  }
583 
584  while ( true )
585  {
586  trigger waittill( "trigger", other );
587 
588  level ‪flag::set( str_flag );
589  while ( IsAlive( other ) && other IsTouching( trigger ) && isdefined( trigger ) )
590  {
591  wait( 0.25 );
592  }
593 
594  level ‪flag::clear( str_flag );
595  }
596 }
597 
598 function ‪trigger_once( trig )
599 {
600  trig endon( "death" );
601 
602  if ( ‪is_look_trigger( trig ) )
603  {
604  trig waittill( "trigger_look" );
605  }
606  else
607  {
608  trig waittill( "trigger" );
609  }
610 
611  waittillframeend;
612  waittillframeend;
613 
614  if ( isdefined( trig ) )
615  {
616 /#
617  println( "" );
618  println( "*** trigger debug: deleting trigger with ent#: " + trig getentitynumber() + " at origin: " + trig.origin );
619  println( "" );
620 #/
621 
622  trig Delete();
623  }
624 }
625 
626 function ‪trigger_hint( trigger )
627 {
628  assert( isdefined( trigger.script_hint ), "Trigger_hint at " + trigger.origin + " has no .script_hint" );
629 
630  trigger endon( "death" );
631 
632  if ( !isdefined( level.displayed_hints ) )
633  {
634  level.displayed_hints = [];
635  }
636 
637  waittillframeend; // give level script a chance to set the hint string and optional boolean functions on this hint
638 
639  assert( isdefined( level.trigger_hint_string[ trigger.script_hint ] ), "Trigger_hint with hint " + trigger.script_hint + " had no hint string assigned to it. Define hint strings with util::add_hint_string()" );
640 
641  trigger waittill( "trigger", other );
642 
643  assert( IsPlayer( other ), "Tried to do a trigger_hint on a non player entity" );
644 
645  if ( isdefined( level.displayed_hints[ trigger.script_hint ] ) )
646  {
647  return;
648  }
649 
650  level.displayed_hints[ trigger.script_hint ] = true;
651 
652  ‪display_hint( trigger.script_hint );
653 }
654 
655 function ‪trigger_exploder( trigger )
656 {
657  trigger endon( "death" );
658  while (true)
659  {
660  trigger waittill( "trigger" );
661  if (isdefined(trigger.target ))
662  {
663  ActivateClientRadiantExploder( trigger.target );
664  }
665  }
666 }
667 
668 
678 function ‪display_hint( hint )
679 {
680  if ( GetDvarString( "chaplincheat" ) == "1" )
681  {
682  return;
683  }
684 
685  // hint triggers have an optional function they can boolean off of to determine if the hint will occur
686  // such as not doing the NVG hint if the player is using NVGs already
687  if( isdefined( level.trigger_hint_func[ hint ] ) )
688  {
689  if( [[ level.trigger_hint_func[ hint ] ]]() )
690  {
691  return;
692  }
693 
694  ‪_hint_print( level.trigger_hint_string[ hint ], level.trigger_hint_func[ hint ] );
695  }
696  else
697  {
698  ‪_hint_print( level.trigger_hint_string[ hint ] );
699  }
700 }
701 
702 function ‪_hint_print( string, breakfunc )
703 {
704  const MYFADEINTIME = 1.0;
705  const MYFLASHTIME = 0.75;
706  const MYALPHAHIGH = 0.95;
707  const MYALPHALOW = 0.4;
708 
709  level ‪flag::wait_till_clear( "global_hint_in_use" );
710  level ‪flag::set( "global_hint_in_use" );
711 
712  Hint = ‪hud::createFontString( "objective", 2 );
713 
714  //Hint.color = ( 1, 1, .5 ); //remove color so that color highlighting on PC can show up.
715  Hint.alpha = 0.9;
716  Hint.x = 0;
717  Hint.y = -68;
718  Hint.alignx = "center";
719  Hint.aligny = "middle";
720  Hint.horzAlign = "center";
721  Hint.vertAlign = "middle";
722  Hint.foreground = false;
723  Hint.hidewhendead = true;
724 
725  Hint setText( string );
726 
727  Hint.alpha = 0;
728  Hint FadeOverTime( MYFADEINTIME );
729  Hint.alpha = MYALPHAHIGH;
730  ‪_hint_print_wait( MYFADEINTIME );
731 
732  if ( isdefined( breakfunc ) )
733  {
734  for ( ;; )
735  {
736  Hint FadeOverTime( MYFLASHTIME );
737  Hint.alpha = MYALPHALOW;
738  ‪_hint_print_wait( MYFLASHTIME, breakfunc );
739 
740  if ( [[ breakfunc ]]() )
741  {
742  break;
743  }
744 
745  Hint FadeOverTime( MYFLASHTIME );
746  Hint.alpha = MYALPHAHIGH;
747  ‪_hint_print_wait( MYFLASHTIME );
748 
749  if ( [[ breakfunc ]]() )
750  {
751  break;
752  }
753  }
754  }
755  else
756  {
757  for ( i = 0; i < 5; i++ )
758  {
759  Hint FadeOverTime( MYFLASHTIME );
760  Hint.alpha = MYALPHALOW;
761  ‪_hint_print_wait( MYFLASHTIME );
762 
763  Hint FadeOverTime( MYFLASHTIME );
764  Hint.alpha = MYALPHAHIGH;
765  ‪_hint_print_wait( MYFLASHTIME );
766  }
767  }
768 
769  Hint Destroy();
770  level ‪flag::clear( "global_hint_in_use" );
771 }
772 
773 function ‪_hint_print_wait( length, breakfunc )
774 {
775  if ( !isdefined( breakfunc ) )
776  {
777  wait( length );
778  return;
779  }
780 
781  ‪timer = length * 20;
782  for ( i = 0; i < ‪timer; i++ )
783  {
784  if ( [[ breakfunc ]]() )
785  {
786  break;
787  }
789  }
790 }
791 
802 function ‪get_all( type1, type2, type3, type4, type5, type6, type7, type8, type9 )
803 {
804  if ( !isdefined( type1 ) )
805  {
806  type1 = "trigger_damage";
807  type2 = "trigger_hurt";
808  type3 = "trigger_lookat";
809  type4 = "trigger_once";
810  type5 = "trigger_radius";
811  type6 = "trigger_use";
812  type7 = "trigger_use_touch";
813  type8 = "trigger_box";
814  type9 = "trigger_multiple";
815  type10 = "trigger_out_of_bounds";
816  }
817 
818  assert( ‪_is_valid_trigger_type( type1 ) );
819  trigs = GetEntArray( type1, "classname" );
820 
821  if ( isdefined( type2 ) )
822  {
823  assert( ‪_is_valid_trigger_type( type2 ) );
824  trigs = ArrayCombine( trigs, GetEntArray( type2, "classname" ), true, false );
825  }
826 
827  if ( isdefined( type3 ) )
828  {
829  assert( ‪_is_valid_trigger_type( type3 ) );
830  trigs = ArrayCombine( trigs, GetEntArray( type3, "classname" ), true, false );
831  }
832 
833  if ( isdefined( type4 ) )
834  {
835  assert( ‪_is_valid_trigger_type( type4 ) );
836  trigs = ArrayCombine( trigs, GetEntArray( type4, "classname" ), true, false );
837  }
838 
839  if ( isdefined( type5 ) )
840  {
841  assert( ‪_is_valid_trigger_type( type5 ) );
842  trigs = ArrayCombine( trigs, GetEntArray( type5, "classname" ), true, false );
843  }
844 
845  if ( isdefined( type6 ) )
846  {
847  assert( ‪_is_valid_trigger_type( type6 ) );
848  trigs = ArrayCombine( trigs, GetEntArray( type6, "classname" ), true, false );
849  }
850 
851  if ( isdefined( type7 ) )
852  {
853  assert( ‪_is_valid_trigger_type( type7 ) );
854  trigs = ArrayCombine( trigs, GetEntArray( type7, "classname" ), true, false );
855  }
856 
857  if ( isdefined( type8 ) )
858  {
859  assert( ‪_is_valid_trigger_type( type8 ) );
860  trigs = ArrayCombine( trigs, GetEntArray( type8, "classname" ), true, false );
861  }
862 
863  if ( isdefined( type9 ) )
864  {
865  assert( ‪_is_valid_trigger_type( type9 ) );
866  trigs = ArrayCombine( trigs, GetEntArray( type9, "classname" ), true, false );
867  }
868 
869  if ( isdefined( type10 ) )
870  {
871  assert( ‪_is_valid_trigger_type( type9 ) );
872  trigs = ArrayCombine( trigs, GetEntArray( type10, "classname" ), true, false );
873  }
874 
875  return trigs;
876 }
877 
879 {
880  switch ( type )
881  {
882  case "trigger_damage":
883  case "trigger_hurt":
884  case "trigger_lookat":
885  case "trigger_once":
886  case "trigger_radius":
887  case "trigger_use":
888  case "trigger_use_touch":
889  case "trigger_box":
890  case "trigger_multiple":
891  case "trigger_out_of_bounds":
892  return true;
893  break;
894  default:
895  return false;
896  }
897 }
898 
911 function ‪wait_till( str_name, str_key = "targetname", e_entity, b_assert = true )
912 {
913  if ( isdefined( str_name ) )
914  {
915  triggers = GetEntArray( str_name, str_key );
916 
917  if( ‪IS_BONUSZM )
918  {
919  // sjakatdar ( 09/21/2015 ) - A temporary fix which should be removed in T8 branch. In campaign zombies,
920  // players can double jump ahead and hit the trigger before trigger::wait_till is called, which can end up in this assert.
921  //Assert( !b_assert || ( triggers.size > 0 ), "trigger not found: " + str_name + " key: " + str_key );
922  // Its better to just return true if the trigger is not found instead.
923  if( triggers.size <= 0 )
924  return;
925  }
926  else
927  {
928  Assert( !b_assert || ( triggers.size > 0 ), "trigger not found: " + str_name + " key: " + str_key );
929  }
930 
931  if ( triggers.size > 0 )
932  {
933  if ( triggers.size == 1 )
934  {
935  trigger_hit = triggers[0];
936  trigger_hit ‪_trigger_wait( e_entity );
937  }
938  else
939  {
940  s_tracker = SpawnStruct();
941  array::thread_all( triggers,&‪_trigger_wait_think, s_tracker, e_entity );
942  s_tracker waittill( "trigger", e_other, trigger_hit );
943  trigger_hit.who = e_other;
944  }
945 
946  return trigger_hit;
947  }
948  }
949  else
950  {
951  if( ‪IS_BONUSZM )
952  {
953  // sjakatdar ( 09/21/2015 ) - A temporary fix which should be removed in T8 branch. In campaign zombies,
954  // players can double jump ahead and hit the trigger before trigger::wait_till is called, which can end up in script errors
955  // Its better to just return true if the trigger is not found instead.
956  if( !IsDefined( self ) )
957  return;
958  }
959 
960  return ‪_trigger_wait( e_entity );
961  }
962 }
963 
964 function ‪_trigger_wait( e_entity )
965 {
966  self endon( "death" );
967 
968  if ( isdefined( e_entity ) )
969  {
970  e_entity endon( "death" );
971  }
972 
973  /#
974  if ( ‪is_look_trigger( self ) )
975  {
976  Assert( !IsArray( e_entity ), "LOOK triggers can only wait on one entity." );
977  }
978  else if ( self.classname === "trigger_damage" )
979  {
980  Assert( !IsArray( e_entity ), "Damage triggers can only wait on one entity." );
981  }
982  #/
983 
984  while ( true )
985  {
986  if ( ‪is_look_trigger( self ) )
987  {
988  self waittill( "trigger_look", e_other );
989 
990  if ( isdefined( e_entity ) )
991  {
992  if ( e_other !== e_entity )
993  {
994  continue;
995  }
996  }
997  }
998  else if ( self.classname === "trigger_damage" )
999  {
1000  self waittill( "trigger", e_other );
1001 
1002  if ( isdefined( e_entity ) )
1003  {
1004  if ( e_other !== e_entity )
1005  {
1006  continue;
1007  }
1008  }
1009  }
1010  else
1011  {
1012  self waittill( "trigger", e_other );
1013 
1014  if ( isdefined( e_entity ) )
1015  {
1016  if ( IsArray( e_entity ) )
1017  {
1018  if ( !array::is_touching( e_entity, self ) )
1019  {
1020  continue;
1021  }
1022  }
1023  else if ( !e_entity IsTouching( self ) && ( e_entity !== e_other ) )
1024  {
1025  continue;
1026  }
1027  }
1028  }
1029 
1030  break;
1031  }
1032 
1033  self.who = e_other;
1034  return self;
1035 }
1036 
1037 function ‪_trigger_wait_think( s_tracker, e_entity )
1038 {
1039  self endon( "death" );
1040  s_tracker endon( "trigger" );
1041 
1042  e_other = ‪_trigger_wait( e_entity );
1043  s_tracker notify( "trigger", e_other, self );
1044 }
1045 
1059 function ‪use( str_name, str_key = "targetname", ent, b_assert = true )
1060 {
1061  if ( !isdefined( ent ) )
1062  {
1063  ent = GetPlayers()[0];
1064  }
1065 
1066  if ( isdefined( str_name ) )
1067  {
1068  e_trig = GetEnt( str_name, str_key );
1069  if( !isdefined( e_trig ) )
1070  {
1071  if ( b_assert )
1072  {
1073  AssertMsg( "trigger not found: " + str_name + " key: " + str_key );
1074  }
1075 
1076  return;
1077  }
1078  }
1079  else
1080  {
1081  e_trig = self;
1082  str_name = self.targetname;
1083  }
1084 
1085  if( isdefined( ent ) )
1086  {
1087  e_trig UseBy( ent );
1088  }
1089  else
1090  {
1091  e_trig UseBy( e_trig );
1092  }
1093 
1094  level notify( str_name, ent ); // TODO: brianb - do we need this?
1095 
1096  if ( ‪is_look_trigger( e_trig ) )
1097  {
1098  e_trig notify( "trigger_look", ent );
1099  }
1100 
1101  return e_trig;
1102 }
1103 
1105 {
1106  // turns triggers on or off depending on if they have the proper flags set, based on their shift-g menu settings
1107 
1108  if ( !isdefined( level.trigger_flags ) || !isdefined( level.trigger_flags[ msg ] ) )
1109  {
1110  return;
1111  }
1112 
1113  // cheaper to do the upkeep at this time rather than with endons and waittills on the individual triggers
1114  level.trigger_flags[ msg ] = ‪array::remove_undefined( level.trigger_flags[ msg ] );
1115  array::thread_all( level.trigger_flags[ msg ], &‪update_based_on_flags );
1116 }
1117 
1119 {
1120  true_on = true;
1121  if ( isdefined( self.script_flag_true ) )
1122  {
1123  true_on = false;
1124  tokens = ‪util::create_flags_and_return_tokens( self.script_flag_true );
1125 
1126  // stay off unless any of the flags are true
1127  for( i=0; i < tokens.size; i++ )
1128  {
1129  if ( level ‪flag::get( tokens[ i ] ) )
1130  {
1131  true_on = true;
1132  break;
1133  }
1134  }
1135  }
1136 
1137  false_on = true;
1138  if ( isdefined( self.script_flag_false ) )
1139  {
1140  tokens = ‪util::create_flags_and_return_tokens( self.script_flag_false );
1141 
1142  // stay off unless all flags are false
1143  for( i=0; i < tokens.size; i++ )
1144  {
1145  if ( level ‪flag::get( tokens[ i ] ) )
1146  {
1147  false_on = false;
1148  break;
1149  }
1150  }
1151  }
1152 
1153  b_enable = true_on && false_on;
1154  self TriggerEnable( b_enable );
1155 }
1156 
1157 function ‪init_flags()
1158 {
1159  level.trigger_flags = [];
1160 }
1161 
1162 function ‪is_look_trigger( trig )
1163 {
1164  return ( isdefined( trig ) ? ‪SPAWNFLAG( trig, ‪SPAWNFLAG_TRIGGER_LOOK ) && !‪IS_EQUAL( trig.classname, "trigger_damage" ) : false );
1165 }
1166 
1167 function ‪is_trigger_once( trig )
1168 {
1169  return ( isdefined( trig ) ? ‪SPAWNFLAG( trig, ‪SPAWNFLAG_TRIGGER_TRIGGER_ONCE ) || ( ‪IS_EQUAL( self.classname, "trigger_once" ) ) : false );
1170 }
1171 
1172 function ‪wait_for_either( str_targetname1, str_targetname2 )
1173 {
1174  ent = SpawnStruct();
1175 
1176  ‪array = [];
1177  ‪array = ArrayCombine( ‪array, GetEntArray( str_targetname1, "targetname" ), true, false );
1178  ‪array = ArrayCombine( ‪array, GetEntArray( str_targetname2, "targetname" ), true, false );
1179 
1180  for ( i = 0; i < ‪array.size; i++ )
1181  {
1182  ent thread ‪_ent_waits_for_trigger( ‪array[ i ] );
1183  }
1184 
1185  ent waittill( "done", t_hit );
1186 
1187  return t_hit;
1188 }
1189 
1190 function ‪_ent_waits_for_trigger( trigger )
1191 {
1192  trigger ‪wait_till();
1193  self notify( "done", trigger );
1194 }
1195 
1205 function ‪wait_or_timeout( n_time, str_name, str_key )
1206 {
1207  ‪TIMEOUT( n_time );
1208  ‪wait_till( str_name, str_key );
1209 }
1210 
1221 function ‪trigger_on_timeout( n_time, b_cancel_on_triggered = true, str_name, str_key = "targetname" )
1222 {
1223  trig = self;
1224  if ( isdefined( str_name ) )
1225  {
1226  trig = GetEnt( str_name, str_key );
1227  }
1228 
1229  if ( b_cancel_on_triggered )
1230  {
1231  if ( ‪is_look_trigger( trig ) )
1232  {
1233  trig endon( "trigger_look" );
1234  }
1235  else
1236  {
1237  trig endon( "trigger" );
1238  }
1239  }
1240 
1241  trig endon( "death" );
1242 
1243  wait n_time;
1244 
1245  trig ‪use();
1246 }
1247 
1248 function ‪multiple_waits( str_trigger_name, str_trigger_notify )
1249 {
1250  foreach ( trigger in GetEntArray( str_trigger_name, "targetname") )
1251  {
1252  trigger thread ‪multiple_wait( str_trigger_notify );
1253  }
1254 }
1255 
1256 function ‪multiple_wait( str_trigger_notify )// self = trigger ent
1257 {
1258  level endon( str_trigger_notify );
1259  self waittill( "trigger" );
1260  level notify( str_trigger_notify );
1261 }
1262 
1281 function ‪add_function( trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6 )
1282 {
1283  self thread ‪_do_trigger_function( trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6 );
1284 }
1285 
1286 function ‪_do_trigger_function( trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6 )
1287 {
1288  self endon( "death" );
1289  trigger endon( "death" );
1290 
1291  if ( isdefined( str_remove_on ) )
1292  {
1293  trigger endon( str_remove_on );
1294  }
1295 
1296  while ( true )
1297  {
1298  if ( IsString( trigger ) )
1299  {
1300  ‪wait_till( trigger );
1301  }
1302  else
1303  {
1304  trigger ‪wait_till();
1305  }
1306 
1307  ‪util::single_thread( self, func, param_1, param_2, param_3, param_4, param_5, param_6 );
1308  }
1309 }
1310 
1311 function ‪kill_spawner_trigger( trigger )
1312 {
1313  trigger ‪trigger::wait_till();
1314 
1315  a_spawners = GetSpawnerArray( trigger.script_killspawner, "script_killspawner" );
1316  foreach ( sp in a_spawners )
1317  {
1318  sp Delete();
1319  }
1320 
1321  ‪a_ents = GetEntArray( trigger.script_killspawner, "script_killspawner" );
1322  foreach ( ent in ‪a_ents )
1323  {
1324  if ( ‪IS_EQUAL( ent.classname, "spawn_manager" ) && ( ent != trigger ) )
1325  {
1326  ent Delete();
1327  }
1328  }
1329 }
1330 
1332 {
1333  targets = [];
1334  if( !isdefined( self.script_linkto ) )
1335  {
1336  return targets;
1337  }
1338 
1339  tokens = Strtok( self.script_linkto, " " );
1340  for( i = 0; i < tokens.size; i++ )
1341  {
1342  token = tokens[i];
1343  target = GetEnt( token, "script_linkname" );
1344  if( isdefined( target ) )
1345  {
1346  targets[targets.size] = target;
1347  }
1348  }
1349 
1350  return targets;
1351 }
1352 
1353 function ‪delete_link_chain( trigger )
1354 {
1355  // deletes all entities that it script_linkto's, and all entities that entity script linktos, etc.
1356  trigger waittill( "trigger" );
1357 
1358  targets = trigger ‪get_script_linkto_targets();
1359  array::thread_all( targets, &‪delete_links_then_self );
1360 }
1361 
1363 {
1364  targets = ‪get_script_linkto_targets();
1365  array::thread_all( targets, &‪delete_links_then_self );
1366  self Delete();
1367 }
1368 
1369 function ‪no_crouch_or_prone_think( trigger )
1370 {
1371  while ( true )
1372  {
1373  trigger waittill( "trigger", other );
1374 
1375  if( !IsPlayer( other ) )
1376  {
1377  continue;
1378  }
1379 
1380  while( other IsTouching( trigger ) )
1381  {
1382  other AllowProne( false );
1383  other AllowCrouch( false );
1385  }
1386 
1387  other AllowProne( true );
1388  other AllowCrouch( true );
1389  }
1390 }
1391 
1392 function ‪no_prone_think( trigger )
1393 {
1394  while ( true )
1395  {
1396  trigger waittill( "trigger", other );
1397 
1398  if( !IsPlayer( other ) )
1399  {
1400  continue;
1401  }
1402 
1403  while( other IsTouching( trigger ) )
1404  {
1405  other AllowProne( false );
1407  }
1408 
1409  other AllowProne( true );
1410  }
1411 }
1412 
1414 {
1415  self thread ‪trigger_group_remove();
1416 
1417  level endon( "trigger_group_" + self.script_trigger_group );
1418  self waittill( "trigger" );
1419  level notify( "trigger_group_" + self.script_trigger_group, self );
1420 }
1421 
1423 {
1424  level waittill( "trigger_group_" + self.script_trigger_group, trigger );
1425  if( self != trigger )
1426  {
1427  self Delete();
1428  }
1429 }
1430 
1431 //trigger_thread
1432 function ‪function_thread(ent, on_enter_payload, on_exit_payload)
1433 {
1434  ent endon("entityshutdown");
1435 
1436  if(ent ‪ent_already_in(self))
1437  return;
1438 
1439  ‪add_to_ent(ent, self);
1440 
1441 // iprintlnbold("Trigger " + self.targetname + " hit by ent " + ent getentitynumber());
1442 
1443  if(isdefined(on_enter_payload))
1444  {
1445  [[on_enter_payload]](ent);
1446  }
1447 
1448  while(isdefined(ent) && ent istouching(self))
1449  {
1450  wait(0.01);
1451  }
1452 
1453 // iprintlnbold(ent getentitynumber() + " leaves trigger " + self.targetname + ".");
1454 
1455  if(isdefined(ent) && isdefined(on_exit_payload))
1456  {
1457  [[on_exit_payload]](ent);
1458  }
1459 
1460  if(isdefined(ent))
1461  {
1462  ‪remove_from_ent(ent, self);
1463  }
1464 }
1465 
1466 function ‪ent_already_in(trig)
1467 {
1468  if(!isdefined(self._triggers))
1469  return false;
1470 
1471  if(!isdefined(self._triggers[trig getentitynumber()]))
1472  return false;
1473 
1474  if(!self._triggers[trig getentitynumber()])
1475  return false;
1476 
1477  return true; // We're already in this trigger volume.
1478 }
1479 
1480 function ‪add_to_ent(ent, trig)
1481 {
1482  if(!isdefined(ent._triggers))
1483  {
1484  ent._triggers = [];
1485  }
1486 
1487  ent._triggers[trig getentitynumber()] = 1;
1488 }
1489 
1490 function ‪remove_from_ent(ent, trig)
1491 {
1492  if(!isdefined(ent._triggers))
1493  return;
1494 
1495  if(!isdefined(ent._triggers[trig getentitynumber()]))
1496  return;
1497 
1498  ent._triggers[trig getentitynumber()] = 0;
1499 }
‪wait_or_timeout
‪function wait_or_timeout(n_time, str_name, str_key)
Definition: trigger_shared.gsc:1205
‪script_delay
‪function script_delay()
Definition: util_shared.gsc:970
‪trigger_hint
‪function trigger_hint(trigger)
Definition: trigger_shared.gsc:626
‪no_crouch_or_prone_think
‪function no_crouch_or_prone_think(trigger)
Definition: trigger_shared.gsc:1369
‪update_based_on_flags
‪function update_based_on_flags()
Definition: trigger_shared.gsc:1118
‪flood_trigger_think
‪function flood_trigger_think(trigger)
Definition: spawner_shared.gsc:2443
‪e_target
‪var e_target
Definition: traps_shared.gsc:2029
‪timer
‪function timer(n_time, str_endon, x, y, height)
Definition: lui_shared.gsc:163
‪_ent_waits_for_trigger
‪function _ent_waits_for_trigger(trigger)
Definition: trigger_shared.gsc:1190
‪get_script_linkto_targets
‪function get_script_linkto_targets()
Definition: trigger_shared.gsc:1331
‪wait_for_either
‪function wait_for_either(str_targetname1, str_targetname2)
Definition: trigger_shared.gsc:1172
‪init_flags
‪function init_flags()
Definition: trigger_shared.gsc:1157
‪trigger_look
‪function trigger_look(trigger)
Definition: trigger_shared.gsc:230
‪trigger_spawner_spawn
‪function trigger_spawner_spawn()
Definition: trigger_shared.gsc:308
‪SPAWNFLAG_TRIGGER_SPAWN
‪#define SPAWNFLAG_TRIGGER_SPAWN
Definition: shared.gsh:34
‪add_to_ent
‪function add_to_ent(ent, trig)
Definition: trigger_shared.gsc:1480
‪_trigger_wait
‪function _trigger_wait(e_entity)
Definition: trigger_shared.gsc:964
‪trigger_turns_off
‪function trigger_turns_off(trigger)
Definition: trigger_shared.gsc:474
‪set_flag_permissions
‪function set_flag_permissions(msg)
Definition: trigger_shared.gsc:1104
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪trigger_unlock
‪function trigger_unlock(trigger)
Definition: trigger_shared.gsc:144
‪_detect_touched
‪function _detect_touched()
Definition: trigger_shared.gsc:551
‪flag_clear_trigger
‪function flag_clear_trigger(trigger, str_flag)
Definition: trigger_shared.gsc:374
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪fallback_think
‪function fallback_think(trigger)
Definition: spawner_shared.gsc:2034
‪_hint_print
‪function _hint_print(string, breakfunc)
Definition: trigger_shared.gsc:702
‪flag_set_touching
‪function flag_set_touching(trigger)
Definition: trigger_shared.gsc:575
‪__init__
‪function __init__()
Definition: trigger_shared.gsc:16
‪_do_trigger_function
‪function _do_trigger_function(trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6)
Definition: trigger_shared.gsc:1286
‪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
‪SPAWNFLAG_TRIGGER_AI_AXIS
‪#define SPAWNFLAG_TRIGGER_AI_AXIS
Definition: shared.gsh:29
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪trigger_unlock_death
‪function trigger_unlock_death(target)
Definition: trigger_shared.gsc:173
‪delete_links_then_self
‪function delete_links_then_self()
Definition: trigger_shared.gsc:1362
‪use
‪function use(str_name, str_key="targetname", ent, b_assert=true)
Definition: trigger_shared.gsc:1059
‪delete_link_chain
‪function delete_link_chain(trigger)
Definition: trigger_shared.gsc:1353
‪flag_set_trigger
‪function flag_set_trigger(trigger, str_flag)
Definition: trigger_shared.gsc:346
‪SPAWNFLAG_TRIGGER_AI_ALLIES
‪#define SPAWNFLAG_TRIGGER_AI_ALLIES
Definition: shared.gsh:30
‪SPAWNFLAG_TRIGGER_AI_NEUTRAL
‪#define SPAWNFLAG_TRIGGER_AI_NEUTRAL
Definition: shared.gsh:31
‪multiple_wait
‪function multiple_wait(str_trigger_notify)
Definition: trigger_shared.gsc:1256
‪is_trigger_once
‪function is_trigger_once(trig)
Definition: trigger_shared.gsc:1167
‪wait_till
‪function wait_till(str_name, str_key="targetname", e_entity, b_assert=true)
Definition: trigger_shared.gsc:911
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪create_flags_and_return_tokens
‪function create_flags_and_return_tokens(flags)
Definition: util_shared.gsc:1017
‪friendly_respawn_trigger
‪function friendly_respawn_trigger(trigger)
Definition: trigger_shared.gsc:432
‪trigger_spawner
‪function trigger_spawner(trigger)
Definition: trigger_shared.gsc:290
‪createFontString
‪function createFontString(font, fontScale)
Definition: hud_util_shared.gsc:334
‪get_trigger_look_target
‪function get_trigger_look_target()
Definition: trigger_shared.gsc:200
‪script_flag_wait
‪function script_flag_wait()
Definition: flag_shared.gsc:394
‪trigger_exploder
‪function trigger_exploder(trigger)
Definition: trigger_shared.gsc:655
‪trigger_group
‪function trigger_group()
Definition: trigger_shared.gsc:1413
‪TIMEOUT
‪#define TIMEOUT(__t)
Definition: shared.gsh:218
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪is_ads
‪function is_ads()
Definition: util_shared.gsc:1521
‪trigger_notify
‪function trigger_notify(trigger, msg)
Definition: trigger_shared.gsc:327
‪remove_undefined
‪function remove_undefined(array, b_keep_keys)
Definition: array_shared.csc:56
‪SPAWNFLAG
‪#define SPAWNFLAG(__e, __f)
Definition: shared.gsh:95
‪_hint_print_wait
‪function _hint_print_wait(length, breakfunc)
Definition: trigger_shared.gsc:773
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪wait_for_an_unlocked_trigger
‪function wait_for_an_unlocked_trigger(triggers, noteworthy)
Definition: trigger_shared.gsc:180
‪array
‪function filter array
Definition: array_shared.csc:16
‪SPAWNFLAG_TRIGGER_NOT_PLAYER
‪#define SPAWNFLAG_TRIGGER_NOT_PLAYER
Definition: shared.gsh:32
‪friendly_respawn_clear
‪function friendly_respawn_clear(trigger)
Definition: trigger_shared.gsc:462
‪script_flag_set_touching
‪function script_flag_set_touching(trigger)
Definition: trigger_shared.gsc:492
‪ent_already_in
‪function ent_already_in(trig)
Definition: trigger_shared.gsc:1466
‪get_all
‪function get_all(type1, type2, type3, type4, type5, type6, type7, type8, type9)
Definition: trigger_shared.gsc:802
‪trigger_group_remove
‪function trigger_group_remove()
Definition: trigger_shared.gsc:1422
‪_trigger_wait_think
‪function _trigger_wait_think(s_tracker, e_entity)
Definition: trigger_shared.gsc:1037
‪report_trigger
‪function report_trigger(ent, noteworthy)
Definition: trigger_shared.gsc:192
‪init
‪function init()
Definition: struct.csc:1
‪add_function
‪function add_function(trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6)
Definition: trigger_shared.gsc:1281
‪trigger_on_timeout
‪function trigger_on_timeout(n_time, b_cancel_on_triggered=true, str_name, str_key="targetname")
Definition: trigger_shared.gsc:1221
‪script_flag_false_trigger
‪function script_flag_false_trigger(trigger)
Definition: trigger_shared.gsc:416
‪a_ents
‪function _query_ents_by_substring_helper a_ents
Definition: util_shared.gsc:3334
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪IS_EQUAL
‪#define IS_EQUAL(__a, __b)
Definition: shared.gsh:250
‪kill_spawner_trigger
‪function kill_spawner_trigger(trigger)
Definition: trigger_shared.gsc:1311
‪no_prone_think
‪function no_prone_think(trigger)
Definition: trigger_shared.gsc:1392
‪SPAWNFLAG_TRIGGER_LOOK
‪#define SPAWNFLAG_TRIGGER_LOOK
Definition: shared.gsh:36
‪exists
‪function exists(str_flag)
Definition: flag_shared.csc:43
‪is_looking_at
‪function is_looking_at(ent_or_org, n_dot_range=0.67, do_trace=false, v_offset)
Definition: util_shared.gsc:1448
‪script_flag_true_trigger
‪function script_flag_true_trigger(trigger)
Definition: trigger_shared.gsc:424
‪display_hint
‪function display_hint(hint)
Definition: trigger_shared.gsc:678
‪trigger_once
‪function trigger_once(trig)
Definition: trigger_shared.gsc:598
‪check_spawnflags
‪function check_spawnflags()
Definition: trigger_shared.gsc:131
‪single_thread
‪function single_thread(entity, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:699
‪add_tokens_to_trigger_flags
‪function add_tokens_to_trigger_flags(tokens)
Definition: trigger_shared.gsc:402
‪is_look_trigger
‪function is_look_trigger(trig)
Definition: trigger_shared.gsc:1162
‪trigger_delete_on_touch
‪function trigger_delete_on_touch(trigger)
Definition: trigger_shared.gsc:562
‪_is_valid_trigger_type
‪function _is_valid_trigger_type(type)
Definition: trigger_shared.gsc:878
‪SPAWNFLAG_TRIGGER_TRIGGER_ONCE
‪#define SPAWNFLAG_TRIGGER_TRIGGER_ONCE
Definition: shared.gsh:38
‪wait_till_clear
‪function wait_till_clear(str_flag)
Definition: flag_shared.csc:248
‪SPAWNFLAG_TRIGGER_VEHICLE
‪#define SPAWNFLAG_TRIGGER_VEHICLE
Definition: shared.gsh:33
‪remove_from_ent
‪function remove_from_ent(ent, trig)
Definition: trigger_shared.gsc:1490
‪IS_BONUSZM
‪#define IS_BONUSZM
Definition: shared.gsh:532
‪multiple_waits
‪function multiple_waits(str_trigger_name, str_trigger_notify)
Definition: trigger_shared.gsc:1248
‪function_thread
‪function function_thread(ent, on_enter_payload, on_exit_payload)
Definition: trigger_shared.gsc:1432
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265