#include maps\_utility; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; #include maps\_hud_util; CONST_BTR_SLIDE_TIME_1 = 1.5; CONST_BTR_SLIDE_TIME_2 = .65; CONST_STREET_CAR_WAIT = .25; CONST_NEW_HELI_DROP_HEIGHT = 5500; //------- SPACE SUIT INPUT ---------> CONST_ISS_INPUT_X_MIN = 8; CONST_ISS_INPUT_RATE_X = .3; CONST_ISS_INPUT_FORCE_X = .75; CONST_ISS_INPUT_ACC_X_MAX = 5; CONST_ISS_INPUT_DEC_X = .05; CONST_ISS_INPUT_RATE_Y = .5; CONST_ISS_INPUT_DEC_Y = .05; CONST_ISS_INPUT_ACC_Y_MIN = 1; //<--------------------------------- /************************************************************************************************************/ /* INTRO */ /************************************************************************************************************/ iss_get_satellite_model() { node = getent( "iss_player_link", "targetname" ); model = spawn_anim_model( "iss_satellite", node.origin ); model.angles = node.angles; model linkto( node ); foreach( part in level.iss_ents[ "satellite" ] ) part linkto( model ); return model; } iss_satellite_update_model( veh ) { while( 1 ) { self moveto( veh.origin, .1 ); self rotateto( veh.angles, .1 ); wait .05; } } iss_camera_setup() { setsaveddvar( "ui_hidemap", 1 ); SetSavedDvar( "hud_showStance", "0" ); SetSavedDvar( "compass", "0" ); SetSavedDvar( "ammoCounterHide", "1" ); level.player allowcrouch( false ); level.player allowprone( false ); level.player freezecontrols( true ); node = getent( "iss_player_link2", "targetname" ); camera = spawn_anim_model( "iss_rig", node.origin ); //camera hide(); camera.angles = node.angles; camera linkto( node ); camera.node = node; level.player playerlinktodelta( camera, "tag_origin", 1, 0, 0, 0, 0 ); level.player PlayerSetGroundReferenceEnt( camera ); node anim_first_frame_solo( camera, "ISS_animation" ); // camera thread iss_camera_spotlight(); return camera; } iss_camera_spotlight() { offset = self iss_camera_offset(); setsaveddvar( "r_spotlightstartradius", "16" ); setsaveddvar( "r_spotlightEndradius", "500" ); setsaveddvar( "r_spotlightfovinnerfraction", ".1" ); setsaveddvar( "r_spotlightexponent", "5" ); setsaveddvar( "r_spotlightBrightness", "2" ); origin = self.origin + offset; model = spawn( "script_model", origin ); model setmodel( "TAG_ORIGIN" ); model.angles = level.player getplayerangles(); playfxontag( level._effect[ "space_helmet_spot_light" ], model, "TAG_ORIGIN" ); while( !flag( "iss_destroy_blast_wave" ) ) { offset = self iss_camera_offset(); model.origin = self.origin + offset; // model moveto( self.origin + offset, .1 ); model.angles = level.player getplayerangles() + self.angles; wait .05; } model delete(); } iss_camera_offset() { up = anglestoup( self.angles ); right = anglestoright( self.angles ); forward = anglestoforward( self.angles ); offset = ( up * 64 ) + ( right * 16 ) + ( forward * -2 ); return offset; } iss_satellite() { model = iss_get_satellite_model(); diff = (5092, 4344, 3438) - ( 5440, 4634, 3470 ); node = getent( "iss_player_link", "targetname" ); node2 = spawn( "script_origin", node.origin ); node2.angles = node.angles; node2.targetname = "iss_player_link2"; node2 linkto( model ); camera = iss_camera_setup(); array = []; array[ "model" ] = model; array[ "node" ] = node; array[ "camera" ] = camera; return array; } iss_organize_ents() { level.iss_ents = []; nodes = getstructarray( "iss_group_node", "targetname" ); array_thread( nodes, ::iss_organize_ents_by_node ); array_wait( nodes, "done_organizing" ); flag_set( "iss_organize_ents" ); } iss_organize_ents_by_node() { ents = getentarray( "iss_entity", "targetname" ); level.iss_ents[ self.script_noteworthy ] = []; node = getstruct( "iss_blast_node", "targetname" ); num = 0; foreach( obj in ents ) { if( distancesquared( obj getorigin(), self.origin ) > squared( self.radius ) ) continue; obj.distance_to_blast = distance( node.origin, obj getorigin() ); size = level.iss_ents[ self.script_noteworthy ].size; level.iss_ents[ self.script_noteworthy ][ size ] = obj; num++; if( num == 50 ) { wait .05; num = 0; } } self notify( "done_organizing" ); } iss_destroy_iss() { level.iss_destroy_small = 0; parts = level.iss_ents[ "iss" ]; flag_init( "temp" ); array_thread( parts, ::iss_destroy_iss_parts ); } iss_destroy_sat() { parts = level.iss_ents[ "satellite" ]; array_thread( parts, ::iss_destroy_sat_parts ); } iss_destroy_iss_parts() { magicnumber = .0012; time = magicnumber * self.distance_to_blast; time = time - 3;// + randomfloat( .1 ); flag_wait_or_timeout( "iss_destroy_blast_wave", time ); flag_set( "iss_destroy_first_wave" ); thread flag_set_delayed( "iss_destroy_blast_wave", 1.5 ); if( isdefined( self.script_noteworthy ) && self.script_noteworthy == "delete" ) { self delete(); return; } if( flag( "iss_destroy_blast_wave" ) && self.script_type == "small" ) { level.iss_destroy_small++; if( level.iss_destroy_small > 1 ) { self delete(); level.iss_destroy_small = 0; return; } } dist = []; dist[ "small" ] = 55000; dist[ "medium" ] = 25000; dist[ "large" ] = 16000; rot = []; rot[ "small" ] = 500; rot[ "medium" ] = 200; rot[ "large" ] = 100; signp = 1; signr = 1; if( cointoss() ) signp = -1; if( cointoss() ) signr = -1; blaststart = getstruct( "iss_blast_node", "targetname" ); blastend = getstruct( blaststart.target, "targetname" ); time = 30; rotation = ( randomfloatrange( .75, 1 ) * signp, 0, randomfloatrange( .75, 1 ) * signr ); vector = vectornormalize( blastend.origin - blaststart.origin ); origin = self getorigin() + ( vector * dist[ self.script_type ] * randomfloatrange( .8, 1.2 ) ); angles = rotation * rot[ self.script_type ] * randomfloatrange( .8, 1.2 ); self moveto( origin, time ); self rotatevelocity( angles, time ); } iss_destroy_sat_parts() { if( isdefined( self.script_noteworthy ) && self.script_noteworthy == "delete" ) { self delete(); return; } if( self.script_type == "small" ) { level.iss_destroy_small++; if( level.iss_destroy_small > 10 ) { self delete(); level.iss_destroy_small = 0; return; } wait .5; } self unlink(); dist = []; dist[ "small" ] = 40000; dist[ "medium" ] = 20000; dist[ "large" ] = 15000; rot = []; rot[ "small" ] = 500; rot[ "medium" ] = 200; rot[ "large" ] = 100; signp = 1; signr = 1; if( cointoss() ) signp = -1; if( cointoss() ) signr = -1; blaststart = getstruct( "iss_blast_node", "targetname" ); blastend = getstruct( blaststart.target, "targetname" ); time = 30; rotation = ( randomfloatrange( .75, 1 ) * signp, 0, randomfloatrange( .75, 1 ) * signr ); vector = vectornormalize( blastend.origin - blaststart.origin ); origin = self getorigin() + ( vector * dist[ self.script_type ] * randomfloatrange( .8, 1.2 ) ); angles = rotation * rot[ self.script_type ] * randomfloatrange( .8, 1.2 ); self moveto( origin, time ); self rotatevelocity( angles, time ); } iss_kill_player() { cam = level.iss_sat[ "camera" ]; cam.node unlink(); blaststart = getstruct( "iss_blast_node", "targetname" ); blastend = getstruct( blaststart.target, "targetname" ); time = 30; vector = vectornormalize( blastend.origin - blaststart.origin ); origin = cam.origin + ( vector * 25000 ); angles = ( 0, 0, 80 ); cam.node moveto( origin, time ); cam.node rotatevelocity( angles, time ); time = 4; plate = spawn( "script_model", level.player geteye() + ( vector * -2000 ) ); plate setmodel( "iss_sail_center" ); plate rotatevelocity( ( 195, 0, -215 ), time ); while( time > 0 ) { plate moveto( level.player geteye() + ( vector * 256 ), time ); time -= .05; wait .05; } } iss_player_quake() { level endon( "iss_done" ); while( 1 ) { earthquake( .35, .2, level.player.origin, 1024 ); wait .05; } } iss_lights_out() { node = getent( "earth_model", "targetname" ); model = spawn( "script_model", node.origin + ( 0,0,300 ) ); model.angles = node.angles; model.targetname = "iss_lights"; wait 1; for( i = 1; i <= level.bg_iss_darknum; i++ ) { name = "bg_iss_dark0"; if( i > 9 ) name = "bg_iss_dark"; model setmodel( name + i ); wait randomfloatrange( .2, .4 ); } } iss_preload_lights() { origin = level.player.origin + ( 0,0,1024 ); for( i = 1; i <= level.bg_iss_darknum; i++ ) { name = "bg_iss_dark0"; if( i > 9 ) name = "bg_iss_dark"; model = spawn( "script_model", origin ); model.targetname = "iss_lights"; model setmodel( name + i ); } } /************************************************************************************************************/ /* INTRO */ /************************************************************************************************************/ intro_enemy_setup() { flag_wait( "crash_cut_to_black" ); thread battlechatter_off(); flag_wait( "emp_entity_cleanup_done" ); ai = getaiarray( "axis" ); ai = array_removeDead_or_dying( ai ); array_thread( ai, ::intro_enemy_reaction ); } intro_enemy_reaction() { self endon( "death" ); self endon( "long_death" ); self.allowdeath = true; self.diequietly = true; self thread anim_generic_loop( self, "covercrouch_hide_idle" ); flag_wait( "emp_back_from_whiteout" ); center = getstruct( "emp_center", "targetname" ); node = spawnstruct(); node.origin = self.origin; angles = node.origin - center.origin; node.angles = vectortoangles( angles ); animes = []; animes[ animes.size ] = "cqb_stand_react_A"; animes[ animes.size ] = "cqb_stand_react_B"; animes[ animes.size ] = "cqb_stand_react_C"; animes[ animes.size ] = "cqb_stand_react_D"; animes[ animes.size ] = "cqb_stand_react_E"; self notify( "stop_loop" ); self anim_stopanimscripted(); node anim_generic_gravity( self, random( animes ) ); self setgoalnode( getnode( "intro_enemy_node", "targetname" ) ); self.goalradius = 100; self add_wait( ::waittill_msg, "goal" ); level add_wait( ::flag_wait, "street_player_hide" ); do_wait_any(); self delete(); } /************************************************************************************************************/ /* EMP */ /************************************************************************************************************/ emp_entities() { switch( self.targetname ) { case "emp_delete": self emp_ents_wait(); if( isdefined( self.script_noteworthy ) ) { switch( self.script_noteworthy ) { case "lamp": playfx( level._effect[ "powerline_runner_oneshot" ], self getorigin() + ( 0, 0, 50) ); thread play_sound_in_space( "glass_pane_blowout", self getorigin() ); break; case "window": playfx( level._effect[ "dcemp_glass_74x44" ], self getorigin(), anglestoforward( (0,270,0) ) );//, anglestoright( (0,270,0) ) ); thread play_sound_in_space( "glass_pane_blowout", self getorigin() ); break; } } self delete(); break; case "emp_swap": if( isdefined( self.target ) ) { after = getent( self.target, "targetname" ); after hide(); self emp_ents_wait(); after show(); self delete(); } else self emp_smart_swap(); break; case "emp_light": self setlightintensity( 1.5 ); self emp_ents_wait(); self setlightintensity( 0 ); break; case "emp_show": self hide(); self emp_ents_wait(); self show(); playfx( level._effect[ "powerline_runner_oneshot" ], self getorigin() ); thread play_sound_in_space( "glass_pane_blowout", self getorigin() ); break; } } emp_smart_swap() { self emp_ents_wait(); switch( self.model ) { case "ch_street_light_01_on": self setmodel( "ch_street_light_01_off" ); break; } } emp_ents_wait( type ) { flag_wait( "iss_done" ); wait 2; center = getstruct( "emp_center", "targetname" ); dist = 0; magicnumber = 1 / 2500; if( !isdefined( type ) ) type = self.targetname; switch( type ) { case "emp_delete": dist = distance( self getorigin(), center.origin ); break; case "emp_swap": dist = distance( self.origin, center.origin ); break; case "emp_light": dist = distance( self.origin, center.origin ); break; case "emp_show": dist = distance( self.origin, center.origin ); break; } time = dist * magicnumber - 13; if( time < 0 ) time = 0; wait time; } emp_stop_start_heli() { self endon( "death" ); flag_wait( "emp_entity_cleanup_done" ); speed = self vehicle_getspeed(); self notify( "newpath" ); self vehicle_setspeedimmediate( 0, 100, 100 ); node = undefined; if( level.start_point != "emp" ) node = getstruct( self.currentNode.target, "targetname" ); flag_wait( "iss_done" ); self vehicle_setspeedimmediate( speed, 100, 100 ); if( level.start_point != "emp" ) self thread maps\_vehicle::vehicle_paths( node ); } #using_animtree( "vehicles" ); emp_heli_spotlight() { level.emp_heli_spotlight = self; add_wait( ::flag_wait, "emp_entity_cleanup_done" ); self add_func( maps\_attack_heli::heli_spotlight_off ); thread do_wait(); self thread emp_stop_start_heli(); wait 2; flag_wait( "iss_done" ); node = getstruct( "emp_anim_heli_spot", "targetname" ); heli = spawn_anim_model( "emp_mi28", self.origin ); heli maps\_vehicle::vehicle_lights_on( "running" ); heli maps\_attack_heli::heli_spotlight_on( "tag_spotlight", false ); heli thread play_loop_sound_on_entity( "scn_dcemp_cobra_shutdown_hover" ); self delete(); // node thread anim_first_frame_solo( heli, "crash" ); // wait level.EMPWAIT_BETA; node thread anim_single_solo( heli, "crash" ); heli waittillmatch( "single anim", "emp" ); heli stop_loop_sound_on_entity( "scn_dcemp_cobra_shutdown_hover" ); heli delaycall( .1, ::playsound, "scn_dcemp_cobra_shutdown" ); flag_set( "emp_heli_crash_go" ); heli thread heli_spark_effects(); heli maps\_attack_heli::heli_spotlight_off(); heli thread attackheli_spotlight_flicker(); heli maps\_vehicle::vehicle_lights_off( "running" ); heli waittillmatch( "single anim", "explode" ); heli notify( "stop_heli_spark_effects" ); heli playsound( "scn_dcemp_cobra_shutdown_crash" ); flag_set( "emp_heli_crash" ); playfx( level._effect[ "helicopter_crash" ], heli gettagorigin( "TAG_DEATHFX" ) ); //thread play_sound_in_space( "mi17_helicopter_crash_dist", heli gettagorigin( "TAG_DEATHFX" ) ); heli setmodel( "vehicle_mi-28_d_animated" ); time = 0; level.player delaycall( time, ::PlayRumbleLoopOnEntity, "tank_rumble" ); level.player delaycall( 1.5 + time, ::stopRumble, "tank_rumble" ); noself_delaycall( time, ::earthquake, 0.25, 1.5, level.player.origin, 5000 ); node waittill( "crash" ); //heli delete(); } heli_spark_effects() { self endon( "stop_heli_spark_effects" ); while ( true ) { playfxontag( getfx( "powerline_runner_oneshot" ), self, "tag_engine_left" ); wait( RandomFloatRange( .15, .25 ) ); } } attackheli_spotlight_flicker() { self endon( "death" ); flickers = randomintrange( 3, 5 ); for ( i=0; i 0 ) { if( !flag( "street_insta_death" ) ) { org = ( model.origin[0] + ( level.player.origin[0] - model.origin[0] ) * .25, model.origin[1] + ( level.player.origin[1] - model.origin[1] ) * .25, model.origin[2] + frac ); model moveto( org, interval ); wait interval; count--; } else { org = ( model.origin[0] + ( level.player.origin[0] - model.origin[0] ) * .25, model.origin[1] + ( level.player.origin[1] - model.origin[1] ) * .25, level.player.origin[2] + 50 ); model moveto( org, time ); wait interval; time -= interval; if( time <= 0 ) count = 0; else count--; } } origin = level.player.origin + (0,0,80); model delete(); if( flag( "street_safe" ) ) return; range = 300; PhysicsExplosionSphere( origin, range, 0, range * .01 );//similar to destructibles playfx( level._effect[ "helicopter_explosion" ], origin ); thread play_sound_in_space( "exp_armor_vehicle", origin ); wait .2; level.player kill(); } #using_animtree( "generic_human" ); street_guy_fall_guy() { node = getstruct( self.target, "targetname" ); self playsound( "generic_death_falling_scream" ); node anim_generic( self, "fastrope_fall" ); self.skipdeathanim = 1; self kill(); self startragdoll(); flag_set( "street_guy_fall" ); } street_btr_scene() { //SETUP heli = getent( "street_heli", "targetname" ); target = getent( "street_heli_target", "targetname" ); slide1 = getent( "street_btr_slide_1", "targetname" ); slide2 = getent( "street_btr_slide_2", "targetname" ); heli hide(); target hide(); slide1 hide(); slide2 hide(); target notsolid(); slide1 notsolid(); slide2 notsolid(); dmg_trig = getent( "btr_dmg_trig", "targetname" ); dmg_trig trigger_off(); clip = getent( "street_btr80_d_clip", "targetname" ); clip notsolid(); clip connectpaths(); self maps\_vehicle::mgoff(); self stopsounds(); d_heli = street_btr_make_destroyed_heli(); level.street_btrorigin = self.origin; if( level.start_point != "corner" ) { flag_wait( "street_crash_btr_first" ); //start dropping the heli street_btr_scene_drop_heli(); flag_set( "street_btr_death" ); waittillframeend; //kill the btr and get a model so we can animate it earthquake( .5, 1.25, level.player.origin, 2048 ); level.player PlayRumbleLoopOnEntity( "tank_rumble" ); level.player delaycall( 1.25, ::stopRumble, "tank_rumble" ); dmg_trig trigger_on(); model = self street_btr_scene_kill_btr(); thread street_btr_blur( model ); //show the damaged heli array_call( getentarray( "street_heli_destroyed", "targetname" ), ::show ); //move the heli parts d_heli thread street_btr_animate_heli(); //move the btr model street_btr_animate_btr(); } else { model = self street_btr_scene_kill_btr(); model.origin = slide2.origin; model.angles = slide2.angles; } //delete the damage trig and turn on the clip brush clip solid(); clip disconnectpaths(); flag_set( "street_btr_scene_done" ); } street_crash_cars() { parts = array_combine( getentarray( self.target, "targetname" ), getstructarray( self.target, "targetname" ) ); info = []; info[ "fx" ] = []; info[ "light" ] = []; foreach( part in parts ) { switch( part.script_noteworthy ) { case "fire_fx": info[ "fx" ][ info[ "fx" ].size ] = part; break; case "light": part.old_intensity = part getlightintensity(); part setlightintensity( 0 ); info[ "light" ][ info[ "light" ].size ] = part; break; case "start": self.endorg = self.origin; self.endang = self.angles; self.origin = part.origin; self.angles = part.angles; part delete(); break; } } if( level.start_point == "corner" ) { self maps\_vehicle::force_kill(); if( isdefined( self.endorg )) { self.origin = self.endorg; self.angles = self.endang; } } else { flag_wait( self.script_flag_wait ); self maps\_vehicle::force_kill(); wait CONST_STREET_CAR_WAIT; do_player_crash_fx( self.origin ); if( isdefined( self.endorg )) { magicnumber = .005; time = distance( self.origin, self.endorg ) * magicnumber; self moveto( self.endorg, time ); self rotateto( self.endang, time ); wait time; } } //fx and light foreach( fx in info[ "fx" ] ) { playfx( level._effect[ "me_dumpster_fire_FX" ], fx.origin, anglestoforward( fx.angles ), anglestoup( fx.angles ) ); thread play_loopsound_in_space( "fire_dumpster_medium", fx.origin ); } foreach( light in info[ "light" ] ) light setlightintensity( light.old_intensity ); wait .05; array_thread( info[ "light" ], ::light_street_fire ); } street_crash_helis() { parts = array_combine( getentarray( self.target, "targetname" ), getstructarray( self.target, "targetname" ) ); deathmodel = []; fx_array = []; clip = undefined; endorg = undefined; endang = undefined; foreach( part in parts ) { switch( part.script_noteworthy ) { case "end": endorg = part.origin; endang = part.angles; part delete(); break; case "destroy": part hide(); deathmodel[ deathmodel.size ] = part; break; case "fire_fx": fx_array[ fx_array.size ] = part; break; case "clip": clip = part; clip notsolid(); break; } } if( level.start_point != "corner" && level.start_point != "meetup" ) { self hide(); if( self.script_flag_wait == "street_crash_heli_first" ) self.origin += ( 0,0, CONST_NEW_HELI_DROP_HEIGHT ); //self.script_flag_wait = "street_crash_btr_first"; flag_wait( self.script_flag_wait ); self show(); dist = distance( self.origin, endorg ); magicnumber = .001; time = dist * magicnumber; sndtime = time - 3; if( sndtime >= 0 ) self delaycall( sndtime, ::playsound, "scn_dcemp_heli_shutdown" ); self moveto( endorg, time, time ); self rotateto( endang, time ); if( isdefined( self.script_flag_set ) ) thread flag_set_delayed( self.script_flag_set, time - CONST_STREET_CAR_WAIT ); self waittill( "movedone" ); do_player_crash_fx( self.origin ); range = 300; maxd = 300; if( !flag( "street_safe" ) ) RadiusDamage( self.origin + (0,0,10), range, maxd, 20, self );//similar to destructibles PhysicsExplosionSphere( self.origin, range, 0, range * .01 );//similar to destructibles playfx( level._effect[ "helicopter_explosion" ], endorg + ( 0, 0, -128) ); thread play_sound_in_space( "exp_armor_vehicle", endorg ); } self delete(); if( isdefined( clip ) ) clip solid(); if( deathmodel.size ) array_call( deathmodel, ::show ); foreach( fx in fx_array ) { playfx( level._effect[ "me_dumpster_fire_FX" ], fx.origin, anglestoforward( fx.angles ), anglestoup( fx.angles ) ); thread play_loopsound_in_space( "fire_dumpster_medium", fx.origin ); } } #using_animtree( "vehicles" ); street_crash_helis_anim() { parts = []; fx_array = []; clip = undefined; dmg = undefined; if( isdefined( self.target ) ) parts = array_combine( getentarray( self.target, "targetname" ), getstructarray( self.target, "targetname" ) ); foreach( part in parts ) { switch( part.script_noteworthy ) { case "fire_fx": fx_array[ fx_array.size ] = part; break; case "clip": clip = part; clip notsolid(); break; case "damage": dmg = part; dmg trigger_off(); break; } } name = "street_mi28"; switch( self.script_flag_set ) { case "street_crash_cop": name = "street_mi28a"; break; case "street_crash_left": name = "street_bh"; break; case "street_crash_left2": name = "street_mi28b"; break; } if( level.start_point != "corner" && level.start_point != "meetup" ) { flag_wait( self.script_flag_wait ); switch( self.script_flag_set ) { case "street_crash_left": car = getent( "street_cars_blackhawk_bounce", "targetname" ); clipcar = getent( "street_blackhawk_car_clip", "targetname" ); clipcar linkto( car ); //car.angles += (0,90,0); car.animname = "street_car"; car UseAnimTree( #animtree ); self thread anim_single_solo( car, "crash" ); break; } } heli = spawn_anim_model( name, self.origin ); self thread anim_single_solo( heli, "crash" ); if( level.start_point != "corner" && level.start_point != "meetup" ) { // heli waittillmatch( "single anim", "play_sound" ); // heli playsound( "scn_dcemp_heli_shutdown" ); heli waittillmatch( "single anim", "pre_explode" ); thread flag_set( self.script_flag_set ); heli waittillmatch( "single anim", "explode" ); switch( self.script_flag_set ) { case "street_crash_cop": name = "vehicle_mi-28_d_animated"; break; case "street_crash_left": thread street_heli_crash_secondaries_2(); name = "vehicle_blackhawk_crash"; break; case "street_crash_left2": thread street_heli_crash_secondaries_3(); name = "vehicle_mi-28_d_animated"; break; } dmg trigger_on(); heli setmodel( name ); do_player_crash_fx( self.origin ); range = 300; maxd = 300; if( !flag( "street_safe" ) ) RadiusDamage( heli gettagOrigin( "TAG_DEATHFX" ), range, maxd, 20, heli );//similar to destructibles PhysicsExplosionSphere( heli gettagOrigin( "TAG_DEATHFX" ), range, 0, range * .01 );//similar to destructibles switch( self.script_flag_set ) { case "street_crash_left": playfx( level._effect[ "helicopter_crash" ], heli gettagorigin( "TAG_DEATHFX" ) + (0,0,-60) ); break; case "street_crash_cop": case "street_crash_left2": playfxontag( level._effect[ "helicopter_explosion" ], heli, "TAG_DEATHFX" ); break; } thread play_sound_in_space( "exp_armor_vehicle", heli gettagOrigin( "TAG_DEATHFX" ) ); heli waittillmatch( "single anim", "end" ); } else { heli waittillmatch( "single anim", "explode" ); switch( self.script_flag_set ) { case "street_crash_cop": name = "vehicle_mi-28_d_animated"; break; case "street_crash_left": thread street_heli_crash_secondaries_2(); name = "vehicle_blackhawk_crash"; break; case "street_crash_left2": thread street_heli_crash_secondaries_3(); name = "vehicle_mi-28_d_animated"; break; } heli setmodel( name ); } dmg delete(); if( isdefined( clip ) ) clip solid(); foreach( fx in fx_array ) { playfx( level._effect[ "me_dumpster_fire_FX" ], fx.origin, anglestoforward( fx.angles ), anglestoup( fx.angles ) ); thread play_loopsound_in_space( "fire_dumpster_medium", fx.origin ); } } street_heli_crash_secondaries_2() { trees = getentarray( "street_blackhawk_tree", "targetname" ); array_thread( trees, ::street_trees ); dmg = getstructarray( "street_damage_node_2", "targetname" ); array_thread( dmg, ::street_damage_radius ); } street_heli_crash_secondaries_3() { trees = getentarray( "street_heli3_tree", "targetname" ); array_thread( trees, ::street_trees ); dmg = getstructarray( "street_damage_node_3", "targetname" ); array_thread( dmg, ::street_damage_radius ); } street_damage_radius() { RadiusDamage( self.origin, self.radius, 1000, 1000 ); } street_trees() { dir = []; dir[0] = anglestoforward( ( 0, 160 - randomfloatrange( 50, 90 ), 0 ) ); dir[1] = anglestoforward( ( 0, 160, 0 ) ); dir[2] = anglestoforward( ( 0, 160 + randomfloatrange( 50, 90 ), 0 ) ); time = 2; parts = getentarray( self.target, "targetname" ); self delete(); centers = []; foreach( part in parts ) { org = getent( part.target, "targetname" );; part linkto( org ); centers[ centers.size ] = org; } foreach( index, part in centers ) { vec = dir[ index ]; p = randomfloatrange( 100, 150 ); r = randomfloatrange( 100, 150 ); if( cointoss() ) p *= -1; if( cointoss() ) r *= -1; vec += ( 0,0, randomfloat( .5 ) + .75 ); vec *= randomfloatrange( 300, 400 ); rot = ( p, 0, r ); part movegravity( vec, time ); part rotatevelocity( rot, time, 0, time ); } wait time; array_call( parts, ::delete ); array_call( centers, ::delete ); } street_cars_bounce() { flag_wait( self.script_noteworthy ); wait randomfloatrange( .2, .4 ); height = randomfloatrange( 15, 24 ); time = randomfloatrange( .5, .75 ); min = 5; max = 10; rotation = ( randomfloatrange( min, max ), randomfloatrange( min, max ), randomfloatrange( min, max ) ); angles = self.angles; origin = self.origin; self movez( height, time, 0, time * .5 ); self rotateto( self.angles + rotation, time, 0, time ); wait time * .6; self delaycall( time * .5, ::rotateto, angles, time * .5 ); self moveto( origin, time, time, 0 ); wait time; time = time * .2; height = height * .1; rotation = rotation * .1; self movez( height, time, 0, time ); self rotateto( self.angles + rotation, time, 0, time ); wait time * .85; self delaycall( time * .5, ::rotateto, angles, time * .5 ); self moveto( origin, time, time, 0 ); } street_crash_motorcycle() { forward = anglestoforward( self.angles ); target = getent( self.target, "targetname" ); endorg = target.origin; endang = target.angles; target delete(); origin = self.origin; angles = self.angles; self.origin = self.origin + ( forward * 400 ); self.angles = self.angles + ( 0,180,0 ); flag_wait( "street_crash_left2" ); wait .5; playfxontag( level._effect[ "firelp_med_pm" ], self, "tag_death_fx" ); self playloopsound( "fire_dumpster_medium" ); wait 2.5; playfx( level._effect[ "small_vehicle_explosion" ], self.origin ); self playsound( "car_explode" ); time = 1.5; self moveto( origin, time ); self rotateto( angles, time ); wait time; time = 1; self moveto( endorg, time, 0, time ); self rotateto( endang, time, 0, time ); wait time; self.origin = self.origin; self.angles = self.angles; } street_btr_make_destroyed_heli() { pieces = getentarray( "street_heli_destroyed", "targetname" ); array_call( pieces, ::hide ); array = []; foreach( part in pieces ) { array[ part.script_noteworthy ] = part; part notsolid(); } body = array[ "back" ]; body.parts = array; return body; } street_btr_scene_drop_heli() { heli = getent( "street_heli", "targetname" ); target = getent( "street_heli_target", "targetname" ); heli show(); dist = distance( heli.origin, target.origin ); magicnumber = .001; time = dist * magicnumber; heli moveto( target.origin, time, time ); heli rotatevelocity( ( 0,105,0 ), time ); wait time; heli delete(); target delete(); } street_btr_scene_kill_btr() { model = spawn( "script_model", self.origin ); model.angles = self.angles; model setmodel( "vehicle_btr80_d" ); model.vehicletype = self.vehicletype; model.modeldummyon = false; model thread maps\_vehicle::kill_fx( "vehicle_btr80", false ); self delete(); range = 300; RadiusDamage( model.origin + (0,0,10), range, 300, 20, model );//similar to destructibles PhysicsExplosionSphere( model.origin, range, 0, range * .01 );//similar to destructibles return model; } street_kill_vehicle() { model = spawn( "script_model", self.origin ); model.angles = self.angles; model setmodel( self.model ); model.vehicletype = self.vehicletype; model.modeldummyon = false; model thread maps\_vehicle::kill_fx( self.model, false ); self delete(); range = 300; RadiusDamage( model.origin + (0,0,10), range, 300, 20, model );//similar to destructibles PhysicsExplosionSphere( model.origin, range, 0, range * .01 );//similar to destructibles return model; } street_btr_animate_btr() { slide1 = getent( "street_btr_slide_1", "targetname" ); slide2 = getent( "street_btr_slide_2", "targetname" ); dmg_trig = getent( "btr_dmg_trig", "targetname" ); dmg_trig thread street_btr_move_dmg_trig( self ); time = CONST_BTR_SLIDE_TIME_1; self moveto( slide1.origin, time, 0, time ); self rotateto( slide1.angles, time, 0, time ); wait time; time = CONST_BTR_SLIDE_TIME_2; self moveto( slide2.origin, time, time, 0 ); self rotateto( slide2.angles, time, time, 0 ); wait time; earthquake( .2, .5, level.player.origin, 2048 ); //cleanup slide1 delete(); slide2 delete(); } street_btr_blur( btr ) { if( !player_looking_at( btr.origin, undefined, true ) ) return; setblur( 4, 0 ); wait .1; setblur( 0, .5 ); } street_btr_move_dmg_trig( btr ) { btr_origin = btr.origin; dmg_origin = self.origin; while( !flag( "street_btr_scene_done" ) ) { delta = btr.origin - btr_origin; self.origin = ( dmg_origin + ( delta[ 0 ], delta[ 1 ], 0 ) ); wait .05; } self delete(); } street_btr_animate_heli() { struct = getstruct( "street_physics_launch_point", "targetname" ); parts = self.parts; foreach( part in parts ) { vec = vectornormalize( ( part.origin + (0,0,32) ) - struct.origin ); vec = vec * randomfloatrange( 800, 900 ); //part PhysicsLaunchClient( targets[ part.script_noteworthy ].origin, vec ); part movegravity( vec, 5 ); part rotatevelocity( ( randomfloatrange( 150, 250 ), randomfloatrange( 150, 250 ), randomfloatrange( 150, 250 ) ), 5, 0, 5 ); } wait 5; foreach( part in parts ) part delete(); } do_player_crash_fx( origin ) { if( flag( "do_player_crash_fx" ) ) return; flag_set( "do_player_crash_fx" ); thread flag_clear_delayed( "do_player_crash_fx", .25 ); dist = distancesquared( level.player.origin, origin ); //player stuff if( dist < squared( 1500 ) ) { level.player PlayRumbleLoopOnEntity( "tank_rumble" ); level.player delaycall( 1.0, ::stopRumble, "tank_rumble" ); earthquake( 0.5, 1, origin, 2000 ); level.player setvelocity( anglestoup( level.player.angles ) * 210 ); if( dist < squared( 650 ) ) { //level.player dirtEffect( origin ); level.player allowStand( false ); level.player allowProne( false ); level.player setstance( "crouch" ); level.player blend_movespeedscale( .5 ); level.player delayThread( .1, ::playLocalSoundWrapper, "breathing_hurt" ); time = 1; level.player delayThread( .5, ::blend_movespeedscale, .8, 1.0 ); level.player delayThread( time + .25, ::playLocalSoundWrapper, "breathing_better" ); level.player delaycall( time, ::allowStand, true ); level.player delaycall( time, ::allowProne, true ); level.player delaycall( time, ::setstance, "stand" ); } } } /************************************************************************************************************/ /* CORNER */ /************************************************************************************************************/ corner_hide_damage() { scene = corner_get_scene(); array_call( scene[ "lights" ], ::setlightintensity, 0.0 ); } corner_show_damage() { scene = corner_get_scene(); array_call( scene[ "lights" ], ::setlightintensity, 2.0 ); wait .05; array_thread( scene[ "lights" ], ::light_street_fire ); exploder( "plane_crash_aftermath" ); } corner_get_scene() { array = []; // fixed an issue from rockets checkin when you where away. -Roger // plane = getentarray( "corner_crash_plane", "targetname" ); // tail = getentarray( "crash_plane_tail", "targetname" ); // post_crash_ents = array_combine( plane, tail ); // array[ "plane" ] = plane; array[ "lights" ] = getentarray( "light_crash_fire", "script_noteworthy" ); return array; } corner_palm_style_door_open( soundalias ) { wait( 1.35 ); if ( IsDefined( soundalias ) ) self PlaySound( soundalias ); else self PlaySound( "door_wood_slow_open" ); self ConnectPaths(); self RotateTo( self.angles + ( 0, 70, 0 ), 2, .5, 0 ); self waittill( "rotatedone" ); self RotateTo( self.angles + ( 0, 29, 0 ), 1.5, 0, 1.5 ); } corner_plane_launch() { wait randomfloat( 2 ); names = []; names[ names.size ] = "vehicle_van_white_door_rb"; names[ names.size ] = "bc_military_tire01"; names[ names.size ] = "vehicle_van_white_hood"; names[ names.size ] = "rubble_large_slab_02"; names[ names.size ] = "727_seats_row_left"; if( !isdefined( level.corner_plane_launch_num ) ) level.corner_plane_launch_num = 0; level.corner_plane_launch_num++; if( level.corner_plane_launch_num == names.size ) level.corner_plane_launch_num = 0; name = names[ level.corner_plane_launch_num ]; model = spawn( "script_model", self.origin ); model setmodel( name ); vec = anglestoforward( self.angles ) * randomfloatrange( 1300, 1500 ); neg1 = 1; neg2 = 1; neg3 = 1; if( cointoss() ) neg1 = -1; if( cointoss() ) neg2 = -1; if( cointoss() ) neg3 = -1; fxmod = spawn( "script_model", model.origin ); fxmod setmodel( "tag_origin" ); fxmod linkto( model ); playfxontag( level._effect[ "firelp_med_pm_nolight" ], fxmod, "TAG_ORIGIN" ); time = 1.0; model movegravity( vec, time ); model rotatevelocity( ( randomfloatrange( 50, 100) * neg1, randomfloatrange( 50, 100) * neg2, randomfloatrange( 50, 100) * neg3 ), time ); node = getstruct( "corner_anim1", "targetname" ); wait time - .05; names = []; names[ names.size ] = "wood_door_kick"; names[ names.size ] = "explo_tree"; names[ names.size ] = "door_wood_double_kick"; names[ names.size ] = "door_wood_fence_post_kick"; names[ names.size ] = "door_cargo_container_burst_open"; names[ names.size ] = "bullet_ap_metal"; thread play_sound_in_space( random( names ), fxmod.origin ); wait .05; fxmod delete(); model delete(); } corner_truck_engine_crash() { self corner_vehicle_engine_crash_setup(); flag_wait( "corner_engine_hit" ); level.corner_engine linkto( self ); self delaythread( .25, ::corner_vehicle_engine_crash_move ); node = getstruct( "corner_engine_fx_sparks", "targetname" ); centerfx = spawn( "script_model", node.origin ); centerfx.angles = node.angles; centerfx setmodel( "tag_origin" ); centerfx linkto( self ); wait .2 + .25; for( i=0; i< 11; i++ ) { playfx( level._effect[ "fire_trail_60" ], centerfx.origin + ( randomfloatrange( -15, 15 ), 0, -5 ), anglestoup( centerfx.angles ), anglestoforward( centerfx.angles ) ); if( i > 8 ) wait .2; else wait .1; } wait .25; playfx( level._effect[ "firelp_med_pm_nolight" ], centerfx.origin );//, anglestoup( centerfx.angles ), anglestoforward( centerfx.angles ) ); wait 3.0; flag_set( "corner_look_outside" ); centerfx delete(); } corner_vehicle_engine_crash_setup() { self thread street_cars_bounce(); ents = getentarray( self.target, "targetname" ); array = []; foreach( ent in ents ) array[ ent.script_noteworthy ] = ent; array[ "clip" ] linkto( self ); array[ "clip" ] disconnectpaths(); self.clip = array[ "clip" ]; self.endorg = array[ "target" ].origin; self.endang = array[ "target" ].angles; array[ "target" ] delete(); } corner_engine_crash() { self hide(); target1 = getent( self.target, "targetname" ); target2 = getent( target1.target, "targetname" ); midorg = target1.origin; midang = target1.angles; endorg = target2.origin; endang = target2.angles; target1 delete(); target2 delete(); flag_wait( "corner_engine_crash" ); self show(); node = getstruct( "corner_engine_fx_fire", "targetname" ); fx = spawn( "script_model", node.origin ); fx.angles = node.angles; fx setmodel( "tag_origin" ); fx linkto( self ); playfxontag( level._effect[ "window_fire_large" ], fx, "TAG_ORIGIN" ); self playloopsound( "fire_dumpster_medium" ); magicnumber = .001; time = distance( self.origin, midorg ) * magicnumber; self moveto( midorg, time ); self rotateto( midang, time ); wait time; self playsound( "exp_armor_vehicle" ); time = .5; earthquake( 0.5, time, self.origin, 3000 ); quakeobj = spawn( "script_origin", level.player.origin + (0,0,200) ); quakeobj PlayRumbleLoopOnEntity( "steady_rumble" ); quakeobj delaycall( time, ::stopRumble, "steady_rumble" ); magicnumber = .001; time = distance( self.origin, endorg ) * magicnumber; self moveto( endorg, time ); self rotateto( endang, time ); wait time; level.corner_engine = self; self playsound( "exp_armor_vehicle" ); time = 1.5; earthquake( 0.5, time * .5, self.origin, 3000 ); quakeobj.origin += (0,0,50); quakeobj PlayRumbleLoopOnEntity( "steady_rumble" ); quakeobj movez( 700, time ); quakeobj delaycall( time, ::stopRumble, "steady_rumble" ); quakeobj delaycall( time + .1, ::delete ); flag_set( "corner_engine_hit" ); } corner_vehicle_engine_crash_move() { self.clip connectpaths(); magicnumber = .0025; time = distance( self.origin, self.endorg ) * magicnumber; self moveto( self.endorg, time, 0, time ); self rotateto( self.endang, time, 0, time ); wait time + .2; self.clip disconnectpaths(); } corner_dead_check() { spawner = getent( "meepup_dead_guy", "targetname" ); guy = dronespawn_bodyonly( spawner ); level.corner_dead_check_guy = guy; guy.animname = "dead_guy"; wait .05; guy gun_remove(); node = getstruct( spawner.target, "targetname" ); node thread anim_loop_solo( guy, "hunted_woundedhostage_idle_start" ); flag_wait( "parking_main" ); guy delete(); } /************************************************************************************************************/ /* MEETUP */ /************************************************************************************************************/ meetup_runner_threads() { level.foley delaythread( 0, ::meetup_runner_jog, "meetup_runner_foley" ); level.team[ "marine1" ] delaythread( 3, ::meetup_runner_walk, "meetup_runner_2" ); level.team[ "marine3" ] delaythread( 2, ::meetup_runner_jog, "meetup_runner_3" ); level.team[ "marine2" ] delaythread( 1.5, ::meetup_runner_walk, "meetup_runner_1" ); level.dunn meetup_runner_dunn(); } meetup_runner_dunn() { node = getstruct( "meetup_runner_anim_node", "targetname" ); node.origin = self.origin; //start self disable_exits(); self disable_arrivals(); self setlookatentity( level.runner ); self clearentitytarget(); self set_ignoreall( true ); self disable_dontevershoot(); self anim_generic_run( self, "exposed_crouch_2_stand" ); self thread anim_generic( self, "stand_exposed_wave_halt_v2" ); self.alertlevel = "noncombat"; self allowedstances( "stand" ); flag_wait( "meetup_do_scripted_scene" ); //node waittill( "DCemp_run_sequence" ); time = getanimlength( getanim_generic( "DCemp_run_sequence_guy1" ) ); time *= .62; self thread delaycall( time, ::setlookatentity ); node anim_generic_gravity( self, "DCemp_run_sequence_guy1" ); self setgoalpos( self.origin ); } meetup_runner_jog( name ) { meetup_runner_start(); node = getstruct( name, "targetname" ); ent = spawn( "script_origin", self.origin ); ent.angles = self.angles; self linkto( ent ); time = .75; ent rotateto( vectortoangles( node.origin - ent.origin ), time, time ); ent thread anim_generic_run( self, "casual_killer_jog_start" ); ent waittill( "rotatedone" ); self unlink(); ent delete(); self thread meetup_runner_end(); self set_generic_run_anim_array( "casual_killer_jog" ); node anim_generic_reach( self, "casual_killer_jog_stop" ); node anim_generic_gravity_run( self, "casual_killer_jog_stop" ); self setgoalpos( self.origin ); self ent_flag_set( "meetup_runner_end" ); } meetup_runner_walk( name ) { meetup_runner_start(); node = getstruct( name, "targetname" ); ent = spawn( "script_origin", self.origin ); ent.angles = self.angles; self linkto( ent ); time = .5; ent rotateto( vectortoangles( node.origin - ent.origin ) + (0,10,0), time, time ); ent thread anim_generic_run( self, "patrol_bored_2_walk" ); ent waittill( "rotatedone" ); self unlink(); ent delete(); self thread meetup_runner_end(); self set_generic_run_anim_array( "patrol_bored_patrolwalk" ); if( distance( node.origin, self.origin ) > 48 ) node anim_generic_reach( self, "patrol_bored_walk_2_bored" ); else node = self; node anim_generic_gravity_run( self, "patrol_bored_walk_2_bored" ); self setgoalpos( self.origin ); self ent_flag_set( "meetup_runner_end" ); } meetup_runner_start() { self disable_exits(); self disable_arrivals(); self setlookatentity( level.runner ); switch( self.script_noteworthy ) { case "foley": self anim_generic_run( self, "exposed_crouch_2_stand" ); break; case "marine1": self anim_generic_run( self, "coverstand_hide_2_aim" ); break; case "marine2": self anim_generic_run( self, "corner_standR_trans_alert_2_A_v2" ); break; } self.alertlevel = "noncombat"; self anim_generic_run( self, "casual_stand_idle_trans_in" ); self allowedstances( "stand" ); } #using_animtree( "generic_human" ); meetup_runner_end() { self ent_flag_init( "meetup_runner_end" ); flag_wait( "meetup_runner_leave" ); angle = 0; switch( self.script_noteworthy ) { case "marine3": wait 0; angle = 80; break; case "marine2": wait .2; angle = 65; break; case "foley": wait .5; angle = 70; break; } if( !angle ) return; self ent_flag_wait( "meetup_runner_end" ); self ai_turn( angle ); self anim_generic_run( self, "casual_stand_idle_trans_in" ); } /************************************************************************************************************/ /* LOBBY */ /************************************************************************************************************/ lobby_enemy_suppressive_fire() { level endon( "office_enemy_suppressive_fire" ); level thread notify_delay( "office_enemy_suppressive_fire", 5 ); node = getstruct( "office_magic_bullet_target2", "targetname" ); target = spawnstruct(); target.origin = self geteye(); while( 1 ) { weapon = "ak47"; if( cointoss() ) weapon = "rpd"; shots = randomintrange( 10, 25 ); for( i = 0; i < shots; i++ ) { magicbullet( weapon, node.origin, target.origin + ( randomfloatrange( -64, 64 ), 0, randomfloat( 10 ) - 10 ) ); wait .1; } wait randomfloatrange( .5, 1.5 ); } } /************************************************************************************************************/ /* OFFICE */ /************************************************************************************************************/ office_enemies_wave1() { self endon( "death" ); self.ignoreall = true; self.oldgrenadeammo = self.grenadeammo; self.grenadeammo = 0; add_wait( ::flag_wait, "lobby_robo_death" ); self add_wait( ::waittill_msg, "damage" ); level add_wait( ::waittill_msg, "office_enemies_wave1_hurt" ); do_wait_any(); level notify( "office_enemies_wave1_hurt" ); self.ignoreall = false; trigger_wait( "office_enemies_wave2", "target" ); self.grenadeammo = self.oldgrenadeammo; } office_enemies_wave1_runner() { self.ignoreall = true; level delaythread( 2, ::dcemp_lightningFlash, "double" ); thread flag_set_delayed( "_weather_lightning_enabled", 4 ); self endon( "death" ); self waittill( "goal" ); self.ignoreall = false; } /************************************************************************************************************/ /* PARKING */ /************************************************************************************************************/ parking_drone() { spawner = getent( "parkinglot_drone", "targetname" ); guy = dronespawn_bodyonly( spawner ); guy gun_remove(); spawner anim_generic( guy, "death_pose_on_desk" ); } parking_dead_check() { spawner = getent( "parking_dead_check_guy", "targetname" ); guy = dronespawn_bodyonly( spawner ); level.parking_dead_check_guy = guy; guy.animname = "dead_guy"; wait .05; guy gun_remove(); node = getstruct( spawner.target, "targetname" ); node thread anim_loop_solo( guy, "hunted_woundedhostage_idle_start" ); flag_wait( "tunnels_main" ); guy delete(); } parking_high_spec() { while( 1 ) { flag_wait( "parking_high_spec" ); lerp_saveddvar( "r_specularColorScale", 15, 2 ); flag_waitopen( "parking_high_spec" ); lerp_saveddvar( "r_specularColorScale", 10, 2 ); } } parking_btr_extra_wait() { self thread anim_generic_loop( self, "coverstand_hide_idle" ); while( !flag( "parking_open_fire" ) && distancesquared( self.origin, level.player.origin ) > squared( 1250 ) ) wait .1; self notify( "stop_loop" ); self anim_stopanimscripted(); } parking_traverse_from_office() { node = getent( "office_to_parking_jump_down", "targetname" ); link = spawn( "script_origin", node.origin ); link.angles = node.angles; link anim_generic_reach( self, "traverse_jumpdown_96" ); link thread anim_generic( self, "traverse_jumpdown_96" ); length = getanimlength( getanim_generic( "traverse_jumpdown_96" ) ); wait length * .66; self anim_stopanimscripted(); node = getent( "office_to_parking_hop", "targetname" ); length = getanimlength( getanim_generic( "traverse40" ) ); height1 = 25; height2 = -14; time1 = length * .34; time2 = length * .75; time3 = length - time2 - .25; link.origin = node.origin + ( 0,0, height1 ); link.angles = node.angles; self linkto( link ); link thread anim_generic_run( self, "traverse40" ); link movez( height1 * -1, time1 ); wait time2; link movez( height2, time3 ); wait time3; self unlink(); } /************************************************************************************************************/ /* PLAZA */ /************************************************************************************************************/ plaza_flare_fx() { model = getent( "street_flare", "targetname" ); model.fxtag = getent( model.target, "targetname" ); model.fxtag linkto( model ); playfxontag( level._effect[ "groundflare" ], model.fxtag, "TAG_ORIGIN" ); } plaza_enemies() { self endon( "death" ); self endon( "long_death" ); self.ignoreall = true; self add_wait( ::waittill_msg, "damage" ); self add_wait( ::waittill_msg, "death" ); self add_func( ::flag_set, "plaza_open_fire" ); thread do_wait_any(); self set_allowdeath( true ); self walkdist_zero(); self pathrandompercent_zero(); self thread anim_generic_loop( self, "covercrouch_hide_idle" ); self thread plaza_enemies_wakeup(); self thread plaza_enemies_player_close(); level endon( "plaza_open_fire" ); level endon( "plaza_throw_react" ); flag_wait( "plaza_show_enemies" ); node = getstruct( self.target, "targetname" ); node script_delay(); self notify( "stop_loop" ); self anim_stopanimscripted(); node anim_generic_reach( self, node.script_animation ); node anim_generic_gravity_run( self, node.script_animation ); node = getnode( node.target, "targetname" ); self setgoalnode( node ); self.goalradius = 80; } plaza_enemies_player_close() { level endon( "plaza_open_fire" ); level.player endon( "death" ); while( distancesquared( level.player.origin, self.origin ) > squared( 300 ) ) wait .25; flag_set( "plaza_open_fire" ); } plaza_enemies_wakeup() { self endon( "death" ); self endon( "long_death" ); flag_wait_any( "plaza_open_fire", "plaza_throw_react" ); node = spawnstruct(); node.origin = self.origin; node.angles = ( 0, 270, 0 ); if( !isdefined( level.plaza_enemies_wakeup ) ) level.plaza_enemies_wakeup = 0; self.reactnum = level.plaza_enemies_wakeup; level.plaza_enemies_wakeup++; anims = []; anims[ anims.size ] = "patrol_bored_react_look_retreat"; anims[ anims.size ] = "exposed_idle_reactB"; anims[ anims.size ] = "exposed_idle_reactB"; delays = []; delays[ delays.size ] = 0; delays[ delays.size ] = 0; delays[ delays.size ] = .5; if( !flag( "plaza_open_fire" ) ) wait .5; wait( delays[ self.reactnum ] ); self anim_stopanimscripted(); self.ignoreall = false; self walkdist_reset(); self pathrandompercent_reset(); node anim_generic_gravity_run( self, anims[ self.reactnum ] ); } /************************************************************************************************************/ /* MISC */ /************************************************************************************************************/ send_team_to_random_nodes( team, nodes ) { index = 0; foreach( actor in team ) { node = nodes[ index ]; node.taken = actor; actor thread follow_path( node ); index++; } } send_team_to_specific_nodes( name, type ) { nodes = getnodearray( name, type ); if( !nodes.size ) nodes = getentarray( name, type ); if( !nodes.size ) nodes = getstructarray( name, type ); foreach( node in nodes ) { name = node.script_noteworthy; if( !isalive( level.team[ name ] ) ) continue; level.team[ name ] thread follow_path( node ); } } emp_teleport_player( name ) { if ( !isdefined( name ) ) name = level.start_point; array = getstructarray( "start_point", "targetname" ); nodes = []; foreach ( ent in array ) { if ( ent.script_noteworthy != name ) continue; nodes[ nodes.size ] = ent; } teleport_players( nodes ); } emp_teleport_team( team, nodes ) { index = 0; foreach( actor in team ) { actor thread teleport_actor( nodes[ index ] ); index++; } } emp_teleport_team_specific( team, nodes ) { foreach( node in nodes ) level.team[ node.script_noteworthy ] thread teleport_actor( node ); } teleport_actor( node ) { link = spawn( "script_origin", self.origin ); link.angles = self.angles; self linkto( link ); link moveto( node.origin, .05 ); if( isdefined( node.angles ) ) link rotateto( node.angles, .05 ); link waittill( "movedone" ); wait .05; self setgoalpos( node.origin ); self unlink(); link delete(); self orientmode( "face angle", node.angles[ 1 ] ); } flickerlight_flares() { wait randomfloatrange( .05, .5 ); intensity = self getlightintensity(); while( 1 ) { self setlightintensity( intensity * randomfloatrange( .8, 1.1 ) ); wait .05; } } light_street_fire() { wait randomfloatrange( .05, .5 ); intensity = self getlightintensity(); color = self getlightcolor(); origin = self.origin; while( 1 ) { for( i = 0; i