IW4-Dump-Files/maps/af_chase_waterfall.gsc

1002 lines
26 KiB
Plaintext

#include maps\_utility;
#include maps\_vehicle;
#include common_scripts\utility;
#include maps\_anim;
#include maps\af_chase_code;
#include maps\_hud_util;
#include maps\_vehicle_spline_zodiac;
main()
{
enemy_pickup_heli = GetEnt( "enemy_pickup_heli", "targetname" );
enemy_pickup_heli add_spawn_function( ::setup_enemy_pickup_heli );
pre_rapids_trigger = GetEnt( "pre_rapids_trigger", "targetname" );
pre_rapids_trigger thread trigger_pre_rapids();
trigger_just_before_boatride_end = GetEnt( "trigger_just_before_boatride_end", "targetname" );
trigger_just_before_boatride_end thread trigger_just_before_boatride_end();
trigger_pavelow_pilot_dialogue = getent( "trigger_pavelow_pilot_dialogue", "targetname" );
trigger_pavelow_pilot_dialogue thread trigger_pavelow_pilot_dialogue();
over_waterfall = GetVehicleNode( "over_waterfall_test", "script_noteworthy" );
over_waterfall thread trigger_over_waterfall();
zodiac_blend_target = GetEnt( "zodiac_blend_target", "targetname" );
zodiac_blend_target Hide();
thread player_in_sight_of_boarding_trigger();
weapon_pullout_before_waterfall = GetEnt( "weapon_pullout_before_waterfall", "targetname" );
weapon_pullout_before_waterfall thread trigger_steady_the_boat();
trigger_stop_boat_nagging = getent( "trigger_stop_boat_nagging", "targetname" );
trigger_stop_boat_nagging thread trigger_stop_boat_nagging();
thread slow_enemy_zodiac_for_player();
init_flags_here();
}
init_flags_here()
{
flag_init( "steady_shot" );
flag_init( "idle_over_waterfall" );
flag_init( "boat_freeze" );
flag_init( "player_in_position_for_boarding_sequence" );
flag_init( "price_steady1" );
flag_init( "price_steady2" );
flag_init( "price_steady3" );
flag_init( "price_steady_shoot" );
flag_init( "test_boat_is_on_spline" );
flag_init( "rocky_bumps" );
flag_init( "release_the_brakes" );
flag_init( "pickup_heli_ok_to_delete_now" );
flag_init( "price_fired_all_his_shots_at_heli" );
}
rumbly_rocks_bumps()
{
while ( 1 )
{
wait randomfloatrange( .1, .4 );
if( ! flag( "rocky_bumps" ) )
continue;
if ( cointoss() )
level.player PlayRumbleOnEntity( "damage_heavy" );
else
level.player PlayRumbleOnEntity( "damage_light" );
}
}
clear_rapids_junk()
{
level notify ( "clear_rapids_junk" );
level.player stoprumble( "damage_heavy" );
level.player stoprumble( "damage_light" );
level.player thread stop_loop_sound_on_entity( "zodiac_waterfall_idle" );
level.player thread stop_loop_sound_on_entity( "zodiac_waterfall_sustain" );
level.rumbler_ent delete();
}
create_ent_for_going_over_edge()
{
ent = spawn_tag_origin();
// ent thread boatline();
level.over_edge_ent = ent;
trigger = getentwithflag( "full_brake_until_waterfall_end" );
struct = getstruct( trigger.target, "targetname" );
targ = getstruct( struct.target, "targetname" );
dist = distance( struct.origin, targ.origin );
speed = 175; //111
time = dist / speed;
ent.origin = struct.origin;
ent thread update_position_on_spline();
flag_wait( "full_brake_until_waterfall_end" );
ent moveto( targ.origin, time, 0, 0 );
}
boatline()
{
self endon( "death" );
for ( ;; )
{
line( self.origin, level.player.origin );
wait 0.05;
}
}
fail_of_too_long_without_progress()
{
if ( flag( "player_brakes_on_waterfall" ) )
return;
level endon( "player_brakes_on_waterfall" );
wait 15;
// taking too long
bread_crumb_fail();
}
rapids_scene()
{
boat = level.players_boat;
flag_wait_or_timeout( "player_on_final_ride", 5 );
if ( !flag( "player_on_final_ride" ) )
{
// taking too long
bread_crumb_fail();
return;
}
/*
trigger = getentwithflag( "player_on_final_ride" );
struct = getstruct( trigger.target, "targetname" );
targ = getstruct( struct.target, "targetname" );
angles = vectortoangles( targ.origin - struct.origin );
forward = anglestoforward( angles );
player_angles = boat.angles;
player_angles = set_y( (0,0,0), boat.angles[1] );
player_forward = anglestoforward( player_angles );
if ( vectordot( player_forward, forward ) < 0.3 )
{
// going backwards or some bs
bread_crumb_fail();
return;
}
*/
// fov = getdvarint( "cg_fov" );
if ( !level.player WorldPointInReticle_Circle( level.enemy_boat.origin, 65, 1000 ) )
{
// going backwards or some bs
bread_crumb_fail();
return;
}
thread fail_of_too_long_without_progress();
autosave_by_name( "end_of_boatride" );
players_boat_end_path = GetVehicleNode( "players_boat_end_path_test", "targetname" );
level endon ( "clear_rapids_junk" );
childthread rumbly_rocks_bumps();
rumble_ent = level.player get_rumble_ent();
rumble_ent.intensity = .025;
level.rumbler_ent = rumble_ent;
//level.players_boat.veh_pathtype = "constrained";
level.players_boat endon( "death" );
level notify( "new_river_current" );
level.VehPhys_SetConveyorBelt_speed = 0;
boat VehPhys_SetConveyorBelt( 0, 0 );
ent = spawn_tag_origin();
level.POS_LOOKAHEAD_DIST = 0;
lookahead = 500;
flag_set( "steady_boat_participating" );
flag_set( "rocky_bumps" );
thread create_ent_for_going_over_edge();
min_speed = 0;
max_speed = 40;
dist_ahead = -80;
speed_ahead = min_speed;
dist_behind = -300;
speed_behind = max_speed;
input_multiplier = 25;
goal_offset_range = 350;
goal_offset = level.player.offset;
min_brake = 0;
max_brake = 1;
brake_dist_ahead = -60;
brake_ahead = max_brake;
brake_dist_behind = -70;
brake_behind = min_brake;
goal_blend_time = 2;
goal_blend_time *= 1000;
start_time = gettime();
was_driving = false;
for ( ;; )
{
//line( boat.origin, level.test_boat.origin );
input = level.player GetNormalizedMovement()[1];
goal_offset += input * input_multiplier;
goal_offset = clamp( goal_offset, goal_offset_range * -1, goal_offset_range );
//println( input + " " + goal_offset );
//targ = get_player_targ();
//next_targ = targ.next_node;
targ = get_player_targ();
progress = get_player_progress();
touching_edge = flag( "boat_hits_right_side" ) || flag( "boat_hits_left_side" );
if ( touching_edge )
{
goal_offset *= 0.85;
//println( goal_offset );
}
used_offset = goal_offset;
if ( abs( used_offset ) < 200 )
{
// give it some sway
sway = sin( gettime() * 0.10 ) * 80;
used_offset += sway;
used_offset = clamp( used_offset, -200, 200 );
//println( used_offset );
}
goal = get_position_from_spline_unlimited( targ, progress + lookahead, used_offset );
goal = set_z( goal, boat.origin[2] );
//old_goal = goal;
//// blend from the original goal to the goal over time
//original_goal = boat.origin + player_forward * lookahead;
//time_passed = gettime() - start_time;
//time_passed = clamp( time_passed, 0, goal_blend_time );
//goal = graph_position( time_passed, 0, original_goal, goal_blend_time, goal );
//
//if ( time_passed == goal_blend_time )
//{
// assertex( goal == old_goal, "Got wrong goal" );
//}
//Line( boat.origin, goal, (1,0,0) );
speed = 35;
if ( flag( "test_boat_is_on_spline" ) )
{
test_ent = level.test_boat;
if ( flag( "full_brake_until_waterfall_end" ) )
{
// get the dif from a spawned entity that is more representative of the scene
// since the boat anim has insanity imbedded in it.
test_ent = level.over_edge_ent;
}
dif = progress_dif( targ, progress, test_ent.targ, test_ent.progress );
speed = graph_position( dif, dist_ahead, speed_ahead, dist_behind, speed_behind );
speed = clamp( speed, min_speed, max_speed );
if ( flag( "full_brake_until_waterfall_end" ) )
{
brakes = graph_position( dif, brake_dist_ahead, brake_ahead, brake_dist_behind, brake_behind );
brakes = clamp( brakes, min_brake, max_brake );
boat.veh_brake = brakes;
}
else
if ( flag( "player_brakes_on_waterfall" ) )
{
brakes = graph_position( dif, brake_dist_ahead, brake_ahead, brake_dist_behind, brake_behind );
brakes = clamp( brakes, min_brake, max_brake );
boat.veh_brake = brakes;
}
}
//println( "speed " + speed + ", brakes " + boat.veh_brake );
time_passed = gettime() - start_time;
if ( time_passed > 1000 || touching_edge )
{
boat vehicleDriveTo( goal, speed );
if ( !was_driving )
{
was_driving = true;
boat.veh_brake = 0;
}
}
wait 0.05;
}
if ( 1 ) return;
level.players_boat thread vehicle_paths( players_boat_end_path );
level.players_boat StartPath( players_boat_end_path );
// level.players_boat delayCall( .2, ::resumespeed, 20 );
level.players_boat delayCall( .2, ::Vehicle_SetSpeed, 35,15,15 );
level.players_boat Vehicle_TurnEngineOff();
jolt_time = .3;
jolt_count = 0;
// level.player ShellShock( "af_chase_boatdrive_end", 60 );
childthread rumbly_rocks_bumps();
flag_set( "rocky_bumps" );
rumble_ent = level.player get_rumble_ent();
rumble_ent.intensity = .025;
level.rumbler_ent = rumble_ent;
while ( 1 )
{
if ( player_steadies_boat() )
{
flag_set( "steady_boat_participating" );
level.player thread stop_loop_sound_on_entity( "zodiac_waterfall_idle" );
// level.player thread play_sound_on_entity( "zodiac_player_rampup" );
level.player thread play_loop_sound_on_entity( "zodiac_waterfall_sustain" );
// level.player StopRumble( "tank_rumble" );
level.players_boat.driftdir = 1;
flag_clear( "rocky_bumps" );
rumble_ent.intensity = .225;
// level.player stopshellshock();
while ( player_steadies_boat() )
wait .05;
rumble_ent.intensity = .0001;
flag_set( "rocky_bumps" );
// level.player ShellShock( "af_chase_boatdrive_end", 60 );
level.player thread stop_loop_sound_on_entity( "zodiac_waterfall_sustain" );
level.player thread play_loop_sound_on_entity( "zodiac_waterfall_idle" );
jolt_count = 0;
}
else
{
level.players_boat.driftdir = -1;
flag_clear( "steady_boat_participating" );
// level.player PlayRumbleOnEntity( "tank_rumble" );
jolt_count += .05;
}
if ( jolt_count > jolt_time )
{
jolt_count = 0;
level.players_boat JoltBody( ( level.players_boat.origin + ( 0, 0, 64 ) + randomvector( 32 ) ), 0.1 );
}
wait .05;
}
}
//#using_animtree( "generic_human" );
price_does_steady_boat_anims_and_sound()
{
level.price delaythread( 0.666, ::play_sound_on_entity, "afchase_pri_holdsteady" );
level.players_boat anim_generic( level.price, "zodiac_rapids_sniper", "tag_guy2" );
level.players_boat thread anim_generic_loop( level.price, "zodiac_rapids_sniper_aimidle", "end_aim", "tag_guy2" );
level.price delaythread( 0, ::play_sound_on_entity, "afchase_pri_steady1" );
level.price delaythread( 3, ::play_sound_on_entity, "afchase_pri_steady1" );
}
price_snipes_from_boat()
{
level.price endon( "death" );
level.price radio_dialogue_stop();
level.price linkto( level.players_boat, "tag_guy2", (0,0,0),(0,0,0) );
thread price_does_steady_boat_anims_and_sound();
// if ( !flag( "steady_shot" ) )
// return player_fail_at_waterfall();
flag_wait( "price_steady_shoot" );
thread fail_if_not_going_over_falls();
level.players_boat notify( "end_aim" );
level.price Shoot();
level.price thread play_sound_on_tag( "price_sniper_fire_at_helicopter", "tag_flash" );
level.players_boat anim_generic( level.price, "zodiac_rapids_sniper_fire", "tag_guy2" );
level.price Shoot();
level.price thread play_sound_on_tag( "price_sniper_fire_at_helicopter", "tag_flash" );
level.players_boat anim_generic( level.price, "zodiac_rapids_sniper_fire", "tag_guy2" );
level.players_boat thread anim_generic_loop( level.price, "zodiac_rapids_sniper_aimidle", "end_aim", "tag_guy2" );
wait .6;
level.price Shoot();
level.players_boat notify( "end_aim" );
level.enemy_pickup_heli delaythread( .05, ::pickup_heli_kill);
level.price thread play_sound_on_tag( "price_sniper_fire_at_helicopter", "tag_flash" );
fx = getfx( "explosions/large_vehicle_explosion" );
heli = level.enemy_ending_seaknight;
PlayFXOnTag( fx, heli, "tag_guy0" );
level.players_boat anim_generic( level.price, "zodiac_rapids_sniper_fire", "tag_guy2" );
flag_set( "price_fired_all_his_shots_at_heli" );
thread over_idle();
scene = "zodiac_rapids_sniper_waterfall";
animation = level.price getgenericanim( scene );
time = getanimlength( animation );
delaythread( time * 1.05, ::flag_set, "release_the_brakes" );
level.players_boat thread play_sound_on_entity( "zodiac_player_reverse" );
level.players_boat anim_generic( level.price, scene, "tag_guy2" );
flag_set( "idle_over_waterfall" );
}
player_fail_at_waterfall()
{
wait 2;
missionFailedWrapper();
}
over_idle()
{
level.players_boat endon ( "death" );
flag_wait( "idle_over_waterfall" );
level.players_boat thread anim_generic_loop( level.price, "zodiac_rapids_sniper_rapididle", "end_aim", "tag_guy2" );
}
trigger_steady_the_boat()
{
self waittill( "trigger" );
thread miniguns_on_pickup_heli();
}
water_fall_edge()
{
trigger = GetEnt( "water_fall_edge_trigger", "targetname" );
level.players_boat notify( "stop_targetting" );
level.player AllowStand( true );
level.player AllowCrouch( false );
level.player AllowProne( false );
PlayFXOnTag( getfx( "splash_over_waterfall" ), level.players_boat, "tag_guy2" );
level.players_boat notify( "kill_treadfx" );
cleanup_stuff_on_players_boat();
targent = GetEnt( trigger.target, "targetname" );
on_foot_destination = GetEnt( "on_foot_destination", "targetname" );
level.player DisableWeapons();
level notify( "player_over_the_waterfall" );
height = targent.origin[ 2 ] + 250;
height = targent.origin[ 2 ] + 270;
level.player PlayerLinkToBlend( level.players_boat, "tag_player", .15, .05, .05 );
level.player SetEqLerp( 1, level.eq_main_track );
level thread maps\af_chase_knife_fight_code::eq_blender();
thread maps\_ambient::use_eq_settings( "fadeout_noncritical", level.eq_mix_track );
while ( level.player.origin[ 2 ] > height )
wait .05;
player_dismount();
flag_set( "pickup_heli_ok_to_delete_now" );
level notify( "stop_music_at_splash" );
if( isdefined( level.music_emitter ) )
{
level.music_emitter StopSounds();
level.music_emitter delaycall( .05, ::delete );
}
thread send_player_to_blend_boat();
move_to_origin = set_z( level.player_linkent.origin, targent.origin[ 2 ] - 55 );
level.players_boat Delete();
script_vehicle_zodiacs = GetEntArray( "script_vehicle_zodiac", "classname" );
script_vehicle_zodiac_physics = GetEntArray( "script_vehicle_zodiac_physics", "classname" ) ;
array_call( script_vehicle_zodiacs, ::delete );
array_call( script_vehicle_zodiac_physics, ::delete );
level.player_linkent.origin = move_to_origin;
level.player Unlink();
level.player PlayerLinkTodelta( level.player_linkent, "tag_player", 1,0,0,0,0 );
flag_set( "boat_freeze" );
AmbientStop();
// set_ambient( "af_chase_caves" );
SetBlur( 6, 1.5 );
level.player PlayRumbleOnEntity( "damage_heavy" );
thread play_sound_in_space( "scn_afchase_player_plunge", level.player.origin );
fog_set_changes( "afch_fog_underwater", 0 );
Earthquake( .3, 3.5, level.player.origin, 1000 );
level.player SetWaterSheeting( 3, 3 );
if ( IsDefined( level.price.function_stack ) )
level.price function_stack_clear();// mo said too. keep his function stack from continuing after he's dead.
level.price stop_magic_bullet_shield();
level.players_boat notify( "end_aim" );
array_call( GetAIArray(), ::Delete );
level.player thread waterfx();
thread maps\af_chase_fx::play_underwater_fx();
wait 1;
if ( ! flag( "killed_pickup_heli" ) )
{
// Shepherd escaped on the Helicopter.
SetDvar( "ui_deadquote", &"AF_CHASE_FAILED_TO_SHOOT_DOWN" );
missionFailedWrapper();
return;
}
black_overlay = create_client_overlay( "black", 0, level.player );
black_overlay FadeOverTime( 3 );
black_overlay.alpha = 1;
AmbientStop( 2 );
level.eq_ent MoveTo( (1,0,0), 5, 0, 0 );
wait 2;
setdvar( "ui_char_museum_mode", "credits_1" );
nextmission();
wait 7;
/*
set_ambient( "af_chase_ext" );
level.player Unlink();
level.player PlayerSetGroundReferenceEnt( undefined );
level.player teleport_player( on_foot_destination );
flag_set( "player_gets_up_after_waterfall" );
flag_wait( "end_heli_crashed" );
level.player EnableWeapons();
flag_set( "water_cliff_jump_splash_sequence" );
black_overlay delayCall( .05, ::Destroy );// leave it for a frame, then knife fight takes over with new overlays.
flag_set( "fell_off_waterfall" );
*/
}
send_player_to_blend_boat()
{
zodiac_blend_target = GetEnt( "zodiac_blend_target", "targetname" );
level.players_boat MakeUsable();
level.player PlayerLinkToBlend( zodiac_blend_target, "tag_player", .05, 0, 0 );
// player_dismount();
level.player PlayerLinkToBlend( zodiac_blend_target, "tag_player", .05, 0, 0 );
level.players_boat MakeUnusable();
level.player_linkent = zodiac_blend_target;
}
pickup_heli_kill()
{
flag_set( "killed_pickup_heli" );
self thread play_sound_on_entity( "scn_afchase_pavelow_downed" );
self Vehicle_TurnEngineOff();
self.script_crashtypeoverride = "none";
self.crashing = true;// halts vehicles script from freeing the vehicle.
self godoff();
self notify( "death" );
flag_wait( "pickup_heli_ok_to_delete_now" );
flag_set( "end_heli_crashed" );
self notify( "stop_crash_loop_sound" );
self notify( "crash_done" );
self notify( "nodeath_thread" );
wait .1;// let the sound thread stop..
self Delete();
}
trigger_pre_rapids()
{
self waittill( "trigger" );
level.price.use_auto_pose = undefined;
level.price.scripted_boat_pose = "left";
}
player_dismount()
{
level.players_boat Vehicle_TurnEngineOff();
level.player DismountVehicle();
level.players_boat SetModel( "vehicle_zodiac" );
level.player.drivingVehicle = undefined;
}
delete_end_seaknight()
{
foreach ( rider in self.riders )
rider stop_magic_bullet_shield();
self Delete();
}
#using_animtree( "vehicles" );
enemy_pickup_boat_spot()
{
anim_scene = getstruct( "rapids_anim_scene", "targetname" );
anim_scene.angles = ( 0, 0, 0 );
enemy_heli = self;
level.enemy_ending_seaknight = self;
enemy_heli.animname = "pavelow";
boat = level.players_boat;
boat = Spawn( "script_model", level.players_boat.origin );
boat SetModel( level.players_boat.model );
boat.animname = "zodiac_player";
boat hide();
boat UseAnimTree( #animtree );
boat NotSolid();
level.test_boat = boat;
guys = [];
guys[ "heli" ] = enemy_heli;
guys[ "boat" ] = boat;
enemy_heli Vehicle_TurnEngineOff();
anim_scene thread anim_loop_solo( enemy_heli, "sniper_waterfall_idle", "stop_loop_solo" );
anim_scene notify( "stop_loop_solo" );
flag_wait( "enemy_boat_boarded_seaknight" );
flag_wait( "player_in_position_for_boarding_sequence" );
boat thread update_position_on_spline();
level.enemy_boat delayThread( 10, ::delete_end_seaknight );
dummy = level.enemy_boat vehicle_to_dummy();
level.enemy_boat Vehicle_SetSpeedImmediate( 500, 500, 500 );
level.enemy_boat vehicleDriveTo( ( 25648, 26920, -10168 ), 500 );
//level.enemy_boat notsolid();
heli_linker = spawn( "script_origin", enemy_heli.origin );
heli_linker linkto ( enemy_heli, "tag_body", (0,0,0), (0,0,0) );
dummy delaycall( .05, ::LinkTo, heli_linker );
level.player thread play_sound_on_entity( "afchase_plp_onboard" );
level.price notify( "stop_boatrider_targets" );
level.price SetEntityTarget( enemy_heli );
animation = boat getanim( "sniper_waterfall" );
startang = GetStartAngles( anim_scene.origin, anim_scene.angles, animation );
startorg = GetStartOrigin( anim_scene.origin, anim_scene.angles, animation );
thread match_position_of_animated_boat( boat );
enemy_heli thread helicopter_sound_blend();
thread price_snipes_from_boat();
level.player delaythread( 4, ::play_sound_on_entity, "afchase_plp_thelongway" );
flag_set( "test_boat_is_on_spline" );
anim_scene thread anim_single_solo( enemy_heli, "sniper_waterfall" );
anim_scene anim_single_solo( boat, "sniper_waterfall" );
//boat anim_single_solo( boat, "waterfall_over" );
}
movetotag( ent, tag, time )
{
thread movetotag_internal( ent, tag, time );
}
movetotag_internal( ent, tag, time )
{
self notify( "new_move_to_tag" );
self endon( "new_move_to_tag" );
timer = GetTime() + ( time * 1000 );
tag_origin = ent GetTagOrigin( tag );
self Unlink();
self MoveTo( tag_origin, time );
while ( GetTime() < timer )
{
updated_tag_origin = ent GetTagOrigin( tag );
if ( updated_tag_origin != tag_origin )
{
tag_origin = updated_tag_origin;
time = ( timer - GetTime() ) / 1000;
self MoveTo( tag_origin, time );
}
wait .05;
}
self LinkToBlendToTag( ent, tag );
}
setup_enemy_pickup_heli()
{
level.enemy_pickup_heli = self;
self thread godon();
while ( !isdefined( level.players_boat ) )
wait .05;
self thread enemy_pickup_boat_spot();
}
miniguns_on_pickup_heli()
{
heli = level.enemy_pickup_heli;
turret = SpawnTurret( "misc_turret", heli.origin, "minigun_littlebird_spinnup" );
turret SetModel( "vehicle_little_bird_minigun_right" );
turret LinkTo( heli, "tag_gunner_right", ( 33, 0, 0 ), ( 60, 76, 0 ) );
// turret.isvehicleattached = true;// lets mgturret know not to mess with this turret
turret.ownerVehicle = self;
turret SetLeftArc( 85 );
turret SetRightArc( 85 );
turret SetBottomArc( 55 );
turret SetTopArc( 85 );
turret.script_team = "axis";
turret SetMode( "manual" );
turret thread maps\_mgturret::burst_fire_unmanned();
turret MakeUnusable();
turret SetTurretTeam( "axis" );
level thread maps\_mgturret::mg42_setdifficulty( turret, getDifficulty() );
turret SetAISpread( .4 );
turret SetConvergenceTime( 1 );
turret.accuracy = 0;
// turret SetTargetEntity( level.players_boat, ( -256, 0, 0) );
level.end_heli_turret = turret;
turret thread minigun_path();
heli waittill( "death" );
turret Delete();
}
minigun_path()
{
minigun_path = getstruct( "minigun_path", "targetname" );
target_ent = Spawn( "script_origin", minigun_path.origin );
// target_ent SetModel( "body_desert_tf141_zodiac" );
// target_ent NotSolid();
minigun_splasher = getent( "minigun_splasher", "targetname" );
minigun_splasher thread minigun_splasher_think();
self endon( "death" );
self SetTargetEntity( target_ent );
flag_wait( "price_steady1" );
self StartFiring();
while ( !flag( "price_fired_all_his_shots_at_heli" ) )
{
if ( !isdefined( minigun_path.target ) )
return;
minigun_path = getstruct( minigun_path.target, "targetname" );
if ( !isdefined( minigun_path ) )
return;
target_ent MoveTo( minigun_path.origin, 1, 0, 0 );
target_ent waittill( "movedone" );
}
target_ent MoveTo( level.player.origin, 2.5, 0, 0 );
// target_ent waittill( "movedone" );
self SetTargetEntity( level.player );
self SetAISpread( .4 );
self SetConvergenceTime( 3 );
self.accuracy = 1;
}
player_in_sight_of_boarding_trigger()
{
flag_wait( "player_in_sight_of_boarding" );
level.price.use_auto_pose = undefined;
level.price.scripted_boat_pose = "left";
thread rapids_scene();
level notify( "quit_bread_crumb" );// kills failure from falling behind script.
remove_extra_autosave_check( "boat_check_trailing" );
remove_extra_autosave_check( "boat_check_player_speeding_along" );
}
trigger_just_before_boatride_end()
{
self waittill( "trigger" );
level notify( "no_more_reverse_hints" );
flag_set( "no_more_physics_effects" );
}
trigger_pavelow_pilot_dialogue()
{
self waittill( "trigger" );
level notify( "price_stops_talking_about_helicopters" );
// Avatar One, gimme a sitrep, over!
radio_dialogue( "afchase_shp_sitrep" );
// I have Warhorse 5-1 standing by. Pave Low's downriver sir.
radio_dialogue( "afchase_uav_downriver" );
// Copy that! Warhorse 5-1, be advised, we're comin' in hot!
radio_dialogue( "afchase_shp_comininhot" );
// Roger - dropping the hatch - keep it above 30 knots and watch the vertical clearance.
radio_dialogue( "afchase_plp_above30knots" );
// level.player thread play_sound_on_entity( "afchase_plp_above30knots" );
}
slow_enemy_zodiac_for_player()
{
trigger = GetVehicleNode( "slow_enemy_zodiac_for_player", "script_noteworthy" );
trigger waittill( "trigger", zodiac );
flag_set( "zodiac_boarding" );
zodiac Vehicle_SetSpeed( 0, 30, 44 );
flag_wait( "player_in_sight_of_boarding" );
zodiac ResumeSpeed( 12 );
}
trigger_over_waterfall()
{
flag_wait( "going_over_waterfall" );
thread water_fall_edge();
boat = level.players_boat;
node = Spawn( "script_origin", boat.origin );
node.angles = flat_angle( boat.angles );
anim_name = "waterfall_over";
thread clear_rapids_junk();
node thread anim_single_solo( boat, anim_name );
}
fail_if_not_going_over_falls()
{
wait 15;
if ( !flag( "going_over_waterfall" ) )
{
bread_crumb_fail();
}
}
match_position_of_animated_boat( animated_boat )
{
catchup_speed = 5;
fall_back_speed = 6;
players_boat = level.players_boat;
players_boat endon( "death" );
wait .1;// animation is not in place yet
last_animated_boat_spot = animated_boat GetTagOrigin( "tag_body" );
ahead = 2;
speed_to_go = 45;
while ( 1 )
{
wait .05;
origin = animated_boat GetTagOrigin( "tag_body" );// cause I don't trust tag_origin
angles = animated_boat GetTagAngles( "tag_body" );// cause I don't trust tag_origin
speed_of_animatedboat = Distance( last_animated_boat_spot, origin ) * 20 / 17.6;
level.speed_of_animatedboat = speed_of_animatedboat ;
origin2 = level.players_boat GetTagOrigin( "tag_body" );
dot = get_dot( origin, angles, origin2 );
last_animated_boat_spot = origin;
if ( dot > 0 )
{
speed_to_go = speed_of_animatedboat - fall_back_speed;
}
else if ( dot < 0 )
{
if ( Distance( origin, origin2 ) < 86 )
speed_to_go = speed_of_animatedboat;
else
speed_to_go = speed_of_animatedboat + catchup_speed;
}
speed_to_go = cap_value( speed_to_go, 5, 60 );
players_boat Vehicle_SetSpeed( speed_to_go, 8, 8 );
}
}
minigun_splasher_think()
{
effect = getfx( "pavelow_minigunner_splash_add" );
while(1)
{
self waittill( "damage", amount, attacker, direction_vec, point, type );
if ( attacker.code_classname != "misc_turret" )
continue;
ang = attacker GetTagAngles( "tag_flash" );
org = attacker GetOrigin( "tag_flash" );
vect = AnglesToForward( ang ) * 3000;
trace = BulletTrace( org, org+vect, false, attacker );
if( trace[ "fraction" ] == 1.0 )
continue;
if( isdefined( trace[ "entity" ] ) )
continue;
playfx( effect, trace[ "position" ] );
}
}
trigger_stop_boat_nagging()
{
self waittill ("trigger");
flag_set ( "stop_boat_dialogue" );
}
helicopter_sound_blend()
{
fly = "afchase_pavelow_fly";
idle = "afchase_pavelow_idle";
flyblend = spawn( "sound_blend", ( 0.0, 0.0, 0.0 ) );
flyblend thread manual_linkto( self, ( 0, 0, 0 ) );
idleblend = spawn( "sound_blend", ( 0.0, 0.0, 0.0 ) );
idleblend thread manual_linkto( self, ( 0, 0, 64 ) );
idleblend thread mix_up( idle );
idleblend SetSoundBlend( idle, idle + "_off", 0 );
wait 1;
idleblend thread mix_down( idle );
flyblend thread mix_up( fly );
flag_wait ( "end_heli_crashed" );
idleblend thread mix_down( idle );
flyblend thread mix_down( fly );
}