#include common_scripts\utility; #include maps\_utility; #include maps\_vehicle; #include maps\_anim; // --------------------------------------------------------------------------------- // Rapelling AI // --------------------------------------------------------------------------------- player_seek_stages() { self endon( "death" ); stages[ 0 ] = 2000; stages[ 1 ] = 1500; stages[ 2 ] = 1000; if ( IsDefined( self.script_vehicleride ) ) { self waittill( "jumpedout" ); wait 0.5; } self SetGoalEntity( level.players[ 0 ] ); foreach ( iRadius in stages ) { self.goalradius = iRadius; wait 15.0; } } ai_rappel_think( playerSeek ) { self endon( "death" ); self.animname = "generic"; self.oldhealth = self.health; self.health = 3; self Hide(); reference = self.spawner; reference anim_first_frame_solo( self, self.animation ); wait( 0.5 ); wait RandomFloat( 4 ); eRopeOrg = Spawn( "script_origin", reference.origin ); eRopeOrg.angles = reference.angles; eRope = Spawn( "script_model", eRopeOrg.origin ); eRope SetModel( "coop_bridge_rappelrope" ); eRope.animname = "rope"; eRope assign_animtree(); eRopeOrg anim_first_frame_solo( eRope, "coop_ropedrop_01" ); eRopeOrg anim_single_solo( eRope, "coop_ropedrop_01" ); self Show(); self.allowdeath = true; self thread ai_rappel_death(); eRopeOrg thread anim_single_solo( eRope, "coop_" + self.animation ); reference thread anim_generic( self, self.animation ); self thread prevent_fall_overbridge(); self thread prevent_fall_overrail(); self waittill( "over_solid_ground" ); self.health = self.oldhealth; if ( IsDefined( playerSeek ) && playerSeek ) { self thread player_seek_stages(); } else { self.goalradius = 500; self SetGoalPos( self.origin ); } } prevent_fall_overbridge() { level endon( "special_op_terminated" ); self endon( "over_solid_ground" ); self endon( "death" ); self endon( "overrail" ); if ( self.animation == "bridge_rappel_R" ) { x = 10888; } else { x = 10106; } while ( 1 ) { if ( self.animation == "bridge_rappel_R" ) { self.allowdeath = self.origin[ 0 ] > x; } else { self.allowdeath = self.origin[ 0 ] < x; } // Catch if killed during allowdeath is false if ( self.allowdeath && self.health == 1 ) { self Kill(); return; } wait( 0.05 ); } } // This will prevent the AI from dying while clipping through the hand rail on the bridge prevent_fall_overrail() { level endon( "special_op_terminated" ); self endon( "death" ); animation = level.scr_anim[ self.animname ][ self.animation ]; overall_time = GetAnimLength( animation ); time_fracs = GetNoteTrackTimes( animation, "over_solid" ); delay = overall_time * time_fracs[ 0 ]; wait( delay - 0.2 ); self notify( "overrail" ); self.allowdeath = false; // self thread debug_draw_on_ent( "CANNOT" ); wait( 0.35 ); self.allowdeath = true; if ( self.health == 1 ) { self Kill(); } // self thread debug_draw_on_ent( "can" ); } debug_draw_on_ent( msg ) { /# self notify( "stop_draw_on_ent" ); self endon( "stop_draw_on_ent" ); self endon( "death" ); timer = GetTime() + 3000; while ( GetTime() < timer ) { Print3d( self.origin, msg, ( 0.8, 0.8, 0.2 ) ); wait( 0.05 ); } #/ } ai_rappel_death() { self endon( "over_solid_ground" ); if ( !isdefined( self ) ) { return; } self set_deathanim( "fastrope_fall" ); self waittill( "death" ); if ( IsDefined( self ) ) { self thread play_sound_in_space( "generic_death_falling" ); } } ai_rappel_over_ground_death_anim( guy ) { guy endon( "death" ); guy notify( "over_solid_ground" ); guy clear_deathanim(); } // --------------------------------------------------------------------------------- // Scripted Destructions // --------------------------------------------------------------------------------- missile_taxi_moves() { // Remove the script_noteworthy from the ad sign on the taxi ents = GetEntArray( "taxi_ad_clip", "targetname" ); foreach ( ent in ents ) { if ( IsDefined( ent.script_noteworthy ) && ent.script_noteworthy == "missile_taxi" ) { ent.script_noteworthy = undefined; } } taxi = GetEnt( "missile_taxi", "script_noteworthy" ); taxi.finalOrg = taxi.origin; taxi.finalAng = taxi.angles; clip = GetEnt( "missile_taxi_clip", "script_noteworthy" ); taxi.origin += ( 80, 200, 0 ); taxi.angles = ( 0, 180, 0 ); wait( 3 ); taxi thread missile_taxi_get_hit_by_hellfire(); taxi thread missile_taxi_get_exploded(); taxi waittill( "taxi_moving" ); clip ConnectPaths(); clip Delete(); taxi thread destructible_force_explosion(); moveTime = 1.0; taxi MoveTo( taxi.finalOrg, moveTime, 0, moveTime / 2 ); taxi RotateTo( taxi.finalAng, moveTime, 0, moveTime / 2 ); } missile_taxi_get_hit_by_hellfire() { self endon( "taxi_moving" ); for ( ;; ) { self waittill( "damage", amount, attacker ); if ( !isdefined( attacker ) ) { continue; } if ( !isdefined( attacker.classname ) ) { continue; } if ( attacker.classname == "script_vehicle" ) { break; } } self notify( "taxi_moving" ); } missile_taxi_get_exploded() { self endon( "taxi_moving" ); self waittill( "exploded" ); self notify( "taxi_moving" ); } // --------------------------------------------------------------------------------- // Attack Helicopter // --------------------------------------------------------------------------------- attack_heli() { trigger_wait( "attack_heli", "targetname" ); attack_heli = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( "kill_heli" ); thread maps\_attack_heli::begin_attack_heli_behavior( attack_heli ); Assert( IsDefined( attack_heli ) ); wait 2; radio_dialogue( "so_bridge_hqr_enemy_helo" ); } // --------------------------------------------------------------------------------- // Bridge Collapsing // --------------------------------------------------------------------------------- BRIDGE_COLLAPSE_SPEED = 1.0; collapsed_section_shakes() { trigger = GetEnt( "collapsed_bridge_effects", "targetname" ); targets = GetEntArray( trigger.target, "targetname" ); trigger waittill( "trigger" ); foreach ( eTarget in targets ) { //playfx( , , , ) PlayFX( getfx( "dust_ceiling_fall" ), eTarget.origin ); } } bridge_collapse_prep() { wait 0.1; thread road_piece_1(); thread road_piece_2(); thread road_piece_3(); thread road_piece_4(); thread road_piece_5(); thread road_piece_6(); // thread road_piece_7(); thread road_piece_8(); thread bridge_collapse_van(); thread bridge_collapse_suv(); thread bridge_collapse_truck_1(); thread bridge_collapse_truck_2(); thread bridge_collapse_sedan_1(); thread reveal_details(); thread car_slide( "slide_car_1", "slide_car_start_1" ); thread car_slide( "slide_car_2", "slide_car_start_2" ); thread car_slide( "slide_car_3", "slide_car_start_3" ); thread car_slide( "slide_car_4", "slide_car_start_4" ); thread view_tilt(); //bridge_collapse_smashed_car_1 // if ( GetDvar( "test_bridge_collapse" ) == "1" ) // { // level thread notify_delay( "bridge_collapse", 10 ); // } level waittill( "bridge_collapse" ); // start sound, needs 2 seconds to play before bridge comes down bridge_collapse_sound = GetEnt( "bridge_collapse_sound", "targetname" ); Assert( IsDefined( bridge_collapse_sound ) ); bridge_collapse_sound thread play_sound_on_entity( "scn_bridge_collapse" ); if ( IsDefined( level.player_sprint_scale ) ) { SetSavedDvar( "player_sprintSpeedScale", level.default_sprint ); } // bridge begins to fall level notify( "bridge_collapse_start" ); level thread notify_delay( "bridge_sway_start", 0.5 ); exploder( 1 ); //setblur( 1.0, 0.5 ); wait 6 * BRIDGE_COLLAPSE_SPEED; //setblur( 0, 0.5 ); if ( IsDefined( level.player_sprint_scale ) ) { SetSavedDvar( "player_sprintSpeedScale", level.player_sprint_scale ); } } bridge_collapse_earthquake() { ent = GetEnt( "bridge_collapse_sound", "targetname" ); ent PlayRumbleOnEntity( "so_bridge_collapse" ); // start earthquake now, bridge is tilting and cars are sliding time = 1; Earthquake( 0.7, time, ent.origin, 5000 ); wait( time * 0.7 ); time = 7; Earthquake( 0.25, time, ent.origin, 5000 ); wait( time * 0.5 ); time = 7; Earthquake( 0.2, time, ent.origin, 5000 ); wait( time * 0.5 ); time = 5; Earthquake( 0.15, time, ent.origin, 5000 ); wait( time ); } reveal_details() { // bridge destroyed details that dont move, they just spawn in after the collapse and are hidden by the smoke bridge_collapse_details = GetEntArray( "bridge_collapse_detail", "targetname" ); thread array_call( bridge_collapse_details, ::Hide ); // these destroyed bridge details spawn in also but need to slide into position because they are less hidden by the smoke /* bridge_collapse_detail_slide_origin = GetEnt( "bridge_collapse_detail_slide_origin", "targetname" ).origin; bridge_collapse_detail_slide = GetEntArray( "bridge_collapse_detail_slide", "targetname" ); foreach( part in bridge_collapse_detail_slide ) { part.finalOrigin = part.origin; part.origin = ( part.origin[ 0 ], bridge_collapse_detail_slide_origin[ 1 ], bridge_collapse_detail_slide_origin[ 2 ] ); part Hide(); } */ level waittill( "bridge_collapse_start" ); wait 1; /* foreach( part in bridge_collapse_detail_slide ) { part Show(); part thread reveal_details_slide(); } */ wait 1.5; thread array_call( bridge_collapse_details, ::Show ); } reveal_details_slide() { self Show(); self MoveTo( self.finalOrigin, 2.0, 0.0, 0.5 ); wait 2.0; self.origin = self.finalOrigin; } road_piece_1() { part = GetEnt( "bridge_piece_1", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; details = GetEntArray( "road_piece_1_detail", "targetname" ); thread array_call( details, ::Hide ); part.origin += ( 0, 0, 280 ); part.angles = ( -3, 0, 0 ); level waittill( "bridge_collapse_start" ); nextPosOrigin = part.origin - ( 0, 0, 150 ); nextPosAngle = part.angles + ( -2, 0, 20 ); moveTime = 0.75 * BRIDGE_COLLAPSE_SPEED; part RotateTo( nextPosAngle, moveTime, 0.3 * BRIDGE_COLLAPSE_SPEED, 0 * BRIDGE_COLLAPSE_SPEED ); part MoveTo( nextPosOrigin, moveTime, 0.3 * BRIDGE_COLLAPSE_SPEED, 0 * BRIDGE_COLLAPSE_SPEED ); wait moveTime; part RotateTo( part.landingSpotAng, moveTime, 0 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); part MoveTo( part.landingSpotOrg, moveTime, 0 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); wait moveTime; thread array_call( details, ::Show ); part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_2() { part = GetEnt( "bridge_piece_2", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; details = GetEntArray( "road_piece_2_detail", "targetname" ); thread array_call( details, ::Hide ); part.origin += ( 0, 0, 130 ); part.angles = ( -15, 0, -22 ); level waittill( "bridge_collapse_start" ); moveTime = 1.5 * BRIDGE_COLLAPSE_SPEED; part RotateTo( part.landingSpotAng, moveTime, 0.3 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); part MoveTo( part.landingSpotOrg, moveTime, 0.3 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); wait moveTime; thread array_call( details, ::Show ); part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_3() { PART_SPEED = 0.75; part = GetEnt( "bridge_piece_3", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 350 ); part.angles = ( -30, 20, 90 ); level waittill( "bridge_collapse_start" ); wait 2.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); wait 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_4() { PART_SPEED = 0.75; part = GetEnt( "bridge_piece_4", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 350 ); part.angles = ( -30, 20, 30 ); level waittill( "bridge_collapse_start" ); wait 3.0 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_5() { PART_SPEED = 0.75; part = GetEnt( "bridge_piece_5", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 350 ); part.angles = ( -30, 20, 20 ); level waittill( "bridge_collapse_start" ); wait 2.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_6() { PART_SPEED = 0.75; part = GetEnt( "bridge_piece_6", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 350 ); part.angles = ( -30, 20, 40 ); level waittill( "bridge_collapse_start" ); wait 1.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_7() { PART_SPEED = 0.75; part = GetEnt( "bridge_piece_7", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 350 ); part.angles = ( -30, 20, 40 ); level waittill( "bridge_collapse_start" ); wait 2.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } road_piece_8() { PART_SPEED = 0.75; part = GetEnt( "bridge_piece_8", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 350 ); part.angles = ( -30, 20, 40 ); level waittill( "bridge_collapse_start" ); wait 1.5 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part MoveTo( part.landingSpotOrg, 1.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED * PART_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED * PART_SPEED ); wait 0.8 * BRIDGE_COLLAPSE_SPEED * PART_SPEED; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } bridge_collapse_van() { part = GetEnt( "bridge_collapse_van", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( -80, 50, 280 ); level waittill( "bridge_collapse_start" ); nextPosOrigin = part.origin - ( 0, 0, 280 ); part MoveTo( nextPosOrigin, 1.4 * BRIDGE_COLLAPSE_SPEED, 0.3 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); wait 1.4 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.2 * BRIDGE_COLLAPSE_SPEED, 0.7 * BRIDGE_COLLAPSE_SPEED, 0.5 * BRIDGE_COLLAPSE_SPEED ); } bridge_collapse_suv() { part = GetEnt( "bridge_collapse_suv", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 200 ); part.angles = ( 90, 90, 0 ); level waittill( "bridge_collapse_start" ); wait 1.8 * BRIDGE_COLLAPSE_SPEED; nextPosOrigin = part.origin - ( 0, 0, 200 ); part MoveTo( nextPosOrigin, 0.5 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); wait 0.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 0.5 * BRIDGE_COLLAPSE_SPEED, 0.1 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); part RotateTo( part.landingSpotAng, 0.5 * BRIDGE_COLLAPSE_SPEED, 0.1 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); } bridge_collapse_truck_1() { part = GetEnt( "bridge_collapse_truck_1", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 280 ); part.angles = ( 90, 0, 90 ); level waittill( "bridge_collapse_start" ); wait 2.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg + ( 0, 0, 84 ), 1.0 * BRIDGE_COLLAPSE_SPEED, 0.9 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); wait 1.0 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 0.8 * BRIDGE_COLLAPSE_SPEED, 0.8 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); part RotateTo( part.landingSpotAng, 0.8 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); wait 1.0 * BRIDGE_COLLAPSE_SPEED; // part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } bridge_collapse_truck_2() { part = GetEnt( "bridge_collapse_truck_2", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( 0, 0, 380 ); part.angles = ( 90, -30, 0 ); level waittill( "bridge_collapse_start" ); wait 0.5 * BRIDGE_COLLAPSE_SPEED; moveTime = 1.0 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg + ( 0, 0, 80 ), moveTime, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); wait 0.2 * BRIDGE_COLLAPSE_SPEED; moveTime = 0.75 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, moveTime, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); part RotateTo( part.landingSpotAng, moveTime, 0.0 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); wait moveTime; part thread part_rummble( part.landingSpotOrg, part.landingSpotAng ); } bridge_collapse_sedan_1() { part = GetEnt( "bridge_collapse_sedan_1", "targetname" ); Assert( IsDefined( part ) ); part.landingSpotOrg = part.origin; part.landingSpotAng = part.angles; part.origin += ( -50, 180, 150 ); part.angles = ( 0, 330, 0 ); // 26 330 13 part SetModel( "vehicle_coupe_gold" ); level waittill( "bridge_collapse_start" ); nextPosOrigin = part.origin - ( 0, 0, 50 ); part MoveTo( nextPosOrigin, 1.5 * BRIDGE_COLLAPSE_SPEED, 0.3 * BRIDGE_COLLAPSE_SPEED, 0.2 * BRIDGE_COLLAPSE_SPEED ); part RotateTo( part.landingSpotAng, 1.5 * BRIDGE_COLLAPSE_SPEED, 0.1 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED ); wait 1.5 * BRIDGE_COLLAPSE_SPEED; part MoveTo( part.landingSpotOrg, 1.2 * BRIDGE_COLLAPSE_SPEED, 0.0 * BRIDGE_COLLAPSE_SPEED, 1.0 * BRIDGE_COLLAPSE_SPEED ); wait 1.2 * BRIDGE_COLLAPSE_SPEED; part SetModel( "vehicle_coupe_gold_destroyed" ); } part_rummble( finalOrg, finalAng ) { // makes a part move around a bit after crashing down to make it seem less mechanical MAX_RUMBLE_ORG_OFFSET = 5; MAX_RUMBLE_ANG_OFFSET = 1; numMoves = RandomIntRange( 3, 5 ); for ( i = 0; i < numMoves; i++ ) { moveTime = RandomFloatRange( 0.05, 0.2 ) * BRIDGE_COLLAPSE_SPEED; //accel_decel = RandomFloatRange( 0.0, moveTime / 2 ); accel_decel = 0 * BRIDGE_COLLAPSE_SPEED; offsetAng = ( RandomIntRange( 0, MAX_RUMBLE_ANG_OFFSET ) - ( MAX_RUMBLE_ANG_OFFSET / 2 ), RandomIntRange( 0, MAX_RUMBLE_ANG_OFFSET ) - ( MAX_RUMBLE_ANG_OFFSET / 2 ), RandomIntRange( 0, MAX_RUMBLE_ANG_OFFSET ) - ( MAX_RUMBLE_ANG_OFFSET / 2 ) ); offsetOrg = ( RandomIntRange( 0, MAX_RUMBLE_ORG_OFFSET ) - ( MAX_RUMBLE_ORG_OFFSET / 2 ), RandomIntRange( 0, MAX_RUMBLE_ORG_OFFSET ) - ( MAX_RUMBLE_ORG_OFFSET / 2 ), RandomIntRange( 0, MAX_RUMBLE_ORG_OFFSET ) - ( MAX_RUMBLE_ORG_OFFSET / 2 ) ); self RotateTo( self.angles + offsetAng, moveTime, accel_decel, accel_decel ); self MoveTo( self.origin + offsetOrg, moveTime, accel_decel, accel_decel ); wait moveTime; self RotateTo( finalAng, moveTime, accel_decel, accel_decel ); self MoveTo( finalOrg, moveTime, accel_decel, accel_decel ); wait moveTime; } self.origin = finalOrg; self.angles = finalAng; } view_tilt() { view_angle_controller_entity = GetEnt( "view_angle_controller_entity", "targetname" ); Assert( IsDefined( view_angle_controller_entity ) ); direction_ent = GetEnt( view_angle_controller_entity.target, "targetname" ); Assert( IsDefined( direction_ent ) ); gravity_vec = VectorNormalize( direction_ent.origin - view_angle_controller_entity.origin ); // level waittill( "bridge_collapse_start" ); level waittill( "bridge_sway_start" ); SetSavedDvar( "phys_gravityChangeWakeupRadius", 1600 ); foreach ( player in level.players ) { player SetMoveSpeedScale( 0.5 ); player PlayerSetGroundReferenceEnt( view_angle_controller_entity ); } moveTime = 1.5; view_angle_controller_entity RotateTo( ( 10, 13, 0 ), moveTime, moveTime * 0.5, moveTime * 0.5 ); wait( moveTime - 0.5 ); SetPhysicsGravityDir( gravity_vec ); wait( 1.5 ); moveTime = 1.0; view_angle_controller_entity RotateTo( ( -3, -1, 0 ), moveTime, moveTime * 0.5, moveTime * 0.5 ); wait( moveTime ); moveTime = 1.0; view_angle_controller_entity RotateTo( ( 4, 5, 0 ), moveTime, moveTime * 0.5, moveTime * 0.5 ); wait( moveTime ); moveTime = 2.0; view_angle_controller_entity RotateTo( ( 0, 2, 0 ), moveTime, moveTime * 0.5, moveTime * 0.5 ); wait( moveTime ); SetPhysicsGravityDir( ( 0, 0, -1 ) ); foreach ( player in level.players ) { player AllowSprint( true ); player SetMoveSpeedScale( 1 ); } } car_slide( carName, startName ) { ents = GetEntArray( carName, "script_noteworthy" ); car = undefined; foreach ( ent in ents ) { if ( ent.classname != "script_model" ) { continue; } car = ent; break; } // Link Clip clip = GetEnt( carName + "_clip", "script_noteworthy" ); clip.origin = car.origin; clip.angles = car.angles; clip LinkTo( car ); Assert( IsDefined( car ) ); start = GetEnt( startName, "script_noteworthy" ); Assert( IsDefined( car ) ); Assert( IsDefined( start ) ); d = Distance( car.origin, start.origin ); moveTime = d / 50; accel_decel = moveTime / 4; car.finalOrg = car.origin; car.origin = start.origin; // level waittill( "bridge_collapse_start" ); level waittill( "bridge_sway_start" ); wait 1; car MoveTo( car.finalOrg, moveTime, accel_decel, accel_decel ); car waittill( "movedone" ); clip Delete(); }