1002 lines
26 KiB
Plaintext
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 );
|
|
|
|
} |