10 #insert scripts\shared\shared.gsh;
12 #using scripts\codescripts\struct;
14 #using scripts\shared\array_shared;
15 #using scripts\shared\callbacks_shared;
16 #using scripts\shared\flag_shared;
17 #using scripts\shared\math_shared;
18 #using scripts\shared\spawner_shared;
19 #using scripts\shared\system_shared;
20 #using scripts\shared\trigger_shared;
21 #using scripts\shared\util_shared;
25 #define ALERT_SCANNING 1
30 #precache( "fx", "_t6/_prototype/fx_pro_temp_searchlight" );
31 #precache( "fx", "_t6/_prototype/fx_pro_temp_searchlight_grn" );
32 #precache( "fx", "_t6/_prototype/fx_pro_temp_searchlight_red" );
33 #precache( "fx", "_t6/_prototype/fx_pro_temp_searchlight_ylw" );
34 #precache( "fx", "_t6/_prototype/fx_pro_temp_explosion_md" );
35 #precache( "fx", "weapon/fx_muz_sm_gas_flash_3p" );
36 #precache( "fx", "_t6/_prototype/fx_pro_temp_light_blink_red" );
37 #precache( "fx", "_t6/_prototype/fx_pro_temp_sparks_elec_disabled" );
38 #precache( "fx", "_t6/_prototype/fx_pro_temp_steam_cooldown" );
39 #precache( "fx", "_t6/_prototype/fx_pro_temp_laser_beam_deathray" );
40 #precache( "fx", "_t6/_prototype/fx_pro_temp_laser_trail_deathray" );
49 level._effect[
"camera_light_fx"] =
"_t6/_prototype/fx_pro_temp_searchlight";
50 level._effect[
"camera_light_fx_grn"] =
"_t6/_prototype/fx_pro_temp_searchlight_grn";
51 level._effect[
"camera_light_fx_red"] =
"_t6/_prototype/fx_pro_temp_searchlight_red";
52 level._effect[
"camera_light_fx_ylw"] =
"_t6/_prototype/fx_pro_temp_searchlight_ylw";
53 level._effect[
"temp_explosion_md"] =
"_t6/_prototype/fx_pro_temp_explosion_md";
54 level._effect[
"railturret_muzzle_flash"] =
"weapon/fx_muz_sm_gas_flash_3p";
55 level._effect[
"security_light_red"] =
"_t6/_prototype/fx_pro_temp_light_blink_red";
56 level._effect[
"electrical_sparks"] =
"_t6/_prototype/fx_pro_temp_sparks_elec_disabled";
57 level._effect[
"steam_cooldown"] =
"_t6/_prototype/fx_pro_temp_steam_cooldown";
59 level._effect[
"deathray_beam"] =
"_t6/_prototype/fx_pro_temp_laser_beam_deathray";
60 level._effect[
"deathray_trail"] =
"_t6/_prototype/fx_pro_temp_laser_trail_deathray";
70 level.prototype_secsystems = [];
73 foreach( secsystem_struct
in a_secsystem_structs )
75 Assert( isdefined( secsystem_struct.script_noteworthy ),
"secsystem_struct.script_noteworthy not found" );
77 str_secsystem_name = secsystem_struct.script_noteworthy;
80 [[ o_secsystem ]]->setup_secsystem( secsystem_struct );
81 ARRAY_ADD( level.prototype_secsystems, o_secsystem );
143 Assert( isdefined( secsystem ),
"cSecuritySystem->setup_secsystem - secsystem doesn't exist - error in calling function" );
191 a_things = GetEntArray( str_targetname,
"targetname" );
193 if ( a_things.size == 0 )
198 foreach ( thing
in a_things )
200 if ( !isdefined( thing.script_noteworthy ) )
211 thread [[ o_Thing ]]->setup( thing,
self );
214 if ( str_targetname ==
"security_node" )
218 if ( ( str_targetname ==
"laser_tripwire" ) || ( str_targetname ==
"security_camera" ) )
224 return a_OutputArray;
229 switch( str_targetname )
231 case "security_door":
233 case "security_crusher":
234 return new cSecurityCrusher();
235 case "security_shutdown_panel":
236 return new cSecurityShutdownPanel();
237 case "security_reverse_panel":
239 case "security_node":
240 return new cSecurityNode();
241 case "laser_tripwire":
242 return new cLaserTripwire();
243 case "security_camera":
244 return new cSecurityCamera();
245 case "security_light":
247 case "security_blocker":
248 return new cSecurityBlocker();
257 [[ o_blocker ]]->reverse();
264 player = level.players[0];
294 if ( !isdefined( n_target_alert_level ) )
300 if ( n_target_alert_level < 0 )
304 else if ( n_target_alert_level > 2 )
311 if ( n_target_alert_level > 0 )
337 self endon(
"cooldown" );
369 PlaySoundAtPosition(
"vox_inter_security_reset_0", level.players[0].origin );
382 self notify(
"cooldown" );
384 PlaySoundAtPosition(
"vox_inter_security_deactivated_0", level.players[0].origin );
429 foreach( o_thing
in a_things )
431 [[ o_thing ]]->activate();
437 if ( !isdefined( a_things ) )
442 foreach( o_thing
in a_things )
444 [[ o_thing ]]->deactivate();
450 foreach( o_thing
in a_things )
452 [[ o_thing ]]->reactivate();
476 foreach( railturret_struct
in a_railturret_structs )
478 if ( !isdefined( railturret_struct.script_noteworthy ) )
480 /# PrintLn(
"railturret_struct.script_noteworthy not found" ); #/
489 if ( isdefined( railturret_struct.script_string ) && ( railturret_struct.script_string ==
"rocket" ) )
491 o_railturret =
new cMissileTurret();
492 [[ o_railturret ]]->spawn_at_struct( railturret_struct,
self );
498 [[ o_railturret ]]->spawn_at_struct( railturret_struct,
self );
569 if( isdefined(
t_laser.script_vector ) )
574 if( isdefined(
t_laser.script_string ) )
576 if (
t_laser.script_string ==
"shake" )
582 if(
t_laser.classname ==
"trigger_multiple" )
594 t_laser waittill(
"trigger", e_other );
602 Earthquake( 1, 2, level.players[0].origin, 64 );
608 PlaySoundAtPosition(
"vox_inter_laser_tripped_0", level.players[0].origin );
628 if ( isdefined(
t_laser.script_float ) )
632 else if ( isdefined(
t_laser.script_int ) )
731 Assert( isdefined( mover ),
"cSecurityMover->setup_mover() - valid mover not passed in, error in calling function" );
736 if ( isdefined(
e_mover.script_string ) )
738 if ( IsSubStr(
e_mover.script_string,
"platform" ) )
740 e_mover SetMovingPlatformEnabled(
true );
743 if ( IsSubStr(
e_mover.script_string,
"rotator" ) )
748 if ( IsSubStr(
e_mover.script_string,
"breakable" ) )
755 if ( isdefined(
e_mover.script_delay ) )
761 if ( isdefined(
e_mover.script_float ) )
765 else if ( isdefined(
e_mover.script_int ) )
769 Assert( isdefined(
n_movement_duration ),
"cSecurityMover->setup_mover() - n_movement_duration not defined, set script_float or script_int on the script_brushmodel in the map" );
776 else if ( isdefined(
e_mover.script_vector ) )
780 if ( isdefined(
e_mover.script_linkto ) )
800 AssertMsg(
"cSecurityMover->setup_mover() - neither script_vector, nor target is defined" );
808 Assert( isdefined(
e_mover_broken ),
"cBreakableWalls->setup_breakable_wall - wall_broken does not exist; targetname should be: " +
e_mover.target );
829 e_mover waittill(
"damage",
damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
831 if ( type ==
"MOD_GRENADE" || type ==
"MOD_GRENADE_SPLASH" || type ==
"MOD_EXPLOSIVE" || type ==
"MOD_EXPLOSIVE_SPLASH" || type ==
"MOD_PROJECTILE" || type ==
"MOD_PROJECTILE_SPLASH" )
846 self notify(
"stop_moving" );
863 self endon(
"stop_moving" );
897 self endon(
"stop_moving" );
935 while ( isdefined( s_nextstruct ) )
939 v_current_position = s_nextstruct.origin;
943 if ( !isdefined( s_nextstruct.target ) )
947 s_nextstruct =
struct::get( s_nextstruct.target,
"targetname" );
954 self notify(
"move_forward_along_path" );
955 self endon(
"move_forward_along_path" );
956 self endon(
"move_backward_along_path" );
957 self endon(
"stop_moving" );
965 Assert( isdefined( s_nextstruct ),
"cSecurityMover->move_along_path() s_nextstruct not defined" );
966 n_dist = Distance(
e_mover.origin, s_nextstruct.origin );
969 if ( n_duration <= 0 )
973 e_mover MoveTo( s_nextstruct.origin, n_duration );
983 self notify(
"move_backward_along_path" );
984 self endon(
"move_backward_along_path" );
985 self endon(
"move_forward_along_path" );
986 self endon(
"stop_moving" );
994 Assert( isdefined( s_nextstruct ),
"cSecurityMover->move_along_path() s_nextstruct not defined" );
995 n_dist = Distance(
e_mover.origin, s_nextstruct.origin );
998 if ( n_duration <= 0 )
1002 e_mover MoveTo( s_nextstruct.origin, n_duration );
1010 if ( n_duration <= 0 )
1024 e_mover playsound(
"evt_door_close_start" );
1025 e_mover playloopsound(
"evt_door_move", .25 );
1032 e_mover playsound(
"evt_door_open_stop" );
1037 self endon(
"stop_moving" );
1041 if ( b_play_screen_shake )
1043 Earthquake( 0.3, 1,
e_mover.origin, 256 );
1062 Assert( isdefined( blocker.radius ),
"cSecurityBlocker->setup() - .radius kvp on blocker not defined" );
1078 Assert( isdefined( e_mover ),
"cSecurityBlocker->blocker_control_thread() - e_mover not defined" );
1084 n_player_dist = Distance( level.player.origin, e_mover.origin );
1106 e_mover.origin = LerpVector( v_endpos, v_startpos, move_amount );
1110 e_mover.origin = LerpVector( v_startpos, v_endpos, move_amount );
1147 self endon(
"stop_moving" );
1195 self endon(
"stop_moving" );
1199 e_mover waittill(
"touch", player );
1202 player DoDamage( player.health, player.origin );
1209 self endon(
"stop_moving" );
1210 self endon(
"deactivate" );
1211 self notify(
"activate" );
1227 self endon(
"activate" );
1228 self notify(
"deactivate" );
1230 if ( !isdefined( e_mover ) )
1238 n_distance_scale = Distance( e_mover.origin, v_startpos ) / Distance( v_endpos, v_startpos );
1240 if ( n_adjusted_movement_duration <= 0 )
1242 /# IPrintLn(
"cSecurityCrusher->retract() - n_adjustment_movement_duration is zero or less" ); #/
1247 e_mover MoveTo( v_startpos, n_adjusted_movement_duration );
1249 e_mover stoploopsound( .25 );
1280 Assert( isdefined( securitylight ),
"cSecurityLight->setup() - securitynode not defined, error in the calling function" );
1281 Assert( isdefined( secsystem ),
"cSecurityLight->setup() - secsystem not defined, error in the calling function" );
1292 PlayFXOnTag( level._effect[
"security_light_red"],
fx_ent,
"tag_origin" );
1324 Assert( isdefined( securitynode ),
"cSecurityNode->setup_securitynode() - securitynode not defined, error in the calling function" );
1325 Assert( isdefined( secsystem ),
"cSecurityNode->setup_securitynode() - secsystem not defined, error in the calling function" );
1379 Assert( isdefined( trigger ),
"cSecurityPanel->setup_securitypanel - trigger not defined, error in calling function" );
1380 Assert( isdefined( secsystem ),
"cSecurityPanel->setup_securitypanel - secsystem not defined, error in calling function" );
1387 t_panel waittill(
"trigger", e_other );
1403 function setup( trigger, secsystem )
1446 w_weapon = GetWeapon(
"ai_tank_drone_rocket" );
1447 n_pause_before_attack = 3;
1448 n_pause_between_shots = 5;
1449 n_shoot_duration = 5000;
1450 n_shoot_cooldown = 5;
1451 n_shoot_revtime = 3;
1454 b_track_while_attacking =
false;
1463 Assert( isdefined( str_struct ),
"cMissileTurret->spawn_at_struct() str_struct not defined" );
1464 Assert( isdefined( secsystem ),
"cMissileTurret->spawn_at_struct() secsystem not defined" );
1476 e_railturret =
util::spawn_model(
"t6_wpn_turret_cic_world", str_struct.origin, str_struct.angles );
1478 e_railturret_snd1 =
spawn(
"script_origin", str_struct.origin );
1479 e_railturret_snd1 linkto( e_railturret );
1480 e_railturret_snd2 =
spawn(
"script_origin", str_struct.origin );
1481 e_railturret_snd2 linkto( e_railturret );
1484 b_turret_alive =
true;
1486 e_railturret SetCanDamage(
true );
1491 player = level.players[0];
1496 b_turret_active =
true;
1501 s_nextdest =
struct::get( str_struct.target,
"targetname" );
1513 while( b_turret_active && b_turret_alive );
1520 while( b_turret_active && b_turret_alive )
1522 if (
self flag::get(
"turret_acquired_target" ) && (
self flag::get(
"turret_moving_along_path" ) ) )
1524 PlaySoundAtPosition(
"vox_turr_target_sighted_0", e_railturret.origin );
1525 PlaySoundAtPosition(
"evt_turret_target", e_railturret.origin );
1529 else if ( !
self flag::get(
"turret_moving_along_path" ) )
1597 Assert( isdefined( str_struct ),
"cRailTurret->spawn_at_struct() str_struct not defined" );
1598 Assert( isdefined( secsystem ),
"cRailTurret->spawn_at_struct() secsystem not defined" );
1626 player = level.players[0];
1637 if ( isdefined( str_struct.script_linkto ) )
1639 e_attachpoint = GetEnt( str_struct.script_linkto,
"script_linkname" );
1641 else if ( isdefined( str_struct.target ) )
1656 e_railturret waittill(
"damage", iDamage, sAttacker, vDirection, vPoint );
1658 PlayFX( level._effect[
"electrical_sparks"], vPoint );
1668 PlayFX( level._effect[
"temp_explosion_md"],
e_railturret.origin );
1696 Assert( isdefined( str_struct ),
"cRailTurret->warp_to_struct() str_struct not defined" );
1720 PlaySoundAtPosition(
"vox_turr_target_sighted_0",
e_railturret.origin );
1721 PlaySoundAtPosition(
"evt_turret_target",
e_railturret.origin );
1754 self notify(
"move_along_path" );
1755 self endon(
"move_along_path" );
1756 self endon(
"stop_moving" );
1759 self flag::set(
"turret_moving_along_path" );
1765 Assert( isdefined(
s_nextdest ),
"cRailTurret->move_along_path() s_nextdest not defined" );
1789 self notify(
"stop_moving" );
1790 self endon(
"stop_moving" );
1791 self endon(
"move_along_path" );
1816 b_seeplayer =
false;
1839 player = level.players[0];
1846 if ( isdefined( target_yaw ) )
1849 yaw_diff = turret_yaw - target_yaw;
1890 player = level.players[0];
1896 Assert( isdefined( target ),
"cRailTurret->set_combat_target() target not defined" );
1902 Assert( isdefined(
e_target ),
"cRailTurret->get_yaw_to_combat_target() e_target not defined" );
1903 Assert( isdefined(
e_railturret ),
"cRailTurret->get_yaw_to_combat_target() e_railturret not defined" );
1912 yaw = ATan( n_slope );
1932 v_turret_firing_angle = ( v_accurate_firing_angle[0], v_turret_yaw[1], v_accurate_firing_angle[2] );
1934 PlayFX( level._effect[
"deathray_beam"], v_fx_pos, v_turret_firing_angle );
1935 PlayFX( level._effect[
"deathray_trail"], v_fx_pos, v_turret_firing_angle );
1944 Assert( isdefined(
e_target ),
"cRailTurret->fire_at_target() e_target not defined" );
1945 Assert( isdefined(
e_railturret ),
"cRailTurret->fire_at_target() e_railturret not defined" );
1947 PlaySoundAtPosition(
"vox_turr_spin_up_0",
e_railturret.origin );
1949 PlaySoundAtPosition(
"vox_turr_fire_0",
e_railturret.origin );
1951 curr_time = GetTime();
1952 time_started_shooting = curr_time;
1960 v_turret_firing_angle = ( v_accurate_firing_angle[0], v_turret_yaw[1], v_accurate_firing_angle[2] );
1962 turret_firing_offset = ( v_turret_firing_angle * 100 );
1963 MagicBullet(
w_weapon, v_fx_pos, v_fx_pos + turret_firing_offset );
1964 PlayFX( level._effect[
"railturret_muzzle_flash"], v_fx_pos, v_turret_firing_angle );
1967 curr_time = GetTime();
1970 PlaySoundAtPosition(
"vox_turr_cool_0",
e_railturret.origin );
1973 self notify(
"stop_cooldown_fx" );
1978 self endon(
"stop_cooldown_fx" );
1986 PlayFX( level._effect[
"steam_cooldown"],
fx_ent.origin );
2000 class cSecurityCamera
2033 /# PrintLn(
"cSecurityCam->constructor()" ); #/
2049 /# PrintLn(
"cSecurityCam->destructor()" ); #/
2054 Assert( isdefined( str_struct ),
"cSecurityCam->setup() str_struct not defined" );
2055 Assert( isdefined( secsystem ),
"cSecurityCam->setup() secsystem not defined" );
2078 Assert( isdefined( str_struct.script_noteworthy ),
"cSecurityCamera->spawn_at_struct() - script_noteworthy not defined!" );
2081 if ( isdefined( str_struct.script_int ) )
2087 if ( isdefined( str_struct.radius ) )
2106 curr_spotlighttype = 0;
2139 switch( light_type )
2142 camera_light_fx = PlayFXOnTag( level._effect[
"camera_light_fx"],
fx_ent,
"tag_origin" );
2145 camera_light_fx = PlayFXOnTag( level._effect[
"camera_light_fx_grn"],
fx_ent,
"tag_origin" );
2148 camera_light_fx = PlayFXOnTag( level._effect[
"camera_light_fx_red"],
fx_ent,
"tag_origin" );
2151 camera_light_fx = PlayFXOnTag( level._effect[
"camera_light_fx_ylw"],
fx_ent,
"tag_origin" );
2163 /# PrintLn(
"cSecurityCam->camera_scan()" ); #/
2164 Assert( isdefined(
e_camera ),
"cSecurityCam->camera_scan() e_camera not defined" );
2173 n_scan_rotationperframe = n_scan_rotationpersecond / 20;
2181 yaw = cam_angles[1];
2187 e_camera.angles = cam_angles + ( 0, n_scan_rotationperframe, 0 );
2194 e_camera playsound(
"evt_camera_move_stop" );
2201 e_camera.angles = cam_angles - ( 0, n_scan_rotationperframe, 0 );
2208 e_camera playsound(
"evt_camera_move_stop" );
2230 PlayFXOnTag( level._effect[
"electrical_sparks"],
fx_ent,
"tag_origin" );
2237 player = level.players[0];
2248 if ( b_cansee == 1 )
2251 v_player_xy_origin = ( player.origin[0], player.origin[1], 0 );
2253 if ( Distance( v_camera_xy_origin, v_player_xy_origin ) <
n_viewrange )
2255 PlaySoundAtPosition(
"vox_turr_target_camera_0",
e_camera.origin );
2256 PlaySoundAtPosition(
"evt_camera_target",
e_camera.origin );
2264 e_camera.angles = ( cam_angles[0], yaw + 90, cam_angles[2] );
2286 Assert( isdefined(
e_target ),
"cSecurityCamera->get_yaw_to_target() e_target not defined" );
2287 Assert( isdefined(
e_camera ),
"cSecurityCamera->get_yaw_to_target() e_camera not defined" );
2296 yaw = ATan( n_slope );