#include maps\_utility; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; #include animscripts\hummer_turret\common; #include maps\_hud_util; turret_guy_in_near_humvee() { wait( 0.2 );// let _vehicle stuff put him on the turret vehicle = self.ridingVehicle; angles = vehicle.angles; angles = ( 0, angles[ 1 ], 0 ); forward = AnglesToForward( angles ); ent = spawn_tag_origin(); ent.origin = vehicle.origin + forward * 250 + ( 0, 0, 120 ); ent LinkTo( vehicle ); self.ignoreall = true; turret = self GetTurret(); turret SetMode( "manual" ); turret SetTargetEntity( ent ); /* for ( ;; ) { Line( ent.origin, self.origin ); wait( 0.05 ); } */ } player_fails_if_he_kills_me( damage, attacker, direction_vec, point, type, modelName, tagName ) { if ( !isalive( attacker ) ) return; if ( attacker != level.player ) return; vehicle = self.ridingVehicle; if ( isdefined( vehicle ) ) { if ( vehicle ent_flag( "can_shoot_the_baddies" ) ) return; } wait( 1 ); // Friendly fire will not be tolerated! SetDvar( "ui_deadquote", &"SCRIPT_MISSIONFAIL_KILLTEAM_AMERICAN" ); // friendly fire will not be tolerated maps\_utility::missionFailedWrapper(); } aim_ahead_until_you_get_enemy() { self endon( "death" ); for ( ;; ) { if ( IsDefined( self.ridingVehicle ) ) break; wait( 0.05 ); } vehicle = self.ridingVehicle; add_damage_function( ::player_fails_if_he_kills_me ); // this guy aims at other targets if ( vehicle.script_index == 0 ) vehicle.target_override = "turret_aim_target_first"; angles = vehicle.angles; angles = ( 0, angles[ 1 ], 0 ); forward = AnglesToForward( angles ); ent = spawn_tag_origin(); ent.origin = vehicle.origin + forward * 250 + ( 0, 0, 120 ); ent LinkTo( vehicle ); turret = undefined; for ( ;; ) { turret = self GetTurret(); if ( IsDefined( turret ) ) break; if ( !isdefined( self.ridingVehicle ) ) return; wait( 0.05 ); } turret SetMode( "manual" ); turret SetTargetEntity( ent ); oldmaxsight = self.maxsightdistsqrd; self.maxsightdistsqrd = 0; turret.dontshoot = true; turret thread gunner_aims_at_targets( ent, self.ridingVehicle ); flag_wait( "humvees_spin_up" ); self.maxsightdistsqrd = oldmaxsight; thread turret_recovers_shooting_ability( vehicle, turret ); wait( RandomFloat( 1.5 ) ); turret play_sound_on_entity( "minigun_gatling_spinup_npc" ); turret StartBarrelSpin(); turret StartFiring(); vehicle ent_flag_wait( "start_aiming_at_badguys" ); turret notify( "stop_aiming_at_targets" ); } turret_recovers_shooting_ability( vehicle, turret ) { turret SetMode( "auto_ai" ); turret ClearTargetEntity(); vehicle ent_flag_wait( "can_shoot_the_baddies" ); //Print3d( turret.origin, "shoot", (1,0,0), 1, 1, 5000 ); turret.dontshoot = undefined; } gunner_aims_at_targets( default_target, vehicle ) { self endon( "stop_aiming_at_targets" ); self endon( "death" ); targetname = "turret_aim_target"; if ( IsDefined( vehicle.target_override ) ) targetname = vehicle.target_override; targets = GetEntArray( targetname, "targetname" ); foreach ( target in targets ) { if ( !isdefined( target.script_noteworthy ) ) target.script_noteworthy = ""; } level.toffset++; for ( ;; ) { ents = get_array_of_closest( self.origin, targets, undefined, 5, 2000, 500 ); next_target = default_target; angles = vehicle.angles; priority_target = undefined; foreach ( ent in ents ) { if ( ent.script_noteworthy == "priority" ) { dot = get_dot( self.origin, angles, ent.origin ); //Print3d( ent.origin + (0,0,level.toffset*16), dot, (1,1,1), 1, 1.2, 100 ); if ( dot > 0.7 ) { priority_target = ent; break; } } } if ( IsDefined( priority_target ) ) { next_target = priority_target; } else { for ( i = 0; i < ents.size; i++ ) { ent = ents[ i ]; dot = get_dot( self.origin, angles, ent.origin ); //Print3d( ent.origin + (0,0,level.toffset*16), dot, (1,1,1), 1, 1.2, 100 ); if ( dot > 0.8 ) { next_target = ent; break; } } } if ( vehicle == level.crazy_ride_convoy[ "detour" ] ) { // detour guy does custom aiming once the shot rings out if ( flag( "shot_rings_out" ) ) return; } //thread linder( next_target ); self SetTargetEntity( next_target ); if ( next_target == default_target ) { wait( 0.15 ); } else { for ( ;; ) { angles = vehicle.angles; dot = get_dot( self.origin, angles, next_target.origin ); if ( dot < 0 ) break; wait( 0.1 ); } } } } linder( ent ) { self notify( "stop" ); self endon( "stop" ); for ( ;; ) { Line( self.origin, ent.origin ); wait( 0.05 ); } } hargrove_spawner() { self.animname = "hargrove"; self gun_remove(); } protect_player_while_scene_is_active() { timeoutEnt = SpawnStruct(); timeout_time = 10; if ( getdvarint( "newintro" ) ) timeout_time = 18; timeoutEnt thread notify_delay( "timeout", timeout_time ); timeoutEnt endon( "timeout" ); for ( ;; ) { flag_wait( "player_hangs_with_commanders" ); set_player_attacker_accuracy( 0 ); level.player.IgnoreRandomBulletDamage = true; flag_waitopen( "player_hangs_with_commanders" ); maps\_gameskill::updateAllDifficulty(); level.player.IgnoreRandomBulletDamage = false; } } player_is_protected_near_commanders() { protect_player_while_scene_is_active(); maps\_gameskill::updateAllDifficulty(); level.player.IgnoreRandomBulletDamage = false; } roadkill_foley_shepherd_intro() { waittillframeend;// for heroes to get defined level.shepherd thread shepherd_roams_battlefield( "shepherd_path" ); thread player_is_protected_near_commanders(); struct = getstruct( "roadkill_shepherd_scene", "targetname" ); guys = []; guys[ "foley" ] = level.foley; //guys[ "shepherd" ] = level.shepherd; /* struct thread anim_loop_solo( level.foley, "intro_idle" ); struct thread anim_loop_solo( level.shepherd, "intro_idle" ); //flag_wait( "player_enters_riverbank" ); wait( 1 ); if ( !is_default_start() ) return; struct notify( "stop_loop" ); */ struct thread anim_first_frame_solo( level.foley, "roadkill_riverbank_intro" ); wait( 1.5 ); struct thread anim_single_solo_run( level.foley, "roadkill_riverbank_intro" ); //struct thread anim_single_solo_run( level.shepherd, "roadkill_riverbank_intro" ); wait( 0.05 ); offset_start = 2; animation = level.foley getanim( "roadkill_riverbank_intro" ); anim_time = GetAnimLength( animation ); start_time = offset_start / anim_time; level.foley SetAnimTime( animation, start_time ); //animation = level.shepherd getanim( "roadkill_riverbank_intro" ); //anim_time = GetAnimLength( animation ); //start_time = offset_start / anim_time; //level.shepherd SetAnimTime( animation, start_time ); //node = GetNode( "shepherd_walk_node", "targetname" ); //level.shepherd.a.movement = "run"; //level.shepherd SetGoalNode( node ); //level.shepherd.goalradius = 16; //level.shepherd set_run_anim( "walk" ); //level.shepherd thread shepherd_roams_battlefield( "shepherd_path" ); node = GetNode( "foley_walk_node", "targetname" ); level.foley.a.movement = "run"; level.foley SetGoalNode( node ); level.foley.goalradius = 16; level.foley add_to_allied_riverbank_ai();// makes him move out with convoy for ( ;; ) { time = level.foley GetAnimTime( animation ); if ( time >= 0.975 ) break; wait( 0.05 ); } level.foley anim_stopanimscripted(); } ent_flag_set_trigger() { for ( ;; ) { self waittill( "trigger", other ); if ( !first_touch( other ) ) continue; other ent_flag_set( self.script_flag ); } } foley_spawner() { AssertEx( !isdefined( level.foley ), "Multiple Foleys!" ); level.foley = self; self.animname = "foley"; self make_hero(); if ( !flag( "player_rolls_into_town" ) ) { flag_wait( "player_rolls_into_town" ); self safe_delete(); } // self gun_remove(); } safe_delete() { if ( !isalive( self ) ) return; if ( IsDefined( self.magic_bullet_shield ) ) self stop_magic_bullet_shield(); self Delete(); } dunn_spawner() { AssertEx( !isdefined( level.dunn ), "Multiple Dunns!" ); level.dunn = self; self.animname = "dunn"; // self gun_remove(); } shepherd_spawner() { AssertEx( !isdefined( level.shepherd ), "Multiple Shepherds!" ); level.shepherd = self; self.animname = "shepherd"; self make_hero(); if ( !flag( "player_rolls_into_town" ) ) { flag_wait( "player_rolls_into_town" ); self safe_delete(); } // self gun_remove(); } player_humvee() { self.dontdisconnectpaths = true; level.player_humvee = self; level.player_humvee.animname = "player_humvee"; if ( level.start_point == "intro" || level.start_point == "getout" ) { org = self player_rides_shotgun_in_humvee( 170, 170, 45, 15 ); flag_wait( "slam_hood" ); wait( 1.5 ); org player_leaves_humvee(); level.player AllowCrouch( true ); level.player AllowProne( true ); } /* level.player PlayerLinkTo( self, "tag_player", 0 ); turret = self.mgturret[ 0 ]; turret MakeUsable(); turret SetMode( "manual" ); turret UseBy( level.player ); turret MakeUnusable(); // thread player_viewhands_minigun( level.suburbans[ 2 ].mgturret[ 0 ] ); level.player DisableTurretDismount(); */ } player_turret_humvee() { self.dontdisconnectpaths = true; level.player_humvee = self; level.player_humvee.animname = "player_humvee"; self player_gets_on_turret(); } player_gets_on_turret() { thread warn_if_player_shoots_prematurely(); level.player AllowCrouch( true ); level.player AllowProne( true ); //level.player PlayerLinkTo( self, "tag_player", 0 ); level.player PlayerLinkToDelta( self, "tag_player", 0.35, 360, 360, 45, 30, true ); turret = self.mgturret[ 0 ]; turret SetModel( "weapon_suburban_minigun_viewmodel" ); turret MakeUsable(); turret SetMode( "manual" ); turret UseBy( level.player ); turret MakeUnusable(); //turret Hide(); level.player_turret = turret; level.player SetPlayerAngles( ( 0, level.player_humvee.angles[ 1 ], 0 ) ); // thread player_viewhands_minigun( level.suburbans[ 2 ].mgturret[ 0 ] ); level.player DisableTurretDismount(); thread maps\_minigun_viewmodel::player_viewhands_minigun( turret ); } front_vehicle() { self.dontdisconnectpaths = true; if ( is_first_start() ) { flag_wait( "player_humvee_stops_for_officers" ); wait( 3 ); self Vehicle_SetSpeed( 0, 10, 10 ); } flag_wait( "slam_hood" ); wait( 1.5 ); self vehicle_unload( "passengers" ); } ending_vehicle() { self.dontunloadonend = true; self.dontdisconnectpaths = true; self waittill( "reached_end_node" ); level.ending_vehicles[ level.ending_vehicles.size ] = self; } shepherd_ending_vehicle() { self.dontunloadonend = true; self.dontdisconnectpaths = true; self waittill( "reached_end_node" ); self vehicle_unload( "rear_driver_side" ); } near_vehicle() { level.near_vehicle = self; self.dontunloadonend = true; self.dontdisconnectpaths = true; // the humvee right in front of the player if ( is_first_start() ) { flag_wait( "player_humvee_stops_for_officers" ); wait( 3 ); } flag_wait( "slam_hood" ); wait( 1.5 ); self vehicle_unload( "passengers" ); // self Vehicle_SetSpeed( 0, 1, 1 ); } rear_vehicle() { self.dontdisconnectpaths = true; if ( is_first_start() ) { flag_wait( "player_humvee_stops_for_officers" ); // the vehicles behind you slow down for ( ;; ) { speed = level.player_humvee.veh_speed; accel = speed; if ( accel <= 5 ) { accel = 5; } self Vehicle_SetSpeed( speed, accel, accel ); if ( flag( "slam_hood" ) ) break; wait( 0.05 ); } } wait( 1.5 ); self vehicle_unload( "passengers" ); } intro_convoy() { self ent_flag_init( "convoy_stops_for_bridge" ); } roadkill_bridge_layer( bridge_model ) { spawner = GetEnt( "bridge_layer_spawner", "targetname" ); spawner.animname = "bridge_layer"; if ( before_bridge_start() ) { org = getstruct( "bridge_layer_org", "targetname" ); org anim_teleport_solo( spawner, "bridge_driveup" ); } else { org = getstruct( "bridge_layer_org", "targetname" ); org anim_teleport_solo( spawner, "bridge_cross" ); node = GetVehicleNode( "bridge_layer_path_1", "targetname" ); spawner.origin = node.origin; } spawner add_spawn_function( ::bridge_layer_think ); spawner spawn_vehicle(); } intro_rundown_friendly_spawner() { self.pathrandompercent = 200; } before_bridge_start() { if ( level.start_point == "intro" ) return true; return level.start_point == "riverbank"; } bridge_layer_think() { self.dontdisconnectpaths = true; level.bridge_layer = self; self.animname = "bridge_layer"; level.bridge_start_time = GetTime(); org = getstruct( "bridge_layer_org", "targetname" ); self assign_animtree(); bridge_model = self.bridge_model;// comes with the vehicle bridge_model.animname = "bridge_layer_bridge"; bridge_model assign_animtree(); bridge_clip = GetEnt( "bridge_clip", "targetname" ); bridge_clip add_target_pivot(); bridge_clip.pivot LinkTo( bridge_model, "origin_animate_jnt", ( 0, 0, 0 ), ( 0, 0, 180 ) ); bridge_clip Hide(); thread bridge_layer_is_threatened_by_baddies( bridge_model ); guys = []; guys[ "vehicle" ] = self; guys[ "bridge" ] = bridge_model; if ( before_bridge_start() ) { bridge_model Unlink(); arm_animation = self getanim( "bridge_arm_lower" ); array_thread( guys, ::slow_down_bridge ); // org anim_first_frame( guys, "bridge_lower" ); org thread anim_single( guys, "bridge_lower" ); wait( 0.05 ); foreach ( guy in guys ) { animation = guy getanim( "bridge_lower" ); guy SetFlaggedAnim( "single anim", animation, 1, 0, 0 ); } //self SetAnim( arm_animation, 1, 0, 0 ); // flag_wait( "bridgelayer_starts" ); org thread anim_single( guys, "bridge_lower" ); bridge_anim_rate = 0.62; self SetFlaggedAnim( "single anim", arm_animation, 1, 0, 1 ); wait( 0.05 ); self SetFlaggedAnim( "single anim", arm_animation, 1, 0, bridge_anim_rate ); // slow down bridgelayer foreach ( guy in guys ) { animation = guy getanim( "bridge_lower" ); guy SetFlaggedAnim( "single anim", animation, 1, 0, bridge_anim_rate ); } //47 bridge_animation = bridge_model getanim( "bridge_lower" ); for ( ;; ) { if ( bridge_model GetAnimTime( bridge_animation ) >= 0.47 ) break; wait( 0.05 ); } self SetFlaggedAnim( "single anim", arm_animation, 1, 0, 0 ); foreach ( guy in guys ) { animation = guy getanim( "bridge_lower" ); guy SetFlaggedAnim( "single anim", animation, 1, 0, 0 ); } wait 17.5; wait 25; flag_set( "bridge_layer_attacked_by_bridge_baddies" ); start_time = GetTime(); flag_wait( "bridge_baddies_retreat" ); foreach ( guy in guys ) { animation = guy getanim( "bridge_lower" ); guy SetFlaggedAnim( "single anim", animation, 1, 0, 1 ); } // get the arm going full speed again self SetFlaggedAnim( "single anim", arm_animation, 1, 0, 1 ); bridge_animation = bridge_model getanim( "bridge_lower" ); for ( ;; ) { if ( bridge_model GetAnimTime( bridge_animation ) >= 0.68 ) break; wait( 0.05 ); } wait_for_buffer_time_to_pass( start_time, 30 ); flag_set( "riverbank_baddies_retreat" );// controls the guys in the windows flag_set( "leaving_riverbank" );// controls the guys in the windows SetSavedDvar( "compass", 1 ); level notify( "tanks_stop_firing" ); for ( ;; ) { if ( bridge_model GetAnimTime( bridge_animation ) >= 0.98 ) break; wait( 0.05 ); } } else { org thread anim_single( guys, "bridge_lower" ); bridge_model Unlink(); // org thread anim_single_solo( bridge_model, "bridge_lower" ); wait( 0.05 ); animation = bridge_model getanim( "bridge_lower" ); bridge_model SetAnimTime( animation, 0.99 ); wait( 1 ); } player_bridge_clip = GetEnt( "player_bridge_clip", "targetname" ); player_bridge_clip Delete(); flag_set( "bridgelayer_complete" ); level.bridge_total_time = GetTime() - level.bridge_start_time; delayThread( 4, ::flag_set, "bridgelayer_crosses" ); animation = getanim( "bridge_lower" ); //self ClearAnim( animation, 0 ); self StopAnimScripted(); node = GetVehicleNode( "bridge_layer_path_1", "targetname" ); self StartPath( node ); // self.veh_pathtype = "constrained"; self thread vehicle_paths( node ); if ( !before_bridge_start() ) { // speed boost self Vehicle_SetSpeedImmediate( 30, 5, 5 ); wait( 1 ); self ResumeSpeed( 5 ); } self waittill( "reached_end_node" ); flag_wait( "player_gets_in" ); spawn_vehicles_from_targetname_and_drive( "lead_vehicle_spawner" ); // self vehicleDriveTo( node.origin, 30 ); // org anim_single_solo( self, "bridge_cross" ); } slow_down_bridge() { wait( 0.05 ); animation = self getanim( "bridge_lower" ); // self SetAnim( animation, 1, 0, 2.5 ); } enemy_bridge_spawner_damage( damage, attacker, direction_vec, point, type, modelName, tagName ) { if ( !isalive( attacker ) ) return; if ( attacker != level.player ) return; flag_set( "player_attacked_bridge_enemy" ); } enemy_bridge_spawner() { startpos = self.origin; self endon( "death" ); self setthreatbiasgroup( "bridge_attackers" ); add_damage_function( ::enemy_bridge_spawner_damage ); self.attackeraccuracy = 0.05; self.IgnoreRandomBulletDamage = true; flag_wait( "bridge_baddies_retreat" ); wait( RandomFloat( 1.5 ) ); node = GetNode( self.target, "targetname" ); self SetGoalNode( node ); self.goalradius = node.radius; self waittill( "goal" ); self SetGoalPos( startpos ); self.goalradius = 16; self waittill( "goal" ); self Delete(); } enemy_bridge_vehicle_spawner() { flag_wait( "bridge_truck_waits" ); wait_until_player_ads_on_truck(); flag_set( "bridge_truck_leaves" ); } wait_until_player_ads_on_truck() { /# flag_assert( "bridge_baddies_retreat" ); #/ level endon( "bridge_baddies_retreat" ); for ( ;; ) { dot = get_dot( level.player GetEye(), level.player GetPlayerAngles(), self.origin ); if ( dot > 0.998 && level.player PlayerAds() >= 1.0 ) break; wait( 0.05 ); } wait( 2.5 ); } bridge_layer_is_threatened_by_baddies( bridge_model ) { if ( !is_default_start() ) return; flag_wait( "bridge_layer_attacked_by_bridge_baddies" ); /* animation = bridge_model getanim( "bridge_lower" ); for ( ;; ) { animtime = bridge_model GetAnimTime( animation ); if ( animtime > 0.43 ) break; wait( 0.05 ); } */ array_spawn_function_targetname( "enemy_bridge_vehicle_spawner", ::enemy_bridge_vehicle_spawner ); spawn_vehicles_from_targetname_and_drive( "enemy_bridge_vehicle_spawner" ); wait( 1 ); array_spawn_function_targetname( "bridge_defender_spawner", ::bridge_defender_spawner ); delayThread( 2, ::array_spawn_targetname, "bridge_defender_spawner" ); array_spawn_targetname( "enemy_bridge_spawner" ); wait( 2 ); thread bridge_attack_warning_dialogue(); // add_wait( ::waittill_dead, guys, 3 ); // add_wait( ::bridge_almost_done, bridge_model ); // do_wait_any(); thread fail_if_player_doesnt_defend_bridge(); if ( level.gameskill >= 2 ) { // higher player threat bias to get their attention. SetThreatBias( "just_player", "bridge_attackers", 3000 ); } flag_wait( "player_attacked_bridge_enemy" ); SetThreatBias( "just_player", "bridge_attackers", 0 ); wait( 7 ); flag_set( "bridge_baddies_retreat" ); wait( 2.5 ); // They're retreating, keep hitting 'em! level.foley thread play_sound_on_entity( "roadkill_fly_keephitting" ); // foley_line( "roadkill_fly_keephitting" ); } bridge_attack_warning_dialogue() { wait( 3 ); // On the bridge, 10 o'clock high! Multiple targets, take em ouuutt!!! thread foley_line( "roadkill_fly_10oclockhigh" ); wait( 3.2 ); // Up on the bridge, far side!! dunn_line( "roadkill_cpd_farside" ); if ( flag( "player_attacked_bridge_enemy" ) ) return; level endon( "player_attacked_bridge_enemy" ); wait( 2.2 ); // Up there! They're making a push for the bridgelayer! Beat 'em back! thread foley_line( "roadkill_fly_makingapush" ); wait( 2.8 ); // They're going for the bridge-layer!! dunn_line( "roadkill_cpd_bridgelayer" ); wait( 1.8 ); // Up there on the bridge!!! foley_line( "roadkill_fly_onthebridge" ); } fail_if_player_doesnt_defend_bridge() { level endon( "player_attacked_bridge_enemy" ); if ( flag( "player_attacked_bridge_enemy" ) ) return; wait( 20 ); thread bridge_layer_explodes(); } bridge_layer_explodes() { // The bridge layer was destroyed. SetDvar( "ui_deadquote", &"ROADKILL_BRIDGELAYER_DESTROYED" ); delayThread( 3, ::missionFailedWrapper ); explosion_fx = getfx( "bmp_explosion" ); for ( ;; ) { vector = randomvector( 200 ); z = vector[ 2 ]; z *= 0.5; z = abs( z ); vector = set_z( vector, z ); PlayFX( explosion_fx, level.bridge_layer.origin + vector ); timer = RandomFloatRange( 0.4, 0.8 ); wait( timer ); } } bridge_defender_spawner() { self endon( "death" ); self.attackeraccuracy = 0; self.IgnoreRandomBulletDamage = 1; flag_wait( "player_climbs_stairs" ); self Delete(); } bridge_almost_done( bridge_model ) { animation = bridge_model getanim( "bridge_lower" ); for ( ;; ) { animtime = bridge_model GetAnimTime( animation ); if ( animtime > 0.75 ) break; wait( 0.05 ); } } fluorescentFlicker() { for ( ;; ) { self SetLightIntensity( .8 ); wait( RandomFloatRange( 0.1, 1.5 ) ); self SetLightIntensity( RandomFloatRange( 0.6, .9 ) * .8 ); wait( RandomFloatRange( .05, .1 ) ); } } lights() { lights = GetEntArray( "flickerlight1", "targetname" ); foreach ( light in lights ) light thread fluorescentFlicker(); } get_orgs_from_ents( ents, dontDelete ) { orgs = []; foreach ( ent in ents ) { struct = SpawnStruct(); struct.origin = ent.origin; struct.radius = ent.radius; orgs[ orgs.size ] = struct; if ( !isdefined( dontDelete ) ) ent Delete(); } return orgs; } riverbank_tank() { self endon( "death" ); level endon( "tanks_stop_firing" ); if ( !is_default_start() ) return; ents = get_linked_ents(); orgs = get_orgs_from_ents( ents ); ent = Spawn( "script_origin", ( 0, 0, 0 ) ); ent.origin = orgs[ 0 ].origin; self SetTurretTargetEnt( ent ); self.target_ent = ent; wait( RandomFloat( 4 ) ); firelink = self.script_firelink; firelink_funcs = []; firelink_funcs[ "fire_often" ] = ::tank_fires_often; firelink_funcs[ "fire_rarely" ] = ::tank_fires_rarely; firelink_funcs[ "fire_never" ] = ::tank_fires_never; firelink_funcs[ "stryker_fire" ] = ::tank_stryker_fire; func = firelink_funcs[ firelink ]; [[ func ]]( orgs ); } tank_fires_never( orgs ) { ent = self.target_ent; for ( ;; ) { orgs = array_randomize( orgs ); foreach ( org in orgs ) { ent.origin = org.origin; if ( IsDefined( org.radius ) ) { ent.origin += randomvector( org.radius ); } if ( self Vehicle_CanTurretTargetPoint( ent.origin ) ) { self waittill( "turret_on_target" ); wait( RandomFloatRange( 2, 3 ) ); } else { wait( RandomFloatRange( 3, 5 ) ); } } } } set_target_org_close( ent ) { // make the target position be close to where we are but on the same line my_org = self.origin + ( 0, 0, 60 ); angles = VectorToAngles( ent.origin - my_org ); forward = AnglesToForward( angles ); ent.origin = my_org + forward * 400; } tank_fires_rarely( orgs ) { ent = self.target_ent; wait( RandomFloat( 10 ) ); for ( ;; ) { orgs = array_randomize( orgs ); foreach ( org in orgs ) { ent.origin = org.origin; if ( IsDefined( org.radius ) ) { ent.origin += randomvector( org.radius ); } set_target_org_close( ent ); if ( self Vehicle_CanTurretTargetPoint( ent.origin ) ) { self waittill( "turret_on_target" ); wait( RandomFloatRange( 0.5, 2 ) ); // 0, 0, 1, or 2 shots shots = RandomInt( 4 ) - 1; for ( i = 0; i < shots; i++ ) { self FireWeapon(); //Line( self.origin, ent.origin, (1,0,0), 1, 0, 500 ); wait( RandomFloatRange( 5, 8 ) ); } wait( 15 ); } else { wait( RandomFloatRange( 3, 5 ) ); } } } } tank_stryker_fire( orgs ) { if ( !is_default_start() ) { RadiusDamage( level.riverside_bmp.origin, 128, 5000, 5000 ); return; } thread tank_fires_often( orgs ); //flag_wait( "player_enters_riverbank" ); wait( 18 ); // 20 second timeout level.riverside_bmp waittill_player_lookat( 0.98, 0.1, true, 20 ); self notify( "stop_tank_fire" ); stryker_blows_up_riverside_bmp(); // go back to firing at random targets tank_fires_often( orgs ); } stryker_blows_up_riverside_bmp() { // self SetTurretTargetEnt( self.target_ent ); self.target_ent.origin = level.riverside_bmp.origin + ( 0, 0, 32 ); self waittill( "turret_on_target" ); wait( 0.25 ); // 0, 0, 1, or 2 shots shots = RandomInt( 4 ) - 1; for ( ;; ) { if ( !isalive( level.riverside_bmp ) ) break; self FireWeapon(); wait( RandomFloatRange( 1, 1.5 ) ); } } tank_fires_often( orgs ) { self endon( "stop_tank_fire" ); ent = self.target_ent; for ( ;; ) { orgs = array_randomize( orgs ); foreach ( org in orgs ) { ent.origin = org.origin; if ( IsDefined( org.radius ) ) { ent.origin += randomvector( org.radius ); } set_target_org_close( ent ); if ( self Vehicle_CanTurretTargetPoint( ent.origin ) ) { self waittill( "turret_on_target" ); wait( RandomFloatRange( 0.5, 2 ) ); // 0, 0, 1, or 2 shots shots = RandomInt( 4 ) - 1; for ( i = 0; i < shots; i++ ) { self FireWeapon(); //Line( self.origin, ent.origin, (1,0,0), 1, 0, 500 ); wait( RandomFloatRange( 1, 3 ) ); } wait( 3 ); } else { wait( 0.5 ); //wait( RandomFloatRange( 3, 5 ) ); } } } } roadkill_officers_walk_up() { struct = getstruct( "intro_orders", "targetname" ); guys = get_guys_with_targetname_from_spawner( "intro_friendly_spawner" ); level.roadkill_officers = guys; foreach ( guy in guys ) { guy set_run_anim( "walk" ); guy.pathrandompercent = 0; guy.moveplaybackrate = 1; guy.goalradius = 8; guy.walkdist = 0; guy.disablearrivals = true; } if ( is_first_start() ) { wait( 8 ); // start walking with proper separation foreach ( guy in guys ) { target = getstruct( guy.target, "targetname" ); guy thread maps\_spawner::go_to_node( target, "struct" ); } wait( 5 ); struct anim_reach_together( guys, "roadkill_intro_orders" ); delayThread( 2.950, ::exploder, "intro_boom" ); delayThread( 0.5, ::spawn_vehicle_from_targetname_and_drive, "early_f15_flyby" ); } struct anim_single( guys, "roadkill_intro_orders" ); } detach_binocs() { if ( IsDefined( self.binoc ) ) self Detach( "weapon_binocular", "tag_inhand" ); self.binoc = undefined; } binoc_scene() { struct = getstruct( "binoc_scene", "targetname" ); struct thread do_binoc_scene(); struct = getstruct( "binoc_scene_spotter", "targetname" ); struct thread do_binoc_scene(); } do_binoc_scene() { binoc_scene_spawners = GetEntArray( self.target, "targetname" ); guys = array_spawn( binoc_scene_spawners ); guy = guys[ 0 ]; guy.animname = guy.script_noteworthy; if ( guy.animname == "spotter" ) { guy Attach( "weapon_binocular", "tag_inhand" ); guy.binoc = true; guy.convoy_func = ::detach_binocs; } guy.doing_looping_anim = true; guy add_to_allied_riverbank_ai(); self thread play_binoc_scene( guy ); } play_binoc_scene( guy ) { self anim_first_frame_solo( guy, "binoc_scene" ); flag_wait( "player_enters_riverbank" ); wait( 0.75 ); self anim_single_solo( guy, "binoc_scene" ); if ( !flag( "player_gets_in" ) ) { self thread anim_loop_solo( guy, "idle" ); } flag_wait( "player_gets_in" ); self notify( "stop_loop" ); } candy_bar_scene() { flag_wait( "time_to_go" ); spawners = GetEntArray( self.target, "targetname" ); guys = array_spawn( spawners ); guys[ 0 ].animname = "cover_radio3"; candyMan = guys[ 0 ]; candy = "mil_mre_chocolate01"; candyMan Attach( candy, "tag_inhand" ); foreach ( guy in guys ) { guy.allowdeath = true; } self thread anim_loop( guys, "idle" ); flag_wait( "player_gets_in" ); if ( IsAlive( candyMan ) ) candyMan Delete(); } cover_scene() { spawners = GetEntArray( self.target, "targetname" ); guys = array_spawn( spawners ); waittillframeend;// for auto spawn logic // remove the ai from the array, only shepherd is an AI newguys = []; foreach ( guy in guys ) { if ( IsSentient( guy ) ) continue; newguys[ newguys.size ] = guy; //guy NotSolid(); guy magic_bullet_shield(); guy thread shoot_from_notetrack(); } guys = newguys; guys[ 0 ].animname = "cover_attack2"; guys[ 1 ].animname = "cover_attack3"; if ( IsDefined( guys[ 2 ] ) ) guys[ 2 ].animname = "cover_attack1"; /* foreach ( guy in guys ) { //guy thread player_line(); guy.allowdeath = true; } */ self.g = 5; self thread anim_loop( guys, "idle" ); wait( 0.05 ); foreach ( guy in guys ) { //guy thread player_line(); guy.allowdeath = true; animation = guy getanim( "idle" )[ 0 ]; guy SetAnimTime( animation, 0.35 ); } flag_wait( "player_gets_in" ); wait( 3.2 ); foreach ( guy in guys ) { guy safe_delete(); } } shoot_from_notetrack() { self endon( "death" ); self.weaponsound = "drone_m4carbine_fire_npc"; for ( ;; ) { self waittill( "fire" ); thread maps\_drone::drone_shoot_fx(); } } player_line() { for ( ;; ) { Line( self.origin, level.player.origin ); wait( 0.05 ); } } radio_scene() { structs = []; structs[ "1" ] = getstruct( "radio_scene1", "targetname" ); structs[ "2" ] = getstruct( "radio_scene2", "targetname" ); structs[ "3" ] = getstruct( "radio_scene3", "targetname" ); guys = []; foreach ( index, struct in structs ) { spawner = GetEnt( struct.target, "targetname" ); guys[ index ] = spawner spawn_ai(); } guys[ "1" ].animname = "cover_radio1"; guys[ "2" ].animname = "cover_radio2"; guys[ "3" ].animname = "cover_radio3"; candyMan = guys[ "3" ]; candy = "mil_mre_chocolate01"; candyMan Attach( candy, "tag_inhand" ); candyMan.convoy_func = ::detach_candy; candyMan.candy = candy; candyMan.doing_looping_anim = true; candyMan add_to_allied_riverbank_ai(); non_candy = []; non_candy[ "1" ] = guys[ "1" ]; non_candy[ "2" ] = guys[ "2" ]; guys[ "2" ] gun_remove(); foreach ( index, struct in structs ) { struct thread anim_loop_solo( guys[ index ], "idle" ); } flag_wait( "leaving_riverbank" ); // stop shooting, guy level.scr_anim[ "cover_radio1" ][ "idle" ][ 0 ] = level.scr_anim[ "cover_radio1" ][ "idle_noshoot" ][ 0 ]; flag_wait( "player_gets_in" ); foreach ( index, struct in structs ) { struct notify( "stop_loop" ); } foreach ( guy in non_candy ) { if ( IsDefined( guy.magic_bullet_shield ) ) guy stop_magic_bullet_shield(); guy Delete(); } } detach_candy() { self Detach( self.candy, "tag_inhand" ); } set_dontshootwhilemoving( val ) { self.dontshootwhilemoving = val; } guys_film_explosion() { spawner = GetEnt( self.target, "targetname" ); guy = spawner spawn_ai(); guy endon( "death" ); // film1, film2, film3, film4 guy.animname = self.script_noteworthy; model = level.scr_model[ guy.animname ]; guy Attach( model, "tag_inhand" ); if ( IsDefined( guy.script_delay ) ) { self anim_first_frame_solo( guy, "video_film_start" ); guy script_delay(); } self anim_single_solo( guy, "video_film_start" ); /* if ( guy.animname == "film1" ) { //animation = guy getanim( "video_film_idle_custom" ); array = []; array[ 0 ] = guy; guy thread anim_custom_animmode_loop( array, "gravity", "video_film_idle" ); } else { self thread anim_loop_solo( guy, "video_film_idle" ); } */ self thread anim_loop_solo( guy, "video_film_idle" ); flag_wait( "video_tapers_react" ); self notify( "stop_loop" ); start_time = GetTime(); cheer_time = 6.4;// RandomFloatRange( 5.75, 6.75 ); if ( guy.animname == "film4" ) cheer_time = 8.5; // thumb guy can cheer longer if ( guy.animname == "film3" ) cheer_time = 6.2; // thumb guy can cheer longer if ( guy.animname == "film2" ) cheer_time = 6.9; // thumb guy can cheer longer if ( guy.animname == "film1" ) cheer_time = 6.4; // thumb guy can cheer longer guy.noTeleport = true; guy disable_pain(); guy.anim_blend_time_override = 0.5; //self anim_single_solo( guy, "video_film_react" ); if ( guy hasanim( "video_film_end" ) ) { self thread anim_custom_animmode_solo( guy, "gravity", "video_film_react" ); wait( 4 ); guy.anim_blend_time_override = 1; guy thread anim_custom_animmode_solo( guy, "gravity", "video_film_end" ); } else { self thread anim_custom_animmode_solo( guy, "gravity", "video_film_react" ); } wait_for_buffer_time_to_pass( start_time, cheer_time ); guy StopAnimScripted(); guy notify( "killanimscript" ); if ( IsDefined( guy.magic_bullet_shield ) ) guy stop_magic_bullet_shield(); guy.fixednode = false; node = GetNode( "bridge_delete_node", "targetname" ); guy SetGoalNode( node ); guy.goalradius = 8; guy waittill( "goal" ); guy Delete(); } enemy_riverbank_rpg_spawner() { self endon( "death" ); bridge_targets = GetEntArray( "bridge_target", "targetname" ); //thread rpgguy(); for ( ;; ) { target = random( bridge_targets ); target.health = 1; self SetEntityTarget( target ); timer = RandomFloatRange( 1, 3 ); wait( timer ); } } rpgguy() { self endon( "death" ); for ( ;; ) { Print3d( self.origin + ( 0, 0, 64 ), "RPG" ); wait( 0.05 ); } } riverside_house_manager( spawners ) { if ( flag( "riverbank_baddies_retreat" ) ) return; level endon( "riverbank_baddies_retreat" ); for ( ;; ) { spawners = array_randomize( spawners ); foreach ( spawner in spawners ) { for ( ;; ) { axis = GetAIArray( "axis" ); if ( axis.size < 6 ) { spawner.count = 1; spawner spawn_ai(); wait( 2 ); break; } wait( 2 ); } } } } riverside_flood_manager( spawners ) { if ( flag( "riverbank_baddies_retreat" ) ) return; level endon( "riverbank_baddies_retreat" ); for ( ;; ) { spawners = array_randomize( spawners ); foreach ( spawner in spawners ) { for ( ;; ) { ai = GetAIArray(); if ( ai.size < 31 ) { spawner.count = 1; spawner spawn_ai(); wait( 1 ); break; } wait( 1 ); } } } } riverside_flood_think( delay_min, delay_max ) { if ( flag( "riverbank_baddies_retreat" ) ) return; level endon( "riverbank_baddies_retreat" ); self endon( "death" ); wait( RandomFloat( 1 ) ); for ( ;; ) { self.count = 1; guy = self spawn_ai(); if ( !isalive( guy ) ) { wait( 1 ); continue; } guy waittill( "death" ); timer = RandomFloatRange( delay_min, delay_max ); wait( timer ); } } hide_helper_model() { self hide_notsolid(); } show_helper_model() { self show_solid(); } riverbank_guy_dies_on_retreat() { self endon( "death" ); flag_wait( "riverbank_baddies_retreat" ); timer = RandomFloat( 3 ); wait( timer ); self Kill(); } riverbank_spawner_retreat_think() { self endon( "death" ); self.startpos = self.origin; flag_wait( "riverbank_baddies_retreat" ); timer = RandomFloat( 6 ); wait( timer ); self SetGoalPos( self.startpos ); self.goalradius = 8; self waittill( "goal" ); self Delete(); } disable_all_vehicle_mgs() { vehicles = GetEntArray( "script_vehicle", "code_classname" ); foreach ( vehicle in vehicles ) { if ( IsSubStr( vehicle.classname, "technical" ) ) continue; vehicle mgoff(); } } guy_gets_in_player_humvee() { if ( !isdefined( self.magic_bullet_shield ) ) self magic_bullet_shield(); //self disable_arrivals(); flag_wait( "convoy_moment" ); // this origin is based on where the vehicle stops, not known until after it stops so we have to manually save it off // so the guy can run early wait( 3.9 ); //org = ( -2492, -3826, 178 ); //org = ( -2481, -3786, 178 );// ( -2509, -3742, 176 ); //org = (-2476.36, -3766.86, 178.319); //org = (-2473.52, -3787.51, 178.106); //org = ( -2488, -3755, 182 ); //org = ( -2483, -3749, 176 ); org = ( -2474, -3765, 178 ); self SetGoalPos( org ); self.goalradius = 8; self waittill( "goal" ); //flag_wait( "player_humvee_stops" ); thread guy_runtovehicle_load( self, level.player_humvee ); if ( IsDefined( self.magic_bullet_shield ) ) self stop_magic_bullet_shield(); wait( 0.4 ); PrintLn( "goalpos " + self.goalpos ); } jeep_rider_spawner_think() { self.qSetGoalPos = false; guy_runtovehicle_load( self, level.friendly_open_humvee ); } humvee_rider_spawner() { spawner = GetEnt( "humvee_rider_spawner", "script_noteworthy" ); spawner waittill( "drone_spawned", guy ); spawner Delete(); AssertEx( IsAlive( guy ), "No waver!" ); guy thread humvee_rider_waver(); } humvee_rider_waver() { self endon( "death" ); self gun_remove(); wait( 0.05 ); self Attach( "weapon_m16", "tag_weapon_chest" ); self.ridingVehicle anim_generic_first_frame( self, "help_player_getin", "tag_guy0" ); flag_wait( "convoy_moment" ); wait( 1.3 ); self.ridingVehicle anim_generic( self, "help_player_getin", "tag_guy0" ); self notify( "animontagdone", "end" ); flag_wait( "player_gets_in" ); wait( 3 ); if ( IsDefined( self.magic_bullet_shield ) ) self stop_magic_bullet_shield(); self Delete(); } player_ride_vehicle() { level.player_humvee = self; self.dontdisconnectpaths = true; chairModel = "vehicle_hummer_seat_rb_obj"; self HidePart( "tag_seat_rb_hide" ); chair = Spawn( "script_model", ( 0, 0, 0 ) ); level.chair = chair; chair SetModel( chairModel ); chair LinkTo( self, "tag_seat_rb_attach", ( 0, 0, 0 ), ( 0, 0, 0 ) ); chair MakeUsable(); // Press and hold^3 &&1 ^7to board. //chair SetHintString( &"ROADKILL_HOLD_TO_BOARD" ); flag_wait( "convoy_moment" ); self thread gopath(); // self MakeUsable(); //time = GetTime(); //self waittill( "speed_zero_path_disconnect" ); //println( GetTime() - time ); wait( 1.3 ); self.animname = "player_humvee"; door_open_animation = self getanim( "roadkill_player_door_open" ); self SetFlaggedAnim( "other_anim_flag", door_open_animation, 1, 0, 1 ); level thread maps\_anim::start_notetrack_wait( self, "other_anim_flag" ); /* Glowing seat model: Use model => ( vehicle_hummer_seat_rb_obj ) as glowing seat. I didn't set any glowing attributes for it yet, you'll have to set that up. To hide regular seat: Use ( tag_seat_rb_hide ). To attach glowing seat to regular: Attach ( tag_seat_rb , from vehicle_hummer_seat_rb_obj) to ( tag_seat_rb_attach ) */ //self Attach( chairModel, "tag_seat_rb_attach" ); player_rig = spawn_anim_model( "player_rig" ); player_rig LinkTo( self, "tag_body", ( 0, 0, 0 ), ( 0, 0, 0 ) ); player_rig Hide(); self anim_first_frame_solo( player_rig, "player_getin", "tag_body" ); flag_set( "player_humvee_stops" ); level.player_humvee waittill( "vehicle_flag_arrived" ); chair thread chair_waits_for_close(); chair waittill( "trigger" ); level.player DisableWeapons(); thread player_fov_zooms_in_for_turret(); /* for ( ;; ) { self waittill( "touch", other ); if ( !isalive( other ) ) continue; if ( other == level.player ) break; } */ self ShowPart( "tag_seat_rb_hide" ); chair Delete(); //self Detach( chairModel, "tag_seat_rb_attach" ); flag_set( "player_gets_in" ); turret = self.mgturret[ 0 ]; turret.animname = "turret"; turret assign_animtree(); guys = []; guys[ "player" ] = player_rig; guys[ "turret" ] = turret; level.player SetStance( "stand" ); level.player AllowCrouch( false ); level.player AllowProne( false ); level.player PlayerLinkToBlend( player_rig, "tag_player", 0.4, 0.2, 0.2 ); player_rig delayCall( 0.2, ::Show ); turret delayThread( 1, ::lerp_out_drop_pitch, 1.5 ); player_rig delaythread( 0.0, ::play_sound_on_entity, "scn_roadkill_enter_humvee_plr" ); self anim_single( guys, "player_getin", "tag_body" ); player_rig Delete(); self ClearAnim( door_open_animation, 1, 0, 1 ); // level.player PlayerLinkTo( self, "tag_player", 0 ); level.player EnableWeapons(); player_gets_on_turret(); // reset the fov wait( 0.1 ); SetSavedDvar( "cg_fov", 65 ); /* turret = self.mgturret[ 0 ]; turret MakeUsable(); turret SetMode( "manual" ); turret UseBy( level.player ); turret MakeUnusable(); // thread player_viewhands_minigun( level.suburbans[ 2 ].mgturret[ 0 ] ); level.player DisableTurretDismount(); */ } chair_waits_for_close() { if ( flag( "player_gets_in" ) ) return; level endon( "player_gets_in" ); self endon( "death" ); for ( ;; ) { if ( Distance( self.origin, level.player.origin ) < 80 ) self notify( "trigger" ); wait( 0.05 ); } } player_fov_zooms_in_for_turret() { wait( 1 ); lerp_fov_overtime( 2, 55 ); } ride_vehicle() { self.dontdisconnectpaths = true; flag_wait( "player_gets_in" ); self thread gopath(); } ride_vehicle_starts_moving() { thread ride_parameters_check(); thread common_ride_vehicle_init(); flag_wait( "convoy_moment" ); self thread gopath(); } common_ride_vehicle_init() { self.dontdisconnectpaths = true; } ride_parameters_check() { if ( !isdefined( self.script_parameters ) ) return; switch( self.script_parameters ) { case "picks_up_riders": level.npc_ride_vehicles[ level.npc_ride_vehicles.size ] = self; break; } } get_vehicle_from_spawner() { if ( !isdefined( self.target ) ) return; // get the vehicle spawner so we'll know the vehicle after it spawns node = GetNode( self.target, "targetname" ); spawner = GetEnt( node.script_linkto, "script_linkname" ); spawner waittill( "spawned", vehicle ); node.vehicle = vehicle; } best_friendly_to_run( array ) { // player sees the scope glint if the dot is within a certain range player_angles = level.player GetPlayerAngles(); player_forward = AnglesToForward( player_angles ); end = level.player GetEye(); foreach ( guy in array ) { start = guy GetEye(); angles = VectorToAngles( start - end ); forward = AnglesToForward( angles ); dot = VectorDot( forward, player_forward ); if ( dot < 0.75 ) continue; animating_guy = IsDefined( guy._animActive ) && guy._animActive; if ( animating_guy && dot >= 0.85 ) continue; return guy; } return undefined; } allies_leave_riverbank() { if ( flag( "player_gets_in" ) ) return; level endon( "player_gets_in" ); array = []; foreach ( guy in level.allied_riverbank_ai ) { array[ guy.unique_id ] = guy; } for ( ;; ) { foreach ( guy in array ) { if ( !isalive( guy ) ) array[ guy.unique_id ] = undefined; } //guy = get_closest_to_player_view( array, level.player, true, 0.85 ); guy = best_friendly_to_run( array ); if ( IsAlive( guy ) ) { array[ guy.unique_id ] = undefined; guy thread run_to_convoy(); if ( level.runnings_to_convoy_count >= level.guy_gets_in_vehicle_targets.size ) return; wait( 4 ); } if ( !array.size ) break; wait( 0.15 ); } // staircase_org = getstruct( "staircase_org", "targetname" ); // array = get_array_of_closest( staircase_org.origin, level.allied_riverbank_ai ); /* wait( 3 );// let the car guys go first count = 0; got_in = 0; for ( i = array.size - 1; ; i-- ) { if ( got_in >= level.guy_gets_in_vehicle_targets.size ) break; if ( i < 0 ) break; guy = array[ i ]; AssertEx( IsAlive( guy ), "Dead, but how?" ); guy ent_flag_set( "go_to_convoy" ); wait( 0.75 ); count++; got_in++; while ( count >= 3 ) { count -= 3; wait( 0.5 ); } } */ } get_in_moving_vehicle() { self.get_in_moving_vehicle = true; } add_to_allied_riverbank_ai() { level.allied_riverbank_ai[ level.allied_riverbank_ai.size ] = self; add_riverbank_flags(); } add_riverbank_flags() { ent_flag_init( "go_to_convoy" ); ent_flag_init( "got_in_vehicle" ); } allied_riverbank_spawner() { self endon( "death" ); add_to_allied_riverbank_ai(); flag_wait( "time_to_go" ); self.ignoreall = true; //ent_flag_wait( "go_to_convoy" ); //self.ignoreall = false; /* while ( index >= 3 ) { index -= 3; wait( 2.0 ); } wait( index * 0.15 ); */ /* flag_wait( "time_to_go" ); if ( self.script_index >= 7 ) run_to_convoy(); */ } run_to_convoy() { level.runnings_to_convoy_count++; /* AssertEx( IsDefined( self.script_index ), "Guy with export " + self.export + " had no script_index" ); wait_table = []; wait_table[ 0 ] = 0.05; // 2 guys to the front right wait_table[ 1 ] = 0.25; // 2 guys to the front right wait_table[ 2 ] = 2.8; // 3 guys doing radio scene wait_table[ 3 ] = 0.5; // 3 guys doing radio scene wait_table[ 4 ] = 0.4; // 3 guys doing radio scene wait_table[ 5 ] = 1.8; // guy forward left wait_table[ 6 ] = 1.9; // 2 doing binoc scene wait_table[ 7 ] = 0.4; // 2 doing binoc scene wait_table[ 8 ] = 1.5; // guy in the hut wait_table[ 9 ] = 0.5; // guy on the truck timer = 0; for ( i = 0; i <= self.script_index; i++ ) { timer += wait_table[ i ]; } wait( timer ); */ self anim_stopanimscripted(); if ( IsDefined( self.doing_looping_anim ) ) { self.remove_from_animloop = true; } if ( IsDefined( self.convoy_func ) ) { // a one time cleanup func a few guys runself.convoy_func = GetEnt( "self.convoy_func", "targetname" ); self thread [[ self.convoy_func ]](); self.convoy_func = undefined; } //self.dontavoidplayer = true; //self PushPlayer( true ); self.moveplaybackrate = 1; self.pathrandompercent = 0; riverbank_run_node = GetNode( "riverbank_run_node", "targetname" ); self.fixednode = false; // trigger with targetname guy_gets_in_vehicle will grab us self SetGoalNode( riverbank_run_node ); self.goalradius = 16; } trigger_guy_gets_in_vehicle() { level.ally_convoy_trigger = self; // target a bunch of structs that target nodes that ai will run to level.guy_gets_in_vehicle_targets = GetNodeArray( self.target, "targetname" ); foreach ( node in level.guy_gets_in_vehicle_targets ) { node thread get_vehicle_from_spawner(); } /# used = []; foreach ( node in level.guy_gets_in_vehicle_targets ) { AssertEx( IsDefined( node.script_index ), "Node at " + node.origin + " has no script_index" ); AssertEx( !isdefined( used[ node.script_index ] ), "Reused script_index " + node.script_index + " at " + node.origin ); used[ node.script_index ] = true; } #/ level.guy_gets_in_vehicle_targets = array_index_by_script_index( level.guy_gets_in_vehicle_targets ); self.index = 0; trigger_handles_guys_running_up_stairs_to_get_in_vehicles(); level.allied_riverbank_ai = remove_dead_from_array( level.allied_riverbank_ai ); // catch up for the guys that didn't get in fast enough foreach ( guy in level.allied_riverbank_ai ) { guy thread goalspam(); if ( IsDefined( guy.gets_in_vehicle ) ) continue; // delete extra guys if ( self.index >= level.guy_gets_in_vehicle_targets.size ) { if ( IsDefined( guy.magic_bullet_shield ) ) guy stop_magic_bullet_shield(); guy Delete(); continue; } struct = level.guy_gets_in_vehicle_targets[ self.index ]; self.index++; guy thread guy_gets_in_convoy( struct ); } } goalspam() { self endon( "death" ); for ( i = 0; i < 5; i++ ) { self notify( "goal" ); wait( 0.05 ); } } trigger_handles_guys_running_up_stairs_to_get_in_vehicles() { if ( flag( "player_gets_in" ) ) return; level endon( "player_gets_in" ); touched = []; for ( ;; ) { self waittill( "trigger", other ); if ( !isalive( other ) ) continue; if ( IsDefined( touched[ other.unique_id ] ) ) continue; touched[ other.unique_id ] = true; struct = level.guy_gets_in_vehicle_targets[ self.index ]; self.index++; AssertEx( self.index <= level.guy_gets_in_vehicle_targets.size, "Too many guys!" ); other thread guy_gets_in_convoy( struct ); /* foreach ( vehicle in level.npc_ride_vehicles ) { if ( vehicle.riders.size >= 3 ) continue; thread guy_runtovehicle_load( other, vehicle ); break; } */ } } guy_gets_in_convoy( mynode ) { /* mynode = undefined; foreach ( struct in level.guy_gets_in_vehicle_targets ) { if ( IsDefined( struct.taken ) ) continue; mynode = struct; mynode.taken = true; level.ride_nodes_taken++; break; } if ( !isdefined( mynode ) ) return; */ self.fixednode = true; self.gets_in_vehicle = true; self.attackeraccuracy = 0; if ( !isdefined( self.magic_bullet_shield ) ) self magic_bullet_shield(); self SetGoalNode( mynode ); self.goalradius = 16; if ( !flag( "convoy_moment" ) ) { level add_wait( ::waittill_msg, "player_got_in" ); self add_wait( ::waittill_msg, "goal" ); level add_endon( "convoy_moment" ); do_wait_any(); flag_wait( "convoy_moment" ); } if ( !flag( "guys_get_in_convoy_vehicles" ) ) { flag_wait( "guys_get_in_convoy_vehicles" ); wait_for_index( mynode.script_index ); } if ( !isdefined( mynode.target ) ) { flag_wait( "player_gets_in" ); self safe_delete(); return; } node = GetNode( mynode.target, "targetname" ); self SetGoalNode( node ); self.disablearrivals = true; level add_wait( ::waittill_msg, "player_got_in" ); self add_wait( ::waittill_msg, "goal" ); do_wait_any(); self.script_startingposition = node.script_startingposition; thread guy_runtovehicle_load( self, node.vehicle ); self waittill( "boarding_vehicle" ); self ent_flag_set( "got_in_vehicle" ); if ( self.script_startingposition == 4 ) self thread convoy_gunner_think(); // thread guy_runtovehicle_load( other, vehicle ); } wait_for_index( index ) { if ( flag( "player_gets_in" ) ) return; level endon( "player_gets_in" ); wait( index * 0.35 ); } /* airstrike_spawner() { if ( !isdefined( self.magic_bullet_shield ) ) self magic_bullet_shield(); self.dontavoidplayer = true; self.interval = 0; self.disableexits = true; flag_wait( "convoy_moment" ); ent = getstruct( self.target, "targetname" ); self maps\_spawner::go_to_node( ent, "struct" ); if ( !isdefined( self.script_noteworthy ) ) return; switch( self.script_noteworthy ) { case "croucher": self waittill( "goal" ); self AllowedStances( "crouch" ); break; case "get_in_car_guy": flag_wait( "time_to_pull_out" ); wait( 1 ); guy_runtovehicle_load( self, level.friendly_open_humvee ); break; } } */ friendly_open_humvee() { level.friendly_open_humvee = self; self waittill( "reached_end_node" ); house_node = GetNode( "house_node", "targetname" ); foreach ( guy in self.riders ) { if ( !isalive( guy ) ) continue; if ( !isai( guy ) ) continue; guy SetGoalPos( house_node.origin ); } } vehicle_break() { touched = []; brake_time = self.script_timer; if ( !isdefined( brake_time ) ) brake_time = 0.3; brake_amount = self.script_brake; if ( !isdefined( brake_amount ) ) brake_amount = 0.3; for ( ;; ) { self waittill( "trigger", other ); if ( IsDefined( touched[ other.unique_id ] ) ) continue; touched[ other.unique_id ] = true; other thread break_awhile ( brake_time, brake_amount ); } } break_awhile ( brake_time, brake_amount ) { self.veh_brake = brake_amount; wait( brake_time ); self.veh_brake = 0; } spark_preset() { target = getstruct( self.target, "targetname" ); angles = VectorToAngles( target.origin - self.origin ); level.spark_presets[ self.script_parameters ] = angles; } vehicle_spark_trigger() { targ = GetEnt( self.target, "targetname" ); targ_targ = GetEnt( targ.target, "targetname" ); /* // move it forward to compensate for high speed angles = VectorToAngles( targ_targ.origin - targ.origin ); forward = AnglesToForward( angles ); vec = forward * -250; self.origin += vec; targ.origin += vec; targ_targ.origin += vec; */ org1 = targ.origin; org2 = targ_targ.origin; targ Delete(); targ_targ Delete(); touched = []; technical_only = false; if ( IsDefined( self.script_noteworthy ) ) { switch( self.script_noteworthy ) { case "technical_only": technical_only = true; break; } } preset = undefined; if ( IsDefined( self.script_parameters ) ) { preset = level.spark_presets[ self.script_parameters ]; } for ( ;; ) { self waittill( "trigger", other ); if ( IsDefined( touched[ other.unique_id ] ) ) continue; if ( technical_only ) { if ( IsDefined( level.traffic_jam_truck ) ) { if ( other != level.traffic_jam_truck ) continue; } else continue; } touched[ other.unique_id ] = true; other thread vehicle_sparks( org1, org2, preset ); } } vehicle_sparks( org1, org2, preset ) { fx = getfx( "vehicle_scrape_sparks" ); no_spark_frame = RandomInt( 4 ); technical = IsDefined( level.traffic_jam_truck ) && self == level.traffic_jam_truck; angles = preset; for ( ;; ) { my_org = self.origin; if ( IsDefined( self.spark_offset ) ) { my_org += self.spark_offset; } spark_org = PointOnSegmentNearestToPoint( org1, org2, my_org ); if ( spark_org == org2 ) return; no_spark_frame--; if ( no_spark_frame && spark_org != org1 ) { angle_range = RandomFloatRange( -85, -55 ); if ( !isdefined( preset ) ) { angles = VectorToAngles( spark_org - self.origin ); angles = ( angle_range, angles[ 1 ], 0 ); } //Line( spark_org, self.origin, (1,0,0), 1, 1, 500 ); up = AnglesToUp( angles ); forward = AnglesToForward( angles ); fast_enough = technical || self.veh_speed > 2; if ( fast_enough ) { //Line( spark_org, spark_org + forward * 100, (1,0,0), 1, 1, 500 ); PlayFX( fx, spark_org, forward, up ); } } if ( !no_spark_frame ) no_spark_frame = get_next_no_spark_frame(); wait( 0.05 ); } } get_next_no_spark_frame() { if ( getdvarint( "r_roadkill_less_sparks" ) ) { return RandomInt( 2 ) + 1; } return RandomInt( 3 ) + 4; } humvee_gunner_idle_until_player_gets_in( owner, turret ) { level endon( "player_gets_in" ); anims = []; anims[ "humvee_turret_bounce" ] = true; // anims[ "humvee_turret_idle_lookback" ] = %humvee_turret_idle_lookback; anims[ "humvee_turret_idle_lookbackB" ] = true; anims[ "humvee_turret_idle_signal_forward" ] = true; anims[ "humvee_turret_idle_signal_side" ] = true; anims[ "humvee_turret_radio" ] = true; anims[ "humvee_turret_flinchA" ] = true; anims[ "humvee_turret_flinchB" ] = true; //anims[ "humvee_turret_rechamber" ] = %humvee_turret_rechamber; foreach ( anime, _ in anims ) { wait( 2 ); level.anime = anime; owner turret_gunner_custom_anim( turret, anime ); if ( flag( "shot_rings_out" ) ) return; } } detour_vehicle_driver_animates() { owner = undefined; turret = undefined; turret = self.mgturret[ 0 ]; for ( ;; ) { owner = turret GetTurretOwner(); if ( IsAlive( owner ) ) break; wait( 0.05 ); } owner endon( "death" ); level.detour_gunner = owner; if ( !isdefined( owner.magic_bullet_shield ) ) { owner magic_bullet_shield(); } if ( !flag( "player_gets_in" ) ) { humvee_gunner_idle_until_player_gets_in( owner, turret ); wait( 1.5 ); } if ( !flag( "100ton_bomb_goes_off" ) ) { owner thread turret_gunner_custom_anim( turret, "humvee_turret_rechamber" ); flag_wait( "100ton_bomb_goes_off" ); wait( 3.5 ); owner notify( "special_anim", "end" ); owner turret_gunner_custom_anim( turret, "humvee_turret_flinchA" ); } thread turret_gunner_cycles_custom_anims( owner, turret ); flag_wait( "shot_rings_out" ); struct = getstruct( "frantic_look_target_struct", "targetname" ); ent = Spawn( "script_origin", struct.origin ); turret SetTargetEntity( ent ); /# if ( GetDebugDvarInt( "showline" ) ) turret thread entline( ent ); #/ count = 0; /* times = []; times[ 0 ] = 0.5; times[ 1 ] = 3.25; times[ 2 ] = 2.55; times[ 3 ] = 2.75; times[ 4 ] = 3.15; times[ 5 ] = 2.55; times[ 6 ] = 1.75; times[ 7 ] = 1.75; */ for ( ;; ) { owner notify( "special_anim", "end" ); //self notify( "do_custom_anim" ); struct = getstruct( struct.target, "targetname" ); dist = Distance( ent.origin, struct.origin ); time = dist / 5000; movetime = GetTime(); ent MoveTo( struct.origin, time, time * 0.2, time * 0.2 ); // Line( turret.origin, struct.origin, (0,1,0), 1, 1, 1000 ); // wait( times[ count ] ); // count++; if ( !isdefined( struct.target ) ) break; level waittill_notify_or_timeout( "shot_rings_out", 1.5 ); wait_for_buffer_time_to_pass( movetime, 2 ); wait( 0.1 ); } ent Delete(); } entline( ent ) { ent endon( "death" ); for ( ;; ) { Line( ent.origin, self.origin ); wait( 0.05 ); } } turret_gunner_cycles_custom_anims( owner, turret ) { // level endon( "shot_rings_out" ); anims = []; anims[ "humvee_turret_bounce" ] = true; // anims[ "humvee_turret_idle_lookback" ] = %humvee_turret_idle_lookback; anims[ "humvee_turret_idle_lookbackB" ] = true; anims[ "humvee_turret_idle_signal_forward" ] = true; anims[ "humvee_turret_idle_signal_side" ] = true; anims[ "humvee_turret_radio" ] = true; anims[ "humvee_turret_flinchA" ] = true; anims[ "humvee_turret_flinchB" ] = true; //anims[ "humvee_turret_rechamber" ] = %humvee_turret_rechamber; foreach ( anime, _ in anims ) { wait( 2 ); level.anime = anime; owner turret_gunner_custom_anim( turret, anime ); if ( flag( "shot_rings_out" ) ) return; } } // gets the turret doing a looping anim in anticipation of an AI getting on it later turret_preload_animate() { turret = self.mgturret[ 0 ]; turret SetDefaultDropPitch( 0 ); turret animscripts\hummer_turret\minigun_stand::setup_turret_anims(); turret animscripts\hummer_turret\common::turret_animfirstframe( turret.passenger2turret_anime ); } player_personal_convoy() { switch( self.script_index ) { case 0: level.crazy_ride_convoy[ "lead" ] = self; break; case 1: level.crazy_ride_convoy[ "player" ] = self; break; case 2: level.crazy_ride_convoy[ "rear" ] = self; self thread turret_preload_animate(); break; case 3: level.crazy_ride_convoy[ "detour" ] = self; self thread turret_preload_animate(); thread detour_vehicle_driver_animates(); thread gunner_becomes_invul(); break; default: AssertMsg( "err err!" ); break; } self ent_flag_init( "can_shoot_the_baddies" ); self ent_flag_init( "start_aiming_at_badguys" ); level.crazy_ride_convoy[ self.script_index ] = self; waittillframeend;// wait for the array to fill in flag_wait( "player_gets_in" ); /* node = GetVehicleNode( self.target, "targetname" ); self Vehicle_SetSpeedImmediate( node.speed, 2, 2 ); wait( 0.05 ); self ResumeSpeed( 5 ); */ // flag_wait( "player_rolls_into_town" ); flag_wait( "start_runner" ); if ( level.crazy_ride_convoy[ "player" ] == self ) { self Vehicle_SetSpeed( 8.79, 1, 1 ); } if ( level.crazy_ride_convoy[ "rear" ] == self ) { self Vehicle_SetSpeed( 8.79, 1, 1 ); } /* if ( level.crazy_ride_convoy[ "lead" ] == self ) { self Vehicle_SetSpeed( 8, 1, 1 ); } if ( level.crazy_ride_convoy[ "detour" ] == self ) { self Vehicle_SetSpeed( 8, 1, 1 ); } */ flag_wait( "player_closes_gap" ); self ResumeSpeed( 5 ); flag_wait( "ambush_auto_adjust_speed" ); self ResumeSpeed( 5 ); if ( self != level.crazy_ride_convoy[ "rear" ] ) return; in_front_index = self.script_index - 1; near_car = level.crazy_ride_convoy[ in_front_index ]; vehicles_maintain_distance_until_traffic( near_car ); /* for ( ;; ) { if ( Distance( near_car.origin, self.origin ) < 280 ) { self.veh_brake = 0.5; break; } wait( 0.05 ); } */ } vehicles_maintain_distance_until_traffic( near_car ) { following = false; // level endon( "traffic_jam" ); for ( ;; ) { /* if ( flag( "lead_vehicle_speeds_up" ) && self == level.crazy_ride_convoy[ "player" ] ) { self Vehicle_SetSpeed( 11, 5, 5 ); wait( 3 ); self ResumeSpeed( 5 ); flag_clear( "lead_vehicle_speeds_up" ); } */ if ( Distance( near_car.origin, self.origin ) < 300 ) { self Vehicle_SetSpeed( near_car.veh_speed, 5, 5 ); following = true; } else if ( following ) { following = false; self ResumeSpeed( 5 ); } wait( 0.05 ); } } /* lead_vehicle_func() { level.lead_vehicle = self; } vehicle_ride_think() { if ( self == level.lead_vehicle ) return; for ( ;; ) { lead_speed = level.lead_vehicle.veh_speed; // if ( self.veh_speed > lead_speed ) if ( Distance( self.origin, level.lead_vehicle.origin ) < 200 ) self Vehicle_SetSpeed( lead_speed, 5, 5 ); wait( 0.05 ); } } */ convoy_gunner_think() { level.convoy_gunners[ self.unique_id ] = self; thread aim_ahead_until_you_get_enemy(); self waittill( "death" ); wait( 1.5 ); if ( !isdefined( self ) ) return; self StartRagdoll(); self Unlink(); } convoy_gunners_pick_targets() { array_thread( level.convoy_gunners, ::convoy_gunner_shoot_protection ); } convoy_gunner_shoot_protection() { if ( !isalive( self ) ) return; self endon( "death" ); for ( ;; ) { self cant_die_unless_player_sees_me(); self avoid_shooting_through_player(); wait( 0.05 ); } } cant_die_unless_player_sees_me() { in_danger = within_fov_2d( level.player GetEye(), level.player GetPlayerAngles(), self.origin, 0.85 ); if ( in_danger ) { self.IgnoreRandomBulletDamage = false; self.attackeraccuracy = 1; if ( self.health > 100 ) self.health = 100; } else { self.IgnoreRandomBulletDamage = true; self.attackeraccuracy = 0; self.health = 5000; } } avoid_shooting_through_player() { // adjust the threatbias on the convoy gunners target so he doesn't shoot through the player excessively enemy = self.enemy; if ( !isalive( enemy ) ) return; if ( enemy.ignoreme ) return; angles = VectorToAngles( level.player.origin - self.origin ); if ( enemy within_fov_2d( level.player.origin, angles, enemy.origin, 0.85 ) ) { enemy.ignoreme = true; enemy delayThread( 1, ::set_ignoreme, 0 ); } } ent_line( ent1, ent2 ) { ent1 endon( "death" ); ent2 endon( "death" ); timer = 5; frames = timer * 20; for ( i = 0; i < frames; i++ ) { Line( ent1.origin, ent2.origin ); wait( 0.05 ); } } enemy_ai_accuracy_effected_by_player_humvee() { level endon( "player_knocked_down" ); for ( ;; ) { ai = GetAIArray( "axis" ); foreach ( guy in ai ) { if ( !isalive( guy ) ) continue; if ( guy.weapon == "rpg" ) continue; if ( within_fov_2d( level.player.origin, level.player_humvee.angles, guy.origin, 0.8 ) ) { guy.baseaccuracy = 0.2; } else { guy.baseaccuracy = 0; } wait( 0.02 ); } wait( 0.05 ); } } traffic_jam_truck() { level.traffic_jam_truck = self; self.vehicle_keeps_going_after_driver_dies = true; self.dontunloadonend = true; self.spark_offset = ( -64, 0, 0 ); self godon(); self.vehicle_stays_alive = true; } setup_ride_path_targets( noteworthy ) { spawners = GetEntArray( "ride_vehicle_spawner", "targetname" ); foreach ( spawner in spawners ) { nodes = spawner getLinkedVehicleNodes(); found_node = false; foreach ( node in nodes ) { if ( node.script_noteworthy != noteworthy ) continue; found_node = true; // remap target to this node so we still spawn our riders if ( IsDefined( spawner.target ) ) remap_targets( spawner.target, node.targetname ); spawner.target = node.targetname; break; } //AssertEx( found_node, "Didn't find a node with noteworthy " + noteworthy ); } } remap_targets( ent_targetname, new_targetname ) { // remap them so the guys riding in the vehicle come along too ents = GetEntArray( ent_targetname, "targetname" ); foreach ( ent in ents ) { ent.targetname = new_targetname; } } spawn_more_street_baddies() { spawners = level.more_street_spawners; wait( 7.5 ); foreach ( spawner in spawners ) { spawner.count = 1; spawner spawn_ai(); } } ride_killer() { level.ride_killer = self; self disable_pain(); self.ignoreme = true; self magic_bullet_shield(); /* player_vehicle = level.crazy_ride_convoy[ 1 ]; //eye = spawn_tag_origin(); //eye.origin = level.player GetEye(); //eye LinkTo( level.player ); //self SetEntityTarget( level.player ); ai = GetAIArray( "allies" ); foreach ( guy in ai ) guy.ignoreme = true; */ missile_target = GetEnt( "missile_target", "targetname" ); self SetEntityTarget( missile_target ); flag_wait( "player_knocked_down" ); self stop_magic_bullet_shield(); ai = GetAIArray( "axis" ); foreach ( guy in ai ) { if ( IsDefined( guy.magic_bullet_shield ) ) guy stop_magic_bullet_shield(); if ( !isdefined( guy.dont_ride_kill ) ) guy Kill(); } } friendly_crash_think() { // self.flashEndTime = GetTime() + 2500; //timer = RandomFloatRange( 2, 3 ); //self flashBangStart( timer ); level.crash_friendly[ level.crash_friendly.size ] = self; self magic_bullet_shield(); self SetThreatBiasGroup( "ally_with_player" ); self disable_pain(); self.ignoreSuppression = true; self endon( "death" ); self.animname = self.animation; self thread anim_custom_animmode_solo( self, "gravity", "flashed" ); wait( 0.05 ); animtimes = []; animtimes[ "exposed_flashbang_v2" ] = 0.245; animtimes[ "exposed_flashbang_v3" ] = 0.36; animtimes[ "exposed_flashbang_v5" ] = 0.13; animlimits = []; animlimits[ "exposed_flashbang_v2" ] = 0.72; animlimits[ "exposed_flashbang_v3" ] = 0.79; animlimits[ "exposed_flashbang_v4" ] = 0.65; animlimits[ "exposed_flashbang_v5" ] = 0.65; animation = self getanim( "flashed" ); animtime = animtimes[ self.animation ]; if ( IsDefined( animtime ) ) { self SetAnimTime( animation, animtime ); } limit = animlimits[ self.animation ]; if ( IsDefined( limit ) ) { for ( ;; ) { if ( self GetAnimTime( animation ) >= limit ) break; wait( 0.05 ); } self notify( "killanimscript" ); } wait( 10 ); flag_wait( "player_enters_ambush_house" ); self enable_pain(); // green guys can get killed and are replaced by cyan guys if ( self.script_forcecolor == "g" ) { if ( !self is_hero() ) { self stop_magic_bullet_shield(); self thread replace_on_death(); } } flag_wait( "eyes_on_school" ); self.ignoreSuppression = false; } move_flashed_spawner_and_spawn() { if ( IsDefined( self.script_linkTo ) ) { struct = getstruct( self.script_linkto, "script_linkname" ); self.origin = struct.origin; self.angles = struct.angles; } wait( 0.25 ); self spawn_ai(); } /* 0.36 exposed_flashbang_v3 0.245 exposed_flashbang_v2 0.2 exposed_flashbang_v5 */ blocker_driver() { level.blocker_driver = self; } roadkill_ride_kill_drones() { flag_wait( "kill_drones" ); angry_drones = GetEntArray( "angry_drone", "script_noteworthy" ); foreach ( drone in angry_drones ) { if ( IsAlive( drone ) ) drone Kill(); else drone Delete(); } } die_after_awhile () { self endon( "death" ); timer = RandomFloatRange( 25, 35 ); wait( timer ); self Kill(); } resumeslowly() { self endon( "death" ); time = 1.0; frames = time * 20; speed = 1; for ( i = 0; i < frames; i++ ) { self Vehicle_SetSpeedImmediate( speed, 2, 2 ); speed += 0.6; wait( 0.05 ); } self ResumeSpeed( 1 ); } crash_physics_explosion() { struct = getstruct( "crash_physics_struct", "targetname" ); physics_spawner = getstruct( "physics_spawner", "targetname" ); targ = getstruct( physics_spawner.target, "targetname" ); index = 0; models = []; models[ 0 ] = "com_soup_can"; models[ 1 ] = "com_bottle1"; models[ 2 ] = "com_soup_can"; models[ 3 ] = "com_bottle1"; models[ 4 ] = "me_plastic_crate1"; angles = VectorToAngles( targ.origin - physics_spawner.origin ); right = AnglesToRight( angles ); for ( i = 0; i < 14; i++ ) { org = targ.origin + randomvector( 200 ); angles = VectorToAngles( org - physics_spawner.origin ); forward = AnglesToForward( angles ); force = forward * RandomFloatRange( 4000, 8500 ); // force = randomvector( 160000 ); model = models[ index ]; index++; if ( index >= models.size ) index = 0; ent = Spawn( "script_model", physics_spawner.origin ); ent.origin += right * RandomFloatRange( -40, 40 );; ent SetModel( model ); ent PhysicsLaunchClient( ent.origin, force ); } PhysicsExplosionSphere( struct.origin, struct.radius, struct.radius, 0.4 ); } goes_to_hell( vehicle_hell ) { self AttachPath( vehicle_hell ); wait( 0.1 ); self godoff(); foreach ( rider in self.riders ) { if ( !IsAlive( rider ) ) continue; rider safe_delete(); } RadiusDamage( self.origin, 128, 5000, 5000 ); } run_away_die() { self endon( "death" ); self waittill( "goal" ); wait( 3 ); struct = getstruct( self.script_linkto, "script_linkname" ); self SetGoalPos( struct.origin ); self.goalradius = 4; self waittill( "goal" ); self Kill(); } player_doesnt_die_in_red_flashing() { level endon( "ride_ends" ); for ( ;; ) { // a reasonable amount of spammity-spam, it's for a good cause. if ( level.player ent_flag( "player_has_red_flashing_overlay" ) ) level.player.attackeraccuracy = 0; wait( 0.05 ); } } school_guy_targets_school() { if ( flag( "shepherd_moves_out" ) ) return; level endon( "shepherd_moves_out" ); targets = GetEntArray( "school_target", "targetname" ); for ( ;; ) { targets = array_randomize( targets ); foreach ( target in targets ) { self SetEntityTarget( target ); timer = RandomFloatRange( 3, 6 ); wait( timer ); } } } ambush_ally_spawner_think() { level.ambush_allies_outside_vehicle++; self endon( "death" ); //self.threatbias = 750; // they really want to shoot these guys more. self SetThreatBiasGroup( "ally_outside_school" ); self magic_bullet_shield(); flag_wait( "friendlies_suppress_school" ); self.suppressionwait = 0; thread school_guy_targets_school(); flag_wait( "shepherd_moves_out" ); vehicle = getClosest( self.origin, level.ambushed_hummers ); guy_runtovehicle_load( self, vehicle ); self stop_magic_bullet_shield(); level.ambush_allies_outside_vehicle--; if ( !level.ambush_allies_outside_vehicle ) flag_set( "shepherd_vehicles_leave" ); flag_wait( "the_end" ); safe_delete(); //flag_wait( "ambush_house_player_goes_upstairs" ); //self stop_magic_bullet_shield(); } join_school_threatbias_group_and_damage_func() { unreachable = false; if ( IsDefined( self.script_noteworthy ) ) { unreachable = self.script_noteworthy == "school_unreachable_spawner"; } if ( unreachable ) { self SetThreatBiasGroup( "axis_school_unreachable" ); } else { self SetThreatBiasGroup( "axis_school" ); } self add_damage_function( ::remove_player_from_threatbias_group ); } remove_player_from_threatbias_group( amt, attacker, force, b, c, d, e ) { if ( !isalive( attacker ) ) return; if ( attacker != level.player ) return; wait( 3 ); // player shot me, put him in a threatbias group that I can fight him in level.player SetThreatBiasGroup( "allies" ); } ambush_house_spawner_think() { self SetThreatBiasGroup( "axis_ambush_house" ); } friendlies_traverse_school() { for ( i = 1; i <= 20; i++ ) { // "roadkill_school_1", "roadkill_school_2", "roadkill_school_3", // "roadkill_school_4", "roadkill_school_5", "roadkill_school_6" msg = "roadkill_school_" + i; trigger = GetEnt( msg, "targetname" ); if ( flag_exist( msg ) ) { flag_wait( msg ); if ( msg == "roadkill_school_10" ) { //flag_wait( "backend_baddies_spawned" ); flag_wait_either( "school_back_baddies_dead", "roadkill_near_crossroads" ); } volume = trigger get_color_volume_from_trigger(); if ( IsDefined( volume ) ) volume waittill_volume_dead_or_dying(); trigger activate_trigger(); } } } dunn_says_clear_on_room_clear() { flag_wait( "hidden_guy_opens_fire" ); wait 1.3; volume = getent( "dunn_clear_volume", "targetname" ); volume waittill_volume_dead(); // Clear! dunn_line( "roadkill_cpd_clear" ); wait 1; guys = []; guys[ "player" ] = level.player; guys[ "foley" ] = level.foley; guys[ "dunn" ] = level.dunn; touchers = 0; foreach ( guy in guys ) { if ( guy istouching( volume ) ) touchers++; } if ( touchers == 2 ) { // Two comin' out! dunn_line( "roadkill_cpd_2cominout" ); } else if ( touchers == 3 ) { // Three comin' out! dunn_line( "roadkill_cpd_3cominout" ); } } hidden_room_spawner() { self endon( "death" ); self set_force_cover( true ); add_wait( ::can_see_player ); add_wait( ::flag_wait, "hidden_guy_opens_fire" ); do_wait_any(); self set_force_cover( false ); } can_see_player() { self endon( "death" ); for ( ;; ) { if ( self CanSee( level.player ) ) return; wait( 0.05 ); } } cutting_history_class_dialogue() { flag_wait( "cutting_through_history" ); for ( ;; ) { waittillframeend; if ( !level.dialogue_function_stack_struct.function_stack.size ) break; wait 0.05; } // I'm cutting through history class. dunn_line( "roadkill_cpd_historyclass" ); // Roger that. foley_line( "roadkill_fly_rogerthat" ); } ambush_house_slowbie() { self.moveplaybackrate = 0.76; self.attackeraccuracy = 1000; } player_impact_earthquake() { Earthquake( 0.25, 0.8, level.player.origin, 5000 ); level.player PlayRumbleOnEntity( "damage_heavy" ); level.player PlayRumbleLoopOnEntity( "damage_light" ); flag_wait( "player_goes_in_reverse" ); level.player StopRumble( "damage_light" ); } traffic_truck_pushed() { struct = getstruct( "truck_contact_point", "targetname" ); targ = getstruct( struct.target, "targetname" ); vec = VectorNormalize( targ.origin - struct.origin ); vec *= 2; level.traffic_jam_truck VehPhys_Launch( vec, ( 0, 0, 0 ), targ.origin ); } force_player_vehicle_speed( speed ) { level notify( "new_force_player_speed" ); level endon( "new_force_player_speed" ); player_vehicle = level.crazy_ride_convoy[ 1 ]; level endon( "stop_updating_player_vehicle_speed" ); for ( ;; ) { player_vehicle Vehicle_SetSpeedImmediate( speed, 2, 2 ); wait( 0.05 ); } } radius_damage_in_front() { level endon( "stop_updating_player_vehicle_speed" ); flag_wait( "push_hurts_technical" ); level.traffic_jam_truck godoff(); damage = 60; for ( ;; ) { // forward = AnglesToForward( self.angles ); // org = self.origin + forward * 140 + (0,0,40); // Print3d( level.traffic_jam_truck.origin, "x", (1,0,0), 1, 2 ); RadiusDamage( level.traffic_jam_truck.origin, 25, damage, damage, level.player ); if ( level.traffic_jam_truck.health < 18000 ) { level.traffic_jam_truck.health = 18000; } wait( 0.05 ); } } lead_vehicle_starts_going_again() { wait( 0.75 ); self Vehicle_SetSpeed( 16, 2, 2 ); self.veh_brake = 0; } player_pushes_truck_down_alley() { player_vehicle = level.crazy_ride_convoy[ 1 ]; rear_vehicle = level.crazy_ride_convoy[ 2 ]; lead_vehicle = level.crazy_ride_convoy[ 0 ]; for ( ;; ) { self waittill( "trigger", other ); if ( !isdefined( level.traffic_jam_truck ) ) continue; if ( other == level.traffic_jam_truck ) break; } flag_set( "we're cut off" ); queue = GetTime(); player_vehicle.veh_brake = 1.0; player_vehicle Vehicle_SetSpeed( 8, 1, 1 ); wait( 0.25 ); rear_vehicle.veh_brake = 0.5; lead_vehicle delayThread( 2, ::set_brakes, 0.5 ); level.traffic_jam_truck.veh_brake = 0.5; //wait( 2 ); // 0.8 dot // 0.5 time spent looking at it // 10 seconds until timeout level.traffic_jam_truck waittill_player_lookat( 0.6, 0.5, undefined, 8 ); delayThread( 0, ::technical_pushed_animation ); wait( 0.2 ); flag_set( "push_through" ); //level.traffic_jam_truck thread dump_vehicle_bones(); wait( 0.5 ); player_vehicle.veh_brake = 0; player_vehicle Vehicle_SetSpeed( 24, 10, 10 ); rear_vehicle.veh_brake = 0; lead_vehicle thread lead_vehicle_starts_driving_again(); wait( 0.65 ); flag_set( "resume_the_path" ); // brakes cleared by main thread // level.traffic_jam_truck.veh_brake = 0; tech_target_org = getstruct( "tech_target_org", "targetname" ); level.traffic_jam_truck vehicleDriveTo( tech_target_org.origin, 25 ); level.traffic_jam_truck.veh_brake = 0; wait( 1.1 ); timer = 3; frames = timer * 20; for ( ;; ) { level.traffic_jam_truck Vehicle_SetSpeedImmediate( 6, 1, 1 ); frames -= 1; if ( frames <= 0 ) break; wait( 0.05 ); } level.traffic_jam_truck Vehicle_SetSpeedImmediate( 0, 1, 1 ); level.traffic_jam_truck.veh_brake = 1.0;// 0.1; wait_for_buffer_time_to_pass( queue, 5.5 ); level.traffic_jam_truck.vehicle_stays_alive = undefined; } lead_vehicle_starts_driving_again() { wait( 3.5 ); self.veh_brake = 0; self Vehicle_SetSpeed( 12, 1, 1 ); //lead_vehicle delayThread( 3.5, ::set_brakes, 0.0 ); } dump_vehicle_bones() { start_time = GetTime(); for ( ;; ) { tag_origin_pos = self GetTagOrigin( "tag_origin" ); tag_origin_ang = self GetTagAngles( "tag_origin" ); tag_body_pos = self GetTagOrigin( "tag_body" ); tag_body_ang = self GetTagAngles( "tag_body" ); time = GetTime() - start_time; PrintLn( "Time: " + time + " tag_origin: " + tag_origin_pos + " " + tag_origin_ang + " tag_body:" + tag_body_pos + " " + tag_body_ang ); wait( 0.05 ); } } /* axis_flee_riverbank() { flag_set( "riverbank_baddies_retreat" ); // controls the guys in the windows volumes = GetEntArray( "riverbank_building_volume", "script_noteworthy" ); nodes = GetNodeArray( "enemy_riverbank_flee_node", "targetname" ); index = 0; ai = GetAIArray( "axis" ); foreach ( guy in ai ) { if ( !isalive( guy ) ) continue; touching_house = false; foreach ( vol in volumes ) { if ( guy IsTouching( vol ) ) { touching_house = true; break; } } if ( touching_house ) { timer = RandomFloat( 3.2 ); guy delayCall( timer, ::Kill ); } else { node = nodes[ index ]; index++; index %= nodes.size; guy SetGoalNode( node ); guy.goalradius = 64; guy.ignoreall = true; guy thread delete_on_goal(); timer = RandomFloat( 1.2 ); wait( timer ); } } } */ delete_on_goal() { self endon( "death" ); self waittill( "goal" ); self Delete(); } player_learned_javelin() { return level.player GetCurrentWeapon() == "javelin"; } detect_player_switched_to_javelin() { for ( ;; ) { if ( level.player GetCurrentWeapon() == "javelin" ) break; wait( 0.05 ); } flag_set( "player_switched_to_javelin" ); } remind_player_to_switch_to_javelin() { lines = []; // Brodsky, switch to your Javelin! lines[ 0 ] = "roadkill_fly_switchtojavelin"; // Brodsky, use your Javelin to take out the armor! lines[ 1 ] = "roadkill_fly_takeoutarmor"; index = 0; for ( ;; ) { timer = 9 + RandomIntRange( 2, 5 ); frames = timer * 20; for ( i = 0; i < frames; i++ ) { if ( level.player GetCurrentWeapon() == "javelin" ) return; wait( 0.05 ); } theLine = lines[ index ]; index++; index %= lines.size; // wait until everybody stops talking while ( level.dialogue_function_stack_struct.function_stack.size ) wait( 0.05 ); if ( level.player GetCurrentWeapon() == "javelin" ) return; foley_line( theLine ); } } /* foley_javelin_reminders() { remind_player_to_switch_to_javelin(); remind_player_to_shoot_targets(); } */ /* detect_player_missile_fire() { level endon( "bmps_destroyed" ); level.last_missile_fire_time = GetTime() - 5000; // bias the time he starts complaining if you dont shoot count = 0; for ( ;; ) { level.player waittill( "missile_fire" ); count++; // missile_fire_1 missile_fire_2 missile_fire_3 flag_set( "missile_fire_" + count ); level.last_missile_fire_time = GetTime(); if ( count >= 3 ) return; } } remind_player_to_shoot_targets() { if ( flag( "bmps_destroyed" ) ) return; level endon( "bmps_destroyed" ); level.last_missile_fire_time = GetTime() - 5000; // bias the time he starts complaining if you dont shoot lines = []; // Target that armored vehicle with your Javelin! lines[ 0 ] = "roadkill_fly_targetvehicle"; // Engage that armored vehicle across the river! lines[ 1 ] = "roadkill_fly_acrossriver"; // Brodsky, use your Javelin to take out the armor! lines[ 2 ] = "roadkill_fly_takeoutarmor"; index = 0; for ( ;; ) { // wait until everybody stops talking if ( foley_should_talk() ) { theLine = lines[ index ]; index++; index %= lines.size; foley_line( theLine ); level.last_missile_fire_time = GetTime(); } wait( 0.05 ); } } */ foley_should_talk() { if ( GetTime() <= level.last_missile_fire_time + 19000 ) return false; return !level.dialogue_function_stack_struct.function_stack.size; } enter_riverbank_foley_shepherd_dialogue() { wait( 11 ); thread autosave_by_name( "riverbank" ); wait( 3 ); // Hunter Two! Keep up the pressure on those RPG teams! If that bridgelayer gets hit, we're swimming, huah? foley_line( "roadkill_fly_wereswimming" ); wait( 1 ); flag_set( "intro_lines_complete" ); } introlines_delay() { //flag_wait( "intro_lines_complete" ); wait( 6 ); } airstrike_call_in_dialogue() { if ( !is_default_start() ) return; wait( 0.74 ); // Warlord, Warlord, this is Hunter 2-1, requesting air strike at grid 2-5-2, 1-7-1! Target is a white, // twelve story apartment building occupied by hostile forces, over! // Warlord, Warlord, this is // shepherd_line( "roadkill_cpd_airstrike" ); // Hunter 2-1, this is Warlord, solid copy, uh, I have Devil 1-1, flight of two F-15s, on the line, standby for relay. radio_line( "roadkill_auc_ontheline" ); wait( 0.9 ); // Hunter 2-1 this is Devil 1-1, flight of two F-15s, time on station, one-five mikes, // holding at three-Sierra, northwest, holding area Knife, carrying two JDAMs and two HARMs, over. radio_line( "roadkill_fp1_devil11" ); // Devil 1-1, this is Hunter 2-1, solid copy on check-in, standby. // dunn_line( "roadkill_cpd_checkin" ); // Standing by. radio_line( "roadkill_fp1_standingby" ); // Devil 1-1, target is a white, twelve story apartment building at grid 2-5-2, 1-7-1. I need you to // level that building, how copy over? shepherd_line( "roadkill_cpd_levelbuilding" ); // Solid copy Hunter 2-1. Rolling in now... Target acquired. radio_line( "roadkill_fp1_targetacquired" ); } ambushed_hummer() { level.ambushed_hummers[ level.ambushed_hummers.size ] = self; self VehPhys_DisableCrashing(); self.dontdisconnectpaths = true; flag_wait( "shepherd_vehicles_leave" ); node = GetVehicleNode( self.target, "targetname" ); dist = Distance( self.origin, node.origin ); time = dist * 0.005; wait( time ); self gopath(); } put_noteworthy_in_magic_chatter() { level.convoy_dialogue_guy[ self.script_noteworthy ] = self; } get_convoy_dialogue_guy( name ) { if ( IsAlive( level.convoy_dialogue_guy[ name ] ) ) return level.convoy_dialogue_guy[ name ]; index = 0; ai = GetAIArray( "allies" ); guys = []; foreach ( guy in ai ) { if ( !isalive( guy ) ) continue; if ( guy is_hero() ) continue; if ( IsDefined( guy.convoy_guy ) ) continue; guy.convoy_guy = true; level.convoy_dialogue_guy[ name ] = guy; return guy; } } magic_dialogue_queue( msg, name ) { guy = get_convoy_dialogue_guy( name ); AssertEx( IsAlive( guy ), "Couldn't find a guy to do line " + msg ); //guy thread printer(); guy generic_dialogue_queue( msg ); wait( 0.25 ); } printer() { frames = Int( 2.5 * 20 ); for ( i = 0; i < frames; i++ ) { Print3d( self GetEye(), "*" ); wait( 0.05 ); } } south( dist ) { return level.player.origin + ( 0, dist * -1, 0 ); } charpos( guy ) { org = level.player.origin; if ( flag( "100ton_bomb_goes_off" ) ) org = level.locked_player_position; unit = 128; switch( guy ) { case "ar1": return org + ( unit, 0, 0 ); case "ar2": return org + ( unit, unit, 0 ); case "ar3": return org + ( unit * -1, 0, 0 ); case "ar4": return org + ( unit * -1, unit * - 0.5, 0 ); case "ar5": return org + ( unit, unit * -0.5, 0 ); case "farguy": return org + ( unit * 15, unit * 15, 0 ); case "left": return org + ( unit * -2, 0, 0 ); case "left_back": return org + ( unit * -2, -1000, 0 ); case "left_back_more": return org + ( unit * -2, -3000, 0 ); case "right_forward": return org + ( unit * 2, 1000, 0 ); case "right_forward_more": return org + ( unit * 2, 1500, 0 ); case "right_rear_back": return org + ( unit * 2, -3800, 0 ); case "cpd": return org + ( unit * 0.5, unit * 0.5, unit * -0.2 ); default: return org + ( 0, 0, 0 ); } } airstrike_completion_dialogue_and_exploder() { time = 2.5; // 10 seconds!! delayThread( time, ::play_sound_in_space, "roadkill_ar1_10seconds", south( 5000 ) ); time += 1.1; // 10 seconds!! delayThread( time, ::play_sound_in_space, "roadkill_ar2_10seconds", south( 3500 ) ); time += 0.8; // 10 seconds!! delayThread( time, ::play_sound_in_space, "roadkill_ar3_10seconds", south( 1200 ) ); time += 2.9; // Which building is it sir? delayThread( time, ::play_sound_in_space, "roadkill_ar1_whichbuilding", charpos( "ar1" ) ); time += 1.6; // The tall one at 1 o'clock. delayThread( time, ::play_sound_in_space, "roadkill_ar2_tallone", charpos( "ar2" ) ); time += 1.4; // Hey dawg, which building? delayThread( time, ::play_sound_in_space, "roadkill_ar3_heydawg", charpos( "left" ) ); time += 1.4; /* //////////////////////////////// // How long will it record for? delayThread( time + 2, ::play_sound_in_space, "roadkill_ar1_howlong", charpos( "right_rear_back" ) ); // I dunno, till it runs out man. delayThread( time + 3.75, ::play_sound_in_space, "roadkill_ar2_runsout", charpos( "right_rear_back" ) ); //////////////////////////////// */ // The one at 1 o'clock, the tall - hey Dave, which one is it? Is it the one of the left or the right? delayThread( time, ::play_sound_in_space, "roadkill_ar4_whichone", charpos( "left_back" ) ); time += 4.6; // The one on the left. delayThread( time, ::play_sound_in_space, "roadkill_ar5_oneonleft", charpos( "left_back_more" ) ); time += 1.2; /* // You gonna tape this one? You got enough memory left? delayThread( time, ::play_sound_in_space, "roadkill_ar4_memoryleft", charpos( "right_forward" ) ); time += 2.5; // Huah, should be good. delayThread( time, ::play_sound_in_space, "roadkill_ar5_shouldbegood", charpos( "right_forward_more" ) ); time += 1.5; */ /* // What's goin' on. // What's the hold up? //roadkill_ar4_goinon broken delayThread( time, ::play_sound_in_space, "roadkill_ar3_holup", charpos( "right_rear_back" ) ); time += 1.5; // Shepherd called in a major fire mission. delayThread( time, ::play_sound_in_space, "roadkill_ar5_majorfire", charpos( "right_rear_back" ) ); time += 3.5; */ /* // Hey isn't this danger close for the task force? delayThread( time, ::magic_dialogue_queue, "roadkill_ar3_dangerclose", "ar3" ); level.scr_sound[ "generic" ][ "roadkill_ar3_dangerclose" ] = "roadkill_ar3_dangerclose"; // Since when does Shepherd care about danger close? level.scr_sound[ "generic" ][ "roadkill_cpd_sincewhen" ] = "roadkill_cpd_sincewhen"; // Cleared hot! // delayThread( time + 2, ::dunn_line, "roadkill_cpd_clearedhot" ); // Devil 1-1 off safe. Bombs away bombs away. delayThread( time + 5.5, ::radio_line, "roadkill_fp1_offsafe" ); time += 2; // What's the hold up? delayThread( time, ::magic_dialogue_queue, "roadkill_ar3_holup", "ar3" ); time += 1.5; // Shepherd called in a major fire mission! delayThread( time, ::magic_dialogue_queue, "roadkill_cpd_majorfiremission", "cpd" ); time += 2.5; */ delayThread( time, ::spawn_vehicle_from_targetname_and_drive, "bomber_spawner" ); time += 0.7; // Hey isn't this danger close for the task force? delayThread( time, ::play_sound_in_space, "roadkill_ar3_dangerclose", charpos( "ar3" ) ); time += 2.1; // Since when does Shepherd care about danger close? delayThread( time, ::play_sound_in_space, "roadkill_cpd_sincewhen", charpos( "cpd" ) ); time += 1.8; video_taper_offset = 0.75; wait( time - video_taper_offset ); flag_set( "video_tapers_react" ); wait( video_taper_offset ); //exploder( "town_bombed" ); //exploder( "white_bomb" ); exploder( "100ton_bomb" ); thread roadkill_bomb_physics_explosion(); thread collapsing_building(); thread collapse_earthquake(); thread fence_rattle(); level.player delayThread( 3.6, maps\_gameskill::grenade_dirt_on_screen, "left" ); level.locked_player_position = level.player.origin; flag_set( "100ton_bomb_goes_off" ); start_time = GetTime(); wait( 0.25 ); // Look! Look! The building's goin' down! (ad lib) delayThread( 8.85, ::play_sound_in_space, "roadkill_cpd_looklook", charpos( "cpd" ) ); /* // Huah!! Get some! delayThread( 0.9, ::magic_dialogue_queue, "roadkill_cpd_getsome", "cpd" ); // Huah! Hell yea! delayThread( 0.95, ::magic_dialogue_queue, "roadkill_ar1_huahyeah", "ar1" ); // Yeah! delayThread( 1.0, ::magic_dialogue_queue, "roadkill_ar1_yeah", "ar3" ); // Woo! Yeah! // delayThread( 1.25, ::magic_dialogue_queue, "roadkill_ar2_wooyeah", "ar2" ); // Whoa! delayThread( 1.8, ::magic_dialogue_queue, "roadkill_ar1_whoa", "dunn" ); */ time = 1.3; // BOOM! delayThread( time, ::play_sound_in_space, "roadkill_ar1_boom", charpos( "ar1" ) ); //delayThread( time, ::play_sound_in_space, "roadkill_ar2_wooyeah", charpos( "ar1" ) ); delayThread( time, ::play_sound_in_space, "roadkill_ar3_woo", charpos( "ar1" ) ); delayThread( time, ::play_sound_in_space, "roadkill_ar1_yeah", charpos( "ar4" ) ); time += 0.2; // --ck yeah! delayThread( time, ::play_sound_in_space, "roadkill_ar2_catcalls", charpos( "ar2" ) ); time += 1.1; delayThread( time, ::play_sound_in_space, "roadkill_ar3_catcalls", charpos( "ar3" ) ); time += 0.9; delayThread( time, ::play_sound_in_space, "roadkill_cpd_getsome", charpos( "cpd" ) ); time += 0.2; delayThread( time, ::play_sound_in_space, "roadkill_ar2_yeah", charpos( "ar2" ) ); time += 0.8; // That was hot man... delayThread( time, ::play_sound_in_space, "roadkill_ar5_hotman", charpos( "right_rear_back" ) ); time += 0.4; // delayThread( time, ::play_sound_in_space, "roadkill_ar1_huahyeah", charpos( "ar5" ) ); // time += 0.2; // Wooo!!! //delaythread( time, ::play_sound_in_space, "roadkill_ar3_woo", charpos( "ar3" ) ); //time += 0.2; // Yeah!!! // delayThread( time, ::play_sound_in_space, "roadkill_ar4_yeah", charpos( "ar4" ) ); time += 0.5; // You don't get this on the 4th of July! delayThread( time, ::play_sound_in_space, "roadkill_ar1_4thofjuly", charpos( "right_rear_back" ) ); time += 2.05; // Battalion is oscar mike!!! // roadkill_ar1_battalionom is misspronounced! delayThread( time, ::play_sound_in_space, "roadkill_ar4_oscarmike", charpos( "ar1" ) ); time += 1.0; delayThread( time, ::flag_set, "convoy_oscar_mike_after_explosion" ); // All right, we're oscar miiike!!! delayThread( time, ::play_sound_in_space, "roadkill_cpd_oscarmike", charpos( "cpd" ) ); time += 0.9; // We're on the move!!! delayThread( time, ::play_sound_in_space, "roadkill_ar3_onthemove", charpos( "right_rear_back" ) ); time += 1.15; // Roger that!! delayThread( time, ::play_sound_in_space, "roadkill_ar4_rogerthat", charpos( "right_rear_back" ) ); time += 2.0; // The networks are gonna pay big for this one! delayThread( time, ::play_sound_in_space, "roadkill_cpd_paybig", charpos( "left_back" ) ); time += 1.8; // Keep dreamin video boy! delayThread( time, ::play_sound_in_space, "roadkill_ar2_keepdreamin", charpos( "left_back" ) ); time += 1.1; // No man, seriously, that was extreme! delayThread( time, ::play_sound_in_space, "roadkill_cpd_extreme", charpos( "left_back" ) ); // // Look! Look! The building's goin' down! (ad lib) // level.scr_sound[ "generic" ][ "roadkill_cpd_looklook" ] = "roadkill_cpd_looklook"; // Whoa! // delayThread( 2.4, ::magic_dialogue_queue, "roadkill_ar2_yeahcough", "fly" ); // cough // delayThread( 3, ::magic_dialogue_queue, "roadkill_gar_cough1", "ar1" ); // allies = GetAIArray( "allies" ); // get_array_of_closest( level.player.origin, allies ); // origins = []; // for ( i = 0; i < allies.size; i++ ) // { // origins[ i ] = allies[ i ].origin; // } // // delayThread( 3.1, ::play_sound_in_space, "roadkill_gar_cough1", origins[ 0 ] ); // delayThread( 3.3, ::play_sound_in_space, "roadkill_gar_cough2", origins[ 1 ] ); // delayThread( 3.5, ::play_sound_in_space, "roadkill_gar_cough3", origins[ 2 ] ); // delayThread( 3.8, ::play_sound_in_space, "roadkill_gar_cough4", origins[ 3 ] ); // delayThread( 4.1, ::play_sound_in_space, "roadkill_gar_cough5", origins[ 4 ] ); // delayThread( 4.5, ::play_sound_in_space, "roadkill_gar_cough6", origins[ 5 ] ); /* // Huah! delayThread( time, ::magic_dialogue_queue, "roadkill_ar2_huah", "ar2" ); time += 0.3; */ //roadkill_ar1_whoa wait_for_buffer_time_to_pass( start_time, 7.15 ); /* // The networks are gonna pay big for this one! magic_dialogue_queue( "roadkill_cpd_paybig", "network_chatter_spawner1" ); // Keep dreamin video boy! magic_dialogue_queue( "roadkill_ar2_keepdreamin", "network_chatter_spawner2" ); // No man, seriously, that was extreme! magic_dialogue_queue( "roadkill_cpd_extreme", "network_chatter_spawner1" ); */ } convoy_moves_out_dialogue() { if ( !is_default_start() ) return; // Hunter Two! Bridge complete, we're oscar mike! Move out!! foley_line( "roadkill_fly_bridgecomplete" ); // We're movin' out!! dunn_line( "roadkill_cpd_movinout" ); // Get your ass back in the vehicle! time = 0.05; delayThread( time, ::magic_dialogue_queue, "roadkill_ar3_backinvehicle", "ar3" ); time += 1.3; // Battalion is oscar mike!!! delayThread( time, ::magic_dialogue_queue, "roadkill_ar4_oscarmike", "ar4" ); time += 1.2; wait( time ); /* // Hu-ahh!! What was that, a 1000 pounder? guys[ "chat_ar3" ] generic_dialogue_queue( "roadkill_ar3_whatwasthat" ); time = 0.05; // I dunno but damn that was kick ass, huah? guys[ "chat_ar4" ] delayThread( time, ::generic_dialogue_queue, "roadkill_ar4_idunno" ); time += 1.2; */ // We're oscar mike, move it! delayThread( time, ::magic_dialogue_queue, "roadkill_fly_oscarmike", "fly" ); time += 0.6; // We're oscar mike! delayThread( time, ::magic_dialogue_queue, "roadkill_ar2_oscarmike", "ar2" ); time += 0.6; // If you have to do #2 go now because once I start the car I am not stoppin', huah? delayThread( time, ::magic_dialogue_queue, "roadkill_cpd_notstoppin", "cpd" ); time += 3.2; wait( time ); if ( flag( "player_gets_in" ) ) return; level endon( "player_gets_in" ); // We're moving out now! thread magic_dialogue_queue( "roadkill_fly_movingout", "fly" ); wait( 1.2 ); // Mount up! thread magic_dialogue_queue( "roadkill_fly_mountup", "fly" ); wait( 0.5 ); // We're oscar mike! thread magic_dialogue_queue( "roadkill_ar2_oscarmike", "ar2" ); } random_ai_line( msg ) { ai = GetAIArray( "allies" ); ai = get_array_of_closest( level.player.origin, ai, undefined, 5 ); guy = random( ai ); if ( !isalive( guy ) ) return; guy generic_dialogue_queue( msg ); } warn_if_player_shoots_prematurely() { if ( flag( "ambush_spawn" ) ) return; level endon( "ambush_spawn" ); lines = []; // Allen, what are you shooting at, there's nothing there! Cease fire! lines[ lines.size ] = "roadkill_fly_nothingthere"; // Allen, stand down! The ROE dictates we can’t fire unless fired upon! // lines[ lines.size ] = "roadkill_fly_standdown"; // Allen! Cease fire! lines[ lines.size ] = "roadkill_fly_ceasefire"; index = 0; //thread fail_player_for_excessive_firing(); for ( ;; ) { if ( player_shoots_at_non_enemy() ) { wait( 1.5 ); } if ( player_shoots_at_non_enemy() ) { theLine = lines[ index ]; index++; index %= lines.size; foley_line( theLine ); wait( 1 ); } wait( 0.05 ); } } player_shoots_at_non_enemy() { if ( !level.player AttackButtonPressed() ) return false; ai = GetAIArray( "axis" ); angles = level.player GetPlayerAngles(); dotforward = AnglesToForward( angles ); start = level.player GetEye(); foreach ( guy in ai ) { angles = VectorToAngles( guy.origin - start ); forward = AnglesToForward( angles ); dot = VectorDot( dotforward, forward ); if ( dot > 0.86 ) return false; } return true; } fail_player_for_excessive_firing() { if ( flag( "ambush_spawn" ) ) return; level endon( "ambush_spawn" ); count = 0; time = 5; sustained_firing_frames = time * 20; for ( ;; ) { if ( level.player AttackButtonPressed() ) { count += 1; } else { // penality wears off slower than it gains so you can't just fire little bursts overand over count -= 0.25; } if ( count <= 0 ) count = 0; if ( count > sustained_firing_frames ) break; wait( 0.05 ); } // An unsanctioned discharge will not be tolerated. SetDvar( "ui_deadquote", &"ROADKILL_SHOT_TOO_MUCH" ); missionFailedWrapper(); } stryker_think() { self.veh_pathtype = "constrained"; flag_wait( "player_gets_in" ); self.veh_pathtype = "follow"; } fence_rattle() { pivot = GetEnt( "animated_bridge_fence_pivot", "targetname" ); //pivot thread maps\_debug::drawOrgForever(); wait( 3.25 ); animated_bridge_fences = GetEntArray( "animated_bridge_fence", "targetname" ); foreach ( piece in animated_bridge_fences ) { piece NotSolid(); piece SetContents( 0 ); piece LinkTo( pivot ); } start_angles = pivot.angles; amount = -25; for ( ;; ) { time = abs( amount ) * 0.0475; if ( time < 0.75 ) time = 0.75; pivot RotateTo( ( 0, 90, amount ), time, time * 0.5, time * 0.5 ); amount *= -0.65; wait( time ); if ( abs( amount ) <= 2 ) break; } pivot RotateTo( start_angles, 0.2 ); wait( 0.5 ); pivot Delete(); } collapse_earthquake() { wait( 1.1 ); level.player PlayRumbleOnEntity( "collapsing_building" ); Earthquake( 0.3, 2, ( -2556.2, -702.2, 1446 ), 15000 ); wait( 2.4 ); Earthquake( 0.15, 0.6, ( -2556.2, -702.2, 1446 ), 15000 ); } collapsing_building() { building = GetEnt( "collapsing_building", "targetname" ); wait( 7.5 ); time = 10; ent = Spawn( "script_origin", building.origin ); ent.angles = building.angles; ent AddPitch( -30 ); ent AddYaw( 60 ); ent.origin += ( 0, 0, -2000 ); building MoveTo( ent.origin, time, 6, 0 ); building RotateTo( ent.angles, time, 6, 0 ); building thread play_sound_on_entity( "scn_roadkill_building_collapse" ); exploder( "building_collapse" ); } roadkill_bomb_physics_explosion() { wait( 1.3 ); start = GetEnt( "physics_explosion_line", "targetname" ); end = getstruct( start.target, "targetname" ); dest = getstruct( end.target, "targetname" ); radius = start.radius; dist = Distance( start.origin, end.origin ); segments = dist / radius; time = 3; start MoveTo( dest.origin, time, 2, 0 ); end_time = GetTime() + time * 1000; segment_vec = end.origin - start.origin; segment_vec /= segments; force_vec = ( -45, -55, 72 ); angles = VectorToAngles( force_vec ); forward = AnglesToForward( angles ); force_vec = forward * 0.14; count = 0; for ( ;; ) { if ( GetTime() > end_time ) break; org = start.origin; for ( i = 0; i < segments; i++ ) { count++; if ( count <= 3 ) { PhysicsExplosionCylinder( org, radius, radius, 0.3 ); // Print3d( org, "x", (0,0,1), 1, 2, 150 ); } else { PhysicsJolt( org, radius, radius, force_vec ); // Print3d( org, "x", (1,0,0), 1, 2, 150 ); count = 0; } org += segment_vec; } wait( 0.05 ); } } street_walk_scene() { array_spawn_function_targetname( "street_walk_scene", ::street_walk_guy ); // flag_wait( "100ton_bomb_goes_off" ); flag_wait( "convoy_oscar_mike_after_explosion" ); wait( 12.5 - 4 ); array_spawn_targetname( "street_walk_scene" ); } street_walk_guy() { self endon( "death" ); self.ignoreall = true; self.ignoreme = true; self SetGoalPos( self.origin ); self.moveplaybackrate = 1; self.pathrandompercent = 0; struct = getstruct( self.script_linkto, "script_linkname" ); delays = []; delays[ "street_walk_scene1" ] = 1.7; delays[ "street_walk_scene2" ] = 0.9; delays[ "street_walk_scene3" ] = 0; delay = delays[ struct.targetname ]; delay *= 1.3; wait( delay ); // flag_wait( "building_face_falloff" ); self enable_cqbwalk(); // struct anim_generic_first_frame( self, "combat_walk" ); struct anim_generic_reach( self, "combat_walk" ); struct thread anim_generic_gravity( self, "combat_walk" ); animation = self getGenericAnim( "combat_walk" ); for ( ;; ) { if ( self GetAnimTime( animation ) >= 0.96 ) break; wait( 0.05 ); } self notify( "killanimscript" ); node = GetNode( self.target, "targetname" ); self SetGoalNode( node ); self.fixednode = false; self.goalradius = 8; self waittill( "goal" ); self safe_delete(); } ps3_hide() { if ( !level.console ) return; if ( !level.ps3 ) return; ents = getentarray( "ps3_hide", "script_noteworthy" ); foreach ( ent in ents ) { ent hide(); } flag_wait( "roadkill_town_dialogue" ); foreach ( ent in ents ) { ent show(); } } broken_wall() { // this wall breaks/slides a bit models = GetEntArray( self.target, "targetname" ); foreach ( model in models ) { model LinkTo( self ); } pivot = GetEnt( self.script_linkto, "script_linkname" ); self add_target_pivot( pivot ); start_ent = GetEnt( "broken_wall_start_org", "targetname" ); end_origin = pivot.origin; end_angles = pivot.angles; pivot.origin = start_ent.origin; pivot.angles = start_ent.angles; flag_wait( "roadkill_town_dialogue" ); flag_wait( "building_face_falloff" ); pivot thread play_sound_on_entity( "scn_roadkill_building_crumble" ); //wait( 1.5 ); moveTime = 4; pivot RotateTo( end_angles, moveTime, 3, 1 ); pivot MoveTo( end_origin, moveTime, 3, 1 ); exploder( "building_crumble" ); } roadkill_riverbank_objective() { thread detect_player_switched_to_javelin(); /* idle_commanders = GetEntArray( "idle_commander", "targetname" ); commander = idle_commanders[ 0 ]; origin = commander.origin; radio_scene = getstruct( "radio_scene", "targetname" ); origin = radio_scene.origin; */ // Protect the bridge layer. waittillframeend; // Protect the bridge layer. Objective_Add( obj( "bridge_layer" ), "current", &"ROADKILL_OBJECTIVE_BRIDGELAYER", ( 0, 0, 0 ) ); Objective_Current( obj( "bridge_layer" ) ); Objective_OnEntity( obj( "bridge_layer" ), level.foley ); Objective_SetPointerTextOverride( obj( "bridge_layer" ), &"SCRIPT_WAYPOINT_TARGETS" ); //SetSavedDvar( "compass", 1 ); // flag_wait( "player_enters_riverbank" ); //flag_wait( "riverbank_scene_starts" ); Objective_Position( obj( "bridge_layer" ), (0,0,0) ); flag_wait( "bridge_layer_attacked_by_bridge_baddies" ); wait 4.5; Objective_Position( obj( "bridge_layer" ), (-2519, -2457, 288) ); setsaveddvar( "compass", 1 ); flag_wait( "bridge_baddies_retreat" ); setsaveddvar( "compass", 0 ); flag_wait( "bridgelayer_crosses" ); objective_complete( obj( "bridge_layer" ) ); wait( 1.5 ); origin = ( -2488, -3755, 182 ); // Get in your Humvee. Objective_Add( obj( "convoy" ), "current", &"ROADKILL_OBJECTIVE_HUMVEE", origin ); Objective_Current( obj( "convoy" ) ); for ( ;; ) { if ( IsDefined( level.chair ) ) break; wait( 0.05 ); } Objective_OnEntity( obj( "convoy" ), level.chair ); flag_wait( "player_gets_in" ); objective_position( obj( "convoy" ), (0,0,0) ); // Standby for airstrike. Objective_String( obj( "convoy" ), &"ROADKILL_OBJECTIVE_AIRSTRIKE" ); flag_wait( "convoy_oscar_mike_after_explosion" ); objective_complete( obj( "convoy" ) ); } roadkill_ride_objective() { // Scan for hostile activity. Do not fire unless fired upon. Objective_Add( obj( "ride" ), "current", &"ROADKILL_OBJECTIVE_SCAN", ( 0, 0, 0 ) ); Objective_Current( obj( "ride" ) ); flag_wait( "shot_rings_out" ); wait( 4.5 ); // Destroy targets of opportunity. Objective_Add( obj( "ride" ), "current", &"ROADKILL_OBJECTIVE_TARGETS", ( 0, 0, 0 ) ); Objective_Current( obj( "ride" ) ); flag_wait( "player_knocked_down" ); } roadkill_dismount_objective() { if ( !is_default_start() ) { // Destroy targets of opportunity. Objective_Add( obj( "ride" ), "current", &"ROADKILL_OBJECTIVE_TARGETS", ( 0, 0, 0 ) ); } wait( 0.5 ); for ( ;; ) { if ( IsAlive( level.foley ) ) break; wait( 0.05 ); } Objective_OnEntity( obj( "ride" ), level.foley ); flag_wait( "sweep_dismount_building" ); node = GetNode( "dismount_obj_node", "targetname" ); // Get eyes on the school. Objective_String( obj( "ride" ), &"ROADKILL_OBJECTIVE_DISMOUNT" ); Objective_Position( obj( "ride" ), node.origin ); flag_wait( "friendlies_suppress_school" ); objective_complete( obj( "ride" ) ); } roadkill_school_objective() { trigger = getEntWithFlag( "roadkill_school_14" ); // Terminate the enemy presence in the school. Objective_Add( obj( "school" ), "current", &"ROADKILL_OBJECTIVE_SCHOOL", trigger.origin ); for ( ;; ) { if ( IsAlive( level.foley ) ) break; wait( 0.05 ); } AssertEx( IsAlive( level.foley ), "No foley no gamey" ); Objective_OnEntity( obj( "school" ), level.foley ); flag_wait( "roadkill_school_14" ); } roadkill_exfil_objective() { objective_complete( obj( "school" ) ); // node = GetNode( "outside_node", "targetname" ); flag_wait( "final_objective" ); // Terminate the enemy presence in the school. struct = getstruct( "roadkill_shepherd_ending_scene", "targetname" ); // Report to General Shepherd at the rally point. Objective_Add( obj( "exfil" ), "current", &"ROADKILL_OBJECTIVE_REPORT", struct.origin ); Objective_Current( obj( "exfil" ) ); } roadkill_mortars() { level endon( "time_to_go" ); mortar = self; mortars = []; mortars[ mortars.size ] = mortar; for ( ;; ) { if ( !isdefined( mortar.target ) ) break; mortar = getstruct( mortar.target, "targetname" ); mortars[ mortars.size ] = mortar; } waits = []; waits[ 0 ] = 0.3; waits[ 1 ] = 1.1; waits[ 2 ] = 0.5; waits[ 3 ] = 0.0; waits[ 4 ] = 1.3; waits[ 5 ] = 2.3; waits[ 6 ] = 1.6; waits[ 7 ] = 0.0; wait( 2.85 - 2.5 ); foreach ( mortar in mortars ) { mortar.water = IsDefined( mortar.script_noteworthy ) && mortar.script_noteworthy == "water"; } mortar_fx = getfx( "mortar_large" ); water_fx = getfx( "mortar_water" ); level.building_mortars = get_exploder_array( "building_mortar" ); for ( i = 0; ; i++ ) { i %= mortars.size; mortar = mortars[ i ]; if ( mortar.water ) { mortar.fx = water_fx; mortar.sound = "mortar_explosion_water"; } else { mortar.fx = mortar_fx; mortar.sound = "mortar_explosion_dirt"; } thread roadkill_mortar_goes_off( mortar ); mod = i % waits.size; wait( waits[ mod ] ); waits[ mod ] += 0.75;// next time we do this one, wait longer } } roadkill_mortar_goes_off( mortar ) { building_mortar = random( level.building_mortars ); building_mortar activate_individual_exploder(); wait( 2 ); thread play_sound_in_space( "artillery_incoming", mortar.origin ); wait( 0.5 ); PlayFX( mortar.fx, mortar.origin ); RadiusDamage( mortar.origin, 200, 300, 50 ); thread play_sound_in_space( mortar.sound, mortar.origin ); } detect_if_player_tries_to_cross_bridge() { level endon( "player_gets_in" ); flag_wait( "player_tries_to_cross_bridge" ); thread player_dies_to_attackers(); } player_dies_to_attackers() { wait( 2 ); level.player endon( "death" ); level.player delayCall( 3, ::EnableHealthShield, false ); eyepos = level.player GetEye(); org = undefined; SetDvar( "ui_deadquote", &"ROADKILL_GOT_SNIPED" ); // try to find an org that could see the player foreach ( org in level.player_killer_orgs ) { if ( BulletTracePassed( eyepos, org, true, undefined ) ) break; } assertex( isdefined( org ), "Impossible!" ); for ( ;; ) { thread play_sound_in_space( "weap_dragunovsniper_fire_npc", org ); level.player DoDamage( 45 / level.player.damagemultiplier, org ); timer = RandomFloatRange( 0.4, 0.7 ); wait( timer ); } } setup_player_killer_orgs() { level.player_killer_orgs = []; orgs = GetEntArray( "attack_point", "script_noteworthy" ); foreach ( org in orgs ) { level.player_killer_orgs[ level.player_killer_orgs.size ] = org.origin; } } bmp_becomes_javelin_targettable() { if ( IsDefined( self.script_noteworthy ) && self.script_noteworthy == "delayed_targeting" ) { if ( level.start_point != "move_out" ) wait( 10 ); } wait( 1 ); OFFSET = ( 0, 0, 60 ); Target_Set( self, OFFSET ); Target_SetAttackMode( self, "top" ); Target_SetJavelinOnly( self, true ); self thread set_javelin_targettable_var(); self.health = 20000; self godon(); self riverbank_bmp_is_shot_at(); if ( IsDefined( self ) ) { Target_Remove( self ); } } set_javelin_targettable_var() { self endon( "death" ); wait( 1.5 ); // used for start points self.javelin_targettable = true; } bmp_gets_killed() { level.riverside_bmp = self; } riverbank_bmp() { bmp_destroyed = GetEnt( "bmp_destroyed", "targetname" ); bmp_destroyed thread bmp_destroyed(); //array_spawn_function_targetname( "riverbank_bmp", ::bmp_becomes_javelin_targettable ); array_spawn_function_targetname( "riverbank_bmp", ::bmp_gets_killed ); bmp = spawn_vehicle_from_targetname( "riverbank_bmp" ); bmp waittill( "death" ); exploder( "bmp_explosion" ); wait( 0.5 ); bmp_destroyed notify( "destroyed" ); bmp Delete(); exploder( "bmp" ); } riverbank_bmp_is_shot_at() { self endon( "death" ); for ( ;; ) { if ( !isalive( self ) ) { break; } oldHealth = self.health; self waittill( "damage", dmg, attacker, one, two, weapType ); if ( IsDefined( attacker.classname ) && !isplayer( attacker ) ) { self.health = oldHealth; continue; } if ( weapType != "MOD_PROJECTILE" ) continue; if ( dmg < 800 ) continue; // if ( !player_has_javelin() ) // continue; // level.javelin_helper delayThread( 1, ::anim_single_queue, level.javelin_helper, "hit_target_" + level.bmps_killed_by_player ); self godoff(); RadiusDamage( self.origin, 150, self.health + 500, self.health + 500 ); } } bmp_destroyed() { self Hide(); targ = GetEnt( self.target, "targetname" ); angles = targ.angles; origin = targ.origin; targ Delete(); self waittill( "destroyed" ); self Show(); wait( 5 ); movetime = 8; self MoveTo( origin, movetime, 0, 2 ); self RotateTo( angles, movetime, 0, 2 ); } intro_orders() { spawners = GetEntArray( self.target, "targetname" ); guys = array_spawn( spawners ); guys[ 0 ].animname = "hargrove"; guys[ 1 ].animname = "foley"; self thread anim_single( guys, "roadkill_intro_orders" ); wait( 0.05 ); guy = undefined; foreach ( guy in guys ) { animation = guy getanim( "roadkill_intro_orders" ); guy SetAnim( animation, 1, 0, 0 ); guy SetAnimTime( animation, 0.25 ); } flag_wait( "player_climbs_stairs" ); foreach ( guy in guys ) { animation = guy getanim( "roadkill_intro_orders" ); guy SetAnim( animation, 1, 0, 1 ); } for ( ;; ) { animation = guy getanim( "roadkill_intro_orders" ); if ( guy GetAnimTime( animation ) >= 0.78 ) break; wait( 0.05 ); } foreach ( guy in guys ) { guy anim_stopanimscripted(); } } ai_invulnerable() { if ( IsDefined( self.script_drone ) ) return; if ( IsDefined( self.script_godmode ) ) return; if ( !isdefined( self.magic_bullet_shield ) ) self magic_bullet_shield(); self.attackeraccuracy = 0; self.IgnoreRandomBulletDamage = true; } extra_bmp_blows_up() { // wait( 12.15 ); flag_wait( "100ton_bomb_goes_off" ); wait( 1 ); RadiusDamage( self.origin, 128, 5000, 5000 ); } player_fights_bmps() { bridge_targets = GetEntArray( "bridge_target", "targetname" ); orgs = get_orgs_from_ents( bridge_targets, true ); // array_spawn_function_targetname( "extra_bmp", ::bmp_targets_bridge, orgs ); // spawn_vehicles_from_targetname_and_drive( "extra_bmp" ); // flag_wait( "missile_fire_3" ); flag_wait( "leaving_riverbank" ); flag_wait( "bridgelayer_crosses" ); /* foreach ( guy in level.stair_block_guys ) { guy Delete(); } */ foreach ( guy in level.stair_block_guys ) { guy thread run_to_convoy(); } player_stair_blocker = GetEnt( "player_stair_blocker", "targetname" ); player_stair_blocker Delete(); flag_clear( "player_climbs_stairs" ); } bmp_targets_bridge( orgs ) { self endon( "death" ); self waittill( "reached_end_node" ); self endon( "death" ); ent = Spawn( "script_origin", ( 0, 0, 0 ) ); ent.origin = orgs[ 0 ].origin; self SetTurretTargetEnt( ent ); self.target_ent = ent; self tank_fires_often( orgs ); } idle_commander() { self magic_bullet_shield(); // self.ignoreall = true; // self.team = "neutral"; // self disable_pain(); // self.grenadeawareness = 0; // self.disableBulletWhizbyReaction = true; } dismount_foley() { level.foley = self; self make_hero(); } dismount_dunn() { level.dunn = self; self make_hero(); } foley_line( msg ) { level.dialogue_function_stack_struct function_stack( ::foley_line_proc, msg ); } foley_line_proc( msg ) { if ( !flag( "player_gets_in" ) ) { level.foley generic_dialogue_queue( msg ); return; } if ( !flag( "player_enters_ambush_house" ) ) { if ( IsDefined( level.crazy_ride_convoy[ "lead" ] ) && !flag( "player_is_dismounted" ) ) { level.crazy_ride_convoy[ "lead" ] generic_dialogue_queue( msg ); } else { if ( IsAlive( level.foley ) ) { level.foley generic_dialogue_queue( msg ); } else { level.player generic_dialogue_queue( msg ); } } return; } level.foley generic_dialogue_queue( msg ); } driver_line( msg ) { level.dialogue_function_stack_struct function_stack( ::driver_line_proc, msg ); } driver_line_proc( alias ) { play_line_at_offset_on_player_vehicle( alias, ( -100, 100, -80 ) ); } passenger_line( msg ) { level.dialogue_function_stack_struct function_stack( ::passenger_line_proc, msg ); } passenger_line_proc( alias ) { play_line_at_offset_on_player_vehicle( alias, ( -100, 0, -80 ) ); } play_line_at_offset_on_player_vehicle( alias, offset ) { player_vehicle_angles = level.crazy_ride_convoy[ "player" ].angles; angles = ( 0, player_vehicle_angles[ 1 ], 0 ); ent = Spawn( "script_origin", ( 0, 0, 0 ) ); ent LinkTo( level.crazy_ride_convoy[ "player" ], "tag_body", offset, ( 0, 0, 0 ) ); ent play_sound_on_entity( alias ); ent Delete(); } dunn_line( msg ) { level.dialogue_function_stack_struct function_stack( ::dunn_line_proc, msg ); } dunn_line_proc( msg ) { if ( !flag( "player_gets_in" ) ) { if ( isalive( level.dunn ) ) { level.dunn generic_dialogue_queue( msg ); } else { magic_dialogue_queue( msg, "ar3" ); } return; } if ( !flag( "player_enters_ambush_house" ) ) { if ( IsDefined( level.crazy_ride_convoy[ "player" ] ) && !flag( "player_is_dismounted" ) ) { level.crazy_ride_convoy[ "player" ] generic_dialogue_queue( msg ); } else { if ( IsAlive( level.dunn ) ) { level.dunn generic_dialogue_queue( msg ); } else { level.player generic_dialogue_queue( msg ); } } return; } level.dunn generic_dialogue_queue( msg ); } shepherd_line( msg ) { level.dialogue_function_stack_struct function_stack( ::shepherd_line_proc, msg ); } shepherd_line_proc( msg ) { if ( IsAlive( level.shepherd ) ) { level.shepherd generic_dialogue_queue( msg ); } else { if ( !isdefined( level.scr_radio[ msg ] ) ) level.scr_radio[ msg ] = level.scr_sound[ "generic" ][ msg ]; radio_dialogue( msg ); } } player_is_safe() { for ( ;; ) { axis = GetAIArray( "axis" ); guy = getClosest( level.player.origin, axis, 600 ); if ( !isalive( guy ) ) break; wait( 0.2 ); } wait( 0.75 ); } respawn_dead_school_window_guys() { // find which guys are currently alive, respawn the spawners that aren't currently alive used_exports = []; ai = GetAIArray( "axis" ); foreach ( guy in ai ) { used_exports[ guy.export ] = true; } foreach ( spawner in level.school_ambush_spawners ) { if ( !isdefined( used_exports[ spawner.export ] ) ) { spawner.count = 1; spawner spawn_ai(); } } } radio_line( msg ) { level.dialogue_function_stack_struct function_stack( ::radio_dialogue, msg ); } pistol_killer_spawner() { level.pistol_killer = self; self endon( "death" ); self magic_bullet_shield(); node = GetNode( self.target, "targetname" ); node thread anim_generic( self, "exposed_reload" ); wait( 0.05 ); animation = getGenericAnim( "exposed_reload" ); self SetAnim( animation, 1, 0, 0 ); self SetAnimTime( animation, 0.3 ); flag_wait( "player_rounds_end_corner" ); self SetAnim( animation, 1, 0, 1 ); self.a.pose = "crouch"; for ( ;; ) { if ( self GetAnimTime( animation ) > 0.90 ) break; wait( 0.05 ); } self.a.pose = "stand"; self notify( "killanimscript" ); /* self.bulletsinclip = 0; wait( 2.7 ); */ node = GetNode( "outside_node", "targetname" ); self SetGoalNode( node ); self disable_cqbwalk(); } roadkill_pistol_guy() { self.flashBangImmunity = true; self.ignoreall = true; self.ignoreme = true; self endon( "death" ); //self.allowdeath = true; self disable_pain(); self.health = 10000; self forceUseWeapon( "glock", "primary" ); self add_damage_function( ::bloody_pain_reverse ); thread shoot_randomly(); struct = getstruct( "backwards_struct", "targetname" ); struct thread anim_generic_custom_animmode( self, "gravity", "pistol_walk_back" ); self set_generic_deathanim( "pistol_death" ); waittill_notify_or_timeout( "damage", 1.5 ); thread fire_bullets_at_guy(); wait( 0.15 ); self thread anim_generic_custom_animmode( self, "gravity", "pistol_death" ); animation = self getGenericAnim( "pistol_death" ); time = GetAnimLength( animation ); self delayThread( 0.5, animscripts\shared::DropAIWeapon ); //wait( time - 0.05 ); wait( 0.9 ); self.a.nodeath = true; self Kill(); } shoot_randomly() { self endon( "death" ); self.baseaccuracy = 0; wait( 0.4 ); self Shoot(); wait( 0.8 ); self Shoot(); wait( 0.2 ); self Shoot(); wait( 0.45 ); self Shoot(); wait( 2 ); self Shoot(); } bloody_pain_reverse( damage, attacker, direction_vec, point, type, modelName, tagName ) { angles = direction_vec + ( 0, 180, 0 ); forward = AnglesToForward( angles ); up = AnglesToUp( angles ); fx = getfx( "headshot" ); PlayFX( fx, point, forward, up ); //Line( point, point + forward * 500, (1,0,0), 1, 1, 5000 ); } fire_bullets_at_guy() { struct = getstruct( "pistol_bullet_spawner", "targetname" ); targ = getstruct( struct.target, "targetname" ); vector = struct.origin - targ.origin; waits = []; waits[ 0 ] = 0.1; waits[ 1 ] = 0.1; waits[ 2 ] = 0.1; waits[ 3 ] = 0.2; waits[ 4 ] = 0.1; waits[ 5 ] = 0.1; waits[ 6 ] = 0.1; waits[ 7 ] = 0.25; count = 12; for ( i = 0; i < count; i++ ) { dest_org = targ.origin + randomvector( 40 ); MagicBullet( "m4m203_eotech", struct.origin, dest_org, level.player ); if ( IsDefined( waits[ i ] ) ) { wait( waits[ i ] ); } else { wait( 0.1 ); } } } player_shoot_detection_trigger() { wait_for_player_to_force_flee(); flag_set( "retreaters_run" ); level.player.threatbias = 5000; wait( 2 ); level.player.threatbias = 150; } wait_for_player_to_force_flee() { if ( flag( "roadkill_school_9" ) ) return; level endon( "roadkill_school_9" ); add_wait( ::flag_wait, "player_forces_enemy_to_flee" );// means player can see down the hall add_wait( ::player_shoots_at_enemies_in_school ); do_wait(); } player_shoots_at_enemies_in_school() { for ( ;; ) { self waittill( "trigger", other ); if ( !isalive( other ) ) continue; if ( other == level.player ) break; } } retreat_spawner() { self endon( "death" ); self.neverEnableCQB = true; flag_wait( "retreaters_run" ); // look at the player then make a break for it self SetLookAtEntity( level.player ); time = RandomFloatRange( 0.3, 0.9 ); wait( time ); self delayCall( 3, ::SetLookAtEntity ); school_flee_struct = getstruct( "school_flee_struct", "targetname" ); self maps\_spawner::go_to_node( school_flee_struct, "struct" ); } school_spawner_think() { self disable_cqbwalk(); self.neverEnableCQB = true; if ( !flag( "detour_convoy_slows_down" ) ) { self endon( "death" ); self.ignoreall = true; self.ignoreme = true; flag_wait( "detour_convoy_slows_down" ); self.ignoreall = false; self.ignoreme = false; return; } self.attackeraccuracy = 0.2; level.school_baddies[ level.school_baddies.size ] = self; // used the second time these guys spawn self waittill( "death" ); level notify( "school_spawner_death" ); } school_spawner_flee_node() { level waittill( "school_spawner_death" ); guys = level.school_baddies; guys = array_removeDead( guys ); node = GetNode( "class_flee_node", "targetname" ); guy = getClosest( node.origin, guys ); if ( IsAlive( guy ) ) { guy.combatMode = "cover"; guy endon( "death" ); guy SetGoalNode( node ); guy.goalradius = 64; guy waittill( "goal" ); guy.goalradius = 2000; } } fleeing_baddie_spawner() { self endon( "death" ); self.attackeraccuracy = 0; self.IgnoreRandomBulletDamage = true; old_dist = self.pathenemyfightdist; old_look = self.pathenemylookahead; self.pathenemyfightdist = 0; self.pathenemylookahead = 0; self.maxfaceenemydist = 32; self enable_sprint(); self waittill( "goal" ); wait( 1.5 ); self.attackeraccuracy = 1; self.IgnoreRandomBulletDamage = false; self.pathenemyfightdist = old_dist; self.pathenemylookahead = old_look; } stop_sprinting_trigger() { for ( ;; ) { self waittill( "trigger", other ); if ( !isalive( other ) ) continue; if ( first_touch( other ) ) { other delayThread( 1.4, ::disable_heat_behavior ); } } } damage_targ_trigger_think() { for ( ;; ) { self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName ); if ( !isalive( attacker ) ) continue; // if ( attacker != level.player ) // continue; if ( Distance( attacker.origin, self.origin ) > 940 ) continue; targ = getstruct( self.target, "targetname" ); RadiusDamage( targ.origin, 30, 5000, 5000 ); } self Delete(); } extra_retreat_spawner() { // if ( !isdefined( self.target ) ) // thread retreat_spawner(); self.neverEnableCQB = true; level.forced_bcs_callouts++; if ( level.forced_bcs_callouts == 1 ) { self play_sound_on_entity( "AB_2_order_action_suppress" ); } else if ( level.forced_bcs_callouts == 2 ) { wait( 0.15 ); self play_sound_on_entity( "AB_3_order_action_coverme" ); } } wave_right_trigger() { for ( ;; ) { self waittill( "trigger", other ); if ( !isalive( other ) ) continue; if ( other == level.foley ) break; } // I think I saw one run into that classroom. thread foley_line( "roadkill_fly_sawone" ); if ( flag( "roadkill_near_crossroads" ) ) { add_wait( ::flag, "school_back_baddies_dead" ); add_wait( ::flag, "roadkill_school_12" ); do_wait_any(); if ( flag( "roadkill_school_12" ) ) { flag_set( "roadkill_school_11" ); return; } } // other endon( "death" ); targ = getstruct( self.target, "targetname" ); targ anim_generic_reach( other, "cqb_wave" ); if ( IsAlive( other ) ) targ thread anim_generic( other, "cqb_wave" ); wait( 0.9 ); other enable_ai_color(); flag_set( "roadkill_school_11" ); // switches tracks so he doesn't go into the room he signaled /* if ( IsAlive( other ) ) other set_force_color( "b" ); // turn the green guy to a purple guy ai = GetAIArray( "allies" ); foreach ( guy in ai ) { if ( !isdefined( guy.script_forcecolor ) ) continue; if ( guy.script_forcecolor != "g" ) continue; guy set_force_color( "p" ); break; } */ } staircase_grenade() { flag_wait( "staircase_grenade" ); trigger = getEntWithFlag( "staircase_grenade" ); start = getstruct( trigger.target, "targetname" ); end = getstruct( start.target, "targetname" ); vector = end.origin - start.origin; angles = VectorToAngles( vector ); forward = AnglesToForward( angles ); velocity = forward * 450; MagicGrenadeManual( "fraggrenade", start.origin, velocity, 5 ); } detach_my_scr_model() { self Detach( level.scr_model[ self.animname ], "tag_inhand" ); } stair_block_guy() { level.stair_block_guys[ level.stair_block_guys.size ] = self; self add_riverbank_flags(); self endon( "death" ); struct = getstruct( self.script_linkto, "script_linkname" ); self.animname = struct.targetname; self gun_remove(); self.doing_looping_anim = true; // electronics_pda if ( IsDefined( level.scr_model[ self.animname ] ) ) { self Attach( level.scr_model[ self.animname ], "tag_inhand" ); self.convoy_func = ::detach_my_scr_model; } struct thread anim_loop_solo( self, "sit_around" ); flag_wait( "time_to_go" ); self gun_recall(); struct notify( "stop_loop" ); } rooftop_drone() { struct = getstruct( self.script_linkto, "script_linkname" ); self.animname = "generic"; offset = ( 0, 0, 100 ); struct.origin -= offset; ent = spawn_tag_origin(); ent.origin = struct.origin; ent.angles = struct.angles; self LinkTo( ent, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); ent MoveTo( ent.origin + offset, 1, 0.5, 0.5 ); struct anim_generic( self, "rooftop_turn" ); ent Delete(); self Delete(); } wobbly_fans() { fans = GetEntArray( "destructible_toy", "targetname" ); foreach ( fan in fans ) { if ( fan.destructible_type == "toy_ceiling_fan" ) fan thread fan_wobbles(); } } fan_wobbles() { self endon( "death" ); //self endon( "exploded" ); action_v = level.destructible_type[ self.destuctableInfo ].parts[ 0 ][ 0 ].v; animation = action_v[ "animation" ][ 0 ][ "anim" ]; for ( ;; ) { rate = RandomFloatRange( 0.01, 0.04 );// go slow for awhile self SetAnim( animation, 1, 0, rate ); timer = RandomFloatRange( 1.0, 2.5 ); wait( timer ); rate = RandomFloatRange( 0.01, 0.15 );// go a random speed self SetAnim( animation, 1, 0, rate ); timer = RandomFloatRange( 1.0, 3 ); wait( timer ); rate = RandomFloatRange( 0.05, 0.2 );// go a random speed self SetAnim( animation, 1, 0, rate ); timer = RandomFloatRange( 1.0, 3 ); wait( timer ); } } friendlies_get_on_exit_convoy_trigger() { for ( ;; ) { self waittill( "trigger", other ); if ( !isalive( other ) ) continue; if ( !first_touch( other ) ) continue; if ( !isdefined( other.running_loader ) ) continue; other thread friendly_gets_on_vehicle(); } } friendly_gets_on_vehicle() { self endon( "death" ); vehicle = undefined; level.ending_vehicles = array_randomize( level.ending_vehicles ); foreach ( ending_vehicle in level.ending_vehicles ) { used_positions = 0; foreach ( pos in ending_vehicle.usedpositions ) { if ( !pos ) used_positions++; } if ( used_positions ) { vehicle = ending_vehicle; break; } } if ( !isdefined( vehicle ) ) return; thread guy_runtovehicle_load( self, vehicle ); } friendly_ending_runner_spawner() { self.running_loader = true; self.fixednode = false; node = GetNode( "friendly_exit_node", "targetname" ); self SetGoalNode( node ); self.goalradius = 64; } shepherd_ending_spawner() { level.shepherd = self; thread player_loses_gun_at_close_range(); self.animname = "shepherd"; self.disablearrivals = true; self.disableexits = true; self gun_remove(); // Transport the wounded directly to the shock trauma unit! Use my helicopter! I'll take the next one out! thread shepherd_line( "roadkill_shp_shocktrauma" ); struct = getstruct( "roadkill_shepherd_ending_scene", "targetname" ); struct anim_first_frame_solo( self, "ending" ); Objective_OnEntity( obj( "exfil" ), self ); flag_wait( "start_shepherd_end" ); // flag_wait( "the_end" ); thread roadkill_ending_dialogue(); //thread maps\roadkill_anim::point_start( self ); node = GetNode( "shepherd_lookout_node", "targetname" ); self SetGoalNode( node ); self.goalradius = 8; self set_generic_run_anim( "walk" ); scene = "ending"; animation = self getanim( scene ); time = getanimlength( animation ); self delaythread( time * 0.332, maps\roadkill_anim::point_start, self ); //struct anim_single_solo( self, "ending" ); struct anim_custom_animmode_solo( self, "gravity", scene ); } player_loses_gun_at_close_range() { self endon( "death" ); level.player endon( "death" ); for ( ;; ) { if ( distance( level.player.origin, self.origin ) < 200 ) break; wait( 0.05 ); } for ( ;; ) { eyepos = self geteye(); if ( level.player WorldPointInReticle_Circle( eyepos, 65, 75 ) ) break; wait( 0.05 ); } level.player DisableWeapons(); } roadkill_ending_dialogue() { wait( 9.8 ); // Battalion is oscar mike!!! thread random_ai_line( "roadkill_ar4_oscarmike" ); wait( 0.4 ); // Anybody got a spare MRE? //thread random_ai_line( "roadkill_ar1_sparemre" ); wait( 0.3 ); } ending_hangout_spawner() { self set_generic_run_anim( "walk" ); } ride_adjust_convoy_speed_trigger() { /* // give the lead vehicle some distance trigger = GetEnt( "ride_adjust_convoy_speed_trigger", "targetname" ); trigger waittill( "trigger", other ); other Vehicle_SetSpeed( 10, 1, 1 ); wait( 12 ); other ResumeSpeed( 1 ); */ } ignore_and_delete() { self endon( "death" ); self.ignoreme = true; self.ignoreall = true; self waittill( "goal" ); wait( 0.5 ); self waittill( "goal" ); self Delete(); } wait_for_empty_queue() { if ( !isdefined( self.function_stack ) ) return; while ( self.function_stack.size > 0 ) { wait( 0.05 ); } } dunn_credits_player_with_kill( max_time ) { level endon( "dunn_no_commento" ); wait( max_time + 0.1 ); level.dialogue_function_stack_struct wait_for_empty_queue(); if ( !flag( "jumper_died" ) ) return; // Nevermind, Allen handled it dunn_line( "roadkill_cpd_handledit" ); } look_forward_nag() { if ( flag( "ride_looking_forward" ) ) return; level endon( "ride_looking_forward" ); wait( 3 ); // Eyes forward, Allen. Look alive. foley_line( "roadkill_fly_eyesforward" ); } gunner_becomes_invul() { turret = self.mgturret[ 0 ]; for ( ;; ) { gunner = turret GetTurretOwner(); if ( IsAlive( gunner ) ) { if ( !isdefined( gunner.magic_bullet_shield ) ) gunner magic_bullet_shield(); return; } wait( 0.05 ); } } get_gunner_from_vehicle() { foreach ( guy in self.riders ) { if ( !isalive( guy ) ) continue; if ( !issentient( guy ) ) continue; if ( IsDefined( guy GetTurret() ) ) return guy; } } structorama() { for ( ;; ) { struct = getstruct( "mortar_school_chain", "targetname" ); struct delayThread( 1, ::struct_mortar ); struct = getstruct( struct.target, "targetname" ); struct delayThread( 1.3, ::struct_mortar ); struct = getstruct( struct.target, "targetname" ); struct delayThread( 1.6, ::struct_mortar ); wait( 5 ); } } struct_mortar() { thread play_sound_in_space( "artillery_incoming_loud", self.origin ); wait( 1 ); mortar_fx = getfx( "mortar_large" ); PlayFX( mortar_fx, self.origin ); RadiusDamage( self.origin, 100, 500, 500, level.player ); thread play_sound_in_space( "mortar_explosion_dirt", self.origin ); PhysicsExplosionSphere( self.origin, 100, 100, 2 ); } smoke_degrades() { wait( 2.5 ); self.degrade_time += 0.05; wait( 1 ); self.degrade_time += 0.05; wait( 1 ); self.degrade_time += 0.05; wait( 1 ); //self.degrade_time += 0.05; self notify( "done" ); } turret_burns_out() { // ent delayThread( 4.5, ::send_notify, "done" ); ent = SpawnStruct(); ent endon( "done" ); ent.degrade_time = 0; ent thread smoke_degrades(); level endon( "kaboom_to_detour_vehicle" ); fx = getfx( "minigun_burnout" ); for ( ;; ) { PlayFXOnTag( fx, self, "j_spin" ); timer = 0; if ( ent.degrade_time > 0 ) { timer += RandomFloat( ent.degrade_time ); } timer += 0.035; wait( timer ); } } vehicle_resumespeed_trigger() { if ( flag( "convoy_slows_down_again" ) ) return; level endon( "convoy_slows_down_again" ); for ( ;; ) { self waittill( "trigger", other ); if ( !first_touch( other ) ) continue; other Vehicle_SetSpeed( 8.2, 5, 5 ); } } player_convoy_encounters_baddies() { trigger = GetEnt( "vehicle_resumespeed_trigger", "targetname" ); trigger thread vehicle_resumespeed_trigger(); player_vehicle = level.crazy_ride_convoy[ "player" ]; detour_vehicle = level.crazy_ride_convoy[ "detour" ]; lead_vehicle = level.crazy_ride_convoy[ "lead" ]; rear_vehicle = level.crazy_ride_convoy[ "rear" ]; gunner = detour_vehicle get_gunner_from_vehicle(); flag_wait( "shot_rings_out" ); wait( 1.5 ); faster = 10.2; lead_vehicle delayCall( 0, ::Vehicle_SetSpeed, faster, 10, 10 ); detour_vehicle delayCall( 0.45, ::Vehicle_SetSpeed, faster, 10, 10 ); rear_vehicle delayCall( 0.8, ::Vehicle_SetSpeed, faster, 10, 10 ); player_vehicle delayCall( 1.2, ::Vehicle_SetSpeed, faster, 10, 10 ); flag_wait( "haggerty_rechambers" ); level.timer = GetTime(); delayThread( 1.1, ::rpg_hits_hydrant ); vehicle = detour_vehicle; node = GetVehicleNode( "detour_vehicle_path", "targetname" ); // veers off to the left vehicle thread vehicle_paths( node ); vehicle StartPath( node ); node = GetVehicleNode( "player_detour_vehicle_path", "targetname" ); player_vehicle thread vehicle_paths( node ); player_vehicle StartPath( node ); level notify( "convoy_continues_to_ambush" ); // flag_wait( "trappers_run" ); // array_spawn_noteworthy( "rpg_ambush_spawner" ); flag_wait( "detour_convoy_slows_down" ); rear_vehicle delayCall( 2.5, ::Vehicle_SetSpeed, 0, 10, 10 ); lead_vehicle delayCall( 2.5, ::Vehicle_SetSpeed, 0, 10, 10 ); attractor = Missile_CreateAttractorEnt( level.crazy_ride_convoy[ "detour" ], 25000, 1024 ); slower = 6; // threadoff() <- and threadoff was born detour_vehicle Vehicle_SetSpeed( slower, 10, 10 ); wait( 0.1 ); player_vehicle Vehicle_SetSpeed( slower, 10, 10 ); // flag_wait( "rpg_ambush" ); flag_wait( "gunner_dies" ); if ( IsAlive( gunner ) ) { if ( IsDefined( gunner.magic_bullet_shield ) ) gunner stop_magic_bullet_shield(); eye = gunner GetEye(); MagicBullet( "ak47", eye + ( 0, 0, 35 ), eye + ( 0, 0, -35 ) ); } flag_wait( "rpg_super_ambush" ); ai = GetAIArray( "axis" ); foreach ( guy in ai ) { // no more rpgs fire like crazy guy.a.rockets = 0; } trigger = getEntWithFlag( "rpg_ambush" ); start = GetEnt( trigger.target, "targetname" ); end = GetEnt( start.target, "targetname" ); //array_spawn_function_targetname( "rpg_vehicle", ::rpg_vehicle ); //spawn_vehicle_from_targetname_and_drive( "rpg_vehicle" ); //detour_vehicle Vehicle_SetSpeed( 9, 10, 10 ); timer = GetTime(); //wait( 0.5 ); rear_vehicle.veh_brake = 0.1; rear_vehicle delayThread( 1.5, ::set_brakes, 1 ); angles = detour_vehicle.angles; forward = AnglesToForward( angles ); right = AnglesToRight( angles ); struct = getstruct( "ambush_impact_vector", "targetname" ); target = getstruct( struct.target, "targetname" ); velocity_angles = VectorToAngles( target.origin - struct.origin ); velocity_forward = AnglesToForward( velocity_angles ); velocity = velocity_forward * 1; // LOTS OF EXPLOSIONS contact_point = right * -30 + forward * - 30 + ( 0, 0, -10 ); //Print3d( detour_vehicle.origin + contact_point, "x", (1,0,0), 1, 1.2, 500 ); //detour_vehicle VehPhys_Launch( velocity, (0,0,0), contact_point ); PhysicsExplosionSphere( detour_vehicle.origin + contact_point, 48, 32, 3 ); level notify( "kaboom_to_detour_vehicle" ); mortar_fx = getfx( "mortar_large" ); PlayFX( mortar_fx, detour_vehicle.origin + contact_point ); //detour_vehicle Vehicle_SetSpeed( 0, 10, 10 ); detour_vehicle godoff(); RadiusDamage( detour_vehicle.origin, 64, 50000, 50000 ); Earthquake( 0.7, 1.2, level.player.origin, 5000 ); level.player PlayRumbleOnEntity( "damage_heavy" ); level.player ShellShock( "default", 5 ); detour_vehicle.veh_brake = 0.15; thread vision_set_fog_changes( "roadkill_ambush", 0.8 ); flag_set( "ambush" ); Missile_DeleteAttractor( attractor ); // keep other missiles away repulsor = Missile_CreateRepulsorEnt( level.player, 700, 1500 ); wait( 0.7 ); player_vehicle.veh_brake = 0.05;// player starts to brake wait( 0.5 ); //rear_vehicle Vehicle_SetSpeed( 0, 10, 10 ); //rear_vehicle.veh_brake = 1; // player brakes player_vehicle delayThread( 0.7, ::set_brakes, 1 ); wait_around_time = 3.2; // rpg flies by delayThread( 2.00 + wait_around_time, ::rpg_flies_by_view ); lead_vehicle delayCall( 5.0, ::resumespeed, 5 ); wait( 1.25 + wait_around_time ); player_vehicle.veh_transmission = "reverse"; player_vehicle.veh_pathdir = "reverse"; player_vehicle Vehicle_SetSpeed( 16, 5, 5 ); player_vehicle.veh_brake = 0; wait( 1.8 ); player_vehicle.veh_brake = 1; wait( 0.7 ); player_vehicle.veh_brake = 0; player_vehicle.veh_transmission = "forward"; player_vehicle.veh_pathdir = "forward"; // player gets back on path node = GetVehicleNode( "player_gets_back_on_path", "targetname" ); player_vehicle thread vehicle_paths( node ); player_vehicle StartPath( node ); player_vehicle ResumeSpeed( 5 ); // rear_vehicle delayCall( 0.65, ::resumespeed, 5 ); rear_vehicle ResumeSpeed( 5 ); // player_vehicle Vehicle_SetSpeed( 24, 5, 5 ); noself_delayCall( 2, ::Missile_DeleteAttractor, repulsor ); wait( 0.8 ); // rear_vehicle Vehicle_SetSpeed( 24, 5, 5 ); rear_vehicle.veh_brake = 0; } rpg_hits_hydrant() { array_spawn_function_targetname( "window_rpg_hydrant", ::rpg_vehicle ); vehicle = spawn_vehicle_from_targetname_and_drive( "window_rpg_hydrant" ); vehicle waittill( "death" ); thread hydrant_hit(); } rpg_flies_by_view() { array_spawn_function_targetname( "window_rpg_vehicle", ::rpg_vehicle ); vehicle = spawn_vehicle_from_targetname_and_drive( "window_rpg_vehicle" ); vehicle waittill( "death" ); struct = getstruct( "dyn_explosion_struct", "targetname" ); // PhysicsExplosionSphere( struct.origin, 350, 350, 3 ); level.player delayThread( 3, maps\_gameskill::grenade_dirt_on_screen, "left" ); struct = getstruct( "dyn_spawner_struct", "targetname" ); targ = getstruct( struct.target, "targetname" ); models = []; models[ 0 ] = "me_woodcrateclosed"; models[ 1 ] = "com_cardboardboxshortclosed_2"; offsets = []; offsets[ 0 ] = ( 0, 0, 8 ); offsets[ 1 ] = ( 0, 0, 4.5 ); forcemult = []; forcemult[ 0 ] = 4; forcemult[ 1 ] = 1; fx = getfx( "rocket_explode" ); PlayFX( fx, struct.origin ); thread play_sound_in_space( "rocket_explode_dirt", struct.origin, true ); PhysicsExplosionSphere( struct.origin, 320, 280, 4 ); RadiusDamage( struct.origin, 320, 50, 50 ); for ( i = 0; i < 14; i++ ) { end = targ.origin + randomvector( 128 ); vec = end - struct.origin; angles = VectorToAngles( vec ); forward = AnglesToForward( angles ); index = RandomInt( models.size ); ent = Spawn( "script_model", struct.origin ); ent SetModel( models[ index ] ); force = forward; force *= 18000; force *= forcemult[ index ]; force *= RandomFloatRange( 0.9, 1.6 ); offset = offsets[ index ] + randomvector( 1.2 ); ent PhysicsLaunchClient( ent.origin + offset, force ); } } vehicle_physics_explosion() { rpg_physics = GetEnt( "rpg_physics", "targetname" ); targ = GetEnt( rpg_physics.target, "targetname" ); rpg_physics_dest = GetEnt( "rpg_physics_dest", "targetname" ); targ_dest = GetEnt( rpg_physics_dest.target, "targetname" ); time = 0.3; rpg_physics MoveTo( rpg_physics_dest.origin, time ); targ MoveTo( targ_dest.origin, time ); start_time = GetTime(); time *= 1000; power = 6.25; vec = targ.origin - rpg_physics.origin; angles = VectorToAngles( vec ); forward = AnglesToForward( angles ); vec = forward * power; power *= 0.35; level.crazy_ride_convoy[ "detour" ] VehPhys_Launch( vec, 1.0 ); /* delayThread( 0.25, ::reverse_force ); for ( ;; ) { vec = targ.origin - rpg_physics.origin; angles = VectorToAngles( vec ); forward = AnglesToForward( angles ); vec = forward * power; power *= 0.35; // PhysicsExplosionSphere( rpg_physics.origin, rpg_physics.radius, rpg_physics.radius, 30 ); PhysicsJolt( rpg_physics.origin, rpg_physics.radius, rpg_physics.radius, vec ); Line( rpg_physics.origin, targ.origin, (1,0,0), 1, 0, 50 ); wait( 0.05 ); if ( GetTime() > start_time + time ) break; } */ // PhysicsExplosionCylinder( rpg_physics.origin, rpg_physics.radius, rpg_physics.radius, 30 ); //Print3d( rpg_physics.origin, "30" ); //wait( 0.05 ); //} } reverse_force() { reverse_force = GetEnt( "reverse_force", "targetname" ); targ = GetEnt( reverse_force.target, "targetname" ); vec = targ.origin - reverse_force.origin; angles = VectorToAngles( vec ); forward = AnglesToForward( angles ); vec = forward * 3.5; PhysicsJolt( reverse_force.origin, 350, 350, vec ); Line( reverse_force.origin, targ.origin, ( 0, 0, 1 ), 1, 0, 500 ); } rpg_vehicle() { self SetModel( "projectile_rpg7" ); fx = getfx( "rpg_trail" ); PlayFXOnTag( fx, self, "tag_origin" ); fx = getfx( "rpg_muzzle" ); PlayFXOnTag( fx, self, "tag_origin" ); self waittill( "reached_end_node" ); flag_set( "rpg_end" ); self Delete(); } ride_scenes() { //thread street_runner_scene(); thread favela_flee_alley(); thread roof_backup_scene(); thread civ_balcony(); thread garage_scene(); thread window_waver(); thread alley_runners(); //thread corner_hider(); array_spawn_function_noteworthy( "flee_if_seen", ::flee_if_seen ); array_spawn_function_noteworthy( "run_and_delete", ::run_and_delete ); } run_and_delete() { self.ignoreme = true; self.ignoreall = true; self endon( "death" ); if ( IsDefined( self.script_delay ) ) { self SetGoalPos( self.origin ); self.goalradius = 8; script_delay(); self thread maps\_spawner::go_to_node(); } self waittill( "reached_path_end" ); self Delete(); } flee_if_seen() { self.ignoreme = true; self.ignoreall = true; self endon( "death" ); start_pos = self.origin; self waittill( "goal" ); wait( 0.5 ); add_wait( ::player_looks_at_me ); add_wait( ::_wait, 4 ); do_wait_any(); self SetGoalPos( start_pos ); self.goalradius = 8; self waittill( "goal" ); self Delete(); } player_looks_at_me() { self endon( "death" ); for ( ;; ) { if ( within_fov_of_players( self.origin, 0.75 ) ) return; wait( 0.05 ); } } corner_hider() { array_spawn_function_noteworthy( "corner_hider_spawner", ::corner_hider_spawner ); //array_spawn_noteworthy( "corner_hider_spawner" ); } bloody_pain( amount, attacker, dir, point, type, a, b ) { fx = getfx( "headshot" ); forward = AnglesToForward( dir ); up = AnglesToUp( dir ); PlayFX( fx, point, forward, up ); //Line( point, point + forward * 500, (1,0,0), 1, 1, 5000 ); } corner_hider_spawner() { self endon( "death" ); self set_generic_deathanim( "facedown_death" ); self add_damage_function( ::bloody_pain_reverse ); self.health = 5000; // targets this guy so he is looking back //turret_alley_target = GetEnt( "turret_alley_target", "targetname" ); turret = level.crazy_ride_convoy[ "detour" ].mgturret[ 0 ]; turret SetMode( "manual" ); turret SetTargetEntity( self ); turret.dontshoot = true; owner = turret GetTurretOwner(); if ( IsAlive( owner ) ) owner.ignoreall = true; trigger = GetEnt( "detour_shoots_alley_guy_trigger", "targetname" ); for ( ;; ) { trigger waittill( "trigger", other ); if ( other == level.crazy_ride_convoy[ "detour" ] ) break; wait( 0.05 ); } //wait( 1.35 ); flag_set( "trapper_spawners_ignoreme" ); turret.dontshoot = undefined; wait( 0.5 ); //self waittill( "damage" ); struct = getstruct( "run_death_facedown", "targetname" ); struct thread anim_generic_gravity( self, "facedown_death" ); wait( 1 ); self.a.nodeath = true; self Kill(); /* node = GetNode( self.script_linkto, "script_linkname" ); struct = getstruct( self.target, "targetname" ); self.ignoreme = true; self.ignoreall = true; self endon( "death" ); self.animname = "flee_alley"; self.favoriteenemy = level.player; self.goalradius = 8; self SetGoalNode( node ); self SetLookAtEntity( level.player ); self disable_long_death(); //wait( 2.34 ); flag_wait( "ambush_guy_attacks" ); // next node node = GetNode( node.script_linkto, "script_linkname" ); self SetGoalNode( node ); self.goalradius = 8; self.a.pose = "stand"; self.a.movement = "run"; // increase the time over which he blends in anim custom animmode self.anim_blend_time_override = 1; thread jumper_shoots_car_fx(); struct anim_custom_animmode_solo( self, "gravity", "flee_shooting" ); self SetLookAtEntity(); self waittill( "goal" ); level notify( "jumper_reached_goal" ); self Delete(); */ } jumper_shoots_car_fx() { self endon( "death" ); struct = getstruct( "jumper_fx", "targetname" ); dirt_fx = getfx( "car_dirt" ); spark_fx = getfx( "car_spark" ); count = 0; for ( ;; ) { self waittillmatch( "custom_animmode", "fire_spray" );// whatever count++; link = getstruct( struct.script_linkto, "script_linkname" ); angles = VectorToAngles( link.origin - struct.origin ); forward = AnglesToForward( angles ); fx = dirt_fx; alias = "bullet_large_dirt"; if ( count > 6 ) { fx = spark_fx; alias = "bullet_large_metal"; //Line( struct.origin, struct.origin + forward * 50, (1,1,0), 1, 0, 150 ); } else { //Line( struct.origin, struct.origin + forward * 50, (1,0,0.5), 1, 0, 150 ); } thread play_sound_in_space( alias, struct.origin ); PlayFX( fx, struct.origin, forward ); if ( !isdefined( struct.target ) ) break; struct = getstruct( struct.target, "targetname" ); if ( count > 9 ) level.player DoDamage( 20 / level.player.damageMultiplier, self.origin, self, self ); } for ( ;; ) { level.player DoDamage( 20 / level.player.damageMultiplier, self.origin, self, self ); self waittillmatch( "custom_animmode", "fire_spray" );// whatever } } alley_runners() { array_spawn_function_noteworthy( "alley_runner_spawner_first", ::alley_runner_spawner_first ); array_spawn_function_noteworthy( "alley_runner_spawner", ::alley_runner_spawner ); // array_spawn_noteworthy( "alley_runner_spawner_first" ); // array_spawn_noteworthy( "alley_runner_spawner" ); } alley_runner_spawner_first() { self endon( "death" ); self.ignoreme = true; self.ignoreall = true; struct = getstruct( self.target, "targetname" ); scene = struct.animation; struct anim_generic( self, scene ); self Delete(); } wall_climber_ragdolls_on_pain( amt, attacker, force, b, c, d, e ) { if ( attacker != level.player ) return; //self.allowdeath = true; //self Kill(); self StartRagdoll(); self remove_damage_function( ::wall_climber_ragdolls_on_pain ); } alley_runner_spawner() { self endon( "death" ); self add_damage_function( ::wall_climber_ragdolls_on_pain ); self disable_pain(); // self magic_bullet_shield(); self.ignoreall = true; self.ignoreme = true; self.disableBulletWhizbyReaction = true; self.ignoreSuppression = true; self.ignoreall = true; pauses = []; pauses[ "unarmed_climb_wall" ] = 1.2; pauses[ "unarmed_climb_wall_v2" ] = 0; struct = getstruct( self.target, "targetname" ); scene = struct.animation; pause = pauses[ scene ]; wait( pause ); struct anim_generic_reach( self, scene ); struct anim_generic( self, scene ); node = GetNode( "alley_runner_node", "targetname" ); self SetGoalNode( node ); self.goalradius = 8; self waittill( "goal" ); // self stop_magic_bullet_shield(); self Delete(); } favela_flee_alley() { // rounds a corner array_spawn_function_targetname( "favela_hide_spawner", ::favela_hide_spawner ); flag_wait( "start_runner" ); array_spawn_targetname( "favela_hide_spawner" ); } favela_hide_spawner() { self endon( "death" ); self.animname = "flee_alley"; struct = getstruct( self.target, "targetname" ); struct thread anim_loop_solo( self, "idle" ); wait( 5 ); struct notify( "stop_loop" ); struct thread anim_custom_animmode_solo( self, "gravity", "round_corner" ); animation = self getanim( "round_corner" ); for ( ;; ) { if ( self GetAnimTime( animation ) > 0.8 ) break; wait( 0.05 ); } self SetLookAtEntity( level.player ); struct = getstruct( "hide_house_scene", "targetname" ); struct anim_first_frame_solo( self, "hands_up" ); wait( 1.7 ); struct anim_single_solo( self, "hands_up" ); self safe_delete(); } window_waver() { flag_wait( "garage_door_scene" ); wait( 10 ); spawner = GetEnt( "window_wave_loop_spawner", "targetname" ); spawner.script_drone_override = true; // array_spawn_function_targetname( "window_wave_loop_spawner", ::window_wave_loop ); // array_spawn_targetname( "window_wave_loop_spawner" ); } window_wave_loop() { self endon( "death" ); self SetLookAtEntity( level.player ); start = self.origin; scene = self.script_noteworthy; struct = getstruct( self.target, "targetname" ); struct thread anim_generic_loop( self, scene ); wait( 13.4 ); struct notify( "stop_loop" ); self anim_stopanimscripted(); self SetGoalPos( start ); self.goalradius = 5; wait( 5 ); self Delete(); } garage_scene() { // garage_door_scene_left // garage_door_scene flag_wait( "garage_door_scene" ); run_thread_on_targetname( "garage_pull_struct", ::garage_pull_struct ); array_spawn_function_targetname( "garage_spawner", ::garage_spawner ); garage_spawner_right = GetEnt( "garage_spawner_right", "script_noteworthy" ); garage_spawner_left = GetEnt( "garage_spawner_left", "script_noteworthy" ); // garage_window_shouter_spawner = GetEnt( "garage_window_shouter_spawner", "script_noteworthy" ); garage_spawner = GetEnt( "garage_spawner", "script_noteworthy" ); garage_spawner_right delayThread( 0, ::spawn_ai ); //garage_window_shouter_spawner delayThread( 0, ::spawn_ai ); garage_spawner delayThread( 6.4, ::spawn_ai ); garage_spawner_left delayThread( 3.4, ::spawn_ai ); } garage_spawner() { self endon( "death" ); scene = self.script_noteworthy; start_org = self.origin; structs = []; structs[ "garage_spawner_right" ] = "garage_door_scene"; structs[ "garage_spawner_left" ] = "garage_door_scene_left"; structs[ "garage_spawner" ] = "garage_door_scene"; structs[ "garage_window_shouter_spawner" ] = self.target; self.moveplaybackrate = 1; if ( scene == "garage_spawner_right" ) { self.force_civilian_hunched_run = true; } else if ( scene == "garage_spawner_left" ) { self.force_civilian_stand_run = true; } if ( IsDefined( level.scr_anim[ "generic" ][ scene + "_run" ] ) ) { self set_generic_run_anim( scene + "_run", false ); } struct_name = structs[ scene ]; struct = getstruct( struct_name, "targetname" ); struct anim_generic_reach( self, scene ); if ( scene == "garage_spawner" ) { level.garage_puller = self; self disable_pain(); self magic_bullet_shield(); delayThread( 1.75, ::flag_set, "pull_garage" ); } struct anim_generic( self, scene ); return_to_goal = []; return_to_goal[ "garage_spawner_right" ] = false; return_to_goal[ "garage_spawner_left" ] = false; return_to_goal[ "garage_window_shouter_spawner" ] = true; return_to_goal[ "garage_spawner" ] = false; if ( !return_to_goal[ scene ] ) { self SetGoalPos( self.origin ); wait( 5 ); self safe_delete(); return; } self SetGoalPos( start_org ); self.goalradius = 4; self waittill( "goal" ); self safe_delete(); } garage_pull_struct() { // get the structs that control the height of the garage door lower_struct = self; mid_struct = getstruct( lower_struct.target, "targetname" ); top_struct = getstruct( mid_struct.target, "targetname" ); top_struct.origin += ( 0, 0, 10 );// buffer // get the brushes that make up the door brushes = []; brush = top_struct; for ( ;; ) { newbrush = GetEnt( brush.target, "targetname" ); brushes[ brushes.size ] = newbrush; if ( !isdefined( newbrush.target ) ) break; brush = newbrush; } start_height = mid_struct.origin[ 2 ] - lower_struct.origin[ 2 ]; // move the brushes up the start height foreach ( brush in brushes ) { brush.start_origin = brush.origin; brush.origin += ( 0, 0, start_height ); if ( brush.origin[ 2 ] > top_struct.origin[ 2 ] ) brush hide_notsolid(); } flag_wait( "pull_garage" ); thread play_sound_in_space( "scn_roadkill_garage_close", brushes[ 0 ].origin ); level delayThread( 0.95, ::send_notify, "stop_pulling" ); origins = []; origins[ origins.size ] = ( 0, 0, 420.637 ); origins[ origins.size ] = ( 0, 0, 420.62 ); origins[ origins.size ] = ( 0, 0, 419.686 ); origins[ origins.size ] = ( 0, 0, 418.499 ); origins[ origins.size ] = ( 0, 0, 415.63 ); origins[ origins.size ] = ( 0, 0, 413.791 ); origins[ origins.size ] = ( 0, 0, 412.708 ); origins[ origins.size ] = ( 0, 0, 411.595 ); origins[ origins.size ] = ( 0, 0, 411.204 ); origins[ origins.size ] = ( 0, 0, 410.838 ); origins[ origins.size ] = ( 0, 0, 411.314 ); origins[ origins.size ] = ( 0, 0, 411.756 ); origins[ origins.size ] = ( 0, 0, 412.38 ); origins[ origins.size ] = ( 0, 0, 412.633 ); origins[ origins.size ] = ( 0, 0, 409.838 ); origins[ origins.size ] = ( 0, 0, 401.405 ); origins[ origins.size ] = ( 0, 0, 388.418 ); // origins[ origins.size ] = ( 0, 0, 369.622 ); // origins[ origins.size ] = ( 0, 0, 369.832 ); // origins[ origins.size ] = ( 0, 0, 369.826 ); thread garage_brushes_move( brushes, lower_struct, origins ); for ( ;; ) { if ( !brushes.size ) break; foreach ( index, brush in brushes ) { if ( brush.origin[ 2 ] < top_struct.origin[ 2 ] ) { brush show_solid(); brushes[ index ] = undefined; } } wait( 0.05 ); } } garage_brushes_move( brushes, lower_struct, origins ) { level endon( "stop_pulling" ); PrintLn( " origins = [];" ); index = 0; for ( ;; ) { //hand_org = level.garage_puller GetTagOrigin( "tag_inhand" ); hand_org = origins[ index ]; index++; //println( " origins[ origins.size ] = ( 0, 0, " + hand_org[ 2 ] + " );" ); difference = hand_org[ 2 ] - lower_struct.origin[ 2 ]; foreach ( brush in brushes ) { brush MoveTo( brush.start_origin + ( 0, 0, difference ), 0.1, 0, 0 ); } if ( index >= origins.size ) break; wait( 0.05 ); } foreach ( brush in brushes ) { brush MoveTo( brush.start_origin, 0.2, 0.1, 0.1 ); } } street_runner_scene() { flag_wait( "start_runner" ); struct = getstruct( "street_runner_scene", "targetname" ); spawner = GetEnt( struct.target, "targetname" ); guy = spawner spawn_ai(); if ( spawn_failed( guy ) ) return; guy.animname = "street_runner"; animation = guy getanim( "scene" ); struct thread anim_custom_animmode_solo( guy, "gravity", "scene" ); wait( 0.05 ); guy SetAnimTime( animation, 0.18 ); guy endon( "death" ); guy.allowPain = true; guy.allowdeath = true; guy add_damage_function( ::player_fails_if_he_kills_me ); for ( ;; ) { if ( guy GetAnimTime( animation ) > 0.95 ) break; wait( 0.05 ); } goalnode = GetNode( guy.target, "targetname" ); guy SetGoalNode( goalnode ); guy.goalradius = 8; guy waittill( "goal" ); guy Delete(); } roof_backup_scene() { flag_wait( "start_runner" ); wait( 4 ); struct = getstruct( "roof_backup_scene", "targetname" ); spawner = GetEnt( struct.target, "targetname" ); guy = spawner spawn_ai(); if ( spawn_failed( guy ) ) return; guy.animname = "roof_backup"; animation = guy getanim( "scene" ); struct thread anim_single_solo( guy, "scene" ); wait( 0.05 ); guy SetAnimTime( animation, 0.2 ); guy endon( "death" ); guy.allowPain = true; guy.allowdeath = true; for ( ;; ) { if ( guy GetAnimTime( animation ) > 0.59 ) break; wait( 0.05 ); } guy Delete(); } civ_balcony() { flag_wait( "start_balcony" ); door = GetEnt( "civ_run_door", "targetname" ); trigger = GetEnt( "civ_door_trigger", "targetname" ); spawner = GetEnt( "civ_balcony_spawner", "targetname" ); struct = getstruct( "civ_balcony_physics", "targetname" ); // wait( 10.00 ); // open the door door ConnectPaths(); //door NotSolid(); door RotateYaw( -90, 1, 0.5, 0.5 ); guy = spawner spawn_ai(); if ( spawn_failed( guy ) ) return; node = GetNode( guy.target, "targetname" ); startpos = guy.origin; guy endon( "death" ); guy waittill( "goal" ); guy.goalradius = 8; wait( 0.35 ); // knock the cans off the balcony forward = AnglesToForward( struct.angles ); vec = forward * 0.15; PhysicsJolt( struct.origin, 32, 32, vec ); wait( 1.8 ); guy SetGoalPos( startpos ); // wait until he runs back inside trigger waittill( "trigger" ); // time to close the door behind him door RotateYaw( 90, 1, 0.5, 0.5 ); wait( 0.4 ); play_sound_in_space( "scn_doorpeek_door_slam", door.origin ); } grenade_barrage_if_you_delay() { // the time before you get grenades on you time = 10; frames = time * 20; count = 0; structs = getstructarray( "grenade_dismount_spawner", "targetname" ); structs = array_randomize( structs ); index = 0; wait_times = []; wait_times[ 0 ] = 3.2; wait_times[ 1 ] = 1.8; wait_times[ 2 ] = 0.5; wait_times[ 3 ] = 3.7; wait_times[ 4 ] = 1.3; wait_index = 0; for ( ;; ) { if ( flag( "player_inside_ambush_house" ) ) { if ( count > frames - 35 ) count = frames - 35; } else { count++; } if ( count >= frames ) { struct = random( structs ); struct throw_grenade(); index++; index %= structs.size; wait( wait_times[ wait_index ] ); wait_index++; wait_index %= wait_times.size; } wait( 0.05 ); } } dismount_enemy_spawner() { self SetThreatBiasGroup( "axis_dismount_attackers" ); self.dont_ride_kill = true; } throw_grenade() { target = getstruct( self.target, "targetname" ); time = RandomFloatRange( 3, 5 ); MagicGrenade( "fraggrenade", self.origin, target.origin, time ); } modify_dismount_spawner_threatbias() { for ( ;; ) { flag_wait( "player_inside_ambush_house" ); SetIgnoreMeGroup( "axis_dismount_attackers", "ally_with_player" ); SetIgnoreMeGroup( "ally_with_player", "axis_dismount_attackers" ); flag_waitopen( "player_inside_ambush_house" ); SetThreatBias( "axis_dismount_attackers", "ally_with_player", 0 ); SetThreatBias( "ally_with_player", "axis_dismount_attackers", 0 ); } } handle_player_exposing_himself_in_front_of_school() { flag_wait( "player_exposes_on_street" ); level.player SetThreatBiasGroup( "allies" ); thread player_dies_if_he_goes_too_far(); for ( ;; ) { flag_wait( "player_exposes_on_street" ); set_player_attacker_accuracy( 1000 ); level.player.noPlayerInvul = true; level.player.threatbias = 50000; level.player EnableHealthShield( false ); flag_waitopen( "player_exposes_on_street" ); maps\_gameskill::updateAllDifficulty(); level.player.noPlayerInvul = undefined; level.player.threatbias = 150; level.player EnableHealthShield( true ); } } player_dies_if_he_goes_too_far() { flag_clear( "player_dies_on_street" ); flag_wait( "player_dies_on_street" ); for ( ;; ) { ai = GetAIArray( "axis" ); guy = random( ai ); origin = ( 0, 0, 0 ); attacker = level.player; if ( IsAlive( guy ) ) { origin = guy GetEye(); attacker = guy; } level.player DoDamage( 25, origin ); delay = RandomFloatRange( 0.1, 0.3 ); wait( delay ); } } handle_start_points_for_detour_humvee() { switch( level.start_point ) { case "default": case "intro": case "riverbank": case "move_out": case "convoy": case "ride": case "ambush": return; } ride_vehicle_spawners = GetEntArray( "ride_vehicle_spawner", "targetname" ); foreach ( spawner in ride_vehicle_spawners ) { if ( spawner.script_index == 3 ) spawner Delete(); } } player_gets_max_health_for_dismount() { level.player endon( "death" ); time = 4; frames = time * 20; for ( i = 0; i < frames; i++ ) { level.player.health = level.player.maxhealth; wait( 0.05 ); } } intro_shepherd() { shepherd_roamer_spawner = GetEnt( "shepherd_roamer_spawner", "targetname" ); shepherd_roamer_spawner add_spawn_function( ::intro_shepherd_think ); shepherd_roamer_spawner spawn_ai(); } intro_shepherd_think() { thread shepherd_roams_battlefield( self.target ); } player_shepherd_fov() { start_time = gettime(); wait_for_buffer_time_to_pass( start_time, 7.0 ); ent = spawn_tag_origin(); // fov_ent fovent ent.origin = (65,0,0); ent thread manage_fov(); time = 0.5; level.player LerpViewAngleClamp( time, time, 0, 0,0,0,0 ); //ent MoveTo( (40,0,0), time, time, 0 ); wait_for_buffer_time_to_pass( start_time, 9.4 ); //ent MoveTo( (65,0,0), time, time * 0.5, time * 0.5 ); wait time; ent delete(); } manage_fov() { self endon( "death" ); for ( ;; ) { setsaveddvar( "cg_fov", self.origin[0] ); wait 0.05; } } shepherd_roams_battlefield( target ) { level.player allowprone( false ); level.player allowcrouch( false ); self endon( "death" ); self.animname = "shepherd"; self.ignoreall = true; self.disablearrivals = true; self.disableexits = true; self.grenadeawareness = 0; self disable_bulletwhizbyreaction(); self set_run_anim( "angry_walk" ); self gun_remove(); lookent = getent( "shepherd_lookat_target", "targetname" ); //self SetLookAtEntity( lookent ); gun = spawn_anim_model( "gun_model" ); //gun LinkTo( self, "tag_weapon_right", (0,0,0), (0,0,0) ); player_rig = spawn_anim_model( "player_rig" ); guys = []; guys[ "shepherd" ] = self; guys[ "gun" ] = gun; guys[ "player_rig" ] = player_rig; scene = "player_shep_intro"; animation = player_rig getanim( scene ); time = getanimlength( animation ); mortar_org = getstruct( "mortar_org", "targetname" ); delayThread( time - 1.6, ::roadkill_mortar_goes_off, mortar_org ); level.player delayThread( time - 0.2, maps\_gameskill::grenade_dirt_on_screen, "right" ); arc = 15; level.player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1 ); thread player_shepherd_fov(); struct = getstruct( "shepherd_get_in_fight", "targetname" ); struct thread anim_single( guys, scene ); //delaythread( 0, ::play_sound_on_entity, "roadkill_shp_ontheline" ); //level.player LerpViewAngleClamp( 1, 0.5, 0.5, 0,0,0,0 ); struct waittill ( scene ); level.player unlink(); level.player allowprone( true ); level.player allowcrouch( true ); player_rig delete(); gun delete(); flag_set( "get_on_the_line" ); node = getnode( "shepherd_dest_node", "targetname" ); self setgoalnode( node ); self.goalradius = 8; flag_wait( "shepherd_leaves" ); self stop_magic_bullet_shield(); thread shepherd_bridge_scene( self ); } shepdamage_bullet_thread() { self endon( "death" ); for ( ;; ) { self waittill( "bullethit", other ); if ( other == level.player ) { // Friendly fire will not be tolerated! SetDvar( "ui_deadquote", &"SCRIPT_MISSIONFAIL_KILLTEAM_AMERICAN" ); // friendly fire will not be tolerated missionfailedwrapper(); } } } shepdamage_damage_thread() { self endon( "death" ); for ( ;; ) { self waittill( "damage", dmg, attacker, one, two, weapType ); if ( !isalive( attacker ) ) continue; if ( attacker == level.player ) { // Friendly fire will not be tolerated! SetDvar( "ui_deadquote", &"SCRIPT_MISSIONFAIL_KILLTEAM_AMERICAN" ); // friendly fire will not be tolerated missionfailedwrapper(); } } } shepherd_bridge_scene( shepherd ) { shepherd gun_remove(); shepherd = maps\_vehicle_aianim::convert_guy_to_drone( shepherd ); //turning him into a drone at this point. not up for fighting with the boatride script shepherd.script = "empty_script"; shepherd.dontdonotetracks = true; shepherd setcandamage( true ); shepherd.health = 5000; shepherd thread shepdamage_bullet_thread(); shepherd thread shepdamage_damage_thread(); shepherd hide(); shepherd.animname = "shepherd"; shepherd Attach( "com_hand_radio", "tag_inhand" ); struct = getstruct( "shepherd_new_wander_struct", "targetname" ); ent = spawn_tag_origin(); start_org = struct.origin + (-200,0,0); ent.origin = start_org; ent.angles = struct.angles; ent anim_first_frame_solo( shepherd, "angry_wander" ); wait 0.05; shepherd linkto( ent ); wait 4; shepherd show(); // ent thread anim_custom_animmode_solo( shepherd, "gravity", "angry_wander" ); ent thread anim_single_solo( shepherd, "angry_wander" ); time = 8; ent moveto( struct.origin, time, 0, time ); wait time; // shepherd unlink(); //flag_wait( "time_to_go" ); shepherd wait_until_time_to_shepout(); time = 5; // shepherd linkto( ent ); ent moveto( start_org, time, time, 0 ); wait time; shepherd delete(); } wait_until_time_to_shepout() { level endon( "player_starts_stairs" ); animation = getanim( "angry_wander" ); for ( ;; ) { animtime = self getanimtime( animation ); if ( animtime > 0.80 ) break; wait 0.05; } } stair_wave_spawner() { self endon( "death" ); self.animname = "shepherd"; self Attach( "com_hand_radio", "tag_inhand" ); self hide(); self gun_remove(); struct = getstruct( "shepherd_wander_struct", "targetname" ); struct anim_first_frame_solo( self, "stair_wave" ); wait 0.05; // for anim to take effect eye = self geteye(); //Print3d( eye, "x", (1,0,0), 1, 2, 5000 ); see_spawn = level.player can_see_origin( eye, false ); within_dist = distance( level.player.origin, self.origin ) < 400; if ( see_spawn || within_dist ) { waittillframeend; self safe_delete(); return; } self show(); // struct anim_single_solo( self, "stair_approach" ); struct thread anim_loop_solo( self, "stair_idle" ); for ( ;; ) { if ( distance( level.player.origin, self.origin ) < 350 ) break; wait( 0.05 ); } struct notify( "stop_loop" ); struct anim_single_solo( self, "stair_wave" ); struct thread anim_loop_solo( self, "stair_idle" ); flag_wait( "player_gets_in" ); self safe_delete(); } wander_battlefield_until_time_to_stop( target ) { if ( flag( "bridgelayer_complete" ) ) return; level endon( "bridgelayer_complete" ); first_target = target; for ( ;; ) { if ( !isdefined( target ) ) target = first_target; struct = getstruct( target, "targetname" ); if ( IsDefined( struct.script_delay ) ) { struct anim_reach_solo( self, "idle_reach" ); struct thread anim_loop_solo( self, "idle" ); wait( struct.script_delay ); struct notify( "stop_loop" ); self anim_stopanimscripted(); } else { self SetGoalPos( struct.origin ); self.goalradius = struct.radius; self waittill( "goal" ); } target = struct.target; } } intro_runner_path_breaker() { brush = GetEnt( "intro_runner_path_breaker", "targetname" ); brush DisconnectPaths(); brush NotSolid(); wait( 5 ); brush Solid(); brush ConnectPaths(); brush Delete(); } school_unreachable_spawner() { self endon( "death" ); flag_wait( "roadkill_school_14" ); self Delete(); } ambusher_spawner() { level.ambusher = self; self.ignoreall = true; self.ignoreme = true; flag_wait( "ambush_spawner_angry" ); self.ignoreme = false; if ( IsAlive( self ) ) { self.threatbias = 50000; self.ignoreall = false; //self.ignoreme = true; link = GetEnt( self.script_linkto, "script_linkname" ); self SetEntityTarget( link ); wait( 3 ); self ClearEntityTarget(); } if ( IsAlive( self ) ) { self waittill( "death" ); // yay ignoreme after death! wait( 2 ); if ( IsDefined( self ) ) self.ignoreme = true; } } ignore_until_attack() { self endon( "death" ); self.ignoreme = true; self waittill( "shooting" ); wait( 0.5 ); self.ignoreme = false; } trapper_spawner() { // so other friendly doesn't crossfire self endon( "death" ); flag_wait( "trapper_spawners_ignoreme" ); self.ignoreme = true; } trapper_killer_trigger() { trigger = GetEnt( "trapper_killer_trigger", "targetname" ); for ( ;; ) { trigger waittill( "trigger", other ); other Delete(); } } no_grenades() { self.grenadeammo = 0; } gaz_balcony_guys() { run_thread_on_targetname( "gaz_balcony", ::gaz_balcony ); } gaz_balcony() { spawner = GetEnt( self.target, "targetname" ); spawner.script_drone_override = true; spawner add_spawn_function( ::gaz_balcony_think, self ); spawner spawn_ai(); } gaz_balcony_think( struct ) { self endon( "death" ); self SetLookAtEntity( level.player ); self gun_remove(); self.allowdeath = true; self.health = 1; self.ignoreall = true; self.ignoreSuppression = true; // self.ignoreme = true; self.custom_scene = struct.animation; self.price_idle = struct.animation == "killhouse_sas_price_idle"; self.first_scene = "killhouse_gaz_idleB"; if ( self.price_idle ) self.first_scene = "killhouse_sas_price_idle"; if ( self.custom_scene == "killhouse_gaz_idleB" ) { // offset anim wait( 2.5 ); } else { wait( RandomFloat( 1.5 ) ); } struct thread anim_generic_loop( self, self.first_scene ); flag_wait( "garage_door_scene" ); //wait( 3 ); idle_until_tired_of_idling_or_shot_at( struct ); timer = RandomFloat( 0.65 ); wait( timer ); struct notify( "stop_loop" ); self anim_stopanimscripted(); self waittill( "goal" ); wait( 90 ); self Delete(); } idle_until_tired_of_idling_or_shot_at( struct ) { self endon( "bulletwhizby" ); if ( !self.price_idle ) { struct notify( "stop_loop" ); struct anim_generic( self, self.custom_scene + "_solo" ); struct anim_generic( self, self.custom_scene + "_solo" ); struct thread anim_generic_loop( self, self.first_scene ); } wait( 60 ); } player_vehicle_catches_up() { flag_wait( "start_runner" ); for ( ;; ) { if ( Distance( level.crazy_ride_convoy[ "player" ].origin, level.crazy_ride_convoy[ "detour" ].origin ) <= 320 ) break; wait( 0.05 ); } flag_set( "player_closes_gap" ); } slow_down_to_speed_when_you_get_dist_from_ent( speed, ent, dist ) { for ( ;; ) { if ( Distance( self.origin, ent.origin ) <= dist ) { self Vehicle_SetSpeed( speed, 5, 5 ); break; } wait( 0.05 ); } } riverbank_mg() { self Delete(); /* self SetMode( "manual" ); self SetTargetEntity( level.player ); for ( ;; ) { bursts = RandomIntRange( 4, 7 ); for ( i = 0; i < bursts; i++ ) { self StartFiring(); burst_time = RandomFloatRange( 0.5, 1 ); wait( burst_time ); self StopFiring(); timeout_time = RandomFloatRange( 0.2, 0.8 ); wait( timeout_time ); } timeout_time = RandomFloatRange( 1.0, 1.5 ); wait( timeout_time ); } */ } radio_dialogue_generic( alias ) { if ( !isdefined( level.scr_radio[ alias ] ) ) { level.scr_radio[ alias ] = level.scr_sound[ "generic" ][ alias ]; } radio_dialogue( alias ); } ahead_line( alias ) { play_line_at_offset_on_player_vehicle( alias, ( 0, 2500, 0 ) ); } way_ahead_line( alias ) { play_line_at_offset_on_player_vehicle( alias, ( 0, 4000, 0 ) ); } shot_fired_trigger() { self waittill( "trigger" ); struct_end = getstruct( self.target, "targetname" ); struct_start = getstruct( struct_end.target, "targetname" ); end = struct_end.origin; original_end = end; start = struct_start.origin; angles = VectorToAngles( start - end ); forward = AnglesToForward( angles ); dist = Distance( end, start ); end += forward * -1000; flag_set( "shot_rings_out" ); // Print3d( start, "bullet", (1,0,0), 1, 2, 1000 ); //Print3d( start, "sound", (0,1,0.5), 1, 2, 1000 ); thread play_sound_in_space( "weap_dragunovsniper_fire_npc", start ); units_per_second = 9000; time = dist / units_per_second; wait( time * 0.6 ); thread play_sound_in_space( "whizby_triggered", end ); wait( time * 0.4 ); // Line( start, original_end, (0.5,0.5,0), 1, 1, 1000 ); //MagicBullet( "scripted_silent", start, end ); trace = BulletTrace( start, end, true, undefined ); pos = trace[ "position" ]; fx = getfx( "car_dirt" ); sound = "concrete"; if ( trace[ "surfacetype" ] != "concrete" ) { fx = getfx( "car_spark" ); sound = "metal"; } PlayFX( fx, pos, forward ); PlayFX( fx, pos, forward ); brick_sounds = []; brick_sounds[ brick_sounds.size ] = "ride_bullet_brick_1"; brick_sounds[ brick_sounds.size ] = "ride_bullet_brick_2"; metal_sounds = []; metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_1"; metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_3"; metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_2"; metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_4"; metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_5"; sounds = []; sounds[ "concrete" ] = brick_sounds; sounds[ "metal" ] = metal_sounds; if ( !isdefined( level.magic_sound_index ) ) level.magic_sound_index = []; if ( !isdefined( level.magic_sound_index[ sound ] ) ) { level.magic_sound_index[ sound ] = 0; } index = level.magic_sound_index[ sound ]; alias = sounds[ sound ][ index ]; thread play_sound_in_space( alias, pos, true ); level.magic_sound_index[ sound ]++; level.magic_sound_index[ sound ] %= sounds[ sound ].size; wait( 1.2 ); // Shot. Nine o'clock. Three hundred twenty six meters. //thread passenger_line( "roadkill_bmr_9_326" ); // Line( start, end, (1,0,0), 1, 1, 1000 ); // Print3d( trace[ "position" ], "HIT", (1,0,0), 1, 2, 1000 ); } rpg_ambush_spawner() { // self.ignoreall = true; self SetEntityTarget( level.crazy_ride_convoy[ "detour" ] ); self.interval = 0; if ( !isdefined( self.script_delay ) ) return; self SetGoalPos( self.origin ); script_delay(); self maps\_spawner::go_to_node(); } hydrant_hit() { hydrant_struct = getstruct( "hydrant_struct", "targetname" ); RadiusDamage( hydrant_struct.origin, hydrant_struct.radius, 5000, 5000, level.player ); } technical_pushed_animation() { technical = level.traffic_jam_truck; technical.animname = "technical"; struct = SpawnStruct(); struct.origin = ( 0, 0, 0 ); struct.angles = ( 0, 0, 0 ); struct thread anim_single_solo( technical, "technical_pushed" ); wait( 0.05 ); animation = technical getanim( "technical_pushed" ); technical SetAnim( animation, 1, 0, 1.07 ); } roadkill_gameskill_ride_settings() { // RIGHT NOW ONLY .25 AND .75 ARE USED for easy and normal level.difficultySettings[ "threatbias" ][ "easy" ] = 0; level.difficultySettings[ "threatbias" ][ "normal" ] = 0; level.difficultySettings[ "threatbias" ][ "hardened" ] = 0; level.difficultySettings[ "threatbias" ][ "veteran" ] = 0; level.difficultySettings[ "base_enemy_accuracy" ][ "easy" ] = 1.0; level.difficultySettings[ "base_enemy_accuracy" ][ "normal" ] = 1.0; level.difficultySettings[ "base_enemy_accuracy" ][ "hardened" ] = 1.0; level.difficultySettings[ "base_enemy_accuracy" ][ "veteran" ] = 1.0; // lower numbers = higher accuracy for AI at a distance level.difficultySettings[ "accuracyDistScale" ][ "easy" ] = 1.0; level.difficultySettings[ "accuracyDistScale" ][ "normal" ] = 1.0; level.difficultySettings[ "accuracyDistScale" ][ "hardened" ] = 1.0; level.difficultySettings[ "accuracyDistScale" ][ "veteran" ] = 1.0; // too many other things make it more difficult level.difficultySettings[ "pain_test" ][ "easy" ] = maps\_gameskill::always_pain; level.difficultySettings[ "pain_test" ][ "normal" ] = maps\_gameskill::always_pain; level.difficultySettings[ "pain_test" ][ "hardened" ] = maps\_gameskill::always_pain; level.difficultySettings[ "pain_test" ][ "veteran" ] = maps\_gameskill::always_pain; // Death Invulnerable Time controls how long the player is death-proof after going into red flashing // This protection resets after the player recovers full health. level.difficultySettings[ "player_deathInvulnerableTime" ][ "easy" ] = 7000; level.difficultySettings[ "player_deathInvulnerableTime" ][ "normal" ] = 4000; level.difficultySettings[ "player_deathInvulnerableTime" ][ "hardened" ] = 3000; level.difficultySettings[ "player_deathInvulnerableTime" ][ "veteran" ] = 3000; // level.invulTime_preShield: time player is invulnerable when hit before their health is low enough for a red overlay( should be very short ) level.difficultySettings[ "invulTime_preShield" ][ "easy" ] = 0.0; level.difficultySettings[ "invulTime_preShield" ][ "normal" ] = 0.0; level.difficultySettings[ "invulTime_preShield" ][ "hardened" ] = 0.0; level.difficultySettings[ "invulTime_preShield" ][ "veteran" ] = 0.0; // level.invulTime_onShield: time player is invulnerable when hit the first time they get a red health overlay( should be reasonably long ) // should not be more than or too much lower than player_deathInvulnerableTime level.difficultySettings[ "invulTime_onShield" ][ "easy" ] = 0.5; level.difficultySettings[ "invulTime_onShield" ][ "normal" ] = 0.5; level.difficultySettings[ "invulTime_onShield" ][ "hardened" ] = 0.5; level.difficultySettings[ "invulTime_onShield" ][ "veteran" ] = 0.5; // level.invulTime_postShield: time player is invulnerable when hit after the red health overlay is already up( should be short ) level.difficultySettings[ "invulTime_postShield" ][ "easy" ] = 0.3; level.difficultySettings[ "invulTime_postShield" ][ "normal" ] = 0.3; level.difficultySettings[ "invulTime_postShield" ][ "hardened" ] = 0.3; level.difficultySettings[ "invulTime_postShield" ][ "veteran" ] = 0.3; // level.playerHealth_RegularRegenDelay // The delay before you regen health after getting hurt level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "easy" ] = 500; level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "normal" ] = 500; level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "hardened" ] = 500; level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "veteran" ] = 500; // level.worthyDamageRatio( player must recieve this much damage as a fraction of maxhealth to get invulTime_PREshield. ) level.difficultySettings[ "worthyDamageRatio" ][ "easy" ] = 0.2; level.difficultySettings[ "worthyDamageRatio" ][ "normal" ] = 0.2; level.difficultySettings[ "worthyDamageRatio" ][ "hardened" ] = 0.2; level.difficultySettings[ "worthyDamageRatio" ][ "veteran" ] = 0.2; // self.gs.regenRate // the rate you regen health once it starts to regen level.difficultySettings[ "health_regenRate" ][ "easy" ] = 0.2; level.difficultySettings[ "health_regenRate" ][ "normal" ] = 0.2; level.difficultySettings[ "health_regenRate" ][ "hardened" ] = 0.2; level.difficultySettings[ "health_regenRate" ][ "veteran" ] = 0.2; // level.playerDifficultyHealth // the amount of health you have in this difficulty level.difficultySettings[ "playerDifficultyHealth" ][ "easy" ] = 20; level.difficultySettings[ "playerDifficultyHealth" ][ "normal" ] = 20; level.difficultySettings[ "playerDifficultyHealth" ][ "hardened" ] = 20; level.difficultySettings[ "playerDifficultyHealth" ][ "veteran" ] = 20; // If you go to red flashing, the amount of time before your health regens level.difficultySettings[ "longRegenTime" ][ "easy" ] = 500; level.difficultySettings[ "longRegenTime" ][ "normal" ] = 500; level.difficultySettings[ "longRegenTime" ][ "hardened" ] = 500; level.difficultySettings[ "longRegenTime" ][ "veteran" ] = 500; // level.healthOverlayCutoff level.difficultySettings[ "healthOverlayCutoff" ][ "easy" ] = 0.02; level.difficultySettings[ "healthOverlayCutoff" ][ "normal" ] = 0.02; level.difficultySettings[ "healthOverlayCutoff" ][ "hardened" ] = 0.02; level.difficultySettings[ "healthOverlayCutoff" ][ "veteran" ] = 0.02; } trigger_delete_axis_not_in_volume() { self waittill( "trigger" ); volume = GetEnt( self.target, "targetname" ); ai = GetAIArray( "axis" ); count = 0; total = ai.size; foreach ( guy in ai ) { if ( guy IsTouching( volume ) ) continue; guy Delete(); count++; } //IPrintLnBold( "Deleted " + count + " out of " + total + " axis." ); } balcony_check() { if ( !isdefined( self.script_balcony ) ) return; self.a.disableLongDeath = true;// no long death on these guys AssertEx( self.script_balcony, "Cant be < 1" ); self.deathFunction = ::try_balcony_death; } try_balcony_death() { // always return false in this function because we want the death // animscript to continue after this function no matter what if ( !isdefined( self ) ) return false; if ( self.a.pose != "stand" ) return false; if ( IsDefined( self.prevnode ) ) { angleAI = self.angles[ 1 ]; angleNode = self.prevnode.angles[ 1 ]; angleDiff = abs( angleAI - angleNode ); if ( angleDiff > 80 ) return false; d = Distance( self.origin, self.prevnode.origin ); if ( d > 92 ) return false; } if ( !isdefined( level.last_balcony_death ) ) level.last_balcony_death = GetTime(); elapsedTime = GetTime() - level.last_balcony_death; // if one just happened within 3 seconds dont do it if ( elapsedTime < 3 * 1000 ) return false; deathAnims = getGenericAnim( "balcony_death" ); self.deathanim = deathAnims[ RandomInt( deathAnims.size ) ]; return false; } enemy_playground_spawner() { level.enemy_playground_enemies[ level.enemy_playground_enemies.size ] = self; level endon( "playground_baddies_retreat" ); self.attackeraccuracy = 0; self.IgnoreRandomBulletDamage = true; thread enemy_playground_guy_retreats(); self waittill( "damage" ); flag_set( "playground_baddies_retreat" ); } enemy_playground_guy_retreats() { self endon( "death" ); flag_wait( "playground_baddies_retreat" ); volume = GetEnt( "lower_school_flee_volume", "targetname" ); timer = RandomFloat( 2 ); wait( timer ); self SetGoalVolumeAuto( volume ); self waittill( "goal" ); self.attackeraccuracy = 1; self.IgnoreRandomBulletDamage = false; } player_becomes_normal_gameskill() { wait( 8.85 ); // reset attackeraccuracy level.player maps\_gameskill::resetSkill(); level.player recover_random_bullet_damage(); // get hurt like normal again level.player clear_custom_gameskill_func(); setsaveddvar( "player_radiusdamagemultiplier", "1.0" ); } recover_random_bullet_damage() { level.player.IgnoreRandomBulletDamage = false; } wait_for_chance_to_charge_school() { volume = GetEnt( "safe_to_charge_school_volume", "targetname" ); num = 1; for ( ;; ) { ai = GetAIArray( "axis" ); count = 0; too_many = false; foreach ( guy in level.enemy_playground_enemies ) { if ( !isalive( guy ) ) continue; if ( guy IsTouching( volume ) ) { count++; if ( count > num ) { too_many = true; break; } } } if ( !too_many ) return; wait( 0.05 ); } } ending_takeoff_heli_spawner() { struct = getstruct( "heli_linkup_struct", "script_noteworthy" ); self set_stage( struct, level.heli_guy_left, "left" ); self set_stage( struct, level.heli_guy_right, "right" ); flag_wait( "start_shepherd_end" ); self thread load_side( "left", level.heli_guy_left ); self thread load_side( "right", level.heli_guy_right ); wait( 8 ); flag_wait( "heli_takes_off" ); heli_fly_node = getstruct( "heli_fly_node", "targetname" ); self vehicle_paths( heli_fly_node ); } heli_spawner_left() { self.goalradius = 8; level.heli_guy_left[ level.heli_guy_left.size ] = self; } heli_spawner_right() { self.goalradius = 8; level.heli_guy_right[ level.heli_guy_right.size ] = self; } link_heli_to_landing() { linker = getstruct( "heli_linkup_struct", "script_noteworthy" ); targ = getstruct( "gag_stage_littlebird_unload", "script_noteworthy" ); linker.target = targ.targetname; } fail_for_civ_kill() { add_damage_function( ::civ_hit ); } civ_hit( amt, attacker, force, b, c, d, e ) { if ( !isalive( attacker ) ) return; if ( attacker != level.player ) return; wait( 1.5 ); // You are not authorized to fire on unarmed targets. SetDvar( "ui_deadquote", &"ROADKILL_SHOT_UNARMED" ); missionFailedWrapper(); } player_get_in_reminder() { if ( flag( "player_gets_in" ) ) return; level endon( "player_gets_in" ); wait( 4 ); lines = []; // Come on Brodsky, get in! lines[ lines.size ] = "roadkill_fly_comeongetin"; // Brodsky, get in your humvee, you're holding up the line! lines[ lines.size ] = "roadkill_fly_holdingupline"; // Hurry up Private! lines[ lines.size ] = "roadkill_fly_hurryup"; // Brodsky, move your ass, let's go! lines[ lines.size ] = "roadkill_fly_moveletsgo"; index = 0; for ( ;; ) { timer = RandomFloatRange( 5, 9 ); wait( timer ); msg = lines[ index ]; index++; index %= lines.size; foley_line( msg ); } } baddies_on_building_get_your_attention() { array_spawn_function_targetname( "enemy_rooftop_spawner", ::enemy_rooftop_spawner ); array_spawn_targetname( "enemy_rooftop_spawner" ); } enemy_rooftop_spawner() { self endon( "death" ); startpos = self.origin; self.ignoreall = true; self.ignoreme = true; self.health = 10000; spy_on_convoy(); self SetGoalPos( startpos ); self waittill( "goal" ); self Delete(); } spy_on_convoy() { flag_assert( "video_tapers_react" ); level endon( "video_tapers_react" ); level endon( "spy_baddies_flee" ); thread flee_if_noticed_by_player(); self SetGoalPos( self.origin ); self.goalradius = 16; timer = RandomFloat( 3 ); wait( timer ); node = GetNode( self.target, "targetname" ); self SetGoalNode( node ); self waittill( "goal" ); nodes = getstructarray( "spy_node", "script_noteworthy" ); for ( ;; ) { timer = RandomFloat( 0.8 ); wait( timer ); node = random( nodes ); self SetGoalPos( node.origin ); self waittill( "goal" ); } } flee_if_noticed_by_player() { level endon( "spy_baddies_flee" ); add_wait( ::waittill_msg, "bulletwhizby" ); add_wait( ::waittill_msg, "death" ); add_wait( ::waittill_msg, "damage" ); do_wait_any(); level notify( "spy_baddies_flee" ); } escape_block_spawner() { self magic_bullet_shield(); self SetGoalPos( self.origin ); self PushPlayer( true ); self.dontavoidplayer = true; self.goalradius = 16; flag_wait( "player_gets_in" ); self safe_delete(); } learn_flash() { level.player.flash_ammo = level.player GetWeaponAmmoStock( "flash_grenade" ); foley_line( "roadkill_fly_getflashbang" ); // wait( 0.25 ); // wait_for_buffer_time_to_pass( start_time, 1.05 ); display_hint( "learn_flash" ); } player_learned_flash() { flash_ammo = level.player GetWeaponAmmoStock( "flash_grenade" ); if ( flash_ammo <= 0 ) return true; return level.player.flash_ammo > flash_ammo; } detect_room_was_flashed() { volume = GetEnt( "dismount_flash_volume", "targetname" ); flash = volume get_flash_touching(); for ( ;; ) { if ( !isdefined( flash ) ) break; wait( 0.05 ); } flag_set( "room_was_flashed" ); } get_flash_touching() { for ( ;; ) { grenades = GetEntArray( "grenade", "classname" ); flashes = []; foreach ( grenade in grenades ) { if ( IsSubStr( grenade.model, "flash" ) ) { flashes[ flashes.size ] = grenade; } } foreach ( flash in flashes ) { if ( flash IsTouching( self ) ) return flash; } wait( 0.05 ); } } blend_sm_sunsamplesizenear() { //SetSavedDvar( "sm_sunSampleSizeNear", "0.55" ); // so bridgelayer has shadows // SetSavedDvar( "sm_sunSampleSizeNear", 2.0 );// coming from air //// delayThread( 0.6, maps\_introscreen::ramp_out_sunsample_over_time, 1.4, 0.76 ); // blend to 0.55 sunsample over 1.4 seconds // wait( 0.6 ); // maps\_introscreen::ramp_out_sunsample_over_time( 1.4, 0.25 );// blend to 0.55 sunsample over 1.4 seconds SetSavedDvar( "sm_sunsamplesizenear", 0.33 ); flag_wait_or_timeout( "player_enters_riverbank", 9 ); maps\_introscreen::ramp_out_sunsample_over_time( 1, 0.76 );// blend to 0.55 sunsample over 1.4 seconds } riverbank_player_learns_m203() { if ( flag( "leaving_riverbank" ) ) return; level endon ( "leaving_riverbank" ); level endon ( "bridge_layer_attacked_by_bridge_baddies" ); flag_wait( "player_enters_riverbank" ); wait( 20 ); if ( player_learned_m203() ) return; // Allen! Switch to your M203! foley_line( "roadkill_fly_yourM203" ); display_hint( "learn_m203" ); for ( ;; ) { if ( player_learned_m203() ) break; wait( 0.05 ); } wait( 2 ); // Drop some rounds on 'em across the river! foley_line( "roadkill_fly_acrossriver" ); } player_learned_m203() { if ( flag( "leaving_riverbank" ) ) return true; return level.player getcurrentweapon() == "m203_m4_eotech"; } other_two_guys_say_huah() { lines = []; lines[ 0 ] = "roadkill_ar1_huah"; lines[ 1 ] = "roadkill_ar2_huah2"; index = 0; ai = getaiarray( "allies" ); foreach ( guy in ai ) { if ( guy is_hero() ) continue; msg = lines[ index ]; guy generic_dialogue_queue( msg ); index++; if ( index >= lines.size ) return; } } foley_gets_eyes_on_school_dialogue() { // Hunter 2-1 to Hunter 2-3, I have eyes on the school, over! foley_line( "roadkill_fly_eyesonschool" ); delayThread( 2.6, ::flag_set, "friendlies_suppress_school" ); start_time = gettime(); // 2-1, we are combat ineffective here! We are taking heavy fire from the school, can you assist, over?! radio_line( "roadkill_ar3_ineffective" ); wait_for_buffer_time_to_pass( start_time, 3.2 ); // Keep it together 2-3! We're on the way! 2-1 out! foley_line( "roadkill_fly_keepittogether" ); if ( flag( "playground_baddies_retreat" ) ) return; // Taaargeets, front of the school!! Take 'em out!!! dunn_line( "roadkill_cpd_frontofschool" ); } school_badguy_cleanup() { flag_wait( "roadkill_school_18" ); // delete all enemies at this point ai = getaiarray( "axis" ); foreach ( guy in ai ) { guy delete(); } } arab_line( msg ) { level.arab_function_stack_struct function_stack( ::arab_line_proc, msg ); } arab_line_proc( msg ) { speakers = getstructarray( "arab_speaker", "targetname" ); nearest = getClosest( level.player.origin, speakers ); play_sound_in_space( msg, nearest.origin ); } ending_fadeout_nextmission() { flag_wait( "start_shepherd_end" ); delayThread( 6, ::flag_set, "heli_takes_off" ); wait( 10 ); black_overlay = create_client_overlay( "black", 0, level.player ); black_overlay FadeOverTime( 2 ); black_overlay.alpha = 1; wait( 2 ); nextmission(); }