//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: Skyscraper Exfil Utils ** // ** // Created: 11/10/2011 - John Webb ** // ** //**************************************************************************** #include maps\_utility; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; #include maps\_nx_utility; //******************************************************************* // * // * //******************************************************************* exfil_setup_allies( start_name ) { level.baker = setup_ally( start_name, "ally1" ); //setup_ally( start_name, "ally2" ); level.baker.countryID = "us"; level.baker set_battlechatter_id( "bar" ); } setup_ally( start_name, ally_name ) { ally_start = getStruct( start_name + "_" + ally_name, "targetname" ); assert( isDefined( ally_start ) ); ally_spawner = GetEnt( ally_name, "targetname" ); ally_spawner add_spawn_function( ::ally_common ); level.allies[ ally_name ] = ally_spawner spawn_ai(); assert( isDefined( level.allies[ ally_name ] ) ); level.allies[ ally_name ] ForceTeleport( ally_start.origin, ally_start.angles ); if ( isDefined( ally_start.target ) ) { node = GetNode( ally_start.target, "targetname" ); assert( isDefined( node ) ); level.allies[ ally_name ] follow_path( node ); } return level.allies[ ally_name ]; } ally_common() { self thread magic_bullet_shield(); self.threatbias = 200; } player_start( player_start_origin_name ) { // Move player to start player_start_origin = GetEnt( player_start_origin_name, "targetname" ); level._player setOrigin( player_start_origin.origin ); level._player setPlayerAngles( player_start_origin.angles ); } ignore_everything() { self.ignoreall = true; self.grenadeawareness = 0; self.ignoreexplosionevents = true; self.ignorerandombulletdamage = true; self.ignoresuppression = true; self.disableBulletWhizbyReaction = true; self disable_pain(); self.og_newEnemyReactionDistSq = self.newEnemyReactionDistSq; self.newEnemyReactionDistSq = 0; } clear_ignore_everything() { self.ignoreall = false; self.grenadeawareness = 1; self.ignoreexplosionevents = false; self.ignorerandombulletdamage = false; self.ignoresuppression = false; self.disableBulletWhizbyReaction = false; self enable_pain(); if( IsDefined( self.og_newEnemyReactionDistSq ) ) { self.newEnemyReactionDistSq = self.og_newEnemyReactionDistSq; } } stumble_walk( move_speed, decay_time, blur_intensity, stumble_intensity, skip_stumble, speed_no_decay ) { //tricky shit to make just one run at a time. level notify( "start_stumble_walk" ); level endon( "start_stumble_walk"); time = 1; if( IsDefined(speed_no_decay) && speed_no_decay ) { player_stumble_movement_speed_do_not_decay( move_speed ); } else { level thread player_stumble_movement_speed( move_speed, decay_time ); } level._player thread player_random_blur( decay_time, blur_intensity ); if ( !IsDefined( skip_stumble ) || !skip_stumble ) { //if we've interupted an existing one, use the existing ground plane and bring it back towards neutral before //letting the second one come into effect. if( !IsDefined( level._ground_ref_ent ) ) { level._ground_ref_ent = spawn( "script_model", ( 0, 0, 0 ) ); level._player PlayerSetGroundReferenceEnt( level._ground_ref_ent ); } else { level._ground_ref_ent RotateTo( (0,0,0), time, time * 0.5, time * 0.5 ); wait time; } self stumble_walk_internal( decay_time, stumble_intensity ); if( IsDefined( level._ground_ref_ent ) ) { level._ground_ref_ent RotateTo( (0,0,0), time, time * 0.5, time * 0.5 ); wait time; level._ground_ref_ent delete(); } level._player PlayerSetGroundReferenceEnt( undefined ); } else { if( IsDefined( level._ground_ref_ent )) { time = 1.0; level._ground_ref_ent RotateTo(( 0, 0, 0 ), time, time * 0.5, time * 0.5 ); wait time; level._ground_ref_ent delete(); } level._player PlayerSetGroundReferenceEnt( undefined ); wait decay_time - time; } if( !( IsDefined(speed_no_decay) && speed_no_decay ) ) { player_stumble_restore_movement_speed(); } setblur( 0, time ); } player_stumble_movement_speed( speed, decay_time ) { level._player AllowJump( false ); level._player AllowSprint( false ); // Turn off the stance HUD indicator while the player cannot crouch SetSavedDvar( "ammoCounterHide", "1" ); SetSavedDvar ( "weapon_view_bob_speed_modifier", 0.7); level._player blend_movespeedscale( speed, 0.05 ); //level._player delayThread( 1, ::blend_movespeedscale, speed, 5 ); wait 0.05; level._player blend_movespeedscale( 1.0, decay_time ); } player_stumble_movement_speed_do_not_decay( speed ) { level._player AllowCrouch( false ); level._player AllowProne( false ); level._player AllowJump( false ); level._player AllowSprint( false ); // Turn off the stance HUD indicator while the player cannot crouch SetSavedDvar( "ammoCounterHide", "1" ); SetSavedDvar ( "weapon_view_bob_speed_modifier", 0.7); level._player maps\_utility_code::movespeed_set_func( speed ); } player_stumble_restore_movement_speed() { level._player AllowCrouch( true ); level._player AllowProne( true ); level._player AllowJump( true ); level._player AllowSprint( true ); SetSavedDvar( "ammoCounterHide", "0" ); SetSavedDvar ( "weapon_view_bob_speed_modifier", 1); level._player blend_movespeedscale( 1.0, 0.1 ); } player_random_blur( decay_length, blur_intensity ) { level._player endon( "death" ); level endon( "stop_stumble_walk" ); decay_length_ms = decay_length * 1000; start_time = GetTime(); while ( true ) { wait 0.05; if ( randomint( 100 ) > 10 ) continue; time = GetTime(); if( time > start_time + decay_length_ms ) return; blur = randomint( 3 ) + 2; blur = blur * ( 1 - ( ( time - start_time ) / decay_length_ms ) ); blur_time = randomfloatrange( 0.3, 0.7 ); recovery_time = randomfloatrange( 0.3, 1 ); setblur( blur * blur_intensity, blur_time ); wait blur_time; setblur( 0, recovery_time ); //blur_wait_time = randomfloatrange( 0.5, 1.5 ); //wait blur_wait_time; } } stumble_walk_internal( decay_length, stumble_intensity ) { level._player endon( "death" ); level endon( "stop_stumble_walk" ); start_time = GetTime(); wait_length = decay_length; while ( true ) { velocity = level._player GetVelocity(); player_speed = abs( velocity [ 0 ] ) + abs( velocity[ 1 ] ); if ( player_speed < 10 ) { wait 0.05; continue; } time = GetTime(); if( time > start_time + ( decay_length * 1000 ) ) { return; } speed_multiplier = player_speed * stumble_intensity * ( 1 - ( ( time - start_time ) / ( decay_length * 1000 ) ) ); p = randomfloatrange( 3, 5 ); if ( randomint( 100 ) < 20 ) p *= 3; r = randomfloatrange( 3, 7 ); y = randomfloatrange( -8, -2 ); stumble_angles = ( p, y, r ); stumble_angles = vector_multiply( stumble_angles, speed_multiplier ); stumble_time = randomfloatrange( .35, .45 ); recover_time = randomfloatrange( .65, .8 ); stumble( stumble_angles, stumble_time, recover_time ); } } stumble( stumble_angles, stumble_time, recover_time ) { level endon( "stop_stumble_walk" ); stumble_angles = adjust_angles_to_player( stumble_angles ); level._ground_ref_ent rotateto( stumble_angles, stumble_time, ( stumble_time / 4 * 3 ), ( stumble_time / 4 ) ); level._ground_ref_ent waittill( "rotatedone" ); base_angles = ( randomfloat( 4 ) - 4, randomfloat( 5 ), 0 ); base_angles = adjust_angles_to_player( base_angles ); level._ground_ref_ent rotateto( base_angles, recover_time, 0, recover_time / 2 ); level._ground_ref_ent waittill( "rotatedone" ); } adjust_angles_to_player( stumble_angles ) { pa = stumble_angles[ 0 ]; ra = stumble_angles[ 2 ]; rv = anglestoright( level._player.angles ); fv = anglestoforward( level._player.angles ); rva = ( rv[ 0 ], 0, rv[ 1 ] * - 1 ); fva = ( fv[ 0 ], 0, fv[ 1 ] * - 1 ); angles = vector_multiply( rva, pa ); angles = angles + vector_multiply( fva, ra ); return angles + ( 0, stumble_angles[ 1 ], 0 ); } enemy_lasers() { //self.has_no_ir = undefined; self LaserForceOn(); //we have to create a new entity for the laser flash because if an actor gets deleted we //need to be able to kill the fx. tag_flash = spawn_tag_origin(); tag_flash.origin = self GetTagOrigin( "tag_flash"); //tag_flash.angles = self GetTagAngles( "tag_flash" ); tag_flash LinkTo( self, "tag_flash" ); if ( IsDefined( level._effect[ "laser_aim" ] ) ) { StopFXOnTag( level._effect[ "laser_aim" ], tag_flash, "tag_origin" ); PlayFxOnTag( level._effect[ "laser_aim" ], tag_flash, "tag_origin" ); } self waittill_any( "death", "deleting", "deathanim" ); if ( IsDefined( level._effect[ "laser_aim" ] ) ) { StopFXOnTag( level._effect[ "laser_aim" ], tag_flash, "tag_origin", true ); } //only try to turn off lasers if the ent hasnt been removed. if ( isDefined( self ) ) { self LaserForceOff(); } } cop_init() { self thread no_cover(); self.no_pistol_switch = true; self.dontevershoot = 1; flag_wait( "cops_engaged" ); //self SetGoalNode( GetNode( self.target, "targetname" ) ); //self.goalradius = 32; self.dontevershoot = undefined; } no_cover() { self endon( "death" ); self.combatmode = "no_cover"; //self.fixednode = true; flag_wait( "swat_encounter_start" ); self.combatmode = "cover"; //self.goalradius = 128; //self SetGoalNode( GetNode( self.target, "targetname" ) ); //side_street_volume = GetEnt( "side_street_volume", "script_noteworthy" ); //self SetGoalVolumeAuto( side_street_volume ); } ignore_on_jumpedout() { self endon( "death" ); maps\nx_exfil_util::ignore_everything(); // Swat van guys need to ignore everything for a few seconds after jumping out // So they can get out of the way of the van self waittill( "jumpedout" ); wait 3.5; maps\nx_exfil_util::clear_ignore_everything(); } // If from_flag has been set // And enemy_noteworthy enemies are under enemy_count // And to_flag has not been hit, move up and lead the player ally_lead_player( from_flag, to_flag, enemy_aigroup, enemy_count, color_order ) { if ( flag( to_flag ) ) { return; } level endon( to_flag ); flag_wait( from_flag ); while ( 1 ) { wait 0.5; if ( get_ai_group_sentient_count( enemy_aigroup ) < enemy_count ) { issue_color_orders( color_order, "allies" ); } } } smoke_throw( aSmokeOrgs, sFlagToStop ) { level endon( sFlagToStop ); exploder ( "smoke_screen" ); while ( true ) { smokeTarget = undefined; foreach ( org in aSmokeOrgs ) { //MagicGrenade( "smoke_grenade_american_no_visblock", org.origin, org.origin + ( 0, 0, 1), RandomFloat( 1.1 ) ); PlayFX( getfx( "smokescreen" ), org.origin ); //org thread play_sound_in_space( "smokegrenade_explode_default" ); wait( RandomFloatRange( .1, .3 ) ); } wait( 28 ); if ( flag( sFlagToStop ) ) break; } }