2071 lines
63 KiB
Text
2071 lines
63 KiB
Text
|
#include maps\_utility;
|
|||
|
#include maps\_vehicle;
|
|||
|
#include maps\sniperescape_code;
|
|||
|
#include maps\sniperescape_exchange;
|
|||
|
#include common_scripts\utility;
|
|||
|
#include maps\_anim;
|
|||
|
#include maps\_stealth_logic;
|
|||
|
#include maps\sniperescape_wounding;
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
precacheItem( "cobra_seeker" );
|
|||
|
precacheshader( "stance_carry" );
|
|||
|
precacheItem( "hind_turret_penetration" );
|
|||
|
level.sniperescape_fastload = false;
|
|||
|
|
|||
|
|
|||
|
maps\_mi17::main( "vehicle_mi17_woodland_fly_cheap" );
|
|||
|
maps\_mi28::main( "vehicle_mi-28_flying" );
|
|||
|
// maps\_mi28::main( "vehicle_mi-28_flying", "mi28_bulletdamage" );
|
|||
|
// maps\_mi28_bulletdamage::main( "vehicle_mi-28_flying" );
|
|||
|
|
|||
|
// maps\_uaz::main( "vehicle_uaz_hardtop", undefined, true );
|
|||
|
maps\_uaz::main( "vehicle_uaz_hardtop_destructible", undefined, true );
|
|||
|
precacheitem( "barrett_fake" );
|
|||
|
// maps\_cobra::main( "vehicle_cobra_helicopter_fly" );
|
|||
|
// maps\_hind::main( "vehicle_mi24p_hind_woodland" );
|
|||
|
|
|||
|
maps\_seaknight::main( "vehicle_ch46e" );
|
|||
|
|
|||
|
maps\createart\sniperescape_art::main();
|
|||
|
maps\createfx\sniperescape_audio::main();
|
|||
|
maps\sniperescape_fx::main();
|
|||
|
|
|||
|
maps\_stealth_logic::stealth_init();
|
|||
|
maps\_stealth_behavior::main();
|
|||
|
|
|||
|
// maps\_load::set_player_viewhand_model( "viewhands_marine_sniper" );
|
|||
|
// maps\_load::set_player_viewhand_model( "viewhands_player_usmc" );
|
|||
|
maps\_load::set_player_viewhand_model( "viewhands_player_marines" );
|
|||
|
|
|||
|
maps\_compass::setupMiniMap("compass_map_sniperescape");
|
|||
|
|
|||
|
|
|||
|
level.player allowstand( false );
|
|||
|
|
|||
|
animscripts\dog_init::initDogAnimations();
|
|||
|
setsaveddvar( "ai_eventDistFootstep", "32" );
|
|||
|
setsaveddvar( "ai_eventDistFootstepLite", "32" );
|
|||
|
|
|||
|
precacheModel( "temp" );
|
|||
|
precacheModel( "weapon_c4" );
|
|||
|
precacheItem( "cobra_seeker" );
|
|||
|
precacheItem( "flash_grenade" );
|
|||
|
precacheshellshock( "barrett" );
|
|||
|
precachestring( &"SNIPERESCAPE_ELIMINATE_IMRAN_ZAKHAEV" );
|
|||
|
precachestring( &"SNIPERESCAPE_TAKE_OUT_THE_ATTACK_CHOPPER" );
|
|||
|
precachestring( &"SNIPERESCAPE_GET_OUT_OF_THE_HOTEL" );
|
|||
|
precachestring( &"SNIPERESCAPE_REACH_THE_EXTRACTION" );
|
|||
|
precachestring( &"SNIPERESCAPE_FOLLOW_CPT_MACMILLAN" );
|
|||
|
precachestring( &"SNIPERESCAPE_DRAG_MACMILLAN_BODILY" );
|
|||
|
precachestring( &"SNIPERESCAPE_PUT_CPT_MACMILLAN_DOWN" );
|
|||
|
precachestring( &"SNIPERESCAPE_HOLD_OUT_UNTIL_EVAC" );
|
|||
|
precachestring( &"SNIPERESCAPE_SEAKNIGHT_INCOMING" );
|
|||
|
precachestring( &"SNIPERESCAPE_GET_CPT_MACMILLAN_TO" );
|
|||
|
precachestring( &"SNIPERESCAPE_PICK_UP_CPT_MACMILLAN" );
|
|||
|
precachestring( &"SNIPERESCAPE_CARRY_MACMILLAN_TO_THE" );
|
|||
|
precachestring( &"SNIPERESCAPE_CLAYMORE_HELP" );
|
|||
|
precachestring( &"SNIPERESCAPE_PRESS_FORWARDS_OR_BACKWARDS" );
|
|||
|
precachestring( &"SNIPERESCAPE_YOU_FAILED_TO_REACH_THE" );
|
|||
|
precachestring( &"SNIPERESCAPE_HOLD_1_TO_PUT_CPT_MACMILLAN" );
|
|||
|
precachestring( &"SNIPERESCAPE_HOLD_1_TO_PICK_UP_CPT" );
|
|||
|
precachestring( &"SNIPERESCAPE_YOU_LEFT_YOUR_SPOTTER" );
|
|||
|
precachestring( &"SNIPERESCAPE_CPT_MACMILLAN_DIED" );
|
|||
|
precachestring( &"SNIPERESCAPE_HOLD_1_TO_RAPPEL" );
|
|||
|
precachestring( &"SNIPERESCAPE_TIME_REMAINING" );
|
|||
|
precachestring( &"SNIPERESCAPE_TARGET" );
|
|||
|
precachestring( &"SNIPERESCAPE_ZAKHAEV" );
|
|||
|
precachestring( &"SNIPERESCAPE_DISTANCE" );
|
|||
|
precachestring( &"SNIPERESCAPE_M" );
|
|||
|
precachestring( &"SNIPERESCAPE_BULLET_TRAVEL" );
|
|||
|
precachestring( &"SNIPERESCAPE_S" );
|
|||
|
precachestring( &"SCRIPT_HINT_C4_THROW" );
|
|||
|
|
|||
|
|
|||
|
precacheRumble( "crash_heli_rumble" );
|
|||
|
precacheRumble( "crash_heli_rumble_rest" );
|
|||
|
|
|||
|
level.heli_objective = precacheshader( "objective_heli" );
|
|||
|
level.last_price_kill = 0;
|
|||
|
add_start( "rappel", ::rappel_out_of_hotel, &"STARTS_RAPPEL" );
|
|||
|
add_start( "run", ::start_run, &"STARTS_RUN" );
|
|||
|
add_start( "apart", ::start_apartment, &"STARTS_APART" );
|
|||
|
add_start( "wounding", ::start_wounding, &"STARTS_WOUNDING" );
|
|||
|
add_start( "crash", ::start_crash, &"STARTS_CRASH" );
|
|||
|
add_start( "wounded", ::start_wounded, &"STARTS_WOUNDED");
|
|||
|
add_start( "burnt", ::start_burnt, &"STARTS_BURNT" );
|
|||
|
add_start( "pool", ::start_pool, &"STARTS_POOL" );
|
|||
|
add_start( "fair", ::start_fair, &"STARTS_FAIR" );
|
|||
|
add_start( "fair_battle", ::start_fair_battle, &"STARTS_FAIRBATTLE" );
|
|||
|
add_start( "fair_battle2", ::start_fair_battle, &"STARTS_FAIRBATTLE" );
|
|||
|
add_start( "seaknight", ::start_seaknight, &"STARTS_SEAKNIGHT" );
|
|||
|
default_start( ::snipe );
|
|||
|
createthreatbiasgroup( "price" );
|
|||
|
createthreatbiasgroup( "dog" );
|
|||
|
setignoremegroup( "price", "dog" );
|
|||
|
|
|||
|
createthreatbiasgroup( "dog_allies" );
|
|||
|
setignoremegroup( "dog", "dog_allies" );
|
|||
|
setignoremegroup( "dog_allies", "dog" );
|
|||
|
|
|||
|
|
|||
|
level.weaponClipModels = [];
|
|||
|
level.weaponClipModels[0] = "weapon_dragunov_clip";
|
|||
|
level.weaponClipModels[1] = "weapon_ak47_clip";
|
|||
|
level.weaponClipModels[2] = "weapon_m16_clip";
|
|||
|
level.weaponClipModels[3] = "weapon_m14_clip";
|
|||
|
level.weaponClipModels[4] = "weapon_g3_clip";
|
|||
|
level.weaponClipModels[5] = "weapon_mp5_clip";
|
|||
|
|
|||
|
maps\_load::main();
|
|||
|
|
|||
|
// init friendly stealth
|
|||
|
ai = getaiarray( "allies" );
|
|||
|
array_thread( ai, ::friendly_init );
|
|||
|
|
|||
|
// friendly and enemy dogs ignore each other
|
|||
|
dog_spawners = getentarray( "actor_enemy_dog", "classname" );
|
|||
|
array_thread( dog_spawners, ::add_spawn_function, ::set_dog_threatbias_group );
|
|||
|
|
|||
|
|
|||
|
level.objectives = [];
|
|||
|
addobj( "zakhaev" );
|
|||
|
addobj( "heli" );
|
|||
|
addobj( "hotel" );
|
|||
|
addobj( "heat" );
|
|||
|
addobj( "wounded" );
|
|||
|
addobj( "putdown" );
|
|||
|
addobj( "holdout" );
|
|||
|
addobj( "seaknight" );
|
|||
|
level.objectives[ "wounded" ] = level.objectives[ "heat" ];
|
|||
|
|
|||
|
// add_hint_string( "prone_at_fair", &"KILLHOUSE_HINT_PRONE", ::should_break_prone_hint );
|
|||
|
add_hint_string( "claymore_plant", &"SCRIPT_LEARN_CLAYMORES", ::should_break_claymores );
|
|||
|
add_hint_string( "c4", &"SCRIPT_C4_USE", ::should_break_c4 );
|
|||
|
add_hint_string( "barrett", &"SNIPERESCAPE_PRESS_FORWARDS_OR_BACKWARDS", ::should_break_zoom_hint );
|
|||
|
add_hint_string( "where_is_he", &"SNIPERESCAPE_WHERE_IS_HE", ::should_break_where_is_he );
|
|||
|
|
|||
|
set_c4_throw_binding(); //added by z
|
|||
|
|
|||
|
|
|||
|
if ( level.start_point != "sunset" )
|
|||
|
{
|
|||
|
thread maps\_radiation::main();
|
|||
|
}
|
|||
|
maps\sniperescape_anim::main();
|
|||
|
level thread maps\sniperescape_amb::main();
|
|||
|
|
|||
|
|
|||
|
curtains_left = getentarray( "curtain_left", "targetname" );
|
|||
|
array_thread( curtains_left, ::curtain, "curtain_left" );
|
|||
|
|
|||
|
curtains_right = getentarray( "curtain_right", "targetname" );
|
|||
|
array_thread( curtains_right, ::curtain, "curtain_right" );
|
|||
|
|
|||
|
level.price = getent( "price", "targetname" );
|
|||
|
level.price thread priceInit();
|
|||
|
level.price pushplayer( true );
|
|||
|
level.price.dontavoidplayer = true;
|
|||
|
level.price.interval = 0;
|
|||
|
level.price_sticky_target_time = 5000;
|
|||
|
|
|||
|
|
|||
|
battlechatter_off( "allies" );
|
|||
|
// battlechatter_off( "axis" );
|
|||
|
|
|||
|
thread do_in_order( ::flag_wait, "player_looks_through_skylight", ::exploder, 1 );
|
|||
|
|
|||
|
level.engagement_dist_func = [];
|
|||
|
add_engagement_func( "actor_enemy_merc_SHTGN_winchester", ::engagement_shotgun );
|
|||
|
add_engagement_func( "actor_enemy_merc_AR_ak47", ::engagement_rifle );
|
|||
|
add_engagement_func( "actor_enemy_merc_LMG_rpd", ::engagement_gun );
|
|||
|
add_engagement_func( "actor_enemy_merc_SNPR_dragunov", ::engagement_sniper );
|
|||
|
add_engagement_func( "actor_enemy_merc_SMG_skorpion", ::engagement_smg );
|
|||
|
|
|||
|
enemies = getaiarray( "axis" );
|
|||
|
array_thread( enemies, ::enemy_override );
|
|||
|
add_global_spawn_function( "axis", ::enemy_override );
|
|||
|
add_global_spawn_function( "axis", ::dog_check );
|
|||
|
add_global_spawn_function( "axis", ::price_kill_check );
|
|||
|
|
|||
|
// flags
|
|||
|
flag_init( "player_on_barret" );
|
|||
|
flag_init( "launch_zak" );
|
|||
|
flag_init( "player_is_on_turret" );
|
|||
|
flag_init( "player_rappels" );
|
|||
|
flag_init( "exchange_heli_alerted" );
|
|||
|
flag_init( "wounding_sight_blocker_deleted" );
|
|||
|
flag_init( "heli_destroyed" );
|
|||
|
flag_init( "player_gets_off_turret" );
|
|||
|
flag_init( "wounded_zak_runs_for_car" );
|
|||
|
flag_init( "player_can_rappel" );
|
|||
|
flag_init( "price_starts_rappel" );
|
|||
|
flag_init( "price_comments_on_zak_miss" );
|
|||
|
flag_init( "price_comments_on_zak_hit" );
|
|||
|
flag_init( "zak_uaz_leaves" );
|
|||
|
flag_init( "zak_spawns" );
|
|||
|
flag_init( "player_used_zoom" );
|
|||
|
flag_init( "player_attacks_exchange" );
|
|||
|
flag_init( "exchange_success" );
|
|||
|
flag_init( "hotel_destroyed" );
|
|||
|
flag_init( "apartment_explosion" );
|
|||
|
flag_init( "heat_area_cleared" );
|
|||
|
flag_init( "player_defends_heat_area" );
|
|||
|
flag_init( "price_is_safe_after_wounding" );
|
|||
|
flag_init( "price_was_hit_by_heli" );
|
|||
|
flag_init( "price_picked_up" );
|
|||
|
flag_init( "stop_adjusting_vision" );
|
|||
|
flag_init( "beacon_placed" );
|
|||
|
flag_init( "beacon_ready" );
|
|||
|
flag_init( "seaknight_flies_in" );
|
|||
|
flag_init( "enemy_choppers_incoming" );
|
|||
|
flag_init( "first_pickup" );
|
|||
|
flag_init( "seaknight_prepares_to_leave" );
|
|||
|
flag_init( "seaknight_leaves" );
|
|||
|
flag_init( "price_cuts_to_woods" );
|
|||
|
flag_init( "player_moves_through_burnt_apartment" );
|
|||
|
flag_init( "fairbattle_detected" );
|
|||
|
flag_init( "price_can_be_left" );
|
|||
|
flag_init( "fair_hold_fire" );
|
|||
|
flag_init( "fairbattle_high_intensity" );
|
|||
|
flag_init( "seaknight_lands" );
|
|||
|
flag_init( "faiground_battle_begins" );
|
|||
|
flag_init( "fairbattle_gunshot" );
|
|||
|
flag_init( "price_wants_apartment_cleared" );
|
|||
|
flag_init( "heli_comes_to_rest" );
|
|||
|
flag_init( "can_manage_price" );
|
|||
|
flag_set( "can_manage_price" );
|
|||
|
flag_init( "price_moves_to_position" );
|
|||
|
flag_init( "break_for_apartment" );
|
|||
|
flag_init( "player_looked_in_pool" );
|
|||
|
flag_init( "player_made_it_to_seaknight" );
|
|||
|
flag_init( "price_calls_out_kills" );
|
|||
|
flag_set( "price_calls_out_kills" );
|
|||
|
flag_init( "price_calls_out_enemy_location" );
|
|||
|
flag_set( "price_calls_out_enemy_location" );
|
|||
|
flag_init( "price_told_player_to_go_prone" );
|
|||
|
flag_init( "seaknight_leaves_prematurely" );
|
|||
|
flag_init( "exchange_uazs_arrive" );
|
|||
|
flag_init( "fence_dog_dies" );
|
|||
|
flag_init( "heat_heli_transport" );
|
|||
|
flag_init( "price_opens_door" );
|
|||
|
flag_init( "kill_heli_attacks" );
|
|||
|
flag_init( "price_is_put_down_near_wheel" );
|
|||
|
flag_init( "fairbattle_threat_visible" );
|
|||
|
flag_init( "put_price_near_wheel" );
|
|||
|
flag_init( "heli_shot_down" );
|
|||
|
flag_init( "can_use_turret" );
|
|||
|
|
|||
|
flag_init( "aa_snipe" );
|
|||
|
flag_init( "aa_heat" );
|
|||
|
flag_init( "aa_wounded" );
|
|||
|
flag_init( "aa_burnt_apartment" );
|
|||
|
flag_init( "aa_seaknight_rescue" );
|
|||
|
flag_init( "wounding_enemy_detected" );
|
|||
|
|
|||
|
flag_init( "carry_me_music_resume" );
|
|||
|
flag_init( "music_fairgrounds_fade" );
|
|||
|
flag_init( "havoc_hits_ground" );
|
|||
|
flag_init( "rescue_music_start" );
|
|||
|
|
|||
|
level.firstplay = true;
|
|||
|
|
|||
|
add_wait( ::flag_wait, "apartment_explosion" );
|
|||
|
add_func( ::blow_up_hotel );
|
|||
|
thread do_wait();
|
|||
|
|
|||
|
add_wait( ::flag_wait, "player_enters_fairgrounds" );
|
|||
|
add_func( ::check_for_price );
|
|||
|
thread do_wait();
|
|||
|
|
|||
|
// group1 initiates group2 when group1 gets low
|
|||
|
group1_enemies = getentarray( "group_1", "script_noteworthy" );
|
|||
|
ent = spawnstruct();
|
|||
|
ent.count = 0;
|
|||
|
array_thread( group1_enemies, ::group1_enemies_think, ent );
|
|||
|
|
|||
|
level.debounce_triggers = [];
|
|||
|
run_thread_on_targetname( "leave_one", ::leave_one_think );
|
|||
|
run_thread_on_targetname( "heli_trigger", ::heli_trigger );
|
|||
|
run_thread_on_targetname( "block_path", ::block_path );
|
|||
|
run_thread_on_targetname( "debounce_trigger", ::debounce_think );
|
|||
|
run_thread_on_targetname( "set_go_line", ::set_go_line );
|
|||
|
// run_thread_on_targetname( "flicker_light", ::flicker_light );
|
|||
|
run_thread_on_targetname( "enemy_door_trigger", ::enemy_door_trigger );
|
|||
|
|
|||
|
run_thread_on_targetname( "grass_obj", ::grass_obj );
|
|||
|
|
|||
|
level.kill_heli_last_warning_refresh_time = 0;
|
|||
|
level.kill_heli_index = 0;
|
|||
|
level.kill_heli_progression = 0;
|
|||
|
level.kill_heli_progression_triggers = [];
|
|||
|
level.kill_heli_progression_triggers[ 0 ] = 0;
|
|||
|
level.kill_heli_progression_warnings = [];
|
|||
|
level.kill_heli_progression_warnings[ 0 ] = 0;
|
|||
|
level.kill_heli_triggers = [];
|
|||
|
run_thread_on_targetname( "heat_progression", ::heat_progression_summons_kill_heli );
|
|||
|
run_thread_on_targetname( "uaz_placeholder", ::deleteme );
|
|||
|
run_thread_on_targetname( "deleteme", ::deleteme );
|
|||
|
run_thread_on_targetname( "bus_grenade_trigger", ::bus_grenade_think );
|
|||
|
run_thread_on_targetname( "fair_grenade_trigger", ::fair_grenade_trigger_think );
|
|||
|
run_thread_on_targetname( "script_animator", ::script_animator );
|
|||
|
run_thread_on_targetname( "merry_go_round_bottom", ::merry_go_round_bottom );
|
|||
|
run_thread_on_targetname( "merry_grass_delete", ::merry_grass_delete );
|
|||
|
run_thread_on_targetname( "final_heli_clip", ::final_heli_clip );
|
|||
|
|
|||
|
|
|||
|
run_thread_on_noteworthy( "patrol_guy", ::add_spawn_function, ::patrol_guy );
|
|||
|
run_thread_on_noteworthy( "chopper_guys", ::add_spawn_function, ::chopper_guys_land );
|
|||
|
run_thread_on_noteworthy( "chase_chopper_guys", ::add_spawn_function, ::chase_chopper_guys_land );
|
|||
|
run_thread_on_noteworthy( "house_chase_spawner", ::add_spawn_function, ::house_chase_spawner );
|
|||
|
|
|||
|
thread handle_radiation_warning();
|
|||
|
|
|||
|
|
|||
|
keys = getarraykeys( level.heli_flag );
|
|||
|
array_levelthread( keys, ::helicopter_broadcast );
|
|||
|
|
|||
|
create_price_dialogue_master();
|
|||
|
|
|||
|
// the turret dvars dont exist onthe first frame
|
|||
|
wait( 0.05 );
|
|||
|
setsaveddvar( "turretScopeZoomMin", "1.5" );
|
|||
|
setsaveddvar( "turretScopeZoomMax", "70" );
|
|||
|
setsaveddvar( "turretScopeZoom", "70" );
|
|||
|
thread player_learns_to_zoom();
|
|||
|
// start angles 12.54 -99.17 0
|
|||
|
// start origin 812.33 -11689.9 973.87
|
|||
|
|
|||
|
level.player allowstand( true );
|
|||
|
}
|
|||
|
|
|||
|
music()
|
|||
|
{
|
|||
|
level endon ( "music_fairgrounds_fade" );
|
|||
|
level endon ( "havoc_hits_ground" );
|
|||
|
level endon ( "rescue_music_start" );
|
|||
|
|
|||
|
musicstop( 0.05 );
|
|||
|
wait( 0.2 );
|
|||
|
// level endon( "price_is_safe_after_wounding" );
|
|||
|
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
/*
|
|||
|
if( firstplay )
|
|||
|
{
|
|||
|
MusicPlayWrapper( "sniperescape_run_music" );
|
|||
|
wait( 134 );
|
|||
|
musicStop( 2 );
|
|||
|
wait 2.5;
|
|||
|
firstplay = false;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
MusicPlayWrapper( "sniperescape_secondary_run_music" );
|
|||
|
|
|||
|
if( !flag( "fairbattle_detected" ) && flag( "heat_enemies_back_off" ) )
|
|||
|
wait 56;
|
|||
|
else
|
|||
|
wait 24;
|
|||
|
|
|||
|
if( level.firstplay )
|
|||
|
{
|
|||
|
level.firstplay = false;
|
|||
|
musicStop( 3 );
|
|||
|
wait 3.5;
|
|||
|
MusicPlayWrapper( "sniperescape_secondary_run_music" );
|
|||
|
wait 24;
|
|||
|
}
|
|||
|
|
|||
|
musicStop( 4 );
|
|||
|
wait 4.5;
|
|||
|
|
|||
|
MusicPlayWrapper( "sniperescape_run_music" );
|
|||
|
wait( 134 );
|
|||
|
musicStop( 2 );
|
|||
|
wait 2.5;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
music_helicrash()
|
|||
|
{
|
|||
|
flag_wait( "havoc_hits_ground" );
|
|||
|
|
|||
|
wait 12;
|
|||
|
|
|||
|
musicstop( 1 );
|
|||
|
|
|||
|
flag_wait( "carry_me_music_resume" );
|
|||
|
|
|||
|
wait 0.1;
|
|||
|
|
|||
|
thread music();
|
|||
|
}
|
|||
|
|
|||
|
music_fairgrounds()
|
|||
|
{
|
|||
|
level endon ( "fairbattle_detected" );
|
|||
|
|
|||
|
flag_wait( "music_fairgrounds_fade" );
|
|||
|
musicStop( 8 );
|
|||
|
wait 8.5;
|
|||
|
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
MusicPlayWrapper( "sniperescape_fairgrounds_music" );
|
|||
|
wait 101;
|
|||
|
musicstop( 1 );
|
|||
|
wait 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
music_fairground_battle()
|
|||
|
{
|
|||
|
flag_wait( "fairbattle_detected" );
|
|||
|
|
|||
|
wait 15;
|
|||
|
musicStop( 6 );
|
|||
|
wait 6.1;
|
|||
|
|
|||
|
thread music();
|
|||
|
}
|
|||
|
|
|||
|
music_rescue()
|
|||
|
{
|
|||
|
flag_wait( "seaknight_flies_in" );
|
|||
|
|
|||
|
wait 36;
|
|||
|
|
|||
|
flag_set( "rescue_music_start" );
|
|||
|
|
|||
|
musicStop( 6 );
|
|||
|
wait 6.5;
|
|||
|
|
|||
|
MusicPlayWrapper( "sniperescape_rescue_music" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
priceInit()
|
|||
|
{
|
|||
|
spawn_failed( self );
|
|||
|
self.provideCoveringFire = false;
|
|||
|
self thread magic_bullet_shield();
|
|||
|
self.baseaccuracy = 1000;
|
|||
|
self.moveplaybackrate = 1.21;
|
|||
|
self.ignoresuppression = true;
|
|||
|
self.animname = "price";
|
|||
|
self.IgnoreRandomBulletDamage = true;
|
|||
|
|
|||
|
thread maps\_props::ghillie_leaves();
|
|||
|
}
|
|||
|
|
|||
|
playerangles()
|
|||
|
{
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
println( level.player getplayerangles() );
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
vision_glow_change()
|
|||
|
{
|
|||
|
flag_set( "stop_adjusting_vision" );
|
|||
|
// gotta do 2 vision sets to clear the glow
|
|||
|
set_vision_set( "sniperescape_glow_off", 5 );
|
|||
|
wait( 10 );
|
|||
|
set_vision_set( "sniperescape_outside", 5 );
|
|||
|
}
|
|||
|
|
|||
|
snipe_vision_adjust()
|
|||
|
{
|
|||
|
level endon( "stop_adjusting_vision" );
|
|||
|
if ( 1 )
|
|||
|
return;
|
|||
|
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
flag_wait( "near_window" );
|
|||
|
glow_change = 1.25;
|
|||
|
vision_change = 1.25;
|
|||
|
set_vision_set( "sniperescape_glow_off", glow_change );
|
|||
|
flag_waitopen_or_timeout( "near_window", glow_change );
|
|||
|
set_vision_set( "sniperescape_outside", vision_change );
|
|||
|
flag_waitopen_or_timeout( "near_window", vision_change );
|
|||
|
|
|||
|
flag_waitopen( "near_window" );
|
|||
|
glow_change = 0.25;
|
|||
|
vision_change = 1.25;
|
|||
|
set_vision_set( "sniperescape_glow_off", glow_change );
|
|||
|
flag_wait_or_timeout( "near_window", glow_change );
|
|||
|
set_vision_set( "sniperescape", vision_change );
|
|||
|
flag_wait_or_timeout( "near_window", vision_change );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
snipe()
|
|||
|
{
|
|||
|
objective_add( getobj( "zakhaev" ), "active", &"SNIPERESCAPE_ELIMINATE_IMRAN_ZAKHAEV", exchange_turret_org() );
|
|||
|
|
|||
|
level.player setplayerangles( ( 9.8, -104, 0 ) );
|
|||
|
thread exchange_wind_flunctuates();
|
|||
|
|
|||
|
thread exchange_heli();
|
|||
|
thread exchange_trace_converter();
|
|||
|
|
|||
|
level.price thread price_watches();
|
|||
|
thread price_talks();
|
|||
|
thread snipe_vision_adjust();
|
|||
|
thread player_gets_on_barret();
|
|||
|
run_thread_on_targetname( "flag_org", ::exchange_flag );
|
|||
|
run_thread_on_targetname( "uaz_clip_brush", ::exchange_vehicle_clip );
|
|||
|
|
|||
|
thread barrett_intro();
|
|||
|
|
|||
|
thread exchange_claymore();
|
|||
|
thread exchange_uaz();
|
|||
|
thread exchange_turret();
|
|||
|
thread exchange_barrett_trigger();
|
|||
|
thread exchange_vehicles_flee_conflict();
|
|||
|
thread exchange_dof();
|
|||
|
thread exchange_uaz_that_backs_up();
|
|||
|
thread exchange_wind_flag();
|
|||
|
thread exchange_wind_generator();
|
|||
|
thread exchange_mission_failure();
|
|||
|
|
|||
|
flag_set( "aa_snipe" );
|
|||
|
|
|||
|
run_thread_on_noteworthy( "leaning_smoker", ::add_spawn_function, ::lean_and_smoke );
|
|||
|
run_thread_on_noteworthy( "standing_smoker", ::add_spawn_function, ::stand_and_smoke );
|
|||
|
|
|||
|
exchange_riders = getentarray( "exchange_rider", "targetname" );
|
|||
|
array_thread( exchange_riders, ::add_spawn_function, ::set_ignoreall, true );
|
|||
|
array_thread( exchange_riders, ::add_spawn_function, ::exchange_baddie_main_think );
|
|||
|
|
|||
|
exchange_guards = getentarray( "exchange_guard", "targetname" );
|
|||
|
array_thread( exchange_guards, ::add_spawn_function, ::set_ignoreall, true );
|
|||
|
array_thread( exchange_guards, ::add_spawn_function, ::exchange_baddie_main_think );
|
|||
|
array_thread( exchange_guards, ::add_spawn_function, ::exchange_bored_idle );
|
|||
|
array_thread( exchange_guards, ::spawn_ai );
|
|||
|
|
|||
|
exchange_baddies = getentarray( "exchange_baddy", "targetname" );
|
|||
|
array_thread( exchange_baddies, ::add_spawn_function, ::set_ignoreall, true );
|
|||
|
array_thread( exchange_baddies, ::add_spawn_function, ::exchange_baddie_main_think );
|
|||
|
baddies = array_spawn( exchange_baddies );
|
|||
|
|
|||
|
|
|||
|
level.exchanger_surprise_time = 0.5;
|
|||
|
guard = baddies[ 0 ];
|
|||
|
dealer = baddies[ 1 ];
|
|||
|
|
|||
|
guard.animname = "guard";
|
|||
|
dealer.animname = "dealer";
|
|||
|
guard.main_baddie = true;
|
|||
|
dealer.main_baddie = true;
|
|||
|
node = getent( "exchange_org", "targetname" );
|
|||
|
|
|||
|
// node anim_teleport( baddies, "exchange" );
|
|||
|
node thread anim_loop( baddies, "exchange_idle" );
|
|||
|
// array_thread( baddies, ::stay_put );
|
|||
|
|
|||
|
|
|||
|
exchange_zak_and_guards_jab_it_up( node, baddies );
|
|||
|
|
|||
|
|
|||
|
// in case we were cut off during the idle
|
|||
|
node notify( "stop_loop" );
|
|||
|
|
|||
|
level.price allowedstances( "prone", "crouch", "stand" );
|
|||
|
flag_wait_either( "player_attacks_exchange", "zakhaev_escaped" );
|
|||
|
|
|||
|
musicStop( 3 );
|
|||
|
|
|||
|
wait( 0.25 );
|
|||
|
|
|||
|
price_clears_dialogue();
|
|||
|
|
|||
|
if ( !flag( "exchange_success" ) )
|
|||
|
{
|
|||
|
// some line about missing
|
|||
|
flag_wait( "exchange_success" );
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
// done in the bullet hit logic
|
|||
|
// Damn, my line of sight was blocked. Did you take him out? I thought I saw his arm fly off! Can you see him?
|
|||
|
// price_line( "did_you_take_him_out" );
|
|||
|
line = "target_down_" + randomint( 3 ) + 1;
|
|||
|
// Target down. I think I saw his arm fly off. Nice work Leftenant. We got him. target_down_1
|
|||
|
// Target down. I think you blew off his arm. Shock and blood loss'll take care of the rest. target_down_2
|
|||
|
// Target is down! Nice shot Leftenant. target_down_3
|
|||
|
price_line( line );
|
|||
|
*/
|
|||
|
|
|||
|
objective_complete( getobj( "zakhaev" ) );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
|
|||
|
if ( !flag( "heli_destroyed" ) )
|
|||
|
{
|
|||
|
//* Shit... they<65>re on to us! Take out that helicopter, it<69>ll buy us some time!
|
|||
|
price_line( "take_out_that_heli" );
|
|||
|
|
|||
|
objective_add( getobj( "heli" ), "active", &"SNIPERESCAPE_TAKE_OUT_THE_ATTACK_CHOPPER", exchange_turret_org() );
|
|||
|
flag_wait( "heli_destroyed" );
|
|||
|
objective_complete( getobj( "heli" ) );
|
|||
|
}
|
|||
|
|
|||
|
thread exchange_heli_second_wave();
|
|||
|
|
|||
|
objective_add( getobj( "hotel" ), "active", &"SNIPERESCAPE_GET_OUT_OF_THE_HOTEL", rappel_obj_org() );
|
|||
|
|
|||
|
//* Great shot Leftenant! Now let's go! They'll be searching for us!
|
|||
|
price_line( "great_shot_now_go" );
|
|||
|
|
|||
|
thread music();
|
|||
|
thread music_helicrash();
|
|||
|
thread music_fairgrounds();
|
|||
|
thread music_fairground_battle();
|
|||
|
thread music_rescue();
|
|||
|
|
|||
|
wait( 2.5 );
|
|||
|
flag_set( "player_gets_off_turret" );
|
|||
|
|
|||
|
thread rappel_out_of_hotel();
|
|||
|
}
|
|||
|
|
|||
|
exchange_uaz()
|
|||
|
{
|
|||
|
guard_uazs = getentarray( "base_uaz", "targetname" );
|
|||
|
array_thread( guard_uazs, ::exchange_uaz_preps_for_escape );
|
|||
|
|
|||
|
uazs = spawn_vehicles_from_targetname( "uaz" );
|
|||
|
array_thread( uazs, ::exchange_uaz_preps_for_escape );
|
|||
|
|
|||
|
uaz = get_ent_with_key_from_array( uazs, "zaks_ride", "script_noteworthy" );
|
|||
|
jeep_window = getent( "jeep_window", "targetname" );
|
|||
|
jeep_window linkto( uaz, "body_animate_jnt", (-75,00,54), (0,0,0) );
|
|||
|
wait( 2 );
|
|||
|
|
|||
|
flag_wait( "player_on_barret" );
|
|||
|
|
|||
|
array_levelthread( uazs, ::gopath );
|
|||
|
flag_wait( "zak_arrives" );
|
|||
|
// uaz waittill( "reached_end_node" );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
flag_set( "exchange_uazs_arrive" );
|
|||
|
}
|
|||
|
|
|||
|
price_watches( firstframe )
|
|||
|
{
|
|||
|
self.animname = "price";
|
|||
|
binocs = spawn( "script_model", (0,0,0) );
|
|||
|
binocs setmodel( level.scr_model[ "binocs" ] );
|
|||
|
binocs linkto( self, "TAG_INHAND", (0,0,0), (0,0,0) );
|
|||
|
level.binocs = binocs;
|
|||
|
|
|||
|
targ = getent( self.target, "targetname" );
|
|||
|
targ anim_single_solo( self, "spotter_wave" );
|
|||
|
targ thread anim_loop_solo( self, "spotter_idle" );
|
|||
|
}
|
|||
|
|
|||
|
price_talks()
|
|||
|
{
|
|||
|
level endon( "player_attacks_exchange" );
|
|||
|
// Leftenant Price, the meeting is underway. Enemy transport sighted entering the target area.
|
|||
|
price_line( "transport_sighted" );
|
|||
|
|
|||
|
|
|||
|
flag_wait( "player_on_barret" );
|
|||
|
MusicPlayWrapper( "sniperescape_exchange_music" );
|
|||
|
|
|||
|
wait( 1.25 );
|
|||
|
// Now get on the Barrett rifle and wait for my signal. Do not engage until I give the word.
|
|||
|
// the wind's gettin a bit choppy, you can compensate for it..
|
|||
|
thread price_line( "get_on_barrett" );
|
|||
|
|
|||
|
// Remember what I've taught you. Keep in mind variable humidity and wind speed along the bullet's flight path. At this distance you<6F>ll also have to take the Coriolis effect into account.
|
|||
|
price_line( "remember_my_teaching" );
|
|||
|
|
|||
|
/*
|
|||
|
// Prepare for ranging. Standby.
|
|||
|
price_line( "prepare_for_ranging" );
|
|||
|
|
|||
|
// White truck on the left, range, 1203.5 meters.
|
|||
|
price_line( "white_truck" );
|
|||
|
|
|||
|
// Range to BMP, 1207 meters.
|
|||
|
price_line( "range_to_bmp" );
|
|||
|
|
|||
|
// The table with the briefcase, range, 1206 meters.
|
|||
|
price_line( "table_with_case" );
|
|||
|
*/
|
|||
|
|
|||
|
//flag_wait( "exchange_uazs_arrive" );
|
|||
|
flag_wait( "zak_is_seen" );
|
|||
|
|
|||
|
flag_set( "launch_zak" );
|
|||
|
|
|||
|
level.wind_setting = "middle";
|
|||
|
|
|||
|
delaythread( 25.8, ::flag_set, "block_heli_starts" );
|
|||
|
wait( 5.6 );
|
|||
|
// Ok... I think I see him. Wait for my mark.
|
|||
|
price_line( "i_see_him" );
|
|||
|
|
|||
|
// Target...acquired. I have a positive I.D. on Imran Zakhaev.
|
|||
|
thread price_line( "target_acquired" );
|
|||
|
// Wait - the wind's picked up. Let it die down before you take the shot. Don<6F>t rush it.
|
|||
|
// steady, keep an eye on that flag
|
|||
|
thread price_line( "wind_picked_up" );
|
|||
|
|
|||
|
flag_wait( "block_heli_arrives" );
|
|||
|
level.helitimer = gettime();
|
|||
|
|
|||
|
wait( 1.2 );
|
|||
|
// Ach, where did he come from? Patience laddie... Wait for a clear shot<6F>.
|
|||
|
thread price_line( "where_did_he_come_from" );
|
|||
|
|
|||
|
flag_wait( "block_heli_moves" );
|
|||
|
|
|||
|
|
|||
|
wait( 13 );
|
|||
|
|
|||
|
// player can take the shot early if he's paying attention to the wind
|
|||
|
level.wind_setting = "start";
|
|||
|
wait( 3 );
|
|||
|
|
|||
|
level notify( "wind_stops_flunctuating" );
|
|||
|
level.wind_vel = 0;
|
|||
|
// Ok take the shot.
|
|||
|
level.wind_setting = "end";
|
|||
|
|
|||
|
|
|||
|
wait( 5 );
|
|||
|
|
|||
|
// It's now or never, take the shot!
|
|||
|
price_line( "now_or_never" ); // "take_the_shot"
|
|||
|
musicstop( 3 );
|
|||
|
}
|
|||
|
|
|||
|
barline()
|
|||
|
{
|
|||
|
for( ;; )
|
|||
|
{
|
|||
|
// Line( self gettagorigin( "tag_origin" ), level.player.origin, (1,1,0) );
|
|||
|
Line( self.origin, level.player.origin, (1,1,0) );
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
setup_rappel()
|
|||
|
{
|
|||
|
rappel_trigger = getent( "rappel_trigger", "targetname" );
|
|||
|
rappel_trigger trigger_off();
|
|||
|
|
|||
|
rope = spawn_anim_model( "rope" );
|
|||
|
level.rope = rope;
|
|||
|
// level.rope hide();
|
|||
|
node = getnode( "price_rappel_node", "targetname" );
|
|||
|
node thread anim_first_frame_solo( rope, "rappel_start" );
|
|||
|
|
|||
|
bullet_block = getent( "bullet_block", "targetname" );
|
|||
|
bullet_block delete();
|
|||
|
|
|||
|
|
|||
|
// It's time to move.
|
|||
|
org = getent( level.price.target, "targetname" );
|
|||
|
org notify( "stop_loop" );
|
|||
|
level.price stopanimscripted();
|
|||
|
// level.price anim_single_queue( level.price, "time_to_move" );
|
|||
|
|
|||
|
flag_clear( "aa_snipe" );
|
|||
|
org anim_single_solo( level.price, "spotter_exit" );
|
|||
|
|
|||
|
if ( isdefined( level.binocs ) )
|
|||
|
level.binocs delete();
|
|||
|
|
|||
|
|
|||
|
// level.rope thread maps\_debug::drawTagForever( "RopeSnap_RI" );
|
|||
|
}
|
|||
|
|
|||
|
player_rappel()
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
// the rappel sequence is relative to this node
|
|||
|
player_node = getnode( "player_rappel_node", "targetname" );
|
|||
|
|
|||
|
rope = spawn_anim_model( "player_rope" );
|
|||
|
player_node thread anim_first_frame_solo( rope, "rappel_for_player" );
|
|||
|
|
|||
|
rope_glow = spawn_anim_model( "player_rope_obj" );
|
|||
|
player_node thread anim_first_frame_solo( rope_glow, "rappel_for_player" );
|
|||
|
rope_glow hide();
|
|||
|
|
|||
|
// this is the model the player will attach to for the rappel sequence
|
|||
|
model = spawn_anim_model( "player_rappel" );
|
|||
|
model hide();
|
|||
|
|
|||
|
// put the model in the first frame so the tags are in the right place
|
|||
|
player_node anim_first_frame_solo( model, "rappel" );
|
|||
|
|
|||
|
// this is sniperescape specific stuff for the helicopter that attacks and the explosion that goes off
|
|||
|
// thread heli_attacks_start();
|
|||
|
|
|||
|
// flag_wait( "player_can_rappel" );
|
|||
|
|
|||
|
rappel_trigger = getent( "rappel_trigger", "targetname" );
|
|||
|
rappel_trigger trigger_on();
|
|||
|
|
|||
|
|
|||
|
rappel_trigger.origin = ( 481.4, -10823.2, 1068.9 );
|
|||
|
rappel_trigger sethintstring( &"SNIPERESCAPE_HOLD_1_TO_RAPPEL" );
|
|||
|
|
|||
|
rope_glow show();
|
|||
|
|
|||
|
rappel_trigger waittill( "trigger" );
|
|||
|
rappel_trigger delete();
|
|||
|
|
|||
|
thread vision_glow_change();
|
|||
|
|
|||
|
rope_glow hide();
|
|||
|
flag_set( "player_rappels" );
|
|||
|
level.rappel_buffer = gettime();
|
|||
|
level.timer = gettime();
|
|||
|
|
|||
|
level.player thread take_weapons();
|
|||
|
|
|||
|
//1.7
|
|||
|
delayThread( 1.2, ::flag_set, "apartment_explosion" );
|
|||
|
|
|||
|
// this smoothly hooks the player up to the animating tag
|
|||
|
model lerp_player_view_to_tag( "tag_player", 0.5, 0.9, 5, 5, 45, 0 );
|
|||
|
|
|||
|
// now animate the tag and then unlink the player when the animation ends
|
|||
|
player_node thread anim_single_solo( model, "rappel" );
|
|||
|
player_node thread anim_single_solo( rope, "rappel_for_player" );
|
|||
|
player_node waittill( "rappel" );
|
|||
|
level.player unlink();
|
|||
|
model delete();
|
|||
|
flag_set( "can_save" );
|
|||
|
objective_complete( getobj( "hotel" ) );
|
|||
|
|
|||
|
level.player give_back_weapons();
|
|||
|
//thread music();
|
|||
|
delaythread( 1.5, ::flag_set, "heli_moves_on" );
|
|||
|
}
|
|||
|
|
|||
|
rappel_out_of_hotel()
|
|||
|
{
|
|||
|
wait( 0.05 );
|
|||
|
thread setup_rappel();
|
|||
|
|
|||
|
// ai = getaispeciesarray( "axis", "all" );
|
|||
|
// array_thread( ai, ::delete_living );
|
|||
|
|
|||
|
thread player_rappel();
|
|||
|
price_node = getnode( "price_rappel_node", "targetname" );
|
|||
|
price_node thread anim_reach_solo( level.price, "rappel_start" );
|
|||
|
|
|||
|
// birds fly up
|
|||
|
delayThread( 2, ::exploder, 6 );
|
|||
|
|
|||
|
flag_set( "player_can_rappel" );
|
|||
|
|
|||
|
guys = [];
|
|||
|
guys[ guys.size ] = level.price;
|
|||
|
guys[ guys.size ] = level.rope;
|
|||
|
|
|||
|
if ( !flag( "player_rappels" ) )
|
|||
|
{
|
|||
|
price_climbs_until_player_rappels( guys, price_node );
|
|||
|
}
|
|||
|
if ( !flag( "price_starts_rappel" ) )
|
|||
|
{
|
|||
|
level.price_anim_start_time = gettime();
|
|||
|
price_node thread anim_single( guys, "rappel_start" );
|
|||
|
}
|
|||
|
wait( 0.05 );
|
|||
|
|
|||
|
buffer_time = 1;
|
|||
|
if ( !isdefined( level.rappel_buffer ) )
|
|||
|
{
|
|||
|
wait( buffer_time );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wait_for_buffer_time_to_pass( level.rappel_buffer, buffer_time );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
animlength = getanimlength( level.price getanim( "rappel_start" ) );
|
|||
|
current_time = gettime() - level.price_anim_start_time;
|
|||
|
current_progress = ( current_time * 0.001 ) / animlength;
|
|||
|
progress = 0.51;
|
|||
|
if ( current_progress < progress )
|
|||
|
{
|
|||
|
// jump to the end of the anim
|
|||
|
level.price anim_self_set_time( "rappel_start", progress );
|
|||
|
level.rope anim_self_set_time( "rappel_start", progress );
|
|||
|
}
|
|||
|
level.price waittillend( "single anim" );
|
|||
|
|
|||
|
price_node thread anim_single( guys, "rappel_end" );
|
|||
|
wait( 4 );
|
|||
|
setsaveddvar( "phys_bulletspinscale", "3" ); // back to default
|
|||
|
level.price set_force_color( "r" );
|
|||
|
thread battle_through_heat_area();
|
|||
|
}
|
|||
|
|
|||
|
price_climbs_until_player_rappels( guys, price_node )
|
|||
|
{
|
|||
|
level endon( "player_rappels" );
|
|||
|
|
|||
|
level.price waittill( "goal" );
|
|||
|
|
|||
|
thread apartment_explosion();
|
|||
|
flag_set( "price_starts_rappel" );
|
|||
|
level.price_anim_start_time = gettime();
|
|||
|
price_node anim_single( guys, "rappel_start" );
|
|||
|
|
|||
|
if ( !flag( "player_rappels" ) )
|
|||
|
{
|
|||
|
price_node thread anim_loop( guys, "rappel_idle", undefined, "stop_idle" );
|
|||
|
flag_wait( "player_rappels" );
|
|||
|
price_node notify( "stop_idle" );
|
|||
|
}
|
|||
|
|
|||
|
arcademode_checkpoint( 5, "a" );
|
|||
|
|
|||
|
price_node thread anim_single( guys, "rappel_end" );
|
|||
|
}
|
|||
|
|
|||
|
apartment_explosion()
|
|||
|
{
|
|||
|
// temporarily disable this for show
|
|||
|
// blow up the apartment if the player doesn't rappel soon enough
|
|||
|
// explosion_death_trigger
|
|||
|
|
|||
|
wait( 4.0 );
|
|||
|
flag_set( "apartment_explosion" );
|
|||
|
/*
|
|||
|
flag_wait_or_timeout( "apartment_explosion" , 8 );
|
|||
|
|
|||
|
// blow up the top floor
|
|||
|
blow_up_hotel();
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
start_run()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
thread vision_glow_change();
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
node = getnode( "tele_node", "targetname" );
|
|||
|
org = getent( "tele_org", "targetname" );
|
|||
|
|
|||
|
level.player setplayerangles( ( 0, 0, 0 ) );
|
|||
|
level.player setorigin( org.origin + ( 0, 0, -34341 ) );
|
|||
|
level.price teleport( node.origin );
|
|||
|
plant_price();
|
|||
|
level.player setorigin( org.origin );
|
|||
|
|
|||
|
thread battle_through_heat_area();
|
|||
|
}
|
|||
|
|
|||
|
battle_through_heat_area()
|
|||
|
{
|
|||
|
// kill heli comes and gets you if you take too long in one zone
|
|||
|
thread kill_heli_logic();
|
|||
|
|
|||
|
level.price.dontshootwhilemoving = true;
|
|||
|
level.move_in_trigger_used = [];
|
|||
|
run_thread_on_targetname( "move_in_trigger", ::move_in );
|
|||
|
// level.price thread price_calls_out_kills();
|
|||
|
thread heat_helis_transport_guys_in();
|
|||
|
|
|||
|
weapons_dealers = getentarray( "weapons_dealer", "targetname" );
|
|||
|
array_thread( weapons_dealers, ::delete_living );
|
|||
|
|
|||
|
// change enemy accuracy on the fly so we can fight tons of guys without it being lame
|
|||
|
thread enemy_accuracy_assignment();
|
|||
|
|
|||
|
east_spawners = getentarray( "east_spawner", "targetname" );
|
|||
|
thread heat_spawners_attack( east_spawners, "start_heat_spawners", "stop_heat_spawners" );
|
|||
|
|
|||
|
west_spawners = getentarray( "west_spawner", "targetname" );
|
|||
|
thread heat_spawners_attack( west_spawners, "start_heat_spawners", "stop_heat_spawners" );
|
|||
|
|
|||
|
wait( 1 );
|
|||
|
flag_set( "aa_heat" );
|
|||
|
|
|||
|
// Leftenant Price, follow me!
|
|||
|
level.price anim_single_queue( level.price, "follow_me" );
|
|||
|
|
|||
|
objective_add( getobj( "heat" ), "active", &"SNIPERESCAPE_REACH_THE_EXTRACTION", extraction_point() );
|
|||
|
objective_current( getobj( "heat" ) );
|
|||
|
thread modify_objective_destination_babystep( getobj( "heat" ) );
|
|||
|
|
|||
|
level.timer = gettime();
|
|||
|
// Delta Two Four, this is Alpha Six! We have been compromised, I repeat we have been compromised, now heading to Extraction Point four!
|
|||
|
delayThread( 1, ::price_line, "compromised" );
|
|||
|
|
|||
|
// Alpha Six, Seaknight Five - Niner is en route, E.T.A. - 20 minutes. Don't be late. We're stretchin' our fuel as it is. Out.
|
|||
|
delayThread( 3, ::price_line, "eta_20_min" );
|
|||
|
delayThread( 9.35, ::autosave_by_name, "eta_20_min" );
|
|||
|
delayThread( 5.5, ::countdown, 20 );
|
|||
|
|
|||
|
thread price_runs_for_woods_on_contact();
|
|||
|
|
|||
|
// thread player_hit_debug();
|
|||
|
|
|||
|
flag_wait( "start_heat_spawners" );
|
|||
|
// autosave_or_timeout( "heat_begins", 2.5 );
|
|||
|
|
|||
|
// temporary work around for - onlyents bug
|
|||
|
spawn_vehicle_from_targetname_and_drive( "introchopper1" );
|
|||
|
|
|||
|
flag_wait( "heat_enemies_back_off" );
|
|||
|
// _colors is waiting for this script to hit, so we have to wait for that to happen so that
|
|||
|
// the orange and yellow colors get set
|
|||
|
waittillframeend;
|
|||
|
|
|||
|
activate_trigger_with_targetname( "price_heads_for_apartment" );
|
|||
|
assertex( level.price.script_forcecolor == "b", "Price's color was wrong" );
|
|||
|
// level.price set_force_color( "o" );
|
|||
|
|
|||
|
thread defend_heat_area_until_enemies_leave();
|
|||
|
|
|||
|
// assertex( level.price.script_forcecolor == "o", "Price's color was wrong" );
|
|||
|
level.price set_force_color( "y" );
|
|||
|
|
|||
|
thread the_apartment();
|
|||
|
}
|
|||
|
|
|||
|
price_runs_for_woods_on_contact()
|
|||
|
{
|
|||
|
// level waittill( "price_sees_enemy" );
|
|||
|
flag_wait( "start_heat_spawners" );
|
|||
|
|
|||
|
level.price set_force_color( "b" );
|
|||
|
level.price.dontshootwhilemoving = undefined;
|
|||
|
|
|||
|
// Enemy contact up ahead. Let's cut through the woods.
|
|||
|
// level.price anim_single_queue( level.price, "cut_through_woods" );
|
|||
|
// wait( 8 );
|
|||
|
flag_set( "price_cuts_to_woods" );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
start_apartment()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
thread vision_glow_change();
|
|||
|
thread countdown( 18 );
|
|||
|
objective_add( getobj( "heat" ), "active", &"SNIPERESCAPE_FOLLOW_CPT_MACMILLAN", extraction_point() );
|
|||
|
objective_current( getobj( "heat" ) );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
price_org = getent( "price_apartment_org", "targetname" );
|
|||
|
player_org = getent( "player_apartment_org", "targetname" );
|
|||
|
|
|||
|
level.player setplayerangles( ( 0, 0, 0 ) );
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -34341 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
plant_price();
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
level.price set_force_color( "y" );
|
|||
|
thread the_apartment();
|
|||
|
}
|
|||
|
|
|||
|
the_apartment()
|
|||
|
{
|
|||
|
thread set_min_time_remaining( 8 );
|
|||
|
flag_set( "break_for_apartment" );
|
|||
|
flag_clear( "aa_heat" );
|
|||
|
thread apartment_price_waits_for_dog_death();
|
|||
|
|
|||
|
// price_fights_until_enemies_leave();
|
|||
|
|
|||
|
level notify( "stop_adjusting_enemy_accuracy" );
|
|||
|
// We'll lose 'em in that apartment! Come on!
|
|||
|
level.price thread anim_single_queue( level.price, "lose_them_in_apartment" );
|
|||
|
// create_apartment_badplace();
|
|||
|
|
|||
|
spin_trigger = getent( "price_explore_trigger", "targetname" );
|
|||
|
spin_trigger waittill( "trigger" );
|
|||
|
spin_ent = getent( spin_trigger.target, "targetname" );
|
|||
|
autosave_by_name( "into_the_apartment" );
|
|||
|
// MusicPlayWrapper( "bog_a_shantytown" );
|
|||
|
|
|||
|
arcademode_checkpoint( 4, "b" );
|
|||
|
|
|||
|
flag_set( "price_opens_door" );
|
|||
|
thread player_touches_wounded_blocker();
|
|||
|
activate_trigger_with_targetname( "price_opens_door" );
|
|||
|
|
|||
|
spin_ent anim_reach_solo( level.price, "spin" );
|
|||
|
length = getanimlength( level.price getanim( "spin" ) );
|
|||
|
length = length * 0.87;
|
|||
|
spin_ent thread anim_single_solo( level.price, "spin" );
|
|||
|
wait( length );
|
|||
|
level.price stopanimscripted();
|
|||
|
|
|||
|
slow_door_org = getent( "slow_door_org", "targetname" );
|
|||
|
slow_door_org anim_reach_and_approach_solo( level.price, "smooth_door_open" );
|
|||
|
|
|||
|
door = getent( "slow_door", "targetname" );
|
|||
|
door thread palm_style_door_open();
|
|||
|
slow_door_org anim_single_solo( level.price, "smooth_door_open" );
|
|||
|
level.price set_force_color( "y" );
|
|||
|
|
|||
|
flag_wait( "fence_dog_attacks" );
|
|||
|
level.price clearenemy();
|
|||
|
|
|||
|
thread dog_attacks_fence();
|
|||
|
|
|||
|
thread the_wounding();
|
|||
|
}
|
|||
|
|
|||
|
start_wounding()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
// thread heli_attacks_price();
|
|||
|
thread vision_glow_change();
|
|||
|
// create_apartment_badplace();
|
|||
|
objective_add( getobj( "heat" ), "active", &"SNIPERESCAPE_FOLLOW_CPT_MACMILLAN", extraction_point() );
|
|||
|
objective_current( getobj( "heat" ) );
|
|||
|
thread countdown( 16 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
price_org = getent( "price_apart_org", "targetname" );
|
|||
|
player_org = getent( "player_apart_org", "targetname" );
|
|||
|
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -34341 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
plant_price();
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
level.price setgoalpos( level.price.origin );
|
|||
|
level.price enable_cqbwalk();
|
|||
|
level.price set_force_color( "y" );
|
|||
|
thread the_wounding();
|
|||
|
thread player_touches_wounded_blocker();
|
|||
|
}
|
|||
|
|
|||
|
start_crash()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
// thread heli_attacks_price();
|
|||
|
thread vision_glow_change();
|
|||
|
// create_apartment_badplace();
|
|||
|
objective_add( getobj( "heat" ), "active", &"SNIPERESCAPE_FOLLOW_CPT_MACMILLAN", extraction_point() );
|
|||
|
objective_current( getobj( "heat" ) );
|
|||
|
thread countdown( 16 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
price_org = getent( "price_apart_org", "targetname" );
|
|||
|
player_org = getent( "player_wounding_org", "targetname" );
|
|||
|
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -34341 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
node = getnode( "price_wounding_node", "targetname" );
|
|||
|
node anim_teleport_solo( level.price, "crash" );
|
|||
|
|
|||
|
plant_price();
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
level.price setgoalpos( level.price.origin );
|
|||
|
level.price enable_cqbwalk();
|
|||
|
level.price set_force_color( "y" );
|
|||
|
// thread the_wounding();
|
|||
|
thread player_touches_wounded_blocker();
|
|||
|
thread heli_attacks_price_new();
|
|||
|
|
|||
|
wait( 1 );
|
|||
|
array_thread( level.deathflags[ "surprise_guys_dead" ][ "ai" ], ::self_delete );
|
|||
|
array_thread( level.deathflags[ "surprise_guys_dead" ][ "spawners" ], ::self_delete );
|
|||
|
flag_set( "surprise_guys_dead" );
|
|||
|
flag_set( "patrol_guys_dead" );
|
|||
|
level waittill( "start_continues" );
|
|||
|
flag_set( "heli_shot_down" );
|
|||
|
}
|
|||
|
|
|||
|
the_wounding()
|
|||
|
{
|
|||
|
thread set_min_time_remaining( 7 );
|
|||
|
flag_set( "price_calls_out_kills" );
|
|||
|
flag_wait( "price_signals_holdup" );
|
|||
|
|
|||
|
if ( !player_is_enemy() && !flag( "wounding_enemy_detected" ) )
|
|||
|
{
|
|||
|
price_goes_to_window_to_shoot();
|
|||
|
level.price.ignoreme = false;
|
|||
|
}
|
|||
|
|
|||
|
level.price pushplayer( true );
|
|||
|
level.price enable_ai_color();
|
|||
|
activate_trigger_with_targetname( "price_moves_to_window_trigger" );
|
|||
|
|
|||
|
level.price.ignoreall = false;
|
|||
|
delete_wounding_sight_blocker();
|
|||
|
wait( 2.5 );
|
|||
|
|
|||
|
|
|||
|
// flag_wait( "plant_claymore" );
|
|||
|
// flag_clear( "plant_claymore" );
|
|||
|
|
|||
|
// Quickly - plant claymores if they come this way!
|
|||
|
// level.price thread anim_single_queue( level.price, "place_claymore" );
|
|||
|
|
|||
|
// flag_wait( "player_moves_through_apartment" );
|
|||
|
|
|||
|
// thread price_wounding_kill_trigger();
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
wait( 0.2 );
|
|||
|
level.price.disableexits = false;
|
|||
|
|
|||
|
// level.price.maxVisibleDist = 32;
|
|||
|
// level.player.maxVisibleDist = 32;
|
|||
|
|
|||
|
price_waits_for_enemies_to_walk_past();
|
|||
|
level.price.maxvisibledist = 200;
|
|||
|
*/
|
|||
|
// delaythread( 4.0, ::activate_trigger_with_targetname, "surprise_trigger" );
|
|||
|
flag_wait_either( "patrol_guys_dead", "player_touches_wounding_clip" );
|
|||
|
// flag_wait( "player_touches_wounding_clip" );
|
|||
|
|
|||
|
// node = getnode( "price_heli_fight_node", "targetname" );
|
|||
|
|
|||
|
level.price disable_ai_color();
|
|||
|
level.price.fixedNodeSafeRadius = 32;
|
|||
|
level.price.fixednode = true;
|
|||
|
level.price.goalradius = 32;
|
|||
|
|
|||
|
node = getnode( "price_wounding_node", "targetname" );
|
|||
|
node thread anim_reach_solo( level.price, "crash" );
|
|||
|
// thread price_sets_stance();
|
|||
|
|
|||
|
flag_wait( "player_touches_wounding_clip" );
|
|||
|
surprisers = getentarray( "surprise_spawner", "targetname" );
|
|||
|
array_thread( surprisers, ::spawn_ai );
|
|||
|
// More behind us!
|
|||
|
level.price delaythread( 2, ::anim_single_queue, level.price, "more_behind" );
|
|||
|
|
|||
|
level.price waittill( "goal" );
|
|||
|
level.price.maxvisibledist = 8000;
|
|||
|
|
|||
|
// flag_wait( "player_touches_wounding_clip" );
|
|||
|
// waittill_noteworthy_dies( "patrol_guy" );
|
|||
|
// node = getnode( "price_apartment_destination_node", "targetname" );
|
|||
|
// level.price.fixedNodeSafeRadius = node.fixedNodeSafeRadius;
|
|||
|
// level.price setgoalnode( node );
|
|||
|
|
|||
|
/*
|
|||
|
// now done via trigger
|
|||
|
door_left = getent( "wounding_door_left", "targetname" );
|
|||
|
door_right = getent( "wounding_door_right", "targetname" );
|
|||
|
door_left thread door_opens();
|
|||
|
door_right thread door_opens( - 1 );
|
|||
|
*/
|
|||
|
|
|||
|
// flag_wait( "price_walks_into_trap" );
|
|||
|
thread heli_attacks_price_new();
|
|||
|
}
|
|||
|
|
|||
|
heli_attacks_price()
|
|||
|
{
|
|||
|
node = getnode( "price_apartment_destination_node", "targetname" );
|
|||
|
|
|||
|
heli = spawn_vehicle_from_targetname_and_drive( "heli_price" );
|
|||
|
level.price_heli = heli;
|
|||
|
heli thread helipath( heli.target, 70, 70 );
|
|||
|
wait( 1 );
|
|||
|
|
|||
|
level.price endon( "death" );
|
|||
|
// More behind us!
|
|||
|
level.price thread anim_single_queue( level.price, "more_behind" );
|
|||
|
|
|||
|
node anim_reach_solo( level.price, "wounded_begins" );
|
|||
|
|
|||
|
flag_wait( "price_heli_in_position" );
|
|||
|
|
|||
|
node anim_reach_solo( level.price, "wounded_begins" );
|
|||
|
|
|||
|
// heli thread kills_enemies_then_wounds_price_then_leaves();
|
|||
|
delaythread( 5.5, ::flag_set, "price_heli_moves_on" );
|
|||
|
target = getent( "wounding_target", "targetname" );
|
|||
|
heli delaythread( 6.5, ::heli_shoots_rockets_at_ent, target );
|
|||
|
delaythread( 7.2, ::exploder, 500 );
|
|||
|
|
|||
|
// Chopper!!! Get back! I'll cover you! sniperescape_mcm_choppergetback
|
|||
|
node anim_single_solo( level.price, "wounded_begins" );
|
|||
|
|
|||
|
thread wounded_combat();
|
|||
|
}
|
|||
|
|
|||
|
price_waits_for_enemies_to_walk_past()
|
|||
|
{
|
|||
|
if ( flag( "enemies_walked_past" ) )
|
|||
|
return;
|
|||
|
if ( flag( "wounding_sight_blocker_deleted" ) )
|
|||
|
return;
|
|||
|
|
|||
|
level endon( "wounding_sight_blocker_deleted" );
|
|||
|
flag_wait( "price_says_wait" );
|
|||
|
|
|||
|
autosave_by_name( "standby" );
|
|||
|
|
|||
|
flag_wait( "walked_past_price" );
|
|||
|
|
|||
|
// Now!
|
|||
|
level.price thread anim_single_queue( level.price, "now" );
|
|||
|
}
|
|||
|
|
|||
|
start_wounded()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
thread vision_glow_change();
|
|||
|
// create_apartment_badplace();
|
|||
|
objective_add( getobj( "heat" ), "active", &"SNIPERESCAPE_FOLLOW_CPT_MACMILLAN", extraction_point() );
|
|||
|
objective_current( getobj( "heat" ) );
|
|||
|
wounding_sight_blocker = getent( "wounding_sight_blocker", "targetname" );
|
|||
|
wounding_sight_blocker connectpaths();
|
|||
|
wounding_sight_blocker delete();
|
|||
|
|
|||
|
thread countdown( 13 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
price_org = getnode( "price_apartment_destination_node", "targetname" );
|
|||
|
player_org = getent( "player_post_wound_org", "targetname" );
|
|||
|
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -34341 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
plant_price();
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
level.price disable_ai_color();
|
|||
|
|
|||
|
thread wounded_combat();
|
|||
|
}
|
|||
|
|
|||
|
wounded_combat()
|
|||
|
{
|
|||
|
level.price endon( "death" );
|
|||
|
// dont like this guy anymore
|
|||
|
maps\_spawner::kill_spawnerNum( 10 );
|
|||
|
|
|||
|
run_thread_on_noteworthy( "flee_guy", ::add_spawn_function, ::flee_guy_runs );
|
|||
|
run_thread_on_noteworthy( "force_patrol", ::add_spawn_function, ::force_patrol_think );
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// delete_apartment_badplace();
|
|||
|
add_global_spawn_function( "axis", ::on_the_run_enemies );
|
|||
|
|
|||
|
run_thread_on_targetname( "wounded_combat_trigger", ::wounded_combat_trigger );
|
|||
|
|
|||
|
thread second_apartment_line();
|
|||
|
|
|||
|
|
|||
|
flag_set( "price_is_safe_after_wounding" );
|
|||
|
autosave_by_name( "carry_price" );
|
|||
|
// musicStop();
|
|||
|
|
|||
|
kill_all_enemies();
|
|||
|
|
|||
|
// (coughing) Damn! My leg's all messed up, I can't move! (coughing)
|
|||
|
thread price_line( "cant_move_3" );
|
|||
|
|
|||
|
objective_string( getobj( "wounded" ), &"SNIPERESCAPE_PICK_UP_CPT_MACMILLAN" );
|
|||
|
objective_position( getobj( "wounded" ), level.price.origin );
|
|||
|
// price is hit so he is no longer the objective
|
|||
|
level notify( "stop_updating_objective" );
|
|||
|
// delaythread( 5, ::activate_trigger_with_targetname, "surprise_trigger" );
|
|||
|
|
|||
|
// zones = getentarray( "zone", "targetname" );
|
|||
|
// array_thread( zones, ::enemy_spawn_zone );
|
|||
|
thread escort_to_park();
|
|||
|
}
|
|||
|
|
|||
|
escort_to_park()
|
|||
|
{
|
|||
|
thread set_min_time_remaining( 5 );
|
|||
|
thread price_wounded_logic();
|
|||
|
|
|||
|
thread price_followup_line();
|
|||
|
|
|||
|
// The extraction point is to the southwest. We can still make it if we hurry.
|
|||
|
thread do_in_order( ::flag_wait, "price_picked_up", ::price_line, "extraction_is_southwest" );
|
|||
|
|
|||
|
flag_wait( "price_picked_up" );
|
|||
|
arcademode_checkpoint( 10, "c" );
|
|||
|
|
|||
|
|
|||
|
flag_set( "aa_wounded" );
|
|||
|
thread do_in_order( ::flag_wait, "enter_burnt", ::flag_clear, "aa_wounded" );
|
|||
|
|
|||
|
objective_string( getobj( "wounded" ), &"SNIPERESCAPE_CARRY_MACMILLAN_TO_THE" );
|
|||
|
set_objective_pos_to_extraction_point( getobj( "wounded" ) );
|
|||
|
|
|||
|
|
|||
|
thread enemy_zone_spawner();
|
|||
|
|
|||
|
flag_wait( "enter_burnt" );
|
|||
|
autosave_by_name( "entered_burnt" );
|
|||
|
thread enter_burnt_apartment();
|
|||
|
}
|
|||
|
|
|||
|
start_burnt()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
flag_set( "first_pickup" );
|
|||
|
add_global_spawn_function( "axis", ::on_the_run_enemies );
|
|||
|
thread vision_glow_change();
|
|||
|
objective_add( getobj( "wounded" ), "active", &"SNIPERESCAPE_DRAG_MACMILLAN_BODILY", extraction_point() );
|
|||
|
objective_current( getobj( "wounded" ) );
|
|||
|
set_objective_pos_to_extraction_point( getobj( "wounded" ) );
|
|||
|
wounding_sight_blocker = getent( "wounding_sight_blocker", "targetname" );
|
|||
|
wounding_sight_blocker connectpaths();
|
|||
|
wounding_sight_blocker delete();
|
|||
|
|
|||
|
thread countdown( 6 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
player_org = getent( "player_burnt_org", "targetname" );
|
|||
|
price_org = getent( "price_burnt_org", "targetname" );
|
|||
|
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -5150 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
plant_price();
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
|
|||
|
wait( 0.05 );// magic bullet shield lameness
|
|||
|
thread price_wounded_logic();
|
|||
|
thread enter_burnt_apartment();
|
|||
|
}
|
|||
|
|
|||
|
enter_burnt_apartment()
|
|||
|
{
|
|||
|
thread burnt_blocker();
|
|||
|
|
|||
|
// thread apartment_hunters();
|
|||
|
// thread more_plant_claymores();
|
|||
|
// thread burnt_spawners();
|
|||
|
thread spooky_sighting();
|
|||
|
thread spooky_dog();
|
|||
|
|
|||
|
thread do_in_order( ::flag_wait, "spawn_spooky_dog", ::flag_set, "aa_burnt_apartment" );
|
|||
|
thread do_in_order( ::flag_wait, "apartment_cleared", ::flag_clear, "aa_burnt_apartment" );
|
|||
|
|
|||
|
setdvar( "player_sees_pool_dogs", "" );
|
|||
|
|
|||
|
run_thread_on_noteworthy( "apartment_guard", ::add_spawn_function, ::set_fixednode_true );
|
|||
|
run_thread_on_noteworthy( "apartment_guard", ::add_spawn_function, ::set_baseaccuracy, 100 );
|
|||
|
|
|||
|
thread do_in_order( ::flag_wait, "enter_burnt", ::clear_dvar, "player_hasnt_been_spooked" );
|
|||
|
thread player_navigates_burnt_apartment();
|
|||
|
|
|||
|
/*
|
|||
|
assert( level.flag[ "to_the_pool" ] );
|
|||
|
ai = getaiarray( "axis", "all" );
|
|||
|
array_thread( ai, ::deleteme );
|
|||
|
*/
|
|||
|
thread pool();
|
|||
|
|
|||
|
trigger = getent( "level_end", "targetname" );
|
|||
|
trigger.origin += ( 0, 150, 0 );
|
|||
|
// wait_for_targetname_trigger( "level_end" );
|
|||
|
// iprintlnbold( "End of current level" );
|
|||
|
// wait( 2 );
|
|||
|
// missionsuccess( "icbm", false );
|
|||
|
|
|||
|
thread fairgrounds_before_battle();
|
|||
|
}
|
|||
|
|
|||
|
start_pool()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
flag_set( "first_pickup" );
|
|||
|
thread vision_glow_change();
|
|||
|
objective_add( getobj( "wounded" ), "active", &"SNIPERESCAPE_DRAG_MACMILLAN_BODILY", extraction_point() );
|
|||
|
objective_current( getobj( "wounded" ) );
|
|||
|
set_objective_pos_to_extraction_point( getobj( "wounded" ) );
|
|||
|
wounding_sight_blocker = getent( "wounding_sight_blocker", "targetname" );
|
|||
|
wounding_sight_blocker connectpaths();
|
|||
|
wounding_sight_blocker delete();
|
|||
|
|
|||
|
thread countdown( 8 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
player_org = getent( "player_pool_org", "targetname" );
|
|||
|
price_org = getent( "price_pool_org", "targetname" );
|
|||
|
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -5150 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
plant_price();
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
|
|||
|
setdvar( "player_sees_pool_dogs", "" );
|
|||
|
wait( 0.05 );// magic bullet shield lameness
|
|||
|
flag_set( "to_the_pool" );
|
|||
|
thread price_wounded_logic();
|
|||
|
thread fairgrounds_before_battle();
|
|||
|
thread pool();
|
|||
|
}
|
|||
|
|
|||
|
pool()
|
|||
|
{
|
|||
|
thread set_min_time_remaining( 4 );
|
|||
|
flag_wait( "to_the_pool" );
|
|||
|
flag_set( "price_calls_out_enemy_location" );
|
|||
|
|
|||
|
arcademode_checkpoint( 20, "d" );
|
|||
|
|
|||
|
thread do_in_order( ::flag_wait, "pool_lookat", ::flag_set, "player_looked_in_pool" );
|
|||
|
|
|||
|
oldmaxdist = level.player.maxvisibledist;
|
|||
|
level.player.maxvisibledist = 168;
|
|||
|
|
|||
|
autosave_by_name( "to_the_pool" );
|
|||
|
|
|||
|
// We're almost there. The extraction point is on the other side of that building.
|
|||
|
thread price_line( "almost_there" );
|
|||
|
|
|||
|
flag_set( "music_fairgrounds_fade" );
|
|||
|
|
|||
|
thread pool_have_body();
|
|||
|
|
|||
|
flag_init( "pool_dogs_flee" );
|
|||
|
|
|||
|
// if you're coming from a checkpoint, the dogs flee
|
|||
|
if ( getdvar( "player_sees_pool_dogs" ) == "" )
|
|||
|
{
|
|||
|
setdvar( "player_sees_pool_dogs", "1" );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
flag_set( "pool_dogs_flee" );
|
|||
|
}
|
|||
|
|
|||
|
if ( !flag( "fairbattle_high_intensity" ) )
|
|||
|
{
|
|||
|
dogs = get_guys_with_targetname_from_spawner( "eating_dog" );
|
|||
|
array_thread( dogs, ::pool_dog_think );
|
|||
|
}
|
|||
|
|
|||
|
flag_wait( "player_enters_fairgrounds" );
|
|||
|
level.player.maxvisibledist = oldmaxdist;
|
|||
|
|
|||
|
/*
|
|||
|
flag_wait( "pool_heli_attacks" );
|
|||
|
wait( 1.2 );
|
|||
|
|
|||
|
pool_heli = spawn_vehicle_from_targetname_and_drive( "pool_heli" );
|
|||
|
pool_heli setturningability( 1 );
|
|||
|
|
|||
|
flag_wait( "pool_heli_in_position" );
|
|||
|
wait( 1.5 );
|
|||
|
heli_target = getent( "pool_heli_target_1", "targetname" );
|
|||
|
pool_heli shoot_at_entity_chain( heli_target );
|
|||
|
|
|||
|
flag_set( "pool_heli_tries_another_angle" );
|
|||
|
flag_wait( "pool_heli_in_second_position" );
|
|||
|
wait( 1 );
|
|||
|
|
|||
|
heli_target = getent( "pool_heli_target_2", "targetname" );
|
|||
|
pool_heli shoot_at_entity_chain( heli_target );
|
|||
|
|
|||
|
flag_set( "pool_heli_leaves" );
|
|||
|
wait( 2 );
|
|||
|
if ( !flag( "player_enters_fairgrounds" ) )
|
|||
|
{
|
|||
|
// iprintlnbold( " < MacMillan > I think it's leaving, let's make a run for it" );
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
start_fair()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
flag_set( "first_pickup" );
|
|||
|
thread vision_glow_change();
|
|||
|
objective_add( getobj( "wounded" ), "active", &"SNIPERESCAPE_DRAG_MACMILLAN_BODILY", extraction_point() );
|
|||
|
objective_current( getobj( "wounded" ) );
|
|||
|
set_objective_pos_to_extraction_point( getobj( "wounded" ) );
|
|||
|
wounding_sight_blocker = getent( "wounding_sight_blocker", "targetname" );
|
|||
|
wounding_sight_blocker connectpaths();
|
|||
|
wounding_sight_blocker delete();
|
|||
|
|
|||
|
thread countdown( 20 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
player_org = getent( "player_fair_org", "targetname" );
|
|||
|
price_org = getent( "price_fair_org", "targetname" );
|
|||
|
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -5150 ) );
|
|||
|
level.price teleport( price_org.origin );
|
|||
|
plant_price();
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
|
|||
|
wait( 0.05 );// magic bullet shield lameness
|
|||
|
thread price_wounded_logic();
|
|||
|
flag_wait( "price_picked_up" );
|
|||
|
thread fairgrounds_before_battle();
|
|||
|
flag_set( "player_enters_fairgrounds" );
|
|||
|
flag_set( "to_the_pool" );
|
|||
|
flag_set( "fair_snipers_died" );
|
|||
|
}
|
|||
|
|
|||
|
start_fair_battle()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
flag_set( "first_pickup" );
|
|||
|
thread vision_glow_change();
|
|||
|
objective_add( getobj( "wounded" ), "active", &"SNIPERESCAPE_DRAG_MACMILLAN_BODILY", extraction_point() );
|
|||
|
objective_current( getobj( "wounded" ) );
|
|||
|
set_objective_pos_to_extraction_point( getobj( "wounded" ) );
|
|||
|
wounding_sight_blocker = getent( "wounding_sight_blocker", "targetname" );
|
|||
|
wounding_sight_blocker connectpaths();
|
|||
|
wounding_sight_blocker delete();
|
|||
|
|
|||
|
// thread countdown( 8 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
player_org = getent( "player_fair_org", "targetname" );
|
|||
|
price_org = getent( "price_gnoll", "targetname" );
|
|||
|
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -5150 ) );
|
|||
|
level.price teleport( price_org.origin, price_org.angles );
|
|||
|
plant_price();
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
|
|||
|
wait( 0.05 );// magic bullet shield lameness
|
|||
|
|
|||
|
flag_set( "price_can_be_left" );
|
|||
|
thread price_wounded_logic();
|
|||
|
thread fairgrounds_after_prep();
|
|||
|
flag_set( "player_enters_fairgrounds" );
|
|||
|
flag_set( "to_the_pool" );
|
|||
|
}
|
|||
|
|
|||
|
fairgrounds_before_battle()
|
|||
|
{
|
|||
|
thread fairground_patrollers();
|
|||
|
|
|||
|
level.price_gnoll_dist = 250;
|
|||
|
|
|||
|
flag_wait( "player_enters_fairgrounds" );
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
flag_wait( "player_reaches_extraction_point" );
|
|||
|
if ( flag( "price_picked_up" ) )
|
|||
|
break;
|
|||
|
flag_clear( "player_reaches_extraction_point" );
|
|||
|
}
|
|||
|
|
|||
|
array_thread( level.deathflags[ "fair_snipers_died" ][ "ai" ], ::fair_spawner_seeks_player );
|
|||
|
flag_wait( "fair_snipers_died" );
|
|||
|
|
|||
|
// Alpha Six, this is Big Bird. Standing by for your signal, over.
|
|||
|
price_line( "waiting_for_signal" );
|
|||
|
|
|||
|
wait( 0.35 );
|
|||
|
//gone// Good. Our helicopter is standing by at a safe distance. The enemy will try to overrun our LZ once they pick him up on radar, so find a good sniping spot and go prone. Once you're in position, I'll call in the helicopter. Go.
|
|||
|
|
|||
|
// Our helicopter is standing by at a safe distance.
|
|||
|
price_line( "helicopter_is_standing_by" );
|
|||
|
|
|||
|
// Put me down behind the Ferris wheel, where I can provide sniper support.
|
|||
|
price_line( "put_down_behind_wheel" );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
objective_complete( getobj( "wounded" ) );
|
|||
|
|
|||
|
flag_set( "put_price_near_wheel" );
|
|||
|
objective_add( getobj( "putdown" ), "active", &"SNIPERESCAPE_PUT_CPT_MACMILLAN_DOWN", price_fair_defendspot() );
|
|||
|
objective_current( getobj( "putdown" ) );
|
|||
|
thread update_objective_position_for_fairground( getobj( "putdown" ) );
|
|||
|
thread price_says_this_is_fine();
|
|||
|
thread price_says_a_bit_farther();
|
|||
|
|
|||
|
price_placement_trigger = getent( "price_placement_trigger", "targetname" );
|
|||
|
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
flag_waitopen( "price_picked_up" );
|
|||
|
if ( level.price istouching( price_placement_trigger ) )
|
|||
|
break;
|
|||
|
if ( distance( level.price.origin, price_fair_defendspot() ) <= level.price_gnoll_dist )
|
|||
|
break;
|
|||
|
flag_wait( "price_picked_up" );
|
|||
|
}
|
|||
|
flag_set( "price_is_put_down_near_wheel" );
|
|||
|
objective_complete( getobj( "putdown" ) );
|
|||
|
|
|||
|
thread fairgrounds_after_prep();
|
|||
|
}
|
|||
|
|
|||
|
fairgrounds_after_prep()
|
|||
|
{
|
|||
|
flag_set( "price_moves_to_position" );
|
|||
|
flag_clear( "can_manage_price" );
|
|||
|
flag_set( "fair_hold_fire" );
|
|||
|
flag_set( "price_can_be_left" );
|
|||
|
flag_set( "first_pickup" );
|
|||
|
flag_clear( "price_calls_out_enemy_location" );
|
|||
|
|
|||
|
fairground_chopper_spawners = getentarray( "chase_chopper_spawner", "script_noteworthy" );
|
|||
|
array_thread( fairground_chopper_spawners, ::add_spawn_function, ::fairground_enemies );
|
|||
|
|
|||
|
|
|||
|
autosave_by_name( "the_fairgrounds" );
|
|||
|
wait( 2 );
|
|||
|
|
|||
|
// level.player givemaxammo("claymore");
|
|||
|
// more ammo for final battle
|
|||
|
maps\_loadout::sniper_escape_initial_secondary_weapon_loadout();
|
|||
|
if ( level.gameskill <= 1 )
|
|||
|
maps\_loadout::max_ammo_on_legit_sniper_escape_weapon();
|
|||
|
|
|||
|
if ( getdvar( "claymore_hint" ) == "" )
|
|||
|
{
|
|||
|
setdvar( "claymore_hint", "claymore" );
|
|||
|
claymoreCount = getPlayerClaymores();
|
|||
|
if ( claymoreCount )
|
|||
|
{
|
|||
|
if ( claymoreCount < 9 )
|
|||
|
{
|
|||
|
// Take the rest of my claymores, now is the time to use them.
|
|||
|
thread price_line( "take_my_claymores" );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// And if you have any claymores left, now is the time to use them.
|
|||
|
thread price_line( "use_claymores" );
|
|||
|
}
|
|||
|
|
|||
|
thread display_hint( "claymore_plant" );
|
|||
|
wait( 4 );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
if ( getdvar( "claymore_hint" ) == "claymore" )
|
|||
|
{
|
|||
|
setdvar( "claymore_hint", "c4" );
|
|||
|
thread c4_hint();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// The enemy is bound to enter this area, so find a good sniping position.
|
|||
|
thread price_line( "find_a_good_snipe" );
|
|||
|
// I will signal the helicopter in thirty seconds.
|
|||
|
thread price_line( "i_will_signal_in_30" );
|
|||
|
wait( 4 );
|
|||
|
|
|||
|
claymoreCount = getPlayerClaymores();
|
|||
|
wait_for_player_to_place_claymores();
|
|||
|
|
|||
|
|
|||
|
if ( autosave_on_good_claymore_placement( claymoreCount ) )
|
|||
|
{
|
|||
|
// player did a decent job placing claymores so lets just save it
|
|||
|
// autosave_now( "claymores_placed" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// player_snipe_spot = getent( "player_snipe_spot", "targetname" );
|
|||
|
|
|||
|
objective_add( getobj( "holdout" ), "active", &"SNIPERESCAPE_HOLD_OUT_UNTIL_EVAC", level.price.origin );
|
|||
|
objective_current( getobj( "holdout" ) );
|
|||
|
|
|||
|
// fairgrounds_wait_until_player_is_ready();
|
|||
|
|
|||
|
// Alright lad, I've activated the beacon. Good luck.
|
|||
|
price_line( "activated_beacon" );
|
|||
|
wait( 2.2 );
|
|||
|
|
|||
|
// Alpha Six, we have a fix on your position. Hang tight. Big Bird out.
|
|||
|
thread price_line( "have_a_fix" );
|
|||
|
|
|||
|
// objective_complete( 3 );
|
|||
|
|
|||
|
flag_set( "beacon_placed" );
|
|||
|
price_putdown_hint_trigger = getent( "price_putdown_hint_trigger", "targetname" );
|
|||
|
price_putdown_hint_trigger delete();
|
|||
|
|
|||
|
|
|||
|
thread fairground_battle();
|
|||
|
|
|||
|
thread seaknight_flies_in( false );
|
|||
|
|
|||
|
|
|||
|
// wait until the _vehicle scripts can do assorted waits they do
|
|||
|
wait( 1 );
|
|||
|
|
|||
|
// thread do_in_order( ::wait_until_seaknight_gets_close, 150000, ::flag_set, "seaknight_flies_in" );
|
|||
|
objective_add( getobj( "holdout" ), "active", &"SNIPERESCAPE_SEAKNIGHT_INCOMING", level.seaknight.origin );
|
|||
|
objective_additionalcurrent( getobj( "holdout" ) );
|
|||
|
objective_icon( getobj( "holdout" ), "objective_heli" );
|
|||
|
thread update_seaknight_objective_pos( getobj( "holdout" ) );
|
|||
|
|
|||
|
// thread fairground_air_war();
|
|||
|
}
|
|||
|
|
|||
|
start_seaknight()
|
|||
|
{
|
|||
|
thread music();
|
|||
|
flag_set( "price_can_be_left" );
|
|||
|
flag_set( "first_pickup" );
|
|||
|
thread vision_glow_change();
|
|||
|
objective_add( getobj( "wounded" ), "active", &"SNIPERESCAPE_DRAG_MACMILLAN_BODILY", extraction_point() );
|
|||
|
objective_current( getobj( "wounded" ) );
|
|||
|
set_objective_pos_to_extraction_point( getobj( "wounded" ) );
|
|||
|
wounding_sight_blocker = getent( "wounding_sight_blocker", "targetname" );
|
|||
|
wounding_sight_blocker connectpaths();
|
|||
|
wounding_sight_blocker delete();
|
|||
|
|
|||
|
thread countdown( 8 );
|
|||
|
|
|||
|
ai = getaispeciesarray( "axis", "all" );
|
|||
|
array_thread( ai, ::delete_living );
|
|||
|
player_org = getent( "player_fair_org", "targetname" );
|
|||
|
price_org = getent( "price_gnoll", "targetname" );
|
|||
|
|
|||
|
level.player setorigin( player_org.origin + ( 0, 0, -5150 ) );
|
|||
|
level.price teleport( price_org.origin, price_org.angles );
|
|||
|
plant_price();
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
|
|||
|
wait( 0.05 );// magic bullet shield lameness
|
|||
|
thread price_wounded_logic();
|
|||
|
// thread fairgrounds_after_prep();
|
|||
|
flag_set( "player_enters_fairgrounds" );
|
|||
|
thread seaknight_flies_in( true );
|
|||
|
wait( 1 );
|
|||
|
// thread do_in_order( ::wait_until_seaknight_gets_close, 150000, ::flag_set, "seaknight_flies_in" );
|
|||
|
objective_add( getobj( "holdout" ), "active", &"SNIPERESCAPE_SEAKNIGHT_INCOMING", level.seaknight.origin );
|
|||
|
objective_additionalcurrent( getobj( "holdout" ) );
|
|||
|
objective_icon( getobj( "holdout" ), "objective_heli" );
|
|||
|
thread update_seaknight_objective_pos( getobj( "holdout" ) );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
seaknight_flies_in( debug )
|
|||
|
{
|
|||
|
seaknight_name = "seaknight_normal";
|
|||
|
if ( level.gameskill >= 1 )
|
|||
|
seaknight_name = "seaknight_hard"; // farther away
|
|||
|
seaknight = spawn_vehicle_from_targetname_and_drive( seaknight_name );
|
|||
|
level.seaknight = seaknight;
|
|||
|
|
|||
|
// seaknight.origin = ( - 558000, seaknight.origin[ 1 ], seaknight.origin[ 2 ] );
|
|||
|
if ( !debug )
|
|||
|
seaknight waittill( "reached_dynamic_path_end" );
|
|||
|
|
|||
|
seaknight_node = getent( "seaknight_landing", "targetname" );
|
|||
|
|
|||
|
oldseaknight = seaknight;
|
|||
|
seaknight = seaknight vehicle_to_dummy();
|
|||
|
|
|||
|
if ( level.start_point == "seaknight" )
|
|||
|
{
|
|||
|
seaknight thread maps\_debug::drawTagForever( "tag_detach" );
|
|||
|
seaknight thread maps\_debug::drawTagForever( "tag_origin" );
|
|||
|
seaknight thread maps\_debug::drawOriginForever();
|
|||
|
}
|
|||
|
|
|||
|
seaknight.animname = "seaknight";
|
|||
|
seaknight thread rotor_anim();
|
|||
|
flag_set( "seaknight_flies_in" );
|
|||
|
oldseaknight stopEngineSound();
|
|||
|
|
|||
|
level.seaknight = seaknight;
|
|||
|
seaknight thread seaknight_badplace();
|
|||
|
// seaknight thread maps\_debug::drawTagForever( "tag_origin" );
|
|||
|
// seaknight thread maps\_debug::drawTagForever( "tag_detach" );
|
|||
|
seaknight assign_animtree();
|
|||
|
seaknight_collmap = getent( "seaknight_collmap", "targetname" );
|
|||
|
seaknight_collmap linkto( seaknight, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|||
|
|
|||
|
seaknight thread seaknight_sound();
|
|||
|
|
|||
|
seaknight_entrance_trigger = getent( "seaknight_trigger", "targetname" );
|
|||
|
seaknight_entrance_trigger thread manual_linkto( seaknight_collmap );
|
|||
|
|
|||
|
seaknight_death_trigger = getent( "seaknight_death_trigger", "targetname" );
|
|||
|
seaknight_death_trigger thread manual_linkto( seaknight );
|
|||
|
seaknight_death_trigger thread heli_squashes_stuff( "seaknight_lands" );
|
|||
|
|
|||
|
seaknight thread spawn_seaknight_crew();
|
|||
|
seaknight_node anim_single_solo( seaknight, "landing" );
|
|||
|
flag_set( "seaknight_lands" );
|
|||
|
thread fairbattle_autosave();
|
|||
|
thread player_becomes_invul_on_pickup();
|
|||
|
|
|||
|
// Alpha Team, we're at the LZ. Standing by.
|
|||
|
thread price_line( "heli_at_the_lz" );
|
|||
|
hangout_time = 60;
|
|||
|
|
|||
|
thread seaknight_leaving_warning( hangout_time );
|
|||
|
|
|||
|
// dont want to save after this
|
|||
|
flag_clear( "can_save" );
|
|||
|
|
|||
|
// no more grenades from baddies for the big exit.
|
|||
|
add_global_spawn_function( "axis", ::no_grenades );
|
|||
|
axis = getaiarray( "axis" );
|
|||
|
array_thread( axis, ::set_grenadeammo, 0 );
|
|||
|
|
|||
|
seaknight_node thread anim_loop_solo( seaknight, "idle", undefined, "stop_idle" );
|
|||
|
seaknight_death_trigger delete();
|
|||
|
|
|||
|
objective_complete( getobj( "holdout" ) );
|
|||
|
|
|||
|
trigger = spawn( "script_origin", (0,0,0) );
|
|||
|
trigger.origin = seaknight gettagorigin( "tag_door_rear" );
|
|||
|
trigger.radius = 27.731134;
|
|||
|
|
|||
|
objective_add( getobj( "seaknight" ), "active", &"SNIPERESCAPE_GET_CPT_MACMILLAN_TO", trigger.origin );
|
|||
|
objective_current( getobj( "seaknight" ) );
|
|||
|
|
|||
|
flag_set( "can_manage_price" );
|
|||
|
|
|||
|
thread player_abandons_seaknight_protection();
|
|||
|
|
|||
|
thread player_boards_seaknight( seaknight, trigger );
|
|||
|
delaythread( hangout_time, ::flag_set, "seaknight_leaves_prematurely" );
|
|||
|
|
|||
|
wait_for_seaknight_to_take_off();
|
|||
|
|
|||
|
|
|||
|
if ( flag( "player_made_it_to_seaknight" ) )
|
|||
|
{
|
|||
|
wait( 5 ); // guys delay getting in so they dont intersect player
|
|||
|
thread bring_in_heli_spawners();
|
|||
|
}
|
|||
|
|
|||
|
flag_set( "seaknight_prepares_to_leave" );
|
|||
|
|
|||
|
// wait for the guys to get back on, comes from flag
|
|||
|
wait( 12 );
|
|||
|
seaknight_node notify( "stop_idle" );
|
|||
|
flag_set( "seaknight_leaves" );
|
|||
|
|
|||
|
seaknight_collmap delete();
|
|||
|
seaknight_node thread anim_single_solo( seaknight, "take_off" );
|
|||
|
if ( flag( "player_made_it_to_seaknight" ) )
|
|||
|
{
|
|||
|
wait( 2.5 );
|
|||
|
flag_clear( "aa_seaknight_rescue" );
|
|||
|
wait( 2 );
|
|||
|
if ( isalive( level.player ) )
|
|||
|
{
|
|||
|
objective_complete( getobj( "seaknight" ) );
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
wait( 5 );
|
|||
|
setdvar( "ui_deadquote", &"SNIPERESCAPE_YOU_FAILED_TO_REACH_THE" );
|
|||
|
maps\_utility::missionFailedWrapper();
|
|||
|
}
|
|||
|
|
|||
|
end_level( empty )
|
|||
|
{
|
|||
|
nextmission();
|
|||
|
}
|
|||
|
|
|||
|
bring_in_heli_spawners()
|
|||
|
{
|
|||
|
wait( 6 );
|
|||
|
// bad guys cant shoot you after you start to get in
|
|||
|
remove_global_spawn_function( "axis", ::no_accuracy );
|
|||
|
level notify( "stop_having_low_accuracy" );
|
|||
|
|
|||
|
heli_chaser_spawners = getentarray( "heli_chaser_spawner", "targetname" );
|
|||
|
array_thread( heli_chaser_spawners, ::spawn_ai );
|
|||
|
badplace_delete( "seaknight_badplace" );
|
|||
|
}
|
|||
|
|
|||
|
spawn_seaknight_crew()
|
|||
|
{
|
|||
|
spawners = getentarray( "seaknight_spawner", "targetname" );
|
|||
|
array_thread( spawners, ::add_spawn_function, ::seaknight_defender );
|
|||
|
org = self gettagorigin( "tag_detach" );
|
|||
|
guys = [];
|
|||
|
for ( i = 0; i < spawners.size; i++ )
|
|||
|
{
|
|||
|
spawners[ i ].origin = org;
|
|||
|
spawn = spawners[ i ] stalingradspawn();
|
|||
|
spawn.animname = "guy" + ( i + 1 );
|
|||
|
guys[ guys.size ] = spawn;
|
|||
|
}
|
|||
|
|
|||
|
self thread anim_first_frame( guys, "unload", "tag_detach" );
|
|||
|
|
|||
|
for ( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
guys[ i ] linkto( self, "tag_detach" );
|
|||
|
guys[ i ].attackeraccuracy = 0;
|
|||
|
}
|
|||
|
|
|||
|
flag_wait( "seaknight_lands" );
|
|||
|
|
|||
|
array_thread( guys, ::send_notify, "stop_first_frame" );
|
|||
|
self anim_single( guys, "unload", "tag_detach" );
|
|||
|
|
|||
|
for ( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
guys[ i ] unlink();
|
|||
|
}
|
|||
|
flag_wait( "seaknight_prepares_to_leave" );
|
|||
|
|
|||
|
for ( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
guys[ i ] linkto( self, "tag_detach" );
|
|||
|
}
|
|||
|
self anim_single( guys, "load", "tag_detach" );
|
|||
|
|
|||
|
flag_wait( "player_made_it_to_seaknight" );
|
|||
|
flag_wait( "seaknight_leaves" );
|
|||
|
|
|||
|
array_thread( guys, ::stop_magic_bullet_shield );
|
|||
|
array_thread( guys, ::deleteme );
|
|||
|
}
|
|||
|
|
|||
|
seaknight_defender()
|
|||
|
{
|
|||
|
self thread magic_bullet_shield();
|
|||
|
self setthreatbiasgroup( "price" ); // so dogs dont attack me
|
|||
|
self allowedstances( "crouch" );
|
|||
|
|
|||
|
wait( 1 );
|
|||
|
self.a.pose = "crouch";
|
|||
|
self waittillmatch( "single anim", "end" );
|
|||
|
self setgoalpos( self.origin );
|
|||
|
self.goalradius = 16;
|
|||
|
}
|
|||
|
|