IW4-Dump-Files/maps/boneyard.gsc

1990 lines
51 KiB
Plaintext

#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\boneyard_code;
main()
{
precacheItem( "littlebird_FFAR" );
PrecacheItem( "smoke_grenade_american" );
PrecacheItem( "rpg_straight" );
PrecacheItem( "rpg_distant" );
PreCacheRumble( "c130_flyby" );
maps\_juggernaut::main();
maps\_drone_ai::init();
start_points_setup();
maps\_load::set_player_viewhand_model( "viewhands_player_marines" );
animscripts\dog\dog_init::initDogAnimations();
maps\boneyard_precache::main();
level.vttype = "uaz_physics";
level.vtmodel = "vehicle_uaz_open_destructible";
maps\_vehicle::build_aianims( maps\boneyard_anim::uaz_overrides, maps\boneyard_anim::uaz_override_vehicle );
maps\_vehicle::build_unload_groups( ::uaz_unload_groups );
level.vttype = "truck_physics";
level.vtmodel = "vehicle_pickup_roobars";
maps\_vehicle::build_aianims( maps\boneyard_anim::truck_overrides, maps\boneyard_anim::truck_vehicle_overrides );
level.vttype = "suburban_minigun";
level.vtmodel = "vehicle_suburban_technical";
typemodel = level.vttype + level.vtmodel;
level.vehicle_death_fx[ typemodel ] = [];
maps\_vehicle::build_aianims( maps\boneyard_anim::suburban_minigun_overrides, maps\_suburban_minigun::set_vehicle_anims );
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 );
maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode" );
level.vttype = "suburban";
level.vtmodel = "vehicle_suburban";
typemodel = level.vttype + level.vtmodel;
level.vehicle_death_fx[ typemodel ] = [];
maps\_vehicle::build_aianims( maps\boneyard_anim::suburban_overrides, maps\_suburban::set_vehicle_anims );
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 );
maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode" );
maps\createart\boneyard_fog::main();
maps\createfx\boneyard_audio::main();
maps\boneyard_fx::main();
maps\_load::main();
maps\boneyard_anim::main();
thread maps\boneyard_amb::main();
maps\_compass::setupMiniMap( "compass_map_boneyard" );
// setup stuff
flags_setup();
threatbiasgroups_setup();
threewayfight_setup();
fire_missile_setup();
delete_not_touching_setup();
delete_excess_setup();
vehicle_event_node_setup();
vehicle_aianimthread_setup();
launch_object_setup();
// killer_bird_setup();
vehicle_sweetener_setup();
ride_rumble_setup();
// consines used for fov checks.
level.cosine[ "20" ] = cos( 20 );
level.cosine[ "60" ] = cos( 60 );
thread objectives();
// used for switching colors on ai
level.base_colors = [];
level.base_colors[ "axis" ] = "r";
level.base_colors[ "team3" ] = "p";
// gameplay threads
thread road();
thread flyby();
thread higround();
thread ride();
thread music_thread();
// it sounds like they are friendlies because some of the battlechatter is over the radio.
// battlechatter_off( "team3" );
// enemies need to be closer to tell each other about an enemy
setsaveddvar( "ai_eventDistNewEnemy", 512 );
// makes you less likely to just walk up to enemies.
setsaveddvar( "ai_eventDistFootstepSprint", 640 ); //400
setsaveddvar( "ai_eventDistFootstep", 480 ); //256
setsaveddvar( "ai_eventDistFootstepWalk", 320 ); //128
}
flags_setup()
{
flag_init( "delete_excess" );
flag_init( "suburban_target_btr80" );
flag_init( "littlebird_at_goal" );
flag_init( "btr80_target_littlebird" );
flag_init( "btr80_destroyed" );
flag_init( "littlebird_stage1" );
flag_init( "uaz_park" );
flag_init( "uaz_player_in_control" );
flag_init( "intro_btr80_dead" );
flag_init( "ride_uaz_arriving" );
flag_init( "uaz_mounted" );
flag_init( "ride_enemy_vehicles_spawn" );
flag_init( "uaz_driver_dead" );
flag_init( "music_boneyard_intro" );
flag_init( "music_boneyard_flyby" );
flag_init( "makarov_dialogue" );
flag_init( "ride_minigun_gunner_dead" );
flag_init( "player_loses_control_of_uaz" );
flag_init( "uaz_nag" );
/*************************
*** FLAGS FROM RADIANT ***
**************************
blow_tanker_first
blow_tanker_second
blow_wing
boneyard_mission_completed
btr80_at_end
btr80_destroy
c130_hatch_open
c130_takeoff
c130_takeoff_missed
flyby_c130
flyby_minigun_move
flyby_rockets
friendly_stay_ahead
frontal_suburban_move
higround_1
higround_2
higround_ascend
hummer_destroy
hunt_btr80
intro_btr80_attack
intro_btr80_attack_kill
intro_btr80_destroy
intro_btr80_pre_attack
intro_littlebird_strafe
intro_rockets_2
keep_moving
littlebird_react
littlebird_stage1_wait
music_boneyard_planechase
no_align
obj_ride
ride_shadows
ride_driver_death
road
road_rocket_guys
road_rocket_guys
runway_save
runway_suburban_rightside
scene_a_wave2
stop_road_rockets
switch_color
uaz_drive
uaz_driver_dialogue
uaz_driver_mount
uaz_mount_end
uaz_player_control
wait_for_player
where_is_nikolai
wing_fall
*************************/
}
threatbiasgroups_setup()
{
CreateThreatBiasGroup( "aware_of_player" );
CreateThreatBiasGroup( "ignore_player" );
CreateThreatBiasGroup( "enemy_dog" );
CreateThreatBiasGroup( "lowthreat" );
SetThreatBias( "allies", "aware_of_player", 0 ); //aware_of_player are using the base threat level.
SetThreatBias( "allies", "axis", -1000 ); // axis find the player to be less of a threat. // used 1000 before
SetThreatBias( "allies", "team3", -1000 ); // team3 find the player to be less of a threat. // used 1000 before
SetThreatBias( "allies", "enemy_dog", -3000 ); // dogs find the player to be less of a threat.
SetIgnoreMeGroup( "allies", "ignore_player" ); // ignore_player ignores the player
SetThreatBias( "lowthreat", "axis", -2000 ); // axis find the target less of a threat.
SetThreatBias( "lowthreat", "team3", -2000 ); // team3 find the target less of a threat.
}
start_points_setup()
{
default_start( ::start_default );
add_start( "intro", ::start_default, "Intro" );
add_start( "road", ::start_road, "Road" );
add_start( "flyby", ::start_flyby, "Flyby" );
add_start( "higround", ::start_higround, "Higround" );
add_start( "ride", ::start_ride, "Ride" );
add_start( "ride_end", ::start_ride_end, "Ride_end" );
}
objectives()
{
flag_init( "obj_rallypoint" );
flag_init( "obj_ride" );
flag_init( "obj_ride_c130" );
objective_number = 0;
// each case is a start point;
switch( level.start_point )
{
default:
case "intro":
// this will have to change when I go backwards and do the sniper clearing.
flag_wait( "obj_rallypoint" );
objective_number = 0;
end_position = getent( "rallypoint", "targetname" );
obj_position = getent( end_position.target, "targetname" );
objective_add( objective_number, "current", &"BONEYARD_OBJ_RALLYPOINT", obj_position.origin );
level thread lerp_objective_pos( objective_number, obj_position, end_position );
case "flyby":
case "higround":
case "ride":
flag_wait( "obj_ride" );
Objective_State( objective_number, "done" );
objective_number = 1;
obj_position = getent( "rallypoint", "targetname" );
objective_add( objective_number, "current", &"BONEYARD_OBJ_RIDE", obj_position.origin );
Objective_SetPointerTextOverride( objective_number, &"BONEYARD_OBJ_RIDE_ICON" );
// flag_wait( "uaz_drive" );
Objective_OnEntity( objective_number, level.uaz, (-48,-32,16) );
case "ride_c130":
flag_wait( "obj_ride_c130" );
level notify( "release_objective" );
Objective_State( objective_number, "done" );
objective_number = 2;
obj_position = level.c130;
objective_add( objective_number, "current", &"BONEYARD_OBJ_C130", obj_position.origin );
setsaveddvar( "compass", 0 );
thread sp_objective_onentity( objective_number, level.c130 );
}
flag_wait( "uaz_park" );
wait 0.5;
Objective_State( objective_number, "done" );
fade_out_level( 2 );
if ( is_default_start() )
{
nextmission();
}
else
{
IPrintLnBold( "DEVELOPER: END OF SCRIPTED LEVEL" );
}
}
lerp_objective_pos( objective_number, obj_position, end_position )
{
flag_wait( "objective_lerp" );
obj_position moveto( end_position.origin, 60 );
for ( i = 0; i<6; i++ )
{
wait 10;
Objective_Position( objective_number, obj_position.origin );
}
Objective_Position( objective_number, end_position.origin );
}
music_thread()
{
flag_wait( "music_boneyard_intro" );
music_loop( "boneyard_intro", 151 );
flag_wait( "music_boneyard_flyby" );
music_loop( "boneyard_flyby", 184, 6 );
flag_wait( "ride_enemy_vehicles_spawn" );
music_play( "boneyard_jeepride", 4 );
flag_wait( "music_boneyard_planechase" );
music_play( "boneyard_planechase", 1 );
flag_wait( "player_loses_control_of_uaz" );
wait 0.8;
musicstop( 1.5 );
level notify( "stop_music" );
level.player play_sound_on_entity( "boneyard_planechase_end" );
}
start_default()
{
level thread intro();
}
intro()
{
getent( "littlebird", "targetname" ) add_spawn_function( ::littlebird_init );
getent( "intro_littlebird", "script_noteworthy" ) add_spawn_function( ::littlebird_init, true );
getent( "intro_littlebird_2", "script_noteworthy" ) add_spawn_function( ::littlebird_init, true );
getent( "intro_littlebird_2", "script_noteworthy" ) add_spawn_function( ::intro_littlebird_strafe );
getent( "intro_hummer", "script_noteworthy" ) add_spawn_function( ::intro_hummer );
getent( "intro_btr80", "script_noteworthy" ) add_spawn_function( ::intro_btr80 );
getent( "scene_a_suburban", "script_noteworthy" ) add_spawn_function( ::scene_a_suburban );
level thread intro_player();
level thread intro_rockets();
level thread intro_dialogue();
activate_trigger_with_targetname( "intro_trigger" );
exploder( "intro_exploder" );
level thread intro_introscreen();
flag_wait( "pullup_weapon" );
wait 0.2;
level.player.surprisedByMeDistSq = squared( 5000 ); //what is this for? - Roger
starttime = gettime();
flag_wait_or_timeout( "player_left_fuselage", 15 );
wait_for_buffer_time_to_pass( starttime, 5 );
activate_trigger_with_targetname( "intro_trigger_2" );
array_thread( getentarray( "littlebird_trigger", "targetname" ), ::littlebird_trigger );
level thread littlebird_spawn();
wait 5;
activate_trigger_with_targetname( "intro_color_trigger" );
flag_wait( "intro_btr80_destroy" );
wait 2;
activate_trigger_with_targetname( "intro_threeway_fight" );
flag_set( "switch_color" );
}
intro_introscreen()
{
// flag_wait_either( "intro_btr80_dead", "objective_lerp" );
flag_wait( "obj_rallypoint" );
wait 1;
maps\_introscreen::boneyard_intro();
}
intro_player()
{
level.player.ignoreme = true;
level.player waittill_any_timeout( 6, "weapon_fired", "grenade_fire" );
wait 6;
level.player.ignoreme = false;
}
intro_dialogue()
{
wait 2.5;
flag_set( "music_boneyard_intro" );
// Soap! Shepherd's trying to wipe out *us* and Makarov at the same time! Head for rally point Bravo to the north! Trust no one!
radio_dialogue( "byard_pri_wipeoutus" );
flag_set( "obj_rallypoint" );
flag_wait_either( "intro_btr80_dead", "objective_lerp" );
wait 8;
// I'm gonna call in the backup plan! Head for the rally point while I coordinate with Nikolai!
radio_dialogue( "byard_pri_backupplan" );
wait 1;
// Nikolai! This is Price! Now would be a good time!!! The LZ is hot, I repeat the LZ is hot!!!
radio_dialogue( "byard_pri_lzishot" );
// Ok, Captain Price, I am on the way! Try to get the situation under control BEFORE I get there, ok?
radio_dialogue( "byard_nkl_ontheway" );
// Right, whatever you say Nikolai! Just get here sharpish!
radio_dialogue( "byard_pri_sharpish" );
flag_wait( "let_them_fight" );
// Soap, let Makarov and Shepherd's men kill each other off as much as you can!
radio_dialogue( "byard_pri_radiotraffic" );
// We can use their radios to listen in on their radio traffic! I'm going to try to contact Makarov!
radio_dialogue( "byard_pri_contactmakarov" );
wait 2;
level thread makarov_dialogue();
level endon( "flyby_c130" );
flag_waitopen( "makarov_dialogue" );
flag_wait( "keep_moving" );
// Soap! Don't get pinned down out there! Keep heading north for the runway area!
radio_dialogue( "byard_pri_headnorth" );
flag_wait( "road" );
// Nikolai, where the hell are you?
radio_dialogue( "byard_pri_whereareyou" );
// Sand storms around Kandahar, Captain Price. I have to fly around them. I'm not getting paid enough to crash my plane.
radio_dialogue( "byard_nkl_sandstorms" );
}
makarov_dialogue()
{
flag_set( "makarov_dialogue" );
wait 2;
// Makarov, this is Price! Shepherd's a war hero now! He's got your operations playbook and he's got a blank check!
radio_dialogue( "byard_pri_warhero" );
wait 1.5;
// Give me what you've got on Shepherd, and I'll take care of the rest!
radio_dialogue( "byard_pri_takecareofrest" );
wait 1.5;
// I know you can hear me on this channel Makarov!
radio_dialogue( "byard_pri_onthischannel" );
wait 0.5;
// You and I both know you won't last a week!
radio_dialogue( "byard_pri_lastaweek" );
// And neither will you!
wait 1;
radio_dialogue( "byard_mkv_neitherwillyou" );
wait 0.25;
// Makarov...you ever hear the old saying...the enemy of my enemy is my friend?
radio_dialogue( "byard_pri_myfriend" );
// Price, one day you're going to find that cuts both ways!
radio_dialogue( "byard_mkv_cutsbothways" );
// Shepherd is using Site Hotel Bravo. You know where it is! I'll see you in hell!
radio_dialogue( "byard_mkv_hotelbravo" );
// Looking forward to it!
radio_dialogue( "byard_pri_myregards" );
wait 3;
flag_clear( "makarov_dialogue" );
}
intro_rockets()
{
flag_wait( "intro_rockets" );
array_thread( getentarray( "intro_first_rocket", "targetname" ), ::magic_rocket );
flag_wait( "intro_rockets_2" );
array_thread( getentarray( "intro_rocket_start", "targetname" ), ::magic_rocket );
}
intro_hummer(){
damage_types = [];
damage_types[ tolower( "MOD_PROJECTILE_SPLASH" ) ] = true;
damage_types[ tolower( "MOD_PROJECTILE" ) ] = true;
self waittill_damage( damage_types, undefined, true, 9 );
self maps\_vehicle::force_kill();
}
intro_btr80()
{
self main_turret_init();
self thread makesentient( self.script_team );
self thread intro_btr80_death();
flag_wait( "intro_btr80_pre_attack" );
self ent_flag_set( "hold_fire" );
self thread main_turret_attack( level.intro_heli.fake_target, ( 0,0,0 ), true );
level.intro_heli.fake_target = undefined;
flag_wait( "intro_btr80_attack" );
self ent_flag_clear( "hold_fire" );
flag_wait( "intro_btr80_attack_kill" );
self main_turret_attack( level.intro_heli, ( 0,0,0 ), true );
wait 1;
self thread intro_btr80_target_axis();
}
intro_btr80_death()
{
flag_wait( "intro_btr80_destroy" );
level.intro_heli.fake_target = undefined;
damage_types = [];
damage_types[ tolower( "MOD_PROJECTILE_SPLASH" ) ] = true;
damage_types[ tolower( "MOD_PROJECTILE" ) ] = true;
self waittill_damage( damage_types, undefined, true, 4 );
flag_set( "intro_btr80_dead" );
self maps\_vehicle::force_kill();
}
intro_btr80_target_axis()
{
self endon( "death" );
while( true )
{
ai_arr = getaiarray( "axis" );
ai_arr = array_add( ai_arr, level.player );
self main_turret_attack( ai_arr[0], ( 0,0,0 ), true );
}
}
intro_littlebird_strafe()
{
level.intro_heli = self;
flag_wait( "intro_littlebird_strafe" );
// make turret fire.
array_thread( self.mgturret, ::road_target, self );
}
vehicle_sweetener_setup()
{
// ents for helicopters
array = getentarray( "vehicle_sweetener", "script_noteworthy" );
array_thread( array, ::vehicle_sweetener );
// nodes for other vehicles
array = getvehiclenodearray( "vehicle_sweetener", "script_noteworthy" );
array_thread( array, ::vehicle_sweetener );
}
vehicle_sweetener()
{
self waittill( "trigger", vehicle );
vehicle playsound( self.script_soundalias );
}
road_target( heli )
{
heli endon( "death" );
self setconvergencetime( 0 );
forward = anglestoforward( self.angles );
target_origin = self.origin + 700 * forward + (0,0,-80);
target_ent = spawn( "script_origin", target_origin );
/*
target_ent = spawn( "script_model", target_origin );
target_ent setmodel( "fx" );
*/
target_ent linkto( self );
old_mode = self getmode();
self setmode( "manual" );
self SetTargetEntity( target_ent );
flag_waitopen( "intro_littlebird_strafe" );
target_ent delete();
self cleartargetentity();
self setmode( old_mode );
}
scene_a_suburban()
{
self endon( "death" );
self thread set_flag_on_player_damage( "scene_a_wave2" );
turret = self.mgturret[0];
turret waittill( "turret_ready" );
// turret SetMode( "auto_ai" );
mg_guy = turret getturretowner();
assert( isdefined( mg_guy ) );
mg_guy thread set_flag_on_player_damage( "scene_a_wave2" );
main_target = getent( "mg_target", "targetname" );
turret thread animscripts\hummer_turret\common::set_manual_target( main_target, 3, 6 );
flag_wait( "scene_a_wave2" );
thread scene_a_rpg_guy( self );
while( true )
{
self waittill( "damage", damage, guy );
assert( isdefined(guy) );
if ( isdefined( self.rpg_guy ) && guy == self.rpg_guy )
break;
}
self maps\_vehicle::godoff();
self notify( "death", self.rpg_guy, "MOD_PROJECTILE" );
}
scene_a_rpg_guy( vehicle )
{
sight_ent = spawn( "script_origin", vehicle.origin + ( 0,0,150 ) );
sight_ent linkto( vehicle );
sight_ent waittill_player_lookat( undefined, undefined, undefined, 5, vehicle );
guy = getent( "scene_a_rpg_guy", "targetname" ) spawn_ai( true );
guy endon( "death" );
vehicle.rpg_guy = guy;
anim_ent = getent( "scene_a_rpg_spot" ,"targetname" );
guy set_allowdeath( true );
guy.ignoreall = true;
guy.ignoreme = true;
anim_ent anim_generic( guy, "prone_2_stand" );
guy SetStableMissile( true );
guy.ignoreall = false;
guy SetEntityTarget( vehicle, 1 );
vehicle waittill_notify_or_timeout( "death", 5 );
guy SetStableMissile( false );
guy ClearEntityTarget();
guy.ignoreme = false;
guy set_force_color( "p" );
guy.goalheight = 128;
guy threewayfight_threads_defaults();
}
littlebird_init( no_repulsor )
{
level notify( "road_heli_spawned" );
array_thread( self.mgturret, ::littlebird_minigun );
level.heli = self;
self.script_AI_invulnerable = true;
waittillframeend;
self thread makesentient( self.script_team );
if ( !isdefined( no_repulsor ) )
self thread toggle_repulsor();
self.fake_target = spawn( "script_model", (0,0,0) );
// self.fake_target setmodel( "fx" );
self.fake_target linkto( self, "tag_origin", ( 100, 0, 150 ), ( 0, 0, 0 ) );
self thread fake_target_delete( self.fake_target );
/#
self thread drawpath();
ent = self.currentnode;
self thread mark_heli_path( ent );
#/
}
toggle_repulsor()
{
self endon( "death" );
while( true )
{
self waittill( "rpg_fired" );
repulsor = Missile_CreateRepulsorEnt( self, 2500, 1000 );
wait 2.5;
Missile_DeleteAttractor( repulsor );
}
}
littlebird_alive()
{
if ( !isdefined( level.heli ) )
return false;
if ( !isalive( level.heli ) )
return false;
if ( level.heli.health < level.heli.healthbuffer )
return false;
return true;
}
fake_target_delete( fake_target )
{
fake_target endon( "death" );
self waittill( "death" );
fake_target delete();
}
littlebird_minigun()
{
self SetBottomArc( 18 );
self setrightarc( 20 );
self setleftarc( 20 );
self SetConvergenceTime( 1.5, "yaw" );
self SetConvergenceTime( 0.7, "pitch" );
}
littlebird_trigger()
{
level endon( "spawn_littlebird" );
self waittill( "trigger" );
level notify( "spawn_littlebird", self.target );
}
littlebird_spawn()
{
level waittill( "spawn_littlebird", ent_str );
ent = getent( ent_str, "targetname" );
heli_spawner = getent( "littlebird", "targetname" );
level.heli = heli_spawner move_spawn_and_go( ent );
flag_clear( "littlebird_react" );
level.heli thread littlebird_reaction( "strafe_path" );
}
flyby_littlebird()
{
flag_wait( "flyby_c130" );
if ( !littlebird_alive() )
{
// if dead respawn
path_ent = getent( "littlebird_flyby_start", "targetname" );
heli_spawner = getent( "littlebird", "targetname" );
level.heli = heli_spawner move_spawn_and_go( path_ent );
}
// level.heli might be overritten by the higround heli if the player moves fast.
heli = level.heli;
heli maps\_vehicle::godon();
heli notify( "reaction_end" );
path = getent( "littlebird_flyby_standby", "targetname" );
heli maps\_vehicle::set_heli_move( "faster" );
heli Vehicle_SetSpeed( 65, 25, 25 );
heli thread maps\_vehicle::vehicle_paths( path );
flag_wait( "flyby_c130" );
path = getent( "flyby_chase_path", "targetname" );
heli maps\_vehicle::set_heli_move( "faster" );
heli Vehicle_SetSpeed( 60, 25, 25 );
heli thread maps\_vehicle::vehicle_paths( path );
heli waittill( "reached_dynamic_path_end" );
heli delete();
}
start_road()
{
level.player start_at( GetEnt( "start_road_player", "targetname" ) );
activate_trigger_with_targetname( "middle_road_start_trigger" );
heli_spawner = getent( "littlebird", "targetname" );
heli_spawner add_spawn_function( ::littlebird_init );
array_thread( getentarray( "littlebird_trigger", "targetname" ), ::littlebird_trigger );
level thread littlebird_spawn();
getentarray( "littlebird_trigger", "targetname" )[0] notify( "trigger" );
wait 1;
flag_set( "littlebird_react" );
waittillframeend;
level.heli notify( "react");
level.heli maps\_vehicle::mgon();
}
road()
{
level thread road_rocket_guys();
level thread flyby_c130();
level thread road_crash();
getent( "road_hummer", "script_noteworthy" ) add_spawn_function( ::road_hummer );
triggers = getentarray( "middle_road", "targetname" );
foreach( trigger in triggers )
level waittill_stack_add( "trigger", trigger );
level waittill( "waittill_stack", msg, trigger );
// tmp fix
dist = 1000;
while( true )
{
wait 0.5;
ai = getaiarray( "axis", "team3" );
if ( !isdefined( ai[0] ) )
continue;
ai = SortByDistance( ai, level.player.origin );
if ( distance( ai[0].origin, level.player.origin ) > dist )
break;
dist *= 0.95;
}
exploder( "road_exploder" );
level waittill_stack_clear(); // clear stack
}
road_hummer()
{
turret = self.mgturret[0];
turret waittill( "turret_ready" ); // could this break it?
mg_guy = turret getturretowner();
if ( littlebird_alive() )
self thread turret_track_target( turret, level.heli );
array_thread( self.riders, ::set_flag_on_player_damage, "road" );
self thread set_flag_on_player_damage( "road" );
self waittill( "death" );
level notify( "hummer_dead" );
}
road_crash()
{
flag_wait( "hummer_destroy" );
// pickup trucks blow up and switch model after in 1 second instead of the default 2.
level.vttype = "truck_physics";
level.vtmodel = "vehicle_pickup_roobars";
typemodel = level.vttype + level.vtmodel;
level.vehicle_death_fx[ typemodel ] = [];
maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode", undefined, undefined, undefined, 0, true );
maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_fx_tire_right_r", "smallfire", undefined, undefined, true, 0.1, true );
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "tag_fx_cab", "smallfire", undefined, undefined, true, 0.11, true );
maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_engine_left", "smallfire", undefined, undefined, true, 0.11, true );
level.vehicle_deathmodel_delay[ level.vtmodel ] = 0;
flag_wait( "road" );
activate_trigger_with_targetname( "road_crash" );
}
road_rocket_guys()
{
level endon( "stop_road_rockets" ); // called by a flag_set in radiant.
spawner_arr = getentarray( "road_rocket_guys", "targetname" );
while( true )
{
flag_wait( "road_rocket_guys" );
if ( !littlebird_alive() )
return;
level.heli endon( "death" );
guy = undefined;
spawner_arr = SortByDistance( spawner_arr, level.player.origin );
for( i=spawner_arr.size; i>0; i-- )
{
spawner = spawner_arr[i-1];
spawner.count++;
guy = spawner spawn_ai();
if( !spawn_failed( guy ) )
break;
}
if ( distance( level.player.origin, guy.origin ) > 800 )
guy.ignoreme = true;
guy.rocket_target = level.heli;
guy thread road_rocket_guys_clear();
flag_clear( "road_rocket_guys" );
}
}
flyby_c130()
{
array_thread( getentarray( "rocket_start", "targetname" ), ::flyby_magic_rocket, 2 );
flag_wait( "flyby_c130" );
spawner = getent( "flyby_c130_spawner", "targetname" );
c130 = spawner spawn_vehicle();
c130 thread maps\_vehicle::gopath();
c130 playsound( "veh_c130_flyby" );
level.player thread flyby_rumble();
flag_wait( "flyby_angel_flare" );
c130 thread angel_flare_burst( 10 );
wait 11;
c130 thread angel_flare_burst( 5 );
}
start_flyby()
{
level.player start_at( GetEnt( "start_flyby_player", "targetname" ) );
path_ent = getent( "littlebird_flyby_start", "targetname" );
heli_spawner = getent( "littlebird", "targetname" );
level.heli = heli_spawner move_spawn_and_go( path_ent );
}
flyby()
{
level thread flyby_dialogue();
// fewer enemies
level.ai_cap[ "axis" ] = 10;
level.ai_cap[ "team3" ] = 10;
getent( "flyby_suburban", "script_noteworthy" ) add_spawn_function( ::flyby_suburban );
flag_wait( "flyby_rockets" );
level thread flyby_littlebird();
flag_wait( "flyby_c130" );
// SetCullDist( 12000 );
flag_set( "music_boneyard_flyby" );
activate_trigger_with_targetname( "flyby_area_trigger" );
level thread flyby_advance();
flag_wait( "flyby_vision_change" );
level thread maps\_utility::vision_set_fog_changes( "boneyard", 10 );
flag_wait( "higround_ascend" );
SetCullDist( 0 );
}
flyby_advance()
{
// this should happen after the drop dow
flag_wait( "flyby_vision_change" );
axis = get_ai_group_ai( "flyby_axis" );
team3 = get_ai_group_ai( "flyby_team3" );
if ( axis.size < 5 && team3.size < 5 )
{
// move enemies and start the suv going.
activate_trigger_with_noteworthy( "flyby_advance_color_trigger" );
flag_set( "flyby_minigun_move" );
}
}
flyby_dialogue()
{
level endon( "higround_ascend" );
flag_wait( "flyby_c130" );
flag_waitopen( "makarov_dialogue" );
// Price, I am approaching the boneyard. I see you do not have situation under control.
// Very unsafe to land. It looks like when I was in Afghanistan with the Soviets!
radio_dialogue( "byard_nkl_unsafetoland" );
// Nikolai! Shut up and just land the bloody plane! We're on our way!
radio_dialogue( "byard_pri_landtheplane" );
// This is such bullshit! I'm not getting paid nearly enough for these missions!
// These flares are expensive!! FUCK!!!
radio_dialogue( "byard_nkl_paidenough" );
flag_wait( "flyby_minigun_move" );
wait 7;
// Soap! Hurry! We've got to get to Nikolai's plane! Keep moving north!
radio_dialogue( "byard_pri_gettoplane" );
}
flyby_suburban()
{
self endon( "death" );
level.flyby_suburban = self;
flag_wait( "flyby_suburban_go" ); // wait till the minigun vehicle has passed.
path_start = getvehiclenode( "flyby_retreat_path","targetname" );
self new_vehicle_path( path_start );
flag_wait( "flyby_suburban_kill" );
self VehPhys_launch( (-450,50,100), true );
self maps\_vehicle::godoff();
self maps\_vehicle::force_kill();
}
start_higround()
{
flag_set( "music_boneyard_intro" );
flag_set( "music_boneyard_flyby" );
objective_number = 0;
obj_position = getent( "rallypoint", "targetname" );
objective_add( objective_number, "current", &"BONEYARD_OBJ_RALLYPOINT", obj_position.origin );
level.player start_at( GetEnt( "start_higround_player", "targetname" ) );
vnode = getvehiclenode( "higround_minigun_suburban_start", "script_noteworthy" );
suburban_spawner = getent( "higround_minigun_suburban", "script_noteworthy" );
vehicle = suburban_spawner move_spawn_and_go( vnode );
vnode = getvehiclenode( "higround_btr80_start", "script_noteworthy" );
btr80_spawner = getent( "higround_btr80", "script_noteworthy" );
vehicle = btr80_spawner move_spawn_and_go( vnode );
flag_set( "flyby_suburban_go" );
/#
// debug shit
ent = getent( "higround_heli_path", "script_noteworthy" );
thread mark_heli_path( ent );
#/
trigger = getent( "higround_start_trigger_off", "script_noteworthy" );
trigger trigger_off();
activate_trigger_with_targetname( "higround_start_color_trigger" );
activate_trigger_with_noteworthy( "higround_start_ai_trigger" );
flag_wait_or_timeout( "higround_ascend", 3 );
activate_trigger_with_targetname( "higround_start_color_trigger_2" );
}
higround()
{
getent( "higround_btr80", "script_noteworthy" ) add_spawn_function( ::higround_btr80 );
getent( "higround_minigun_suburban", "script_noteworthy" ) add_spawn_function( ::higround_minigun_suburban );
getent( "higround_littlebird", "targetname" ) add_spawn_function( ::littlebird_init );
getent( "higround_littlebird", "targetname" ) add_spawn_function( ::higround_littlebird );
array_spawn_function_noteworthy( "higround_guy", ::higround_guy );
level thread higround_dialogue();
flag_wait( "flyby_suburban_go" );
SetThreatBias( "allies", "team3", 0 ); // team3 find the player to be normal threat for when they are crossing the road.
level thread higround_second_save();
// start the ride once living higround guys are 4 or less and the btr80 died or reached it's final destination.
level thread higround_ride_force_start( 4 );
}
higround_ride_force_start( living )
{
flag_wait( "higround_2" );
flag_wait_either( "btr80_at_end", "btr80_destroyed" );
while( level.higround_guy > living )
wait 0.5;
activate_trigger_with_noteworthy( "ride_start_trigger" );
}
higround_guy()
{
level endon( "ride_uaz_arriving" );
if ( !isdefined( level.higround_guy ) )
level.higround_guy = 0;
level.higround_guy++;
self waittill_either( "death", "pain_death" );
level.higround_guy--;
}
higround_second_save()
{
// save halfway through the higround when atleast 30 seconds has passed.
level endon( "ride_uaz_arriving" );
flag_wait( "higround_ascend" );
start_time = gettime();
flag_wait( "higround_2" );
wait_for_buffer_time_to_pass( start_time, 30 );
autosave_by_name( "higround_second_save" );
}
higround_dialogue()
{
level endon( "higround_2" );
flag_wait( "higround_ascend" );
flag_waitopen( "makarov_dialogue" );
// Soap! I'm going to get some transport! Make your way north towards the runway!
radio_dialogue( "byard_pri_gettransport" );
starttime = gettime();
flag_wait( "higround_1" );
wait_for_buffer_time_to_pass( starttime, 15 );
// Soap! I've found some transport! Keep moving north! I'll meet you en route!
radio_dialogue( "byard_pri_foudntransport" );
}
higround_littlebird()
{
self endon( "death" );
level.btr80 endon( "death" );
level endon( "obj_ride" );
self thread higround_littlebird_ondeath();
self thread higround_littlebird_onkill();
flag_wait( "hunt_btr80" );
self SetMaxPitchRoll( 25, 25 );
self SetYawSpeed( 90, 45, 22.5, 0 );
self thread higround_littlebird_hunt_btr80( "hunt_btr80" );
self higround_littlebird_aligned( "higround_2" );
if ( !flag( "btr80_at_end" ) )
{
flag_clear( "no_align" );
// this will fire but miss.
self higround_littlebird_failed_attack();
self notify( "stop_hunt" );
self ClearLookAtEnt();
self ClearTurretTarget();
flag_set( "btr80_target_littlebird" );
self maps\_vehicle::godon();
self Vehicle_SetSpeed( 70, 35, 10 );
self SetNearGoalNotifyDist( 512 );
self SetVehGoalPos( level.player.origin + ( 0,0,768 ) );
self waittill_any( "goal", "near_goal" );
flag_clear_delayed( "btr80_target_littlebird", 3 );
self delaythread( 4, maps\_vehicle::godoff );
}
self notify( "stop_hunt" ); // stops the first hunt
self thread higround_littlebird_hunt_btr80( "hunt_btr80_final" );
self higround_littlebird_aligned();
self notify( "stop_hunt" ); // stops the hunt just above.
// might kill the btr80 or it might not.
if ( cointoss() )
{
target_arr = [];
target_arr[0] = level.btr80;
self thread fire_missile( target_arr, 3 );
}
else
{
self higround_littlebird_failed_attack();
thread flag_set_delayed( "btr80_target_littlebird", 3 );
self.fake_target delayCall( randomfloatrange( 4, 8 ), ::delete );
}
level.heli notify( "missed_final" );
self ClearLookAtEnt();
self ClearTurretTarget();
start_path = getent( "higround_strafe_path_first", "targetname" );
level.heli thread maps\_vehicle::vehicle_paths( start_path );
flag_clear( "littlebird_react" );
level.heli thread littlebird_reaction( "higround_strafe_path" );
}
higround_littlebird_onkill()
{
level endon( "obj_ride" );
level.heli endon( "death" );
level.heli endon( "missed_final" );
level.btr80 waittill( "death" );
self ClearLookAtEnt();
self ClearTurretTarget();
start_path = getent( "higround_strafe_path_first", "targetname" );
level.heli thread maps\_vehicle::vehicle_paths( start_path );
flag_clear( "littlebird_react" );
level.heli thread littlebird_reaction( "higround_strafe_path" );
}
higround_littlebird_ondeath()
{
level endon( "obj_ride" );
level.btr80 endon( "death" );
level.heli waittill( "death" );
level.btr80.main_turret_enemies = array_remove( level.btr80.main_turret_enemies, level.heli );
}
higround_btr80()
{
self endon( "death" );
level.btr80 = self;
self.dontunloadonend = true;
self thread higround_btr80_on_death();
flag_set( "suburban_target_btr80" );
vehicle_set_health( 500 );
self main_turret_init();
// self thread makesentient( self.script_team );
flag_wait( "flyby_suburban_go" );
if ( isalive( level.flyby_suburban ) )
{
wait 2;
self main_turret_attack( level.flyby_suburban, ( 0,0,30 ), true, 10 );
}
mg = self.mgturret[0];
mg SetTopArc( 10 );
self main_turret_aim_straight();
wait 5;
self ent_flag_clear( "hold_fire" );
self thread main_turret_think();
SetThreatBias( "allies", "team3", 1000 ); // team3 find the player to be less of a threat again.
self higround_btr80_target_littlebird();
wait 2;
self notify( "clear_turret_target" );
flag_set( "higround_2" );
}
higround_btr80_target_littlebird()
{
self endon( "death" );
while( true )
{
flag_wait( "btr80_target_littlebird" );
if ( !isdefined( level.heli ) )
return;
level.heli endon( "death" );
// addes the heli as a target.
if ( self.main_turret_enemies.size == 0 )
self.main_turret_enemies = array_add( self.main_turret_enemies, level.heli );
else
self.main_turret_enemies = array_insert( self.main_turret_enemies, level.heli, 0 );
self notify( "clear_turret_target" );
flag_waitopen( "btr80_target_littlebird" );
self.main_turret_enemies = array_remove( self.main_turret_enemies, level.heli );
}
}
higround_btr80_on_death()
{
self waittill( "death" );
flag_set( "btr80_destroyed" );
}
higround_minigun_suburban()
{
self endon( "death" );
level.minigun_suburban = self;
// self.dontUnloadOnEnd = true;
turret = self.mgturret[0];
turret waittill( "turret_ready" );
mg_guy = turret getturretowner();
flag_wait( "suburban_target_btr80" );
turret = self.mgturret[0];
turret animscripts\hummer_turret\common::set_manual_target( level.btr80, 4, 5 );
flag_wait( "higround_ascend" );
self vehicle_set_health( 200 );
flag_wait( "btr80_target_suburban" );
level.btr80.main_turret_enemies = array_add( level.btr80.main_turret_enemies, self );
}
start_ride()
{
flag_set( "music_boneyard_intro" );
flag_set( "music_boneyard_flyby" );
level.player start_at( GetEnt( "start_ride_player", "targetname" ) );
heli_spawner = getent( "littlebird", "targetname" );
heli_spawner add_spawn_function( ::littlebird_init );
}
ride()
{
ride_vehicle_spawners = getentarray( "ride_vehicle", "script_noteworthy" );
array_thread( ride_vehicle_spawners, ::add_spawn_function, ::ride_vehicle );
getent( "ride_uaz", "script_noteworthy" ) add_spawn_function( ::ride_uaz );
spawner = getent( "runway_suburban", "targetname" );
spawner add_spawn_function( ::ride_runway_suburban );
array_spawn_function_noteworthy( "price", ::ride_uaz_price );
array_spawn_function_noteworthy( "uaz_driver", ::ride_uaz_driver );
array_spawn_function_noteworthy( "ride_minigunner", ::ride_minigunner );
level thread ride_c130();
level thread ride_c130_sound();
level thread ride_tanker_blow();
level thread collapse_wing();
level thread ride_dialogue();
level thread ride_zfar();
level thread ride_littlebird();
level thread suburban_ride_deathfx();
flag_wait( "ride_uaz_arriving" );
autosave_by_name( "ride_arriving_save" );
level thread ramp_sunsample_over_time( .65, 3 );
flag_wait( "ride_enemy_vehicles_spawn" );
// pickup trucks blow up and switch model after in 1 second instead of the default 2.
level.vttype = "truck_physics";
level.vtmodel = "vehicle_pickup_roobars";
typemodel = level.vttype + level.vtmodel;
level.vehicle_death_fx[ typemodel ] = [];
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "tag_body", "smallfire", undefined, undefined, true, 0, true );
maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode", undefined, undefined, undefined, 0.9, true );
maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_fx_tire_right_r", "smallfire", undefined, undefined, true, 1, true );
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "tag_fx_cab", "smallfire", undefined, undefined, true, 1.01, true );
maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_engine_left", "smallfire", undefined, undefined, true, 1.01, true );
level.vehicle_deathmodel_delay[ level.vtmodel ] = 1;
// spawn vehicles
activate_trigger_with_targetname( "ride_initiate" );
// add ammo to current weapons for the ride.
weaponlist = level.player GetWeaponsListPrimaries();
foreach( weapon in weaponlist )
{
if ( IsSubStr( tolower( weapon ) , "rpg" ) )
continue;
if ( level.player GetFractionMaxAmmo( weapon ) > 0.5 )
continue;
level.player GiveStartAmmo( weapon );
}
flag_wait( "uaz_mounted" );
set_custom_gameskill_func( ::boneyard_gameskill_ride_settings );
flag_wait( "blow_wing" );
autosave_by_name( "ride2" );
flag_wait( "c130_hatch_open" );
autosave_now(); // should always be safe
flag_wait( "ride_driver_death" );
flag_set( "uaz_driver_dialogue" );
level thread ride_uaz_player_viewkick();
wait 2;
level.player DisableOffhandWeapons();
wait 1;
flag_set( "uaz_player_control" );
}
suburban_ride_deathfx()
{
flag_wait( "ride_uaz_arriving" );
// change sound to scn_boneyard_sub_explode
level.vttype = "suburban";
level.vtmodel = "vehicle_suburban";
typemodel = level.vttype + level.vtmodel;
level.vehicle_death_fx[ typemodel ] = [];
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 );
maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "scn_boneyard_sub_explode" );
flag_wait( "uaz_mounted" );
level.vttype = "suburban";
level.vtmodel = "vehicle_suburban";
typemodel = level.vttype + level.vtmodel;
level.vehicle_death_fx[ typemodel ] = [];
maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 );
maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode" );
}
ride_zfar()
{
flag_wait( "uaz_mounted" );
wait 0.5; //8
SetCullDist( 10000 );
wait 11; //20
SetCullDist( 13000 );
wait 7; //27
SetCullDist( 15500 );
wait 20; //47
SetCullDist( 20000 );
}
ride_dialogue()
{
flag_wait( "ride_uaz_arriving" );
flag_waitopen( "makarov_dialogue" );
level thread ride_uaz_nag();
if ( !flag( "uaz_driver_mount" ) )
{
// Captain Price, I'm taking off in one minute! You better hurry if you want a ride out of here!
radio_dialogue( "byard_nkl_oneminute" );
// Soap! We don't have much time! Nikolai's not going to wait around for us! Hurry!
radio_dialogue( "byard_pri_muchtime" );
}
flag_wait( "uaz_driver_mount" );
if ( !flag( "uaz_mounted" ) )
{
if ( flag( "uaz_nag" ) )
{
// Soap! Get in the jeep!
level.price dialogue_queue( "byard_pri_getinjeep" );
}
else
{
// Soap! We are leaving!!! Get in the jeep!
level.price dialogue_queue( "byard_pri_weareleaving" );
}
}
flag_wait( "uaz_driver_dialogue" );
sniper_origin = level.player.origin + (0,0,64);
wait 0.8;
flag_set( "uaz_driver_dead" );
wait 1;
// Soap! Rook is down! Take the wheel!!!
level.price dialogue_queue( "byard_pri_takewheel" );
level.price endon( "death" );
flag_wait( "uaz_player_in_control" );
wait 3;
// Aim for the ramp!!!
level.price dialogue_queue( "byard_pri_aimforramp" );
}
ride_uaz_nag()
{
level.price endon( "death" );
level endon( "uaz_driver_mount" );
wait 20;
// Soap! Get in the jeep!
level.price dialogue_queue( "byard_pri_getinjeep" );
wait 30;
// Soap! We are leaving!!! Get in the jeep!
level.price dialogue_queue( "byard_pri_weareleaving" );
flag_set( "uaz_nag" );
}
ride_uaz_player_viewkick()
{
wait 1.3;
level.player ViewKick( 256, level.rook geteye() );
}
ride_uaz_price()
{
level.price = self;
self.name = "Captain Price";
self.animname = "price";
flag_wait( "uaz_player_in_control" );
self thread ride_uaz_fake_price_fire();
}
ride_vehicle()
{
self thread vehicle_player_induced_death();
self thread vehicle_event_handler();
self VehPhys_DisableCrashing();
array_thread( self.riders, ::ride_rider );
// vehicles damage and death gets handles by level script.
self maps\_vehicle::godon();
}
ride_runway_suburban()
{
level.runway_suburban = self;
self hidepart( "TAG_GLASS_RIGHT_BACK" );
self hidepart( "TAG_GLASS_LEFT_BACK" );
self hidepart( "TAG_GLASS_RIGHT_FRONT" );
}
ride_rider()
{
// little less easy to kill when on harder difficulties.
// if this is "bad" we need some way to reinforce the riders.
// don't do minigun guys since they get their health raised elsewhere.
difficulty = level.gameskill;
if ( difficulty == 0 )
difficulty = 1;
self.health *= difficulty;
}
ride_minigunner()
{
self endon( "death" );
level.ride_minigunner = self;
self add_func( ::waittill_msg, "death" );
self add_func( ::flag_set, "ride_minigun_gunner_dead" );
self thread do_funcs();
wait 1;
turret = self GetTurret();
assert( isdefined( turret ) );
turret SetAISpread( 4 );
flag_wait( "uaz_mount_end" );
while( true )
{
self.ignoreall = false;
wait 0.65;
// wait randomfloatrange( 0.25, 0.75 );
self.ignoreall = true;
wait 1.75;
// wait randomfloatrange( 1.5, 2 );
}
}
ride_c130()
{
level.c130 = assemble_c130();
level endon( "uaz_park_crash" );
flag_wait( "uaz_mounted" );
// allow saves.
flag_set( "can_save" );
autosave_by_name( "ride" );
spawner = getent( "ride_c130_spawner", "targetname" );
c130_ent = spawner spawn_vehicle();
c130_ent hide();
wait 1;
c130_ent maps\_vehicle::lights_off( "running" );
level.c130 linkto( c130_ent, "tag_origin", (0,0,0), (0,0,0) );
flag_set( "obj_ride_c130" );
c130_ent thread maps\_vehicle::gopath();
flag_wait( "uaz_driver_dead" );
c130_ent thread add_player_tractor_beam();
// failsafe in case some other vehicle drivs into the trigger.
while( true )
{
level.c130.ramp_trigger waittill( "trigger", vehicle );
if ( vehicle == level.uaz )
break;
}
flag_set( "uaz_park" );
wait( 0.15 );
Earthquake( 0.35, 0.50, level.player.origin, 5000 );
level.player PlayRumbleOnEntity( "damage_heavy" );
SetBlur( 4, 0 );
wait( 0.15 );
setblur( 0, 0.4 );
}
add_player_tractor_beam()
{
if ( !isdefined( level.uaz ) )
return;
self endon( "death" );
level.uaz endon( "death" );
back_dist = -260;
enter_dist = 1524;
for ( ;; )
{
forward = anglestoforward( self.angles );
org = self.origin + forward * back_dist;
if ( distance( self.origin, level.uaz.origin ) < enter_dist )
break;
wait( 0.05 );
}
flag_set( "player_loses_control_of_uaz" );
level.control_loss_time = gettime();
}
ride_c130_sound()
{
flag_wait( "c130_takeoff" );
left = getent( "sound_engine_left", "script_noteworthy" );
right = getent( "sound_engine_right", "script_noteworthy" );
center = getent( "sound_c130_center", "script_noteworthy" );
left PlayLoopSound( "veh_c130_left_engine_loop" );
right PlayLoopSound( "veh_c130_right_engine_loop" );
center PlayLoopSound( "veh_c130_main_loop" );
}
ride_littlebird()
{
flag_wait( "obj_ride" );
if ( littlebird_alive() )
{
level.heli notify( "reaction_end" );
level.heli notify( "stop_hunt" );
level.heli ClearLookAtEnt();
level.heli ClearTurretTarget();
path = getent( "littlebird_ride_start", "targetname" );
level.heli Vehicle_SetSpeed( 40, 25, 25 );
level.heli thread maps\_vehicle::vehicle_paths( path );
}
flag_wait( "littlebird_stage1" );
if ( !littlebird_alive() )
{
// if dead respawn
path_ent = getent( "littlebird_ride_respawn", "targetname" );
heli_spawner = getent( "littlebird", "targetname" );
level.heli = heli_spawner move_spawn_and_go( path_ent );
}
level.heli maps\_vehicle::godon();
repulsor = Missile_CreateRepulsorEnt( level.heli, 5000, 1000 );
path = getent( "littlebird_ride_stage1", "targetname" );
level.heli Vehicle_SetSpeed( 65, 25, 25 );
level.heli SetMaxPitchRoll( 25, 25 );
level.heli thread new_vehicle_path( path );
flag_wait( "blow_tanker_second" );
target_arr = getentarray( "tanker_rocket_target", "targetname" );
target_arr = array_index_by_script_index( target_arr );
level.heli thread fire_missile( target_arr, target_arr.size );
flag_wait( "blow_wing" );
target_arr = getentarray( "tanker_rocket_target_2", "targetname" );
target_arr = array_index_by_script_index( target_arr );
level.heli thread fire_missile( target_arr, target_arr.size );
}
ride_track_health()
{
level endon( "ride_uaz_nodeath" );
self.damage_taken = 0;
while ( true )
{
self waittill( "damage", damage, attacker );
if ( !isdefined( level.ride_minigunner ) || attacker != level.ride_minigunner )
continue;
self.damage_taken += damage;
println( "DAMAGE: " + self.damage_taken );
if ( self.damage_taken > 37000 )
break;
}
self maps\_vehicle::godoff();
self maps\_vehicle::force_kill();
wait 1;
level.player kill();
// missionfailedwrapper();
}
ride_uaz()
{
flag_set( "ride_uaz_arriving" );
self thread ride_track_health();
level.uaz = self;
self HidePart( "tag_blood" );
self thread uaz_control();
self thread ride_uaz_mount();
self thread ride_uaz_failed_mount();
self thread ride_uaz_player_crash();
self thread ride_uaz_takeoff_missed();
self VehPhys_DisableCrashing();
self.dontunloadonend = true;
// hack to get AI to fire when the vehicle is stationary
// needs to be fixed so that unload doesn't force people into idle.
flag_wait( "wait_for_player" );
self Maps\_vehicle::vehicle_ai_event( "hide_attack_forward" );
flag_wait( "uaz_drive" );
self thread ride_bump();
flag_set( "littlebird_stage1" );
flag_wait( "uaz_mounted" );
wait 2;
level thread lerp_fov_overtime( 5, 80 );
level thread maps\_utility::vision_set_fog_changes( "boneyard_ride", 5 );
flag_wait( "uaz_player_in_control" );
level thread maps\_utility::vision_set_fog_changes( "boneyard_steer", 2 );
self VehPhys_EnableCrashing();
}
ride_uaz_failed_mount()
{
level endon( "uaz_mounted" );
flag_wait( "uaz_mount_end" );
setDvar( "ui_deadquote", &"BONEYARD_DEADQUOTE_MOUNT" );
missionfailedwrapper();
}
ride_uaz_player_crash()
{
level endon( "uaz_park" );
level endon( "uaz_park_crash" );
flag_wait( "uaz_player_in_control" );
self thread ride_uaz_player_force_crash();
if ( isdefined( level.use_ent ) )
level.use_ent delete();
crash_limit = 15000;
while( true )
{
self waittill( "veh_jolt", vector );
force = abs( vector[0] ) + abs( vector[1] ) + abs( vector[2] );
if ( force > crash_limit )
break;
}
ride_uaz_player_launch();
self maps\_vehicle::godoff();
self maps\_vehicle::force_kill();
wait 1;
level.player kill();
// missionfailedwrapper();
}
ride_uaz_player_force_crash()
{
flag_wait( "uaz_force_crash" );
ride_uaz_player_launch();
self maps\_vehicle::godoff();
self maps\_vehicle::force_kill();
level.player kill();
}
ride_uaz_takeoff_missed()
{
level endon( "uaz_park" );
level endon( "uaz_park_crash" );
flag_wait( "c130_takeoff_missed" );
setDvar( "ui_deadquote", &"BONEYARD_DEADQUOTE_TAKEOFF" );
missionfailedwrapper();
}
ride_uaz_driver()
{
self endon( "death" );
level.rook = self;
self.name = "Rook";
self disable_pain();
self magic_bullet_shield();
self.animname = "rook";
self thread ride_uaz_driver_attack();
flag_wait( "uaz_driver_mount" );
// stop any save at this point.
flag_clear( "can_save" );
flag_wait( "ride_littlebird_dodge" );
level.uaz thread guy_runtovehicle_load( self, level.uaz );
self waittill( "boarding_vehicle" );
self gun_remove();
self stop_magic_bullet_shield();
flag_set_delayed( "ride_enemy_vehicles_spawn", 1 );
flag_wait( "uaz_driver_dead" );
self playsound( "scn_bone_headshot" );
playfxontag( getfx( "blood" ), self, "J_Head" );
playfxontag( getfx( "blood_dashboard_splatter" ), self, "J_Head" );
level.uaz ShowPart( "tag_blood" );
self thread ride_uaz_driver_death();
}
ride_uaz_driver_death()
{
self notify( "newanim" );
self anim_stopanimscripted();
// remove rook from riders array so that he never starts a new idle anim.
level.uaz.riders = array_remove( level.uaz.riders, self );
org = level.uaz GetTagOrigin( "tag_driver" );
angles = level.uaz GetTagAngles( "tag_driver" );
level.uaz thread anim_single_solo( self, "boneyard_driver_death", "tag_driver" );
animation = self getanim( "boneyard_driver_death" );
anim_time = GetAnimLength( animation );
wait ( anim_time - 0.15 );
self SetAnim( animation, 1, 0, 0 );
}
ride_uaz_driver_attack()
{
flag_wait( "obj_ride" );
wait 1;
self waittill( "jumpedout" );
flag_set( "ride_littlebird_dodge" );
if ( isdefined( level.btr80 ) && isalive( level.btr80 ) )
{
etarget = spawn( "script_origin", level.btr80.origin + (0,0,128) );
etarget linkto( level.btr80 );
self SetEntityTarget( etarget, 1 );
attractor = Missile_CreateAttractorEnt( level.btr80, 20000, 512 );
if ( !flag( "uaz_driver_mount" ) )
self waittill( "missile_fire" );
self clearentitytarget();
}
if ( littlebird_alive() )
{
etarget = spawn( "script_origin", level.heli.origin + (0,0,-128) );
etarget linkto( level.heli );
self SetEntityTarget( etarget, 1 );
if ( !flag( "uaz_driver_mount" ) )
self waittill( "missile_fire" );
self clearentitytarget();
}
self.a.rockets = 0;
}
ride_tanker_blow()
{
tanker = get_tanker( "tanker_first", true );
flag_wait( "blow_tanker_first" );
wait 0.4;
rocket_source = getent( "blow_tanker_first_rocket", "targetname" );
rocket_target = getent( rocket_source.target, "targetname" );
rocket = MagicBullet( "rpg_straight", rocket_source.origin, rocket_target.origin );
damage_types = [];
damage_types[ tolower( "MOD_PROJECTILE_SPLASH" ) ] = true;
damage_types[ tolower( "MOD_PROJECTILE" ) ] = true;
tanker waittill_damage( damage_types );
level.player EnableInvulnerability();
tanker thread destructible_force_explosion();
tanker waittill( "destroyed" );
level.player DisableInvulnerability();
tanker = get_tanker( "tanker_second", true );
tanker waittill_damage( damage_types );
tanker thread destructible_force_Explosion();
}
get_tanker( tanker_name, disable_explosion )
{
tanker_arr = getentarray( tanker_name, "script_noteworthy" );
tanker = undefined;
foreach( tanker in tanker_arr )
{
if ( tanker.classname == "script_model" )
break;
}
if ( isdefined( disable_explosion ) )
tanker destructible_disable_explosion();
return tanker;
}
start_ride_end()
{
ride_vehicle_spawners = getentarray( "ride_vehicle", "script_noteworthy" );
array_thread( ride_vehicle_spawners, ::add_spawn_function, ::ride_vehicle );
vnode = getvehiclenode( "ride_end_start", "script_noteworthy" );
spawner = getent( "ride_uaz", "script_noteworthy" );
level.uaz = spawner move_spawn_and_go( vnode );
vnode = getvehiclenode( "ride_end_pickup_start", "targetname" );
spawner = getent( "runway_pickup", "targetname" );
spawner move_spawn_and_go( vnode );
vnode = getvehiclenode( "ride_end_suburban_start", "script_noteworthy" );
spawner = getent( "runway_suburban", "targetname" );
spawner move_spawn_and_go( vnode );
flag_set( "uaz_mounted" );
lerp_fov_overtime( 0.1, 80 );
level.use_ent delete();
flag_wait( "uaz_driver_dead" );
}