1 #using scripts\codescripts\struct;
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;
10 #insert scripts\shared\shared.gsh;
18 level.fog_trigger_current = undefined;
19 level.trigger_hint_string = [];
20 level.trigger_hint_func = [];
22 if ( !isdefined( level.trigger_flags ) )
45 foreach ( trig
in get_all(
"trigger_radius",
"trigger_multiple",
"trigger_once",
"trigger_box" ) )
59 if ( trig.classname !=
"trigger_damage" )
61 if ( trig.classname !=
"trigger_hurt" )
75 if ( isdefined( trig.script_flag_true ) )
80 if ( isdefined( trig.script_flag_set ) )
85 if ( isdefined( trig.script_flag_set_on_touching ) || isdefined( trig.script_flag_set_on_cleared ) )
90 if ( isdefined( trig.script_flag_clear ) )
95 if ( isdefined( trig.script_flag_false ) )
100 if ( isdefined( trig.script_trigger_group ) )
105 if ( isdefined( trig.script_notify ) )
110 if ( isdefined( trig.script_fallback ) )
115 if ( isdefined( trig.script_killspawner ) )
120 if ( isdefined( trig.targetname ) )
123 if ( isdefined( trigger_funcs[ trig.targetname ] ) )
125 level thread [[ trigger_funcs[ trig.targetname ] ]]( trig );
133 if (
IS_TRUE(
self.script_trigger_allplayers )
149 noteworthy =
"not_set";
150 if( isdefined( trigger.script_noteworthy ) )
152 noteworthy = trigger.script_noteworthy;
155 target_triggers = GetEntArray( trigger.target,
"targetname" );
161 array::run_all( target_triggers, &TriggerEnable,
false );
163 trigger waittill(
"trigger" );
165 array::run_all( target_triggers, &TriggerEnable,
true );
169 array::notify_all( target_triggers,
"relock" );
175 self waittill(
"death" );
176 target_triggers = GetEntArray( target,
"targetname" );
177 array::run_all( target_triggers, &TriggerEnable,
false );
182 level endon(
"unlocked_trigger_hit" + noteworthy );
184 for( i = 0; i < triggers.size; i++ )
188 ent waittill(
"trigger" );
189 level notify(
"unlocked_trigger_hit" + noteworthy );
194 self endon(
"relock" );
195 level endon(
"unlocked_trigger_hit" + noteworthy );
196 self waittill(
"trigger" );
197 ent notify(
"trigger" );
202 if ( isdefined(
self.target ) )
204 a_potential_targets = GetEntArray(
self.target,
"targetname" );
207 foreach ( target
in a_potential_targets )
209 if (
IS_EQUAL( target.classname,
"script_origin" ) )
216 a_targets = ArrayCombine( a_targets, a_potential_target_structs,
true,
false );
218 if ( a_targets.size > 0 )
220 Assert( a_targets.size == 1,
"Look tigger at " +
self.origin +
" targets multiple origins/structs." );
232 trigger endon(
"death" );
236 if ( isdefined( trigger.script_flag ) && !isdefined( level.flag[trigger.script_flag] ) )
238 level
flag::init( trigger.script_flag, undefined,
true );
242 if ( isdefined( trigger.script_parameters ) )
244 a_parameters = StrTok( trigger.script_parameters,
",; " );
247 b_ads_check = IsInArray( a_parameters,
"check_ads" );
251 trigger waittill(
"trigger", e_other );
253 if ( IsPlayer( e_other ) )
255 while ( isdefined( e_other ) && e_other IsTouching( trigger ) )
260 trigger notify(
"trigger_look", e_other );
262 if ( isdefined( trigger.script_flag ) )
269 if ( isdefined( trigger.script_flag ) )
278 if ( isdefined( trigger.script_flag ) )
285 AssertMsg(
"Look triggers only support players." );
292 a_spawners = GetSpawnerArray( trigger.target,
"targetname" );
294 Assert( a_spawners.size > 0,
"Triggers with flag TRIGGER_SPAWN at " + trigger.origin +
" must target at least one spawner." );
296 trigger endon(
"death" );
299 foreach ( sp
in a_spawners )
301 if ( isdefined( sp ) )
310 self endon(
"death" );
329 trigger endon(
"death" );
333 if( isdefined( trigger.target ) )
335 a_target_ents = GetEntArray( trigger.target,
"targetname" );
337 foreach ( notify_ent
in a_target_ents )
339 notify_ent notify( msg, other );
343 level notify( msg, other );
348 trigger endon(
"death" );
350 DEFAULT( str_flag, trigger.script_flag );
361 if ( isdefined( trigger.targetname ) && ( trigger.targetname ==
"flag_set" ) )
376 trigger endon(
"death" );
378 DEFAULT( str_flag, trigger.script_flag );
389 if ( isdefined( trigger.targetname ) && ( trigger.targetname ==
"flag_clear" ) )
404 for( i = 0; i < tokens.size; i++ )
407 if( !isdefined( level.trigger_flags[flag] ) )
409 level.trigger_flags[flag] = [];
412 level.trigger_flags[flag][level.trigger_flags[flag].size] =
self;
434 trigger endon(
"death" );
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;
442 spawner endon(
"death" );
446 trigger waittill(
"trigger" );
449 if( isdefined( trigger.script_forcecolor ) )
451 level.respawn_spawners_specific[trigger.script_forcecolor] = spawner;
455 level.respawn_spawner = spawner;
464 trigger endon(
"death" );
468 trigger waittill(
"trigger" );
477 trigger TriggerEnable(
false );
479 if( !isdefined( trigger.script_linkTo ) )
485 tokens = Strtok( trigger.script_linkto,
" " );
486 for( i = 0; i < tokens.size; i++ )
488 array::run_all( GetEntArray( tokens[i],
"script_linkname" ), &TriggerEnable,
false );
494 trigger endon(
"death" );
496 if ( isdefined( trigger.script_flag_set_on_touching ) )
498 level
flag::init( trigger.script_flag_set_on_touching, undefined,
true );
501 if ( isdefined( trigger.script_flag_set_on_cleared ) )
503 level
flag::init( trigger.script_flag_set_on_cleared, undefined,
true );
510 trigger.script_touched =
false;
515 if ( !trigger.script_touched )
524 if ( trigger.script_touched )
526 if ( isdefined( trigger.script_flag_set_on_touching ) )
528 level
flag::set( trigger.script_flag_set_on_touching );
531 if ( isdefined( trigger.script_flag_set_on_cleared ) )
533 level
flag::clear( trigger.script_flag_set_on_cleared );
538 if ( isdefined( trigger.script_flag_set_on_touching ) )
540 level
flag::clear( trigger.script_flag_set_on_touching );
543 if ( isdefined( trigger.script_flag_set_on_cleared ) )
545 level
flag::set( trigger.script_flag_set_on_cleared );
553 self endon(
"death" );
557 self waittill(
"trigger" );
558 self.script_touched =
true;
566 trigger waittill(
"trigger", other );
567 if( isdefined( other ) )
577 str_flag = trigger.script_flag;
579 if ( !isdefined( level.flag[ str_flag ] ) )
586 trigger waittill(
"trigger", other );
589 while ( IsAlive( other ) && other IsTouching( trigger ) && isdefined( trigger ) )
600 trig endon(
"death" );
604 trig waittill(
"trigger_look" );
608 trig waittill(
"trigger" );
614 if ( isdefined( trig ) )
618 println(
"*** trigger debug: deleting trigger with ent#: " + trig getentitynumber() +
" at origin: " + trig.origin );
628 assert( isdefined( trigger.script_hint ),
"Trigger_hint at " + trigger.origin +
" has no .script_hint" );
630 trigger endon(
"death" );
632 if ( !isdefined( level.displayed_hints ) )
634 level.displayed_hints = [];
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()" );
641 trigger waittill(
"trigger", other );
643 assert( IsPlayer( other ),
"Tried to do a trigger_hint on a non player entity" );
645 if ( isdefined( level.displayed_hints[ trigger.script_hint ] ) )
650 level.displayed_hints[ trigger.script_hint ] =
true;
657 trigger endon(
"death" );
660 trigger waittill(
"trigger" );
661 if (isdefined(trigger.target ))
663 ActivateClientRadiantExploder( trigger.target );
680 if ( GetDvarString(
"chaplincheat" ) ==
"1" )
687 if( isdefined( level.trigger_hint_func[ hint ] ) )
689 if( [[ level.trigger_hint_func[ hint ] ]]() )
694 _hint_print( level.trigger_hint_string[ hint ], level.trigger_hint_func[ hint ] );
704 const MYFADEINTIME = 1.0;
705 const MYFLASHTIME = 0.75;
706 const MYALPHAHIGH = 0.95;
707 const MYALPHALOW = 0.4;
718 Hint.alignx =
"center";
719 Hint.aligny =
"middle";
720 Hint.horzAlign =
"center";
721 Hint.vertAlign =
"middle";
722 Hint.foreground =
false;
723 Hint.hidewhendead =
true;
725 Hint setText(
string );
728 Hint FadeOverTime( MYFADEINTIME );
729 Hint.alpha = MYALPHAHIGH;
732 if ( isdefined( breakfunc ) )
736 Hint FadeOverTime( MYFLASHTIME );
737 Hint.alpha = MYALPHALOW;
740 if ( [[ breakfunc ]]() )
745 Hint FadeOverTime( MYFLASHTIME );
746 Hint.alpha = MYALPHAHIGH;
749 if ( [[ breakfunc ]]() )
757 for ( i = 0; i < 5; i++ )
759 Hint FadeOverTime( MYFLASHTIME );
760 Hint.alpha = MYALPHALOW;
763 Hint FadeOverTime( MYFLASHTIME );
764 Hint.alpha = MYALPHAHIGH;
775 if ( !isdefined( breakfunc ) )
782 for ( i = 0; i <
timer; i++ )
784 if ( [[ breakfunc ]]() )
802 function get_all( type1, type2, type3, type4, type5, type6, type7, type8, type9 )
804 if ( !isdefined( type1 ) )
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";
819 trigs = GetEntArray( type1,
"classname" );
821 if ( isdefined( type2 ) )
824 trigs = ArrayCombine( trigs, GetEntArray( type2,
"classname" ),
true,
false );
827 if ( isdefined( type3 ) )
830 trigs = ArrayCombine( trigs, GetEntArray( type3,
"classname" ),
true,
false );
833 if ( isdefined( type4 ) )
836 trigs = ArrayCombine( trigs, GetEntArray( type4,
"classname" ),
true,
false );
839 if ( isdefined( type5 ) )
842 trigs = ArrayCombine( trigs, GetEntArray( type5,
"classname" ),
true,
false );
845 if ( isdefined( type6 ) )
848 trigs = ArrayCombine( trigs, GetEntArray( type6,
"classname" ),
true,
false );
851 if ( isdefined( type7 ) )
854 trigs = ArrayCombine( trigs, GetEntArray( type7,
"classname" ),
true,
false );
857 if ( isdefined( type8 ) )
860 trigs = ArrayCombine( trigs, GetEntArray( type8,
"classname" ),
true,
false );
863 if ( isdefined( type9 ) )
866 trigs = ArrayCombine( trigs, GetEntArray( type9,
"classname" ),
true,
false );
869 if ( isdefined( type10 ) )
872 trigs = ArrayCombine( trigs, GetEntArray( type10,
"classname" ),
true,
false );
882 case "trigger_damage":
884 case "trigger_lookat":
886 case "trigger_radius":
888 case "trigger_use_touch":
890 case "trigger_multiple":
891 case "trigger_out_of_bounds":
911 function wait_till( str_name, str_key =
"targetname", e_entity, b_assert =
true )
913 if ( isdefined( str_name ) )
915 triggers = GetEntArray( str_name, str_key );
923 if( triggers.size <= 0 )
928 Assert( !b_assert || ( triggers.size > 0 ),
"trigger not found: " + str_name +
" key: " + str_key );
931 if ( triggers.size > 0 )
933 if ( triggers.size == 1 )
935 trigger_hit = triggers[0];
940 s_tracker = SpawnStruct();
942 s_tracker waittill(
"trigger", e_other, trigger_hit );
943 trigger_hit.who = e_other;
956 if( !IsDefined(
self ) )
966 self endon(
"death" );
968 if ( isdefined( e_entity ) )
970 e_entity endon(
"death" );
976 Assert( !IsArray( e_entity ),
"LOOK triggers can only wait on one entity." );
978 else if (
self.classname ===
"trigger_damage" )
980 Assert( !IsArray( e_entity ),
"Damage triggers can only wait on one entity." );
988 self waittill(
"trigger_look", e_other );
990 if ( isdefined( e_entity ) )
992 if ( e_other !== e_entity )
998 else if (
self.classname ===
"trigger_damage" )
1000 self waittill(
"trigger", e_other );
1002 if ( isdefined( e_entity ) )
1004 if ( e_other !== e_entity )
1012 self waittill(
"trigger", e_other );
1014 if ( isdefined( e_entity ) )
1016 if ( IsArray( e_entity ) )
1018 if ( !array::is_touching( e_entity,
self ) )
1023 else if ( !e_entity IsTouching(
self ) && ( e_entity !== e_other ) )
1039 self endon(
"death" );
1040 s_tracker endon(
"trigger" );
1043 s_tracker notify(
"trigger", e_other,
self );
1059 function use( str_name, str_key =
"targetname", ent, b_assert =
true )
1061 if ( !isdefined( ent ) )
1063 ent = GetPlayers()[0];
1066 if ( isdefined( str_name ) )
1068 e_trig = GetEnt( str_name, str_key );
1069 if( !isdefined( e_trig ) )
1073 AssertMsg(
"trigger not found: " + str_name +
" key: " + str_key );
1082 str_name =
self.targetname;
1085 if( isdefined( ent ) )
1087 e_trig UseBy( ent );
1091 e_trig UseBy( e_trig );
1094 level notify( str_name, ent );
1098 e_trig notify(
"trigger_look", ent );
1108 if ( !isdefined( level.trigger_flags ) || !isdefined( level.trigger_flags[ msg ] ) )
1121 if ( isdefined(
self.script_flag_true ) )
1127 for( i=0; i < tokens.size; i++ )
1138 if ( isdefined(
self.script_flag_false ) )
1143 for( i=0; i < tokens.size; i++ )
1153 b_enable = true_on && false_on;
1154 self TriggerEnable( b_enable );
1159 level.trigger_flags = [];
1174 ent = SpawnStruct();
1177 array = ArrayCombine(
array, GetEntArray( str_targetname1,
"targetname" ),
true,
false );
1178 array = ArrayCombine(
array, GetEntArray( str_targetname2,
"targetname" ),
true,
false );
1180 for ( i = 0; i <
array.size; i++ )
1185 ent waittill(
"done", t_hit );
1193 self notify(
"done", trigger );
1224 if ( isdefined( str_name ) )
1226 trig = GetEnt( str_name, str_key );
1229 if ( b_cancel_on_triggered )
1233 trig endon(
"trigger_look" );
1237 trig endon(
"trigger" );
1241 trig endon(
"death" );
1250 foreach ( trigger
in GetEntArray( str_trigger_name,
"targetname") )
1258 level endon( str_trigger_notify );
1259 self waittill(
"trigger" );
1260 level notify( str_trigger_notify );
1281 function add_function( trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6 )
1283 self thread
_do_trigger_function( trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6 );
1288 self endon(
"death" );
1289 trigger endon(
"death" );
1291 if ( isdefined( str_remove_on ) )
1293 trigger endon( str_remove_on );
1298 if ( IsString( trigger ) )
1315 a_spawners = GetSpawnerArray( trigger.script_killspawner,
"script_killspawner" );
1316 foreach ( sp
in a_spawners )
1321 a_ents = GetEntArray( trigger.script_killspawner,
"script_killspawner" );
1324 if (
IS_EQUAL( ent.classname,
"spawn_manager" ) && ( ent != trigger ) )
1334 if( !isdefined(
self.script_linkto ) )
1339 tokens = Strtok(
self.script_linkto,
" " );
1340 for( i = 0; i < tokens.size; i++ )
1343 target = GetEnt( token,
"script_linkname" );
1344 if( isdefined( target ) )
1346 targets[targets.size] = target;
1356 trigger waittill(
"trigger" );
1373 trigger waittill(
"trigger", other );
1375 if( !IsPlayer( other ) )
1380 while( other IsTouching( trigger ) )
1382 other AllowProne(
false );
1383 other AllowCrouch(
false );
1387 other AllowProne(
true );
1388 other AllowCrouch(
true );
1396 trigger waittill(
"trigger", other );
1398 if( !IsPlayer( other ) )
1403 while( other IsTouching( trigger ) )
1405 other AllowProne(
false );
1409 other AllowProne(
true );
1417 level endon(
"trigger_group_" +
self.script_trigger_group );
1418 self waittill(
"trigger" );
1419 level notify(
"trigger_group_" +
self.script_trigger_group,
self );
1424 level waittill(
"trigger_group_" +
self.script_trigger_group, trigger );
1425 if(
self != trigger )
1434 ent endon(
"entityshutdown");
1443 if(isdefined(on_enter_payload))
1445 [[on_enter_payload]](ent);
1448 while(isdefined(ent) && ent istouching(
self))
1455 if(isdefined(ent) && isdefined(on_exit_payload))
1457 [[on_exit_payload]](ent);
1468 if(!isdefined(
self._triggers))
1471 if(!isdefined(
self._triggers[trig getentitynumber()]))
1474 if(!
self._triggers[trig getentitynumber()])
1482 if(!isdefined(ent._triggers))
1487 ent._triggers[trig getentitynumber()] = 1;
1492 if(!isdefined(ent._triggers))
1495 if(!isdefined(ent._triggers[trig getentitynumber()]))
1498 ent._triggers[trig getentitynumber()] = 0;