1 #using scripts\codescripts\struct;
3 #using scripts\shared\hud_util_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\flag_shared;
7 #insert scripts\shared\shared.gsh;
11 #define HACKING_PLAYER_WEAPON "pda_hack"
12 #define DOOR_CLEARANCE_TIMER 0.3
62 if( !IsDefined(str_xmodel) )
64 str_xmodel =
"script_origin";
84 v_pos = ( v_pos[0], v_pos[1], v_pos[2]+50 );
136 v_pos = ( v_pos[0], v_pos[1], v_pos[2]+50 );
139 e_trig TriggerIgnoreTeam();
141 e_trig SetVisibleToAll();
142 e_trig SetTeamForTrigger(
"none" );
143 e_trig UseTriggerRequireLookAt();
145 e_trig SetCursorHint(
"HINT_NOICON" );
192 sndEnt playloopsound(
m_s_bundle.door_loop_sound, 1 );
252 sndEnt playloopsound(
m_s_bundle.door_loop_sound, 1 );
348 if ( isdefined( e_fx ) )
356 e_fx =
Spawn(
"script_model", v_pos );
357 e_fx SetModel(
"tag_origin" );
358 e_fx.angles = v_angles;
359 PlayFXOnTag(
m_s_bundle.door_locked_fx, e_fx,
"tag_origin" );
364 if ( isdefined( e_fx ) )
372 e_fx =
Spawn(
"script_model", v_pos );
373 e_fx SetModel(
"tag_origin" );
374 e_fx.angles = v_angles;
375 PlayFXOnTag(
m_s_bundle.door_unlocked_fx, e_fx,
"tag_origin" );
385 str_hint =
"This door is controlled elsewhere";
389 str_hint =
"This door is electronically locked";
423 v_pos = ( v_pos[0], v_pos[1], v_pos[2]+50 );
457 foreach( str_flag
in a_flags )
478 v_offset = ( 0, 0, n_slide_amount );
482 v_offset = ( n_slide_amount, 0, 0 );
503 v_side = anglestoforward( v_angles );
504 v_pos = v_pos + (v_offset[0] * v_side);
508 v_dir = anglestoright( v_angles );
509 v_pos = v_pos + (v_offset[1] * v_dir);
513 v_up = anglestoup( v_angles );
514 v_pos = v_pos + (v_offset[2] * v_up);
555 foreach ( s_instance
in a_doors )
557 c_door = s_instance
init();
558 if (isdefined(c_door) )
560 s_instance.c_door = c_door;
572 if( !IsDefined(
self.angles) )
574 self.angles = (0, 0 ,0 );
577 s_door_bundle = level.scriptbundles[
"doors" ][
self.scriptbundlename ];
594 c_door.m_s_bundle = s_door_bundle;
595 c_door.m_str_targetname = s_door_instance.targetname;
596 c_door.m_str_target = s_door_instance.target;
597 c_door.m_str_script_flag = s_door_instance.script_flag;
603 if ( c_door.m_s_bundle.door_unlock_method ==
"key" )
605 if ( IsDefined( c_door.m_s_bundle.door_key_model ) )
607 level.door_key_model = c_door.m_s_bundle.door_key_model;
610 if ( IsDefined( c_door.m_s_bundle.door_key_icon ) )
612 level.door_key_icon = c_door.m_s_bundle.door_key_icon;
615 if ( IsDefined( c_door.m_s_bundle.door_key_fx ) )
617 level.door_key_fx = c_door.m_s_bundle.door_key_fx;
621 if ( c_door.m_s_bundle.door_unlock_method ==
"hack" && !
IS_TRUE(level.door_hack_precached) )
623 level.door_hack_precached =
true;
626 str_door_xmodel = c_door.m_s_bundle.model;
629 if( IsDefined(c_door.m_s_bundle.door_triggerOffsetX) )
631 n_xOffset = c_door.m_s_bundle.door_triggerOffsetX;
637 if( IsDefined(c_door.m_s_bundle.door_triggerOffsetY) )
639 n_yOffset = c_door.m_s_bundle.door_triggerOffsetY;
645 if( IsDefined(c_door.m_s_bundle.door_triggerOffsetZ) )
647 n_zOffset = c_door.m_s_bundle.door_triggerOffsetZ;
654 v_trigger_offset = ( n_xOffset, n_yOffset, n_zOffset );
655 c_door.m_s_bundle.v_trigger_offset = v_trigger_offset;
657 n_trigger_radius = c_door.m_s_bundle.door_trigger_radius;
658 if(
IS_TRUE(c_door.m_s_bundle.door_slide_horizontal) )
666 n_open_time = c_door.m_s_bundle.door_open_time;
667 n_slide_amount = c_door.m_s_bundle.door_slide_open_units;
669 if( !IsDefined(c_door.m_s_bundle.door_swing_angle) )
671 c_door.m_s_bundle.door_swing_angle = 0;
674 if(
IS_TRUE(c_door.m_s_bundle.door_closes) )
683 if(
IS_TRUE(c_door.m_s_bundle.door_connect_paths) )
685 n_door_connect_paths = 1;
689 n_door_connect_paths = 0;
692 if (
IS_TRUE( c_door.m_s_bundle.door_start_open ) )
697 if ( IsDefined( c_door.m_str_script_flag ) )
699 a_flags = StrTok(c_door.m_str_script_flag,
",");
700 foreach( str_flag
in a_flags )
707 [[ c_door ]]->init_xmodel( str_door_xmodel, n_door_connect_paths, s_door_instance.origin, s_door_instance.angles);
710 [[ c_door ]]->init_trigger( v_trigger_offset, n_trigger_radius, c_door.m_s_bundle );
714 [[ c_door ]]->init_hint_trigger();
717 thread [[ c_door ]]->run_lock_fx();
720 [[ c_door ]]->init_movement( n_slide_up, n_slide_amount );
722 if ( !IsDefined(c_door.m_s_bundle.door_open_time) )
724 c_door.m_s_bundle.door_open_time = 0.4;
727 [[ c_door ]]->set_door_paths( n_door_connect_paths );
730 c_door.m_s_bundle.b_loop_sound = IsDefined( c_door.m_s_bundle.door_loop_sound ) && c_door.m_s_bundle.door_loop_sound !=
"";
744 str_unlock_method =
"default";
745 if ( IsDefined( c_door.m_s_bundle.door_unlock_method ) )
747 str_unlock_method = c_door.m_s_bundle.door_unlock_method;
750 b_auto_close = (
IS_TRUE(c_door.m_s_bundle.door_closes) && !
IS_TRUE(c_door.m_s_bundle.door_use_trigger));
751 b_hold_open =
IS_TRUE(c_door.m_s_bundle.door_use_hold);
752 b_manual_close =
IS_TRUE(c_door.m_s_bundle.door_use_trigger) &&
IS_TRUE(c_door.m_s_bundle.door_closes);
757 c_door.m_e_trigger waittill(
"trigger", e_who );
758 c_door.m_e_trigger_player = e_who;
764 if ( b_hold_open || b_auto_close )
771 e_who DisableWeapons();
772 e_who DisableOffhandWeapons();
783 e_who EnableWeapons();
784 e_who EnableOffhandWeapons();
787 }
else if ( str_unlock_method ==
"key" )
794 IPrintLnBold(
"You need a key." );
800 }
else if ( b_manual_close )
809 str_unlock_method =
"default";
810 if ( IsDefined( c_door.m_s_bundle.door_unlock_method ) )
812 str_unlock_method = c_door.m_s_bundle.door_unlock_method;
816 if (
IS_TRUE( c_door.m_s_bundle.door_locked ) && str_unlock_method !=
"key" )
820 if (IsDefined(c_door.m_str_targetname))
828 [[c_door]]->update_use_message();
842 if( c_door.m_door_open_delay_time > 0 )
844 c_door.m_e_door notify(
"door_waiting_to_open", c_door.m_e_trigger_player );
845 wait( c_door.m_door_open_delay_time );
848 [[c_door]]->open_internal();
852 [[c_door]]->close_internal();
855 if( !
IS_TRUE(c_door.m_s_bundle.door_closes) )
864 c_door.m_e_trigger
delete();
865 c_door.m_e_trigger = undefined;
870 door_str = c_door.m_str_targetname;
871 c_door.m_e_trigger.targetname = (door_str +
"_trig");
875 c_door.m_e_trigger waittill(
"unlocked" );
876 [[c_door]]->unlock();
884 if ( IsDefined(
self.freeze_origin) )
887 self.freeze_origin Delete();
888 self.freeze_origin = undefined;
891 if ( !IsDefined(
self.freeze_origin) )
893 self.freeze_origin =
Spawn(
"script_model",
self.origin );
894 self.freeze_origin SetModel(
"tag_origin" );
895 self.freeze_origin.angles =
self.angles;
896 self PlayerLinkToDelta(
self.freeze_origin,
"tag_origin", 1.0, 45.0, 45.0, 45.0, 45.0 );
908 self endon(
"death" );
910 last_trigger_time = gettime();
911 self.ents_in_trigger =
true;
913 str_kill_trigger_notify =
"trigger_now_clear";
921 if(
self.ents_in_trigger ==
true )
923 self.ents_in_trigger =
false;
924 last_trigger_time = time;
928 dt = ( time - last_trigger_time ) / 1000;
937 self notify( str_kill_trigger_notify );
946 if ( IsDefined( str_kill_on_door_notify ) )
948 c_door endon( str_kill_on_door_notify );
954 max_dist_sq = c_door.m_s_bundle.door_trigger_radius * c_door.m_s_bundle.door_trigger_radius;
960 b_pressed = e_triggerer UseButtonPressed();
961 n_dist = DistanceSquared(e_triggerer.origin,
self.origin);
963 while ( b_pressed && n_dist < max_dist_sq );
971 e_trigger = c_door.m_e_trigger;
972 e_temp_trigger = undefined;
976 if (
IS_TRUE( c_door.m_s_bundle.door_trigger_at_target ) )
978 e_door = c_door.m_e_door;
979 v_trigger_offset = c_door.m_s_bundle.v_trigger_offset;
980 v_pos = [[c_door]]->calculate_offset_position( e_door.origin, e_door.angles, v_trigger_offset );
981 n_radius = c_door.m_s_bundle.door_trigger_radius;
982 n_height = c_door.m_n_trigger_height;
985 e_temp_trigger =
spawn(
"trigger_radius", v_pos, 0, n_radius, n_height );
986 e_trigger = e_temp_trigger;
990 if ( IsPlayer( e_triggerer ) &&
IS_TRUE(c_door.m_s_bundle.door_use_hold) )
998 if ( IsDefined( e_temp_trigger ) )
1000 e_temp_trigger Delete();
1012 self endon(
"death" );
1013 self endon( str_kill_trigger_notify );
1017 self waittill(
"trigger", e_who );
1018 self.ents_in_trigger =
true;
1029 self endon(
"death" );
1034 v_end = v_start + ( 0, 0, 1000 );
1035 v_col = ( 0, 0, 1 );
1038 line( v_start, v_end, (0,0,1) );
1047 if ( !IsDefined(
self.collectible_keys ) )
1052 if ( !IsDefined(
self.collectible_keys[str_key_type] ) )
1057 return self.collectible_keys[str_key_type].num_keys > 0;
1067 self.collectible_keys[str_key_type].num_keys--;
1068 if (
self.collectible_keys[str_key_type].num_keys <= 0 && IsDefined(
self.collectible_keys[str_key_type].hudelem ) )
1070 self.collectible_keys[str_key_type].hudelem Destroy();
1071 self.collectible_keys[str_key_type].hudelem = undefined;
1077 self endon(
"death" );
1080 self RotateYaw( 180, 3.0 );
1087 e_trigger endon(
"death" );
1089 const blinking_time = 5.0;
1090 if ( n_timeout_sec < blinking_time )
1092 n_timeout_sec = blinking_time + 1.0;
1095 wait n_timeout_sec - blinking_time;
1099 for ( f = 0.0; f < blinking_time; f += n_stepsize )
1111 if ( n_stepsize > 0.15 )
1117 level notify(
"key_drop_timeout" );
1125 v_pos =
self.origin;
1127 e_model =
spawn(
"script_model", v_pos + (0,0,80) );
1128 e_model.angles = (10,0,10);
1129 e_model SetModel( level.door_key_model );
1131 if ( IsDefined( level.door_key_fx ) )
1133 PlayFXOnTag( level.door_key_fx, e_model,
"tag_origin" );
1136 while( IsAlive(
self ) )
1138 e_model MoveTo(
self.origin + (0,0,80), 0.2 );
1139 e_model RotateYaw( 30, 0.2 );
1143 e_model MoveZ( -60, 1.0 );
1148 e_trigger =
spawn(
"trigger_radius", e_model.origin, 0, 25.0, 100.0 );
1150 if ( isdefined( n_timeout_sec ) )
1155 e_trigger endon(
"death" );
1159 e_trigger waittill(
"trigger", e_who );
1160 if ( IsPlayer( e_who ) )
1173 assert( isdefined( level.door_key_model ),
"Attempting to give ai a key, but no key model is associated with any door in this level." );
1180 assert( isdefined( level.door_key_icon ),
"Attempting to give player a key, but no key icon is associated with any door in this level." );
1182 if ( !IsDefined(
self.collectible_keys ) )
1184 self.collectible_keys = [];
1187 if ( !IsDefined(
self.collectible_keys[str_key_type] ) )
1189 self.collectible_keys[str_key_type] = SpawnStruct();
1190 self.collectible_keys[str_key_type].num_keys = 0;
1191 self.collectible_keys[str_key_type].type = str_key_type;
1194 hudelem =
self.collectible_keys[str_key_type].hudelem;
1195 if ( !isdefined( hudelem ) )
1197 hudelem = newclienthudelem(
self );
1200 hudelem.alignX =
"right";
1201 hudelem.alignY =
"bottom";
1202 hudelem.horzAlign =
"right";
1203 hudelem.vertAlign =
"bottom";
1204 hudelem.hidewheninmenu =
true;
1205 hudelem.hideWhenInDemo =
true;
1209 hudelem SetShader( level.door_key_icon, 16, 16 );
1211 self.collectible_keys[str_key_type].hudelem = hudelem;
1213 self.collectible_keys[str_key_type].num_keys++;
1219 foreach( s_inst
in a_s_inst_list )
1221 c_door = s_inst.c_door;
1222 if ( isdefined( c_door ) )
1224 [[c_door]]->unlock();
1234 function unlock( str_name, str_name_type =
"targetname", b_do_open =
true )
1237 foreach( s_inst
in a_s_inst_list )
1239 if ( isdefined( s_inst.c_door ) )
1241 [[s_inst.c_door]]->unlock();
1245 [[s_inst.c_door]]->open();