IW4-Dump-Files/maps/invasion.gsc

7811 lines
206 KiB
Plaintext
Raw Permalink Blame History

#include common_scripts\utility;
#include maps\_utility;
#include maps\_vehicle;
#include maps\_anim;
#include maps\invasion_anim;
main()
{
if ( getdvar( "r_reflectionProbeGenerate" ) == "1" )
return;
setsaveddvar( "r_specularcolorscale", "2.3" );
level.min_time_between_uav_launches = 4 * 1000;
level.obj_direction = undefined;
level.min_btr_fighting_range = 400;
level.attackheliRange = 7000;
level.redshirts = [];
level.goodFriendlyDistanceFromPlayerSquared = 300 * 300;
level.cosine[ "90" ] = cos( 90 );
level.cosine[ "60" ] = cos( 60 );
level.cosine[ "25" ] = cos( 25 );
level.droppers = 0;
level.dropped = 0;
level.bmps_from_north_dead = 0;
level.bcs_maxThreatDistFromPlayer = 3500;
level.no_remote_missile_reminders = true;
PreCacheItem( "remote_missile_invasion" );
level.remote_missile_invasion = true;
precacheString( &"INVASION_LINE1" );
precacheString( &"INVASION_LINE2" );
precacheString( &"INVASION_LINE3" );
precacheString( &"INVASION_LINE4" );
precacheString( &"INVASION_LINE5" );
level.weaponClipModels = [];
level.weaponClipModels[0] = "weapon_scar_h_clip";
level.weaponClipModels[1] = "weapon_ak47_clip";
level.weaponClipModels[2] = "weapon_ump45_clip";
level.weaponClipModels[3] = "weapon_fn2000_clip";
level.weaponClipModels[4] = "weapon_mp5_clip";
level.weaponClipModels[5] = "weapon_saw_clip";
level.weaponClipModels[6] = "weapon_mp44_clip";
level.weaponClipModels[7] = "weapon_m16_clip";
build_light_override( "btr80", "vehicle_btr80", "spotlight", "TAG_FRONT_LIGHT_RIGHT", "misc/spotlight_btr80_daytime", "spotlight", 0.2 );
build_light_override( "btr80", "vehicle_btr80", "spotlight_turret", "TAG_TURRET_LIGHT", "misc/spotlight_btr80_daytime", "spotlight_turret", 0.0 );
maps\invasion_precache::main();
maps\invasion_fx::main();
maps\createart\invasion_art::main();
precacheItem( "smoke_grenade_american" );
precacheItem( "remote_missile_not_player_invasion" );
precacheModel( "weapon_stinger_obj" );
precacheModel( "weapon_uav_control_unit_obj" );
precacheItem( "flash_grenade" );
precacheItem( "zippy_rockets" );
precacheItem( "stinger_speedy" );
default_start( ::start_humvee );
add_start( "humvee", ::start_humvee );
add_start( "yards", ::start_yards );
add_start( "bmp", ::start_bmp );
add_start( "pizza", ::start_pizza );
add_start( "gas_station", ::start_gas_station );
add_start( "crash", ::start_crash );
add_start( "nates_roof", ::start_nates_roof );
//add_start( "northside", ::start_roof_northside );
add_start( "attack_diner", ::start_attack_diner );
add_start( "defend_diner", ::start_diner_defend );
add_start( "diner", ::start_diner );
add_start( "burgertown", ::start_burgertown );
add_start( "vip_escort", ::start_vip_escort );
add_start( "defend_BT", ::start_defend_BT );
add_start( "helis", ::start_helis );
add_start( "convoy", ::start_convoy );
//add_start( "surprized_parachute_moment", ::start_surprized_parachute_moment );
//add_start( "police_car_cover_moment", ::start_police_car_cover_moment );
//add_start( "BT_roof", ::start_BT_roof );
//add_start( "bmp_paradrop", ::start_bmp_paradrop );
//add_start( "animated_humvee", ::start_animated_humvee );
add_start( "start_btr80_smash", ::start_btr80_smash );
maps\_attack_heli::preLoad();
maps\_drone_ai::init();
//maps\_juggernaut::main();
maps\_load::main();
maps\_carry_ai::initCarry();
thread maps\invasion_amb::main();
common_scripts\_sentry::main();
array_thread( getvehiclenodearray( "plane_sound", "script_noteworthy" ), maps\_mig29::plane_sound_node );
//array_thread( getentarray( "magic_glass_breaker", "targetname" ), ::magic_glass_breaker );
maps\_stinger::init();
maps\invasion_anim::main_anim();
maps\_remotemissile::init();
thread setup_stingers();
thread setup_nates_kitchen_ladder_clip();
thread setup_bt_ktichen_ladder_clip();
level.bcs_maxTalkingDistFromPlayer = 1500; // default = 1500
level.bcs_maxThreatDistFromPlayer = 5000; // default = 2500
//level.player thread playerunlimitedammothread();
// /#
// while(1)
// {
// file = OpenFile( "test.txt", "write" );
// fprintln(file, level.player.origin );
// closefile( file );
// wait .05;
// }
// #/
if( level.start_point == "no_game" )
return;
flag_init( "notetrack_gimmesitrep" );
flag_init( "notetrack_status" );
flag_init( "notetrack_whatelse" );
flag_init( "notetrack_sentrygunsouth" );
flag_init( "notetrack_checkout" );
flag_init( "notetrack_meatlocker" );
flag_init( "notetrack_unconscious" );
flag_init( "notetrack_supplydrop" );
flag_init( "house_destroyer_moving_back" );
flag_init( "btr_backed_away" );
flag_init( "btr_smoke_starting" );
flag_init( "btr_smoked" );
flag_init( "follow_foley" );
flag_init( "northside_roof" );
flag_init( "smoke_screen_starting" );
flag_init( "bmp_out_of_sight" );
flag_init( "player_goto_roof" );
flag_init( "wells_intro_done" );
flag_init( "truck_guys_retreat" );
flag_init( "diner_attack" );
flag_init( "time_to_go_get_UAV_control" );
flag_init( "time_to_clear_burgertown" );
flag_init( "time_to_destroy_bmps" );
flag_init( "taco_goes_to_roof" );
flag_init( "player_defended_burgertown" );
flag_init( "player_at_convoy" );
flag_init( "bmp_north_left_dead" );
flag_init( "bmp_north_mid_dead" );
flag_init( "move_president_to_prep" );
flag_init( "bmp1_spotted_player" );
flag_init( "bmp2_spotted_player" );
flag_init( "juggernaut_dead" );
flag_init( "nates_bomb_incoming" );
flag_init( "nates_bombed" );
flag_init( "bank_guys_retreat" );
flag_init( "back_door_attack_start" );
flag_init( "bmps_from_north_dead" );
thread bmps_from_north_dead();
maps\_compass::setupMiniMap("compass_map_invasion");
flag_init( "player_in_pos_to_cover_vip" );
flag_init( "convoy_is_here" );
flag_init( "threw_semtex" );
flag_init( "threw_smoke" );
flag_init( "first_attack_heli_spawned" );
flag_init( "second_attack_heli_spawned" );
flag_init( "first_attack_heli_dead" );
flag_init( "second_attack_heli_dead" );
flag_init( "time_to_goto_convoy" );
flag_init("bmp_has_spotted_player" );
//NOT SPAWNERS, start out spawned
//SPAWNERS
yards_roof_parachute_guy = getent( "roof_parachute_landing_guy_yards", "targetname" );
humvee_roof_parachute_guy = getent( "humvee_ride_roof_landing", "targetname" );
yards_roof_parachute_guy add_spawn_function( ::setup_roof_parachute_guy );
humvee_roof_parachute_guy add_spawn_function( ::setup_roof_parachute_guy, "humvee_guy" );
array_thread( getentarray( "commander", "script_noteworthy" ), ::add_spawn_function, ::setup_raptor );
array_thread( getentarray( "taco", "script_noteworthy" ), ::add_spawn_function, ::setup_taco );
array_thread( getentarray( "worm", "script_noteworthy" ), ::add_spawn_function, ::setup_worm );
array_thread( getentarray( "alley_nates_attackers", "script_noteworthy" ), ::add_spawn_function, ::alley_nates_attackers_setup );
array_thread( getentarray( "wells", "script_noteworthy" ), ::add_spawn_function, ::setup_wells );
array_thread( getentarray( "BT_nates_attackers", "script_noteworthy" ), ::add_spawn_function, ::BT_nates_attackers_setup );
wounded_carry_attackers = getentarray( "wounded_carry_attackers", "script_noteworthy" );
array_thread( wounded_carry_attackers, ::add_spawn_function, ::setup_wounded_carry_attackers );
BT_enemy_defenders = getentarray( "BT_enemy_defenders", "script_noteworthy" );
array_thread( BT_enemy_defenders, ::add_spawn_function, ::setup_BT_enemy_defenders );
nates_defenders = getentarray( "nates_defenders", "script_noteworthy" );
array_thread( nates_defenders, ::add_spawn_function, ::nates_defenders_setup );
array_thread( nates_defenders, ::add_spawn_function, ::set_threatbias_group, "nates_defenders" );
// ramirez = getentarray( "ramirez", "script_noteworthy" );
// array_thread( ramirez, ::add_spawn_function, ::setup_ramirez );
// array_thread( ramirez, ::add_spawn_function, ::set_threatbias_group, "nates_defenders" );
//
// collins = getentarray( "collins", "script_noteworthy" );
// array_thread( collins, ::add_spawn_function, ::setup_collins );
// array_thread( collins, ::add_spawn_function, ::set_threatbias_group, "nates_defenders" );
president = getentarray( "president", "script_noteworthy" );
array_thread( president, ::add_spawn_function, ::setup_president );
truck_group_enemies = getentarray( "truck_group_enemies", "script_noteworthy" );
array_thread( truck_group_enemies, ::add_spawn_function, ::truck_group_enemies_setup );
array_thread( truck_group_enemies, ::add_spawn_function, ::truck_group_enemies_setup_retreat );
array_thread( truck_group_enemies, ::add_spawn_function, ::truck_group_enemies_count_deaths );
bank_nates_attackers = getentarray( "bank_nates_attackers", "targetname" );
array_thread ( bank_nates_attackers, ::add_spawn_function, ::bank_enemies_setup_retreat );
spawners = getentarray( "diner_enemy_defenders_mobile", "script_noteworthy" );
array_thread( spawners, ::add_spawn_function, ::setup_diner_backdoor_attackers );
gas_station_truck_guys = getentarray( "gas_station_truck_guys", "targetname" );
array_thread( gas_station_truck_guys, ::add_spawn_function, ::set_threatbias_group, "gas_station_truck_enemies" );
array_thread( getentarray( "tangled_parachute_guy", "script_noteworthy" ), ::add_spawn_function, maps\invasion_anim::tangled_parachute_guy );
add_global_spawn_function( "axis", ::setup_count_predator_infantry_kills );
add_global_spawn_function( "axis", ::setup_remote_missile_target_guy );
flag_init( "player_has_predator_drones" );
predator_drone_control = getent( "predator_drone_control", "targetname" );
predator_drone_control hide();
thread bt_locker_door_open();
thread nates_locker_door_open();
level.paradropper_left = getent("paradrop_guy_left", "script_noteworthy" );
level.paradropper_right = getent("paradrop_guy_right", "script_noteworthy" );
paradrop_plane_triggers = getentarray( "paradrop_plane_trigger", "targetname" );
array_thread( paradrop_plane_triggers, ::paradrop_vehicle );
thread paradrops_ambient();
//array_thread( getvehiclenodearray( "start_drop", "script_noteworthy" ), ::plane_start_drop );
//array_thread( getvehiclenodearray( "stop_drop", "script_noteworthy" ), ::plane_stop_drop );
level.uav = spawn_vehicle_from_targetname_and_drive( "uav" );
level.uav playLoopSound( "uav_engine_loop" );
level.uavRig = spawn( "script_model", level.uav.origin );
level.uavRig setmodel( "tag_origin" );
thread UAVRigAiming();
//keep before objectives
flag_init ( "sentry_in_position" );
level.obj_sentry = getent( "obj_sentry", "script_noteworthy" );
level.obj_sentry thread sentry_init_owner();
//level.obj_sentry.maxrange = 1500;//does nothing
//level.obj_sentry thread waittill_sentry_moved();
thread diner_window_traverses();
//createThreatBiasGroup( "rpg_friendlies" );
//createThreatBiasGroup( "attack_helis" );
createThreatBiasGroup( "nates_defenders" );
createThreatBiasGroup( "gas_station_truck_enemies" );
createThreatBiasGroup( "players_group" );
level.player setthreatbiasgroup( "players_group" );
//SetIgnoreMeGroup( "nates_defenders", "gas_station_truck_enemies" );
ignoreEachOther( "nates_defenders", "gas_station_truck_enemies" );
//attack_helis = getentarray( "kill_heli", "targetname" );
//array_thread( attack_helis, ::add_spawn_function, ::set_threatbias_group, "attack_helis" );
friendly_redshirt_rpg = getentarray( "friendly_redshirt_rpg", "script_noteworthy" );
array_thread( friendly_redshirt_rpg, ::add_spawn_function, ::setup_rpg_redshirts );
//array_thread( attack_helis, ::add_spawn_function, ::set_threatbias_group, "rpg_friendlies" );
// These hints are set in _remotemissile.gscs
// add_hint_string( "hint_predator_drone_4", &"HELLFIRE_USE_DRONE", ::should_break_use_drone );
// add_hint_string( "hint_predator_drone_2", &"HELLFIRE_USE_DRONE_2", ::should_break_use_drone );
add_hint_string( "hint_predator_drone_vs_bmps_4", &"HELLFIRE_USE_DRONE", ::should_break_use_drone_vs_bmps );
add_hint_string( "hint_predator_drone_vs_bmps_2", &"HELLFIRE_USE_DRONE_2", ::should_break_use_drone_vs_bmps );
add_hint_string( "hint_steer_drone", &"SCRIPT_PLATFORM_STEER_DRONE", ::should_break_steer_drone );
//add_hint_string( "hint_throw_semtex", &"INVASION_THROW_SEMTEX", ::should_break_throw_semtex );
//add_hint_string( "hint_get_semtex", &"INVASION_GET_SEMTEX", ::should_break_get_semtex );
add_hint_string( "hint_throw_smoke", &"INVASION_THROW_SMOKE", ::should_break_throw_smoke );
add_hint_string( "hint_get_smoke", &"INVASION_GET_SMOKE", ::should_break_get_smoke );
add_hint_string( "hint_smoke_too_far", &"INVASION_SMOKE_TOO_FAR", ::should_break_smoke_too_far );
add_hint_string( "hint_ads_with_stinger", &"INVASION_ADS_WITH_STINGER", ::should_break_ads_with_stinger );
add_hint_string( "hint_toggle_ads_with_stinger", &"INVASION_TOGGLE_ADS_WITH_STINGER", ::should_break_ads_with_stinger );
/*
flag_init( "got_stinger" );
stingers = getEntArray( "stingers", "targetname" );
foreach ( stinger in stingers )
{
stinger thread Ammorespawnthink( undefined, "stinger", "got_stinger" );
}
*/
//start everything after the first frame so that level.start_point can be
//initialized - this is a bad way of doing things...if people are initilizing
//things before they want their start to start, then they should wait on a flag
waittillframeend;
setsaveddvar( "ai_busyEventDistDeath", "400" );
setsaveddvar( "ai_busyEventDistGunShot", "800" );
thread objective_main();
thread spawn_nates_defenders();
}
sentry_init_owner()
{
wait .5;
owner = spawn( "script_origin", self.origin );
owner.targetname = "fake_sentry_owner";
// owner.debug_sentry = self;// for debug
self.owner = owner;
// self SetSentryOwner( owner );
while( 1 )
{
self waittill( "trigger", ent );
if( isplayer( ent ) )
break;
}
self.owner = ent;
}
turret_spotlight()
{
vehicle_lights_on( "spotlight spotlight_turret" );
}
//#using_animtree( "vehicles" );
//animate_btr80( humvee_opening_node )
//{
// humvee_opening_node anim_single_solo( level.humvee_destroyer, "invasion_opening_BTR" );
// level.humvee_destroyer anim_stopanimscripted();
// //level.humvee_destroyer ClearAnim( %invasion_opening_BTR, 0);
// level.humvee_destroyer thread humvee_destroyer_fires_at_pillars_and_player();
//}
start_humvee()
{
thread handler_humvee_to_yards();
}
//start_paradrop()
//{
// start = getent( "start_yards", "targetname" );
// level.player setOrigin( start.origin );
// level.player setPlayerAngles( start.angles );
//
// //thread test_paradrop();
// paradrop_plane_triggers = getentarray( "paradrop_plane_trigger", "targetname" );
// array_thread( paradrop_plane_triggers, ::paradrop_vehicle );
//}
start_bmp_paradrop()
{
start = getstruct( "start_yards", "targetname" );
level.player setOrigin( start.origin );
level.player setPlayerAngles( start.angles );
level.bmp_paradrop = true;
/*
yards_flight2 = getentarray( "yards_flight2", "targetname" );
while( 1 )
{
array_thread( yards_flight2, ::paradrop_bmp );
wait 5;
}
*/
// //thread test_paradrop();
// paradrop_plane_triggers = getentarray( "paradrop_plane_trigger", "targetname" );
// array_thread( paradrop_plane_triggers, ::paradrop_vehicle );
}
start_yards()
{
start = getstruct( "start_yards", "targetname" );
level.player setOrigin( start.origin );
level.player setPlayerAngles( start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_yards_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
//array_thread( getentarray( "ammo_crate_guy", "script_noteworthy" ), ::add_spawn_function, ::ammo_cache_guy_setup );
thread handler_yards_to_house_destroyer();
}
start_bmp()
{
start_bmp = getstruct( "start_bmp", "targetname" );
level.player setOrigin( start_bmp.origin );
level.player setPlayerAngles( start_bmp.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_bmp_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
//array_thread( getentarray( "ammo_crate_guy", "script_noteworthy" ), ::add_spawn_function, ::ammo_cache_guy_setup );
thread handler_house_destroyer_to_pizza();
}
start_pizza()
{
start_pizza = getstruct( "start_pizza", "targetname" );
level.player setOrigin( start_pizza.origin );
level.player setPlayerAngles( start_pizza.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_pizza_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
//activate_trigger_with_targetname( "ambient_battle_trigger" );
flag_set( "spawn_nates_attackers_in_alley" );
thread spawn_nates_attackers_in_alley();
thread handler_pizza_to_gas_station();
}
start_gas_station()
{
player_start = getstruct( "start_gas_station", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_gas_station_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
//activate_trigger_with_targetname( "ambient_battle_trigger" );
activate_trigger_with_targetname( "BT_attackers_trigger" );
thread handler_gas_station_to_crash();
}
start_crash()
{
player_start = getstruct( "start_crash", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_crash_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
thread spawn_president();
level.taco set_force_color( "g" );
level.raptor set_force_color( "y" );
//activate_trigger_with_targetname( "ambient_battle_trigger" );
activate_trigger_with_targetname( "move_to_wells_intro" );
flag_set( "leaving_gas_station" );//spawns_nates_defenders
wait 1;
thread handler_crash();
}
start_nates_roof()
{
player_start = getstruct( "start_nates_roof", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
flag_set( "leaving_gas_station" );//spawns_nates_defenders
flag_set( "crash_objective" );//turn off bullet shield on defenders
thread spawn_president();
thread spawn_wells();
thread handler_crash_to_roof();
}
start_roof_northside()
{
player_start = getstruct( "start_nates_roof", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
flag_set( "leaving_gas_station" );//spawns_nates_defenders
flag_set ( "sentry_in_position" );
flag_set( "crash_objective" );//turn off bullet shield on defenders
thread spawn_president();
thread spawn_wells();
magic_smoke_grenades = getentarray( "magic_smoke_grenade", "targetname" );
array_thread( magic_smoke_grenades, ::enemy_uses_smoke );
thread wait_to_spawn_diner_defenders();
thread handler_roof_north_side();
}
start_attack_diner()
{
player_start = getstruct( "start_nates_roof", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
flag_set( "leaving_gas_station" );//spawns_nates_defenders
flag_set( "crash_objective" );//turn off bullet shield on defenders
thread spawn_president();
thread spawn_wells();
flag_set( "sentry_in_position" );
thread wait_to_spawn_diner_defenders();
wait .1;
thread handler_roof_to_diner();
}
start_btr80_smash()
{
player_start = getstruct( "start_nates_roof", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
friendlies = getentarray( "secretservice_friendly", "targetname" );
//array_thread( friendlies, ::spawn_ai );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
for ( i = 0 ; i < friendly_starts.size ; i++ )
{
friendlies[ i ].origin = friendly_starts[ i ].origin;
friendlies[ i ].angles = friendly_starts[ i ].angles;
friendlies[ i ] spawn_ai();
}
flag_set( "leaving_gas_station" );//spawns_nates_defenders
flag_set( "crash_objective" );//turn off bullet shield on defenders
thread spawn_president();
thread spawn_wells();
level.obj_sentry kill();
level.btr80_smash = true;
flag_set( "sentry_in_position" );
thread wait_to_spawn_diner_defenders();
thread handler_roof_to_diner();
}
start_diner_defend()
{
player_start = getstruct( "start_diner", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
taco_spawner = getent( "taco", "script_noteworthy" );
friendly_start = getstruct( "start_diner_taco", "targetname" );
taco_spawner.origin = friendly_start.origin;
taco_spawner.angles = friendly_start.angles;
taco_spawner spawn_ai();
raptor_spawner = getent( "commander", "script_noteworthy" );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
raptor_spawner.origin = friendly_starts[ 0 ].origin;
raptor_spawner.angles = friendly_starts[ 0 ].angles;
raptor_spawner spawn_ai();
thread spawn_president();
thread spawn_wells();
flag_set( "leaving_gas_station" );//spawns_nates_defenders
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
thread give_player_predator_drone();
level.obj_sentry kill();
wait .1;
thread two_bmps_from_north();
thread handler_diner_defend();
}
start_diner()
{
player_start = getstruct( "start_diner", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
taco_spawner = getent( "taco", "script_noteworthy" );
friendly_start = getstruct( "start_diner_taco", "targetname" );
taco_spawner.origin = friendly_start.origin;
taco_spawner.angles = friendly_start.angles;
taco_spawner spawn_ai();
raptor_spawner = getent( "commander", "script_noteworthy" );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
raptor_spawner.origin = friendly_starts[ 0 ].origin;
raptor_spawner.angles = friendly_starts[ 0 ].angles;
raptor_spawner spawn_ai();
thread spawn_president();
thread spawn_wells();
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
thread give_player_predator_drone();
//thread two_bmps_from_north();
//thread dialog_time_to_destroy_BMPS();
thread diner_back_door_open();
level.obj_sentry kill();
flag_set( "nates_bomb_incoming" );//prevents nates defenders from spawning
activate_trigger_with_targetname( "burger_town_enemy_defenders_trigger" );
thread taco_goes_to_BT();
thread handler_diner_to_burgertown();
}
start_burgertown()
{
player_start = getstruct( "start_BT", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
taco_spawner = getent( "taco", "script_noteworthy" );
friendly_start = getstruct( "start_BT_taco", "targetname" );
taco_spawner.origin = friendly_start.origin;
taco_spawner.angles = friendly_start.angles;
taco_spawner spawn_ai();
raptor_spawner = getent( "commander", "script_noteworthy" );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
raptor_spawner.origin = friendly_starts[ 0 ].origin;
raptor_spawner.angles = friendly_starts[ 0 ].angles;
raptor_spawner spawn_ai();
thread spawn_president();
thread spawn_wells();
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
thread give_player_predator_drone();
//thread two_bmps_from_north();
flag_set( "nates_bomb_incoming" );//prevents nates defenders from spawning
thread diner_back_door_open();
level.obj_sentry kill();
remove_tvs();
exploder( 333 );
thread handler_burgertown();
}
start_vip_escort()
{
player_start = getstruct( "start_vip_escort", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
taco_spawner = getent( "taco", "script_noteworthy" );
friendly_start = getstruct( "start_BT_taco", "targetname" );
taco_spawner.origin = friendly_start.origin;
taco_spawner.angles = friendly_start.angles;
taco_spawner spawn_ai();
raptor_spawner = getent( "commander", "script_noteworthy" );
friendly_starts = getstructarray( "start_roof_friendly", "targetname" );
raptor_spawner.origin = friendly_starts[ 0 ].origin;
raptor_spawner.angles = friendly_starts[ 0 ].angles;
raptor_spawner spawn_ai();
thread spawn_president();
thread spawn_wells();
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
thread give_player_predator_drone();
//thread two_bmps_from_north();
remove_tvs();
exploder( 333 );
thread taco_goes_to_BT_roof();
flag_set( "taco_goes_to_roof" );
wells_in_bushes = getnode( "wells_in_bushes", "targetname" );
level.wells setgoalnode( wells_in_bushes );
flag_set( "nates_bomb_incoming" );//prevents nates defenders from spawning
thread diner_back_door_open();
level.obj_sentry kill();
thread handler_vip_escort();
}
start_defend_BT()
{
player_start = getstruct( "start_BT", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
taco_spawner = getent( "taco", "script_noteworthy" );
friendly_start = getstruct( "start_BT_taco", "targetname" );
taco_spawner.origin = friendly_start.origin;
taco_spawner.angles = friendly_start.angles;
taco_spawner spawn_ai();
raptor_spawner = getent( "commander", "script_noteworthy" );
raptor_start = getent( "president_in_burgertown_meat_locker", "targetname" );
raptor_spawner.origin = raptor_start.origin;
raptor_spawner.angles = raptor_start.angles;
raptor_spawner spawn_ai();
//thread spawn_president();
//thread spawn_wells();
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
thread give_player_predator_drone();
//thread two_bmps_from_north();
remove_tvs();
exploder( 333 );
thread taco_goes_to_BT_roof();
flag_set( "taco_goes_to_roof" );
flag_set( "nates_bomb_incoming" );//prevents nates defenders from spawning
thread diner_back_door_open();
level.obj_sentry kill();
flag_set( "president_in_BT_meat_locker" );
thread handler_defend_BT();
}
start_helis()
{
player_start = getstruct( "start_nates_roof", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
taco_spawner = getent( "taco", "script_noteworthy" );
friendly_start = getstruct( "start_BT_taco", "targetname" );
taco_spawner.origin = friendly_start.origin;
taco_spawner.angles = friendly_start.angles;
taco_spawner spawn_ai();
raptor_spawner = getent( "commander", "script_noteworthy" );
raptor_start = getent( "president_in_burgertown_meat_locker", "targetname" );
raptor_spawner.origin = raptor_start.origin;
raptor_spawner.angles = raptor_start.angles;
raptor_spawner spawn_ai();
//thread spawn_president();
//thread spawn_wells();
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
thread give_player_predator_drone();
remove_tvs();
exploder( 333 );
thread taco_goes_to_BT_roof();
flag_set( "taco_goes_to_roof" );
flag_set( "nates_bomb_incoming" );//prevents nates defenders from spawning
thread diner_back_door_open();
level.obj_sentry kill();
flag_set( "president_in_BT_meat_locker" );
level.num_of_enemy_forces_spawned = 3;
flag_set( "first_attack_heli_spawned" );
thread handler_defend_BT();
}
start_convoy()
{
player_start = getstruct( "start_nates_roof", "targetname" );
level.player setOrigin( player_start.origin );
level.player setPlayerAngles( player_start.angles );
flag_set( "crash_objective" );//turn off bullet shield on defenders
flag_set( "sentry_in_position" );
remove_tvs();
exploder( 333 );
//thread taco_goes_to_BT_roof();
flag_set( "taco_goes_to_roof" );
flag_set( "nates_bomb_incoming" );//prevents nates defenders from spawning
thread diner_back_door_open();
level.obj_sentry kill();
flag_set( "president_in_BT_meat_locker" );
thread handler_convoy();
}
//start_BT_roof()
//{
// thread spawn_president();
// wells_start = getent( "wells_in_nates_prep", "targetname" );
// thread spawn_wells( wells_start );
//
// player_start = getent( "start_BT_roof", "targetname" );
// level.player setOrigin( player_start.origin );
// level.player setPlayerAngles( player_start.angles );
//
//
// taco_spawner = getent( "taco", "script_noteworthy" );
// friendly_start = getent( "start_BT_roof_taco", "targetname" );
// taco_spawner.origin = friendly_start.origin;
// taco_spawner.angles = friendly_start.angles;
// taco_spawner spawn_ai();
//
// raptor_spawner = getent( "commander", "script_noteworthy" );
// raptor_start = getentarray( "raptor_in_nates_prep", "targetname" );
// raptor_spawner.origin = raptor_start.origin;
// raptor_spawner.angles = raptor_start.angles;
// raptor_spawner spawn_ai();
//
// flag_set( "move_president_to_prep" );
//
//
// flag_set( "crash_objective" );//turn off bullet shield on defenders
// flag_set( "sentry_in_position" );
// thread give_player_predator_drone();
//
// exploder( 333 );
//
// thread handler_vip_escort();
//}
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
black_screen_intro()
{
setSavedDvar( "hud_drawhud", "0" );
level.player freezeControls( true );
//thread maps\_introscreen::introscreen_generic_black_fade_in( 3.5, 1 );
thread maps\_introscreen::introscreen_generic_black_fade_in( 5.3, 1 );
lines = [];
// wolverines
lines[ lines.size ] = &"INVASION_LINE1"; //
// Day 2 - 13:45:[{FAKE_INTRO_SECONDS:4}]
lines[ "date" ] = &"INVASION_LINE2";
//pvt ramerez
lines[ lines.size ] = &"INVASION_LINE3";
//virginia
lines[ lines.size ] = &"INVASION_LINE4";
lines[ lines.size ] = &"INVASION_LINE5";
maps\_introscreen::introscreen_feed_lines( lines );
wait 5;
level.player setplayerangles( ( 0, 180, 0 ) );
level.player freezeControls( false );
wait 1.8;// wait for date stamp
level notify( "introscreen_complete" );// Do final notify when player controls have been restored
wait( 2 );
autosave_by_name( "levelstart" );
}
//test_escort()
//{
// while( 1 )
// {
// wait 3;
// paradrop_escort = spawn_vehicle_from_targetname_and_drive( "paradrop_escort" );
// }
//}
handler_humvee_to_yards()
{
level.vtmodel = "vehicle_hummer_viewmodel";
level.vttype = "humvee";
build_radiusdamage( ( 0, 0, 53 ), 512, 90, 20, false );
//setculldist( 8000 );
//thread test_escort();
thread black_screen_intro();
battlechatter_off( "allies" );
thread dialog_intro();
thread MusicPlayWrapper( "invasion_intro" );
wait 2.5;
first_planes = getent( "first_flight", "script_noteworthy" );
first_planes notify( "trigger" );
first_planes trigger_off();
wait 1.5;
level.player disableweapons();
level.humvee_front = spawn_vehicle_from_targetname_and_drive( "humvee_front" );
level.humvee_front.dontunloadonend = true;
shotgun_guy = getent( "shotgun", "script_noteworthy" );
shotgun_guy add_spawn_function( ::setup_shotgun_guy );
backseat_right_guy = getent( "backseat_right", "script_noteworthy" );
backseat_right_guy add_spawn_function( ::setup_backseat_right_guy );
humvee_blows_up_riders = getentarray( "humvee_blows_up_riders", "targetname" );
array_thread( humvee_blows_up_riders, ::spawn_ai );
level.humvee_player = spawn_vehicle_from_targetname_and_drive( "humvee_player" );
level.humvee_player playsound( "scn_invasion_humvee_ridein" );
level.humvee_player.dontunloadonend = true;
org = level.humvee_player player_rides_shotgun_in_humvee();
flag_wait( "humvee_ride_roof_landing" );
thread roof_parachute_landing_guy_humvee();
flag_wait( "start_humvee_destroyer" );
level.raptor pushplayer( true );
level.taco pushplayer( true );
level.worm pushplayer( true );
level.worm thread magic_bullet_shield();
level.humvee_destroyer = spawn_vehicle_from_targetname_and_drive( "humvee_destroyer" );
//level.humvee_destroyer.veh_pathtype = "follow";
level.humvee_destroyer.veh_pathtype = "constrained";
level.humvee_destroyer thread humvee_destroyer_action();
wait 2;
//Seal Six-One: We got a BMP! Get out, get out!
level.raptor thread dialogue_queue( "inv_six_gotbmp" );
//wait 1;
level.humvee_player Vehicle_SetSpeed( 0, 10 );
//level.humvee_player waittill( "reached_end_node" );
wait 1;
level.humvee_player thread vehicle_unload();
activate_trigger_with_targetname( "flee_humvee" );
wait 1;
level.raptor pushplayer( true );
level.taco pushplayer( true );
level.worm pushplayer( true );
org player_leaves_humvee();
thread dialog_go_to_yards();
wait 1;
setSavedDvar( "hud_drawhud", "1" );
level.raptor pushplayer( true );
level.taco pushplayer( true );
level.worm pushplayer( true );
//level.humvee_player notify( "death" );
thread handler_yards_to_house_destroyer();
}
handler_yards_to_house_destroyer()
{
battlechatter_off( "allies" );
//parachute_landing = getent( "parachute_landing", "targetname" );
spawner = getent( "roof_parachute_landing_guy_yards", "targetname" );
flag_wait( "entering_yards" );
autosave_by_name( "yards" );
if( isalive( level.worm ) )
{
if( isdefined( level.worm.magic_bullet_shield ) )
level.worm thread stop_magic_bullet_shield();
}
level.raptor pushplayer( false );
level.taco pushplayer( false );
if( isalive( level.worm ) )
level.worm pushplayer( false );
thread enable_water_fx();
//thread friendlies_start_ignoreall();
//friendly_at_fence_corner = getent( "friendly_at_fence_corner", "targetname" );
//friendly_at_fence_corner thread activate_this_friendly();
level.roof_paratrooper = spawner spawn_ai();
level.roof_paratrooper.ignoreme = true;
//Russian paratrooper coming down at our 12 o'clock.
//level.raptor dialogue_queue( level.raptor, "inv_six_rusptroop" );
//radio_dialogue( "inv_six_rusptroop" );
//friendly = get_closest_ai( level.roof_paratrooper.origin, "allies" );
//friendly.ignoreall = false;
//Taco: Roger that.
//level.taco dialogue_queue( level.taco, "inv_tco_rogerthat" );
//radio_dialogue( "inv_tco_rogerthat" );
thread dialog_yards_story();
//wait 3;
//thread dialog_yards_objective();
thread handler_house_destroyer_to_pizza();
}
handler_house_destroyer_to_pizza()
{
//flag_init( "start_house_destroyer" );
flag_wait( "start_house_destroyer" );
autosave_by_name( "hd" );
thread spawn_nates_attackers_in_alley();
flag_init( "house_destroyer_unloading" );
level.house_destroyer = spawn_vehicle_from_targetname( "house_destroyer" );
level.house_destroyer thread setup_house_destroyer();
//thread friendlies_duck_from_house_destroyer();
thread dialog_bmp_hasnt_spotted_us();
//level.house_destroyer thread dialog_house_destroyer_destroyed();
//thread save_when_btr_and_riders_are_dead();
flag_wait( "got_visual_on_crash" );
//Seal Six-One: I got a visual on smoke coming from the crash site.
level.raptor dialogue_queue( "inv_six_viscrashsite" );
battlechatter_on( "allies" );
thread dialog_house_destroyer_unloading();
thread flag_save( "house_destroyer_unloading" );
//thread friendlies_stop_ignoring_when_flag( "house_destroyer_unloading" );
thread wait_till_btr_smoked();
thread watch_for_smoke_throws();
thread dialog_semtex_that_bmp();
//thread dialog_take_point();
thread btr_backed_off();
thread handler_pizza_to_gas_station();
}
handler_pizza_to_gas_station()
{
thread spawn_tangled_chute_struggler();
flag_wait( "gas_station_truck_spawned" );
thread maps\_utility::set_ambient( "invasion_ext3" );
thread setup_gas_station_truck();
//thread friendlies_peal_back();
thread flag_save( "leaving_gas_station" );
//thread dialog_juggernaut_attack();
thread handler_gas_station_to_crash();
}
handler_gas_station_to_crash()
{
flag_wait( "leaving_gas_station" );
burning_tree = getent( "burning_tree", "script_noteworthy" );
burning_tree notify( "stop_burning_tree" );
level.obj_direction = "north";//not enough time for drop to the east
thread dialog_going_to_crash_site();
thread one_bmp_from_south();
thread dialog_dont_engage_that_APC();
thread dialog_waiting_at_crash_site();
thread player_shooting_nates();
thread spawn_president();
if( !isdefined( level.wells ) )
{
wells_spawner = getent( "wells", "script_noteworthy" );
wells_spawner spawn_ai();
}
activate_trigger_with_targetname( "advance_towards_nates" );
flag_wait( "goto_wells_intro" );
thread mig_fly_overs();
thread handler_crash();
}
handler_crash()
{
if( !isdefined( level.wells ) )
{
wells_spawner = getent( "wells", "script_noteworthy" );
wells_spawner spawn_ai();
}
thread police_car_cover_moment();
level.taco set_force_color( "g" );
//level.raptor set_force_color( "b" );
activate_trigger_with_targetname( "move_to_wells_intro" );//moves worm and taco
bank_nates_attackers = getentarray( "bank_nates_attackers", "targetname" );
foreach( spawner in bank_nates_attackers )
guy = spawner spawn_ai();
flag_wait( "crash_objective" );
autosave_by_name( "crash_site" );
level.obj_direction = "north";
thread cleanse_the_world();
thread handler_crash_to_roof();
}
police_car_cover_moment()
{
anim_node = getstruct("police_car_moment","script_noteworthy" );
BadPlace_Cylinder( "police_car_moment", -1, anim_node.origin, 600, 300, "axis" );
anim_node thread anim_generic_loop( level.wells, "invasion_vehicle_cover_dialogue_guy1_idle", "stop_invasion_vehicle_cover_dialogue_guy1_idle" );
level.raptor disable_ai_color();
anim_node anim_generic_reach( level.raptor, "invasion_vehicle_cover_dialogue_guy2" );
flag_wait( "crash_objective" );
thread dialog_wells_intro();
anim_node notify( "stop_invasion_vehicle_cover_dialogue_guy1_idle" );
anim_node thread anim_generic( level.wells, "invasion_vehicle_cover_dialogue_guy1" );
anim_node anim_generic( level.raptor, "invasion_vehicle_cover_dialogue_guy2" );
thread move_raptor_wells_and_worm();
BadPlace_Delete( "police_car_moment" );
//level.raptor enable_ai_color();
//level.wells enable_ai_color();
}
dialog_wells_intro()
{
if( flag( "player_on_roof" ) )
return;
level endon ( "player_on_roof" );
thread battlechatter_off( "allies" );
flag_wait( "notetrack_gimmesitrep" );
//Seal Six-One: Marine! Gimme a sitrep! Where's the President?
level.raptor playsound( "inv_six_gimmesitrep" );
flag_wait( "notetrack_meatlocker" );
//Sgt Wells: We moved him to the meat locker, it's practically bulletproof!
level.wells playsound( "inv_sgw_meatlocker" );
flag_wait( "notetrack_status" );
//Seal Six-One: What's his status?
level.raptor playsound( "inv_six_status" );
flag_wait( "notetrack_unconscious" );
//Sgt Wells: He's still unconscious, you got a corpsman?
level.wells playsound( "inv_sgw_unconscious" );
flag_wait( "notetrack_whatelse" );
//Seal Six-One: (aside) Taco, check it out! (back to Marine) What else?
level.raptor playsound( "inv_six_whatelse" );
flag_wait( "notetrack_checkout" );
thread taco_to_meat_locker();
flag_wait( "notetrack_supplydrop" );
//Sgt Wells: We got a supply drop on the roof with an M-5 sentry gun!
level.wells playsound( "inv_sgw_supplydrop" );
flag_wait( "notetrack_sentrygunsouth" );
//Seal Six-One: Roach - get to the roof and get that sentry gun pointed south!
level.raptor playsound( "inv_six_sentrygunsouth" );
wait 3;
flag_set( "player_goto_roof" );
thread battlechatter_on( "allies" );
/*
//Seal Six-One: Marine! Gimme a sitrep! Where's the President?
level.raptor dialogue_queue( "inv_six_gimmesitrep" );
wait .5;
//Sgt Wells: We moved him to the meat locker, it's practically bulletproof!
level.wells dialogue_queue( "inv_sgw_meatlocker" );
//Seal Six-One: What's his status?
level.raptor dialogue_queue( "inv_six_status" );
wait .5;
//Sgt Wells: He's still unconscious, you got a corpsman?
level.wells dialogue_queue( "inv_sgw_unconscious" );
//Seal Six-One: (aside) Taco, check it out! (back to Marine) What else?
level.raptor dialogue_queue( "inv_six_whatelse" );
thread taco_to_meat_locker();
wait 1;
//Sgt Wells: We got a supply drop on the roof with an M-5 sentry gun!
level.wells dialogue_queue( "inv_sgw_supplydrop" );
flag_set( "player_goto_roof" );
//Seal Six-One: Roach - get to the roof and get that sentry gun pointed south!
level.raptor dialogue_queue( "inv_six_sentrygunsouth" );
*/
wait 12;
//Seal Six-One: What about anti-tank weapons, air support?
level.raptor dialogue_queue( "inv_six_antitank" );
//Sgt Wells: We're all out! It's just Ramirez, Collins and myself sir!
level.wells dialogue_queue( "inv_sgw_allout" );
wait 1;
//Seal Six-One: Roger that!
level.raptor dialogue_queue( "inv_six_rogerthat" );
flag_set( "wells_intro_done" );
}
handler_crash_to_roof()
{
thread kill_friendlies_on_roof();
thread dialog_sentry_nags();
thread dialog_enemies_on_roof();
flag_wait( "player_on_roof" );
thread battlechatter_on( "allies" );
level.obj_direction = "south";
nates_roof_volume_south = getent( "nates_roof_volume_south", "targetname" );
friendlies = getaiarray( "allies" );
for( i = 0 ; i < friendlies.size ; i++ )
{
if( i == 5 )
break;
friendlies[i].goalheight = 80;
friendlies[i].goalradius = 500;
friendlies[i].fixednode = false;
friendlies[i] setgoalpos( nates_roof_volume_south.origin );
friendlies[i] setgoalvolume( nates_roof_volume_south );
}
level.raptor.goalheight = 80;
level.raptor.goalradius = 500;
level.raptor.fixednode = false;
level.raptor setgoalpos( nates_roof_volume_south.origin );
level.raptor setgoalvolume( nates_roof_volume_south );
level.taco.goalheight = 80;
level.taco.goalradius = 500;
level.taco.fixednode = false;
level.taco setgoalpos( nates_roof_volume_south.origin );
level.taco setgoalvolume( nates_roof_volume_south );
//flag_wait( "sentry_in_position" );
autosave_by_name( "sentry_in_position" );
flag_set( "bank_guys_retreat" );
wait 3;
enemies = getaiarray( "axis" );
foreach( guy in enemies )
guy thread rush_restaurant_enemies_setup();
level.truck_group_enemies_count_lives = 0;
level.truck_group_enemies_alive = 0;
level.truck_group_enemies_count_deaths = 0;
truck1 = thread spawn_vehicle_from_targetname_and_drive( "truck_group_left" );
truck1.veh_pathtype = "constrained";
wait .1;//easier on spawn code
//thread spawn_vehicle_from_targetname_and_drive( "truck_group_mid" );
truck2 = thread spawn_vehicle_from_targetname_and_drive( "truck_group_right" );
truck2.veh_pathtype = "constrained";
magic_smoke_grenades = getentarray( "magic_smoke_grenade", "targetname" );
array_thread( magic_smoke_grenades, ::enemy_uses_smoke );
thread dialog_they_are_using_smoke();
//Seal Six-One: Heads up ladies, we got trucks to the south.
radio_dialogue( "inv_six_headsupladies" );
thread dialog_foot_mobiles();
wait 1;//let them spawn
while( level.truck_group_enemies_alive > 5 )
wait 1;
//while( level.truck_group_enemies_count_deaths < 14 )
// wait 1;
//e = getaiarray( "allies" );
//f = getaiarray( "axis" );
//println( "enemies " + e.size );
//println( "friendlies " + f.size );
autosave_by_name( "trucks_to_north" );
thread handler_roof_north_side();
}
handler_roof_north_side()
{
level.obj_direction = "north";
magic_smoke_grenades = getentarray( "magic_smoke_grenade_north", "targetname" );
array_thread( magic_smoke_grenades, ::enemy_uses_smoke );
level.truck_group_enemies_count_lives = 0;
//level.truck_group_enemies_alive = 0;
level.truck_group_enemies_count_deaths = 0;//reset counter
truck3 = thread spawn_vehicle_from_targetname_and_drive( "truck_north_right" );
truck3.veh_pathtype = "constrained";
wait .1;
truck4 = thread spawn_vehicle_from_targetname_and_drive( "truck_north_left" );//actually second
truck4.veh_pathtype = "constrained";
thread dialog_smoke_to_north();
//while( 1 )
//{
// level waittill ( "truck_guy_died" );
// ratio = level.truck_group_enemies_count_deaths / level.truck_group_enemies_count_lives;
// println( " ratio: " + ratio );
// if( ratio > .7 )
// break;
//}
//Taco: Incoming, north side!
radio_dialogue( "inv_tco_incomingnorth" );
//Seal Six-One: Roger that!
radio_dialogue( "inv_six_rogerthat" );
thread friendlies_shift_north();
flag_set( "northside_roof" );
wait 6;
//Taco: Contact to the north!
radio_dialogue( "inv_tco_contactnorth" );
//Team, we got contacts to the north.
radio_dialogue( "inv_six_contactsn" );
//Team, shift your fire north.
radio_dialogue( "inv_six_shiftfiren" );
thread wait_to_spawn_diner_defenders();
//while( level.truck_group_enemies_count_deaths < 13 )
while( level.truck_group_enemies_alive > 5 )
wait 1;
level.obj_direction = "west";
flag_set( "truck_guys_retreat" );
wait 6;
autosave_by_name( "truck_retreat" );
south_side_nodes = getnodearray( "south_side_nodes", "targetname" );
n = 0;
nates_roof_volume_south = getent( "nates_roof_volume_south", "targetname" );
friendlies = getaiarray( "allies" );
for( i = 0 ; i < friendlies.size ; i++ )
{
if( cointoss() )
{
if( n >= south_side_nodes.size )
break;
//friend.goalheight = 80;
//friend.goalradius = 500;
friendlies[i].fixednode = false;
friendlies[i] setgoalnode( south_side_nodes[n] );
friendlies[i] setgoalvolume( nates_roof_volume_south );
n++;
}
}
//Seal Six-One: Looks like Ivan's had enough.
radio_dialogue( "inv_six_hadenough" );
//Corporal Dunn, give me a sitrep on Raptor, over.
radio_dialogue( "inv_six_sitreponraptor" );
//Raptor is secure and stable.
radio_dialogue( "inv_tco_secureandstable" );
//Seal Six-One: Team, check weapons and ammo. They'll be back.
radio_dialogue( "inv_six_checkammo" );
dialog_two_bmps_from_north();
thread handler_roof_to_diner();
}
handler_roof_to_diner()
{
level.obj_direction = "west";
if ( isdefined( level.btr80_smash ) )
thread btr80_smash();
thread set_up_predator_drone_control_pickup();
thread hellfire_attacks();
friendlies = getaiarray( "allies" );
foreach( friend in friendlies )
friend cleargoalvolume();
thread friendlies_try_to_get_off_roof();
taco_scopes_diner = getnode( "taco_scopes_diner", "targetname" );
if( isdefined( taco_scopes_diner ) )
level.taco SetGoalNode( taco_scopes_diner );
thread dialog_hellfire_attack_reaction();
flag_waitopen( "player_on_roof" );
flag_set( "diner_attack" );//activates player half way to diner trigger for autosave
bmps = two_bmps_from_north();
//thread save_halfway_to_diner( bmps );
thread dialog_taco_sees_uav_op();
thread taco_goes_to_diner();
//flag_clear( "player_inside_nates" );
level add_wait( ::flag_wait, "player_inside_nates" );
level add_func( ::autosave_by_name, "go_to_diner" );
level thread do_wait();
thread dialog_pickup_drone_control_nag();
thread diner_backdoor_attack();
thread handler_diner_defend();
}
handler_diner_defend()
{
flag_wait( "player_has_predator_drones" );
level.obj_direction = "east";
thread get_friendlies_away_from_nates_destruction();
autosave_by_name( "has_drones" );
activate_trigger_with_targetname( "burger_town_enemy_defenders_trigger" );//spawn enemies in the BT
thread taco_goes_to_BT();
thread dialog_time_to_destroy_BMPS();
thread spawn_battle_when_in_uav();
flag_wait( "bmp_north_left_dead" );
flag_wait( "bmp_north_mid_dead" );
autosave_by_name( "bmps_destroyed" );
thread dialog_regroup_at_nates_nag();
thread handler_diner_to_burgertown();
}
handler_diner_to_burgertown()
{
flag_wait( "leaving_diner" );
//autosave_by_name( "leaving_diner" );
flag_set( "nates_bomb_incoming" );
bomb_nates();
level.obj_direction = "south";
BT_goal = getnode( "taco_in_BT", "script_noteworthy" );
BT_org = BT_goal.origin;
BT_goal_volume = getent( "BT_goal_volume", "targetname" );
redshirts_desired = 3;
level.redshirts = redshirts_respawn( redshirts_desired );
foreach( redshirt in level.redshirts )
redshirt thread smart_barney( "player_in_burgertown", BT_org, BT_goal_volume );
flag_set( "move_president_to_prep" );
thread dialog_nates_bombing_reaction();
thread dialog_clear_burgertown_nag();
level add_wait( ::flag_wait, "player_in_burgertown" );
level add_func( ::autosave_by_name, "player_in_burgertown" );
level thread do_wait();
flag_wait( "burger_town_lower_cleared" );
autosave_by_name( "burgertown_cleared" );
thread handler_burgertown();
}
handler_burgertown()
{
flag_set( "move_president_to_prep" );
//thread dialog_time_to_destroy_BMPS();
//flag_wait( "bmp_north_left_dead" );
//flag_wait( "bmp_north_mid_dead" );
//flag_wait( "player_on_burgertown_roof" );
level.obj_direction = undefined;
wait 3;
//thread dialog_come_cover_us_nag();
//Seal Six-One: Alright, stay on the roof and cover us! We got the President and we're movin' out now.
//thread radio_dialogue( "inv_six_gotpresident" );
thread taco_goes_to_BT_roof();
flag_set( "taco_goes_to_roof" );
flag_set( "time_to_clear_burgertown" );
wells_in_bushes = getnode( "wells_in_bushes", "targetname" );
level.wells setgoalnode( wells_in_bushes );
nates_regroup_enemies = getentarray( "nates_regroup_enemies", "targetname" );
array_thread( nates_regroup_enemies, ::spawn_ai );
thread handler_vip_escort();
}
handler_vip_escort()
{
flag_set( "move_president_to_prep" );
end_volume = getent("BT_goal_volume", "targetname" );
end_goal = getent( "president_in_burgertown_meat_locker", "targetname" ).origin;
redshirts_desired = 3;
level.redshirts = redshirts_respawn( redshirts_desired );
foreach( redshirt in level.redshirts )
redshirt thread smart_barney_on_raptor( end_goal, end_volume );
//level.player waittill_entity_in_range( level.wells, 400 );
//waittill_player_lookat_for_time( timer, dot, dot_only )
//level.wells waittill_player_lookat_for_time( 0.1, .99 );
//flag_set( "player_in_pos_to_cover_vip" );
autosave_by_name( "defend_prez" );
//level.wounded_carry_attackers_dead = 0;
//wounded_carry_attackers_TC = getentarray( "wounded_carry_attackers_TC", "targetname" );
//array_thread( wounded_carry_attackers_TC, ::spawn_ai );
wait 1;
//Everyone lock and load! We're going to move from here to the Burger Town as a group, hua?
radio_dialogue( "inv_six_lockandload" );
wait 5;
flag_waitopen_or_timeout( "player_in_burgertown", 6 );
thread wells_cover_path();
//thread raptor_can_die();
bt_locker = getent( "president_in_burgertown_meat_locker", "targetname" );
//level.raptor thread maps\_carry_ai::move_president_to_node( level.president, bt_locker );
level.president invisibleNotSolid();
level.raptor pushplayer( true );
level.raptor.dontchangepushplayer = true;
wounded_carry_path = getent( "wounded_carry_path", "targetname" );
//level.raptor thread maps\_carry_ai::move_president_to_node_nopickup( level.president, wounded_carry_path );
level.raptor thread maps\_carry_ai::move_president_to_node( level.president, wounded_carry_path );
//On three!
radio_dialogue( "inv_six_onthree" );
wait 1;
//One!
radio_dialogue( "inv_six_one" );
wait 1;
//Two!
radio_dialogue( "inv_six_two" );
wait 1;
//Three!!
radio_dialogue( "inv_six_three" );
wait 1;
//Go go go!
radio_dialogue( "inv_six_gogogo2" );
level.wells thread stop_magic_bullet_shield();
level.raptor thread keep_enemies_away();
thread dialog_keep_guys_off_me();
thread wounded_carry_attackers();
flag_wait( "president_in_BT_meat_locker" );
//level.raptor.dontchangepushplayer = undefined;
//level.raptor pushplayer( false );
thread dialog_team_were_inside();
//thread end_of_script();
thread handler_defend_BT();
}
handler_defend_BT()
{
thread stinger_hint();
thread bt_locker_door_close();
setup_hunter_enemies();
thread enemy_monitor();
thread spawn_redshirts_during_BT_defend();
//bank_enemies = getentarray( "bank_enemies", "targetname" );
//array_thread( bank_enemies, ::spawn_ai );
//thread dialog_stay_near_BT_nags();
//thread mission_fail_if_leaves_BT();
//while( level.num_of_enemy_forces_spawned < 3 )
// wait 1;
//wait 10;
flag_wait( "first_attack_heli_spawned" );
eHeli = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( "kill_heli" );
eHeli.circling = true;
eHeli.no_attractor = true;
level.attack_heli = thread maps\_attack_heli::begin_attack_heli_behavior( eHeli );
//level.attack_heli MakeEntitySentient( "axis" );
thread dialog_first_attack_heli();
//thread dialog_attack_heli_nags();//does both
thread spawn_rpg_redshirts();
attacker = undefined;
if( isalive( level.attack_heli ) )
level.attack_heli waittill( "death", attacker );
flag_set( "first_attack_heli_dead" );
if( isdefined( attacker ) && isplayer( attacker ) )
thread dialog_shot_down_heli();
thread autosave_by_name( "heli_death" );
flag_wait( "second_attack_heli_spawned" );
eHeli = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( "kill_heli" );
eHeli.circling = true;
eHeli.no_attractor = true;
level.attack_heli = thread maps\_attack_heli::begin_attack_heli_behavior( eHeli );
//level.attack_heli MakeEntitySentient( "axis" );
thread spawn_rpg_redshirts();
thread dialog_second_attack_heli();
attacker = undefined;
if( isalive( level.attack_heli ) )
level.attack_heli waittill( "death", attacker );
flag_set( "second_attack_heli_dead" );
if( isdefined( attacker ) && isplayer( attacker ) )
thread dialog_shot_down_heli();
thread autosave_by_name( "heli_death" );
wait 12;
thread handler_convoy();
}
music_invasion_regroup_and_end()
{
thread music_regroup();
flag_wait( "player_at_convoy" );
music_stop( 3 );
level.player playsound( "invasion_ending" );
//MusicPlayWrapper( "invasion_ending" );
}
music_regroup()
{
if( flag( "player_at_convoy" ) )
return;
music_TIME = musicLength( "invasion_regroup" );
//music_TIME = 86;
level endon( "player_at_convoy" );
while( 1 )
{
MusicPlayWrapper( "invasion_regroup" );
wait music_TIME;
}
}
handler_convoy()
{
//nodes = getvehiclenodes( "apply_brakes", "script_noteworthy" );
//foreach( n in nodes )
// n thread setup_brakes();
wait 1;
level.obj_direction = "south";
center_spawner = undefined;
convoy = getentarray( "convoy", "targetname" );
foreach( member in convoy )
{
if( !isdefined( member.script_noteworthy ) )
continue;
if( member.script_noteworthy == "obj_vehicle" )
center_spawner = member;
}
if( isdefined( center_spawner ) )
{
while( player_looking_at( center_spawner.origin, 0, true ) && flag( "player_on_roof" ) )
wait 1;
}
thread music_invasion_regroup_and_end();
targets = getstructarray( "convoy_targets", "targetname" );
humvees = [];
thread dialog_come_to_convoy();
foreach( member in convoy )
{
vehicle = member thread maps\_vehicle::spawn_vehicle_and_gopath();
//vehicle.veh_pathtype = "constrained";
vehicle.dontunloadonend = true;
//vehicle.script_keepdriver = true;
vehicle thread convoy_targets( targets );
vehicle thread setup_brakes();
if( isdefined( member.script_noteworthy ) )
{
humvees[humvees.size] = vehicle;
if( member.script_noteworthy == "obj_vehicle" )
level.convoy = vehicle;
}
//wait .05;//so the spawners arent used more than once per frame
}
flag_set( "time_to_goto_convoy" );
enemies = getaiarray( "axis" );
total = enemies.size;
if( total < 12 )
{
//4 guys:
wounded_carry_attackers_TC = getentarray( "wounded_carry_attackers_TC", "targetname" );
array_thread( wounded_carry_attackers_TC, ::spawn_ai );
}
if( total < 6 )
{
//6 guys
wounded_carry_attackers_gas = getentarray( "wounded_carry_attackers_gas", "targetname" );
array_thread( wounded_carry_attackers_gas, ::spawn_ai );
}
//convoy = maps\_vehicle::spawn_vehicles_from_targetname_and_drive( "convoy" );
//iprintlnbold( "convoy is here" );
flag_wait( "convoy_has_arrived" );//vehicle node sets this
//convoy[0] waittill( "reached_path_end" );
if( !isdefined( level.convoy.usedPositions ) )
{
level.convoy.usedPositions = [];
}
level.convoy.usedPositions[ 3 ] = true;
//level.player waittill_entity_in_range( level.convoy, 4000 );
flag_set( "convoy_in_position" );
flag_wait( "player_at_convoy" );
thread friendlies_enter_humvees( humvees );
thread player_enters_convoy_humvee();
set_vision_set( "invasion_near_convoy", 3 );
//Radio HQ Voice 1: Seal Six-One, this is Overlord, gimme a sitrep over.
radio_dialogue( "inv_hqr_sitrep" );
//Seal Six-One: Overlord, Six-One Actual. Be advised: precious cargo is secure, repeat, precious cargo is secure. We're oscar mike.
radio_dialogue( "inv_six_cargosecure" );
//Radio HQ Voice 1: Overlord copies all. Good job. Out.
radio_dialogue( "inv_hqr_goodjob" );
wait 1;
//Squad, we still got 2,000 civvies in Arcadia! If you got family there it's your lucky day - we're gonna go save their lives!
radio_dialogue( "inv_fly_2kcivvies" );
//iprintlnbold( "end" );
nextmission();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
stinger_hint()
{
flag_wait( "first_attack_heli_spawned" );
while ( 1 )
{
level.player waittill( "begin_firing" );
weap = level.player GetCurrentWeapon();
if ( weap == "stinger" )
{
if( level.player playerads() == 1.0 )
return;
else
{
if ( is_command_bound( "+toggleads_throw" ) )
display_hint_timeout( "hint_toggle_ads_with_stinger", 5 );
else
display_hint_timeout( "hint_ads_with_stinger", 5 );
}
}
}
}
should_break_ads_with_stinger()
{
weap = level.player GetCurrentWeapon();
if ( weap == "stinger" )
{
if( level.player playerads() == 1.0 )
return true;
else
return false;
}
else
{
return true;
}
}
player_enters_convoy_humvee()
{
humvee = level.convoy;
while ( 1 )
{
if( humvee.veh_speed == 0 )
break;
wait .5;
}
goal_pos = humvee gettagorigin( "tag_guy1" );
//humvee_end_pos =(-4692,-4529,2310);
//thread maps\_debug::drawArrowForever( goal_pos, (0,0,0) );
while ( 1 )
{
d = Distance( goal_pos, level.player.origin );
if ( d <= 70 )
break;
wait .5;
}
move_time = 0.6;
level.player AllowCrouch( false );
level.player AllowProne( false );
level.player DisableWeapons();
org = spawn_tag_origin();
org.origin = level.player.origin;
org.angles = level.player.angles;
level.player PlayerLinkTo( org, "tag_origin", 0.8, 180, 180, 40, 40 );
goal_pos = humvee gettagorigin( "tag_guy1" );
org MoveTo( goal_pos+(0,0,-30), move_time, move_time * 0.5, move_time * 0.5 );
wait( move_time );
//wait 2;
//iprintlnbold( "nextmission" );
}
setup_brakes()
{
self ent_flag_init( "apply_brakes" );
//if( self.classname == "script_vehicle_bradley" )
// return;
self ent_flag_wait( "apply_brakes" );
//print3d( self.origin + (0,0,100), "brake", (1,1,1), 1, 1, 60 );
//self waitill( "trigger", vehicle );
self.veh_brake = 1;
}
friendlies_enter_humvees( humvees )
{
friendly_redshirts = getentarray( "friendly_redshirt", "script_noteworthy" );
foreach( thing in friendly_redshirts )
{
if( !isai( thing ) )
{
if( isspawner( thing ) )
{
thing remove_spawn_function( ::keep_red_shirts_alive_until_close );
thing remove_spawn_function( ::smart_roaming_barney );
}
}
}
humvees_left = humvees.size;
while( humvees_left )
{
new_guys = spawn_humvee_boarders();
foreach( guy in new_guys )
thread guy_runtovehicle_load( guy, humvees[humvees_left-1] );
humvees_left--;
wait 3;
}
}
spawn_humvee_boarders()
{
group = "redshirt_spawn_group_BT";
redshirt_spawn_groups = getstructarray( group, "targetname" );
farthest = getfarthest( level.player.origin, redshirt_spawn_groups );
spawners = getentarray( farthest.target, "targetname" );
println( " selected redshirt group: " + farthest.script_noteworthy );
//closest = getclosest( level.player.origin, redshirt_spawn_groups );
//redshirt_spawn_groups = array_remove( redshirt_spawn_groups, closest );
//second_closest = getclosest( level.player.origin, redshirt_spawn_groups );
//spawners = getentarray( second_closest.target, "targetname" );
guys = [];
foreach( spawner in spawners )
{
if( guys.size < 3 )
{
spawner.count = 1;
guys[guys.size] = spawner spawn_ai();
}
}
return guys;
}
dialog_enemies_on_roof()
{
flag_wait( "player_on_roof" );
level endon( "diner_attack" );
dialog = [];
//Tangos on the roof behind us!
dialog[dialog.size] = "inv_six_roofbehind";
//Our perimeter is breached! Enemies on the roof!
dialog[dialog.size] = "inv_six_enemiesonroof";
//Contact! Hostiles are on our roof! Inside our perimeter!
dialog[dialog.size] = "inv_six_insideperim";
//Squad! Hostiles on the roof! Turn around!
dialog[dialog.size] = "inv_six_turnaround";
current_line = 0;
trig = getent( "enemies_on_roof", "targetname" );
while( 1 )
{
trig waittill( "trigger", other );
println( other.classname + " " + other.origin );
level.raptor dialogue_queue( dialog[current_line] );
current_line++;
if( current_line >= dialog.size )
current_line = 0;
wait 10;
}
}
wait_to_spawn_diner_defenders()
{
flag_wait( "player_on_roof" );
flag_waitopen( "player_on_roof" );
activate_trigger_with_targetname( "diner_enemy_defenders_trigger" );
}
setup_remote_missile_target_guy()
{
if( isdefined( self.script_noteworthy ) )
{
if( self.script_noteworthy == "paradrop_guy_left" )
return;
if( self.script_noteworthy == "paradrop_guy_right" )
return;
}
if( isdefined( self.ridingvehicle ) )
{
self endon( "death" );
self waittill( "jumpedout" );
}
self maps\_remotemissile::setup_remote_missile_target();
}
//save_when_btr_and_riders_are_dead()
//{
// flag_wait( "house_destroyer_dead" );
// if( flag( "house_destroyer_unloading" ) )
// flag_wait( "house_destroyer_riders_dead" );
//
// autosave_by_name( "save_when_btr_and_riders_are_dead" );
//}
get_friendlies_away_from_nates_destruction()
{
nates_roof_volume_south = getent( "nates_roof_volume_south", "targetname" );
destroyed_nates_inaccessable_volume = getent( "destroyed_nates_inaccessable_volume", "targetname" );
destroyed_nates_safe_volume = getent( "destroyed_nates_safe_volume", "targetname" );
destroyed_nates_safe_goal = getent( "raptor_in_nates_prep", "targetname" );
friendlies = getaiarray( "allies" );
foreach( friend in friendlies )
{
if( ( friend istouching( destroyed_nates_inaccessable_volume ) ) || ( friend istouching( nates_roof_volume_south ) ) )
{
friend.goalradius = 500;
friend setgoalpos( destroyed_nates_safe_goal.origin );
friend setgoalvolume( destroyed_nates_safe_volume );
friend.fixednode = false;
}
}
BadPlace_Brush( "destroyed_nates_inaccessable_volume", -1, destroyed_nates_inaccessable_volume, "allies", "axis" );
BadPlace_Brush( "nates_roof_volume_south", -1, nates_roof_volume_south, "allies", "axis" );
flag_wait ( "nates_bomb_incoming" );
BadPlace_Delete( "destroyed_nates_inaccessable_volume" );
BadPlace_Delete( "nates_roof_volume_south" );
}
kill_friendlies_on_roof()
{
level endon( "player_on_roof" );
roof_volume = getent( "roof_volume", "targetname" );
friendlies = getaiarray( "allies" );
foreach( friend in friendlies )
{
if( friend istouching( roof_volume ) )
{
if( isdefined( friend.magic_bullet_shield ) )
friend stop_magic_bullet_shield();
friend kill();
wait .5;
}
}
}
btr80_smash()
{
scripted_node = getent( "btr80_smash", "targetname" );
//scripted_node.origin = ( -1571.2, -3374.1, 2357.7 );
scripted_node.origin = ( 805.9, -1688.8, 2309.7 );
//s_angles[0] = 0;
//s_angles[1] = 149;
//s_angles[2] = 0;
//scripted_node.angles = s_angles;
scripted_node.angles = (0,149,0);
level.player waittill_in_range( scripted_node.origin, 1350 );
//iprintlnbold( "now" );
btr = spawn_anim_model( "btr_ground_smash" );
car = spawn_anim_model( "btr_squashedcar" );
btr playsound( "scn_invasion_btr_drop" );
scripted_node thread anim_single_solo( car, "btr_squashedcar" );
scripted_node thread anim_single_solo( btr, "btr_ground_smash" );
}
friendlies_shift_north()
{
north_side_nodes = getnodearray( "north_side_nodes", "targetname" );
nates_roof_volume_north = getent( "nates_roof_volume_north", "targetname" );
friendlies = getaiarray( "allies" );
level.raptor.goalheight = 80;
level.raptor.goalradius = 500;
level.raptor.fixednode = false;
level.raptor setgoalnode( north_side_nodes[0] );
level.raptor setgoalvolume( nates_roof_volume_north );
num = 1;
for( i = 0 ; i < friendlies.size ; i++ )
{
if( num >= north_side_nodes.size )
break;
if( !isalive( friendlies[i] ) )
{
continue;
}
else
{
friendlies[i].goalheight = 80;
friendlies[i].goalradius = 500;
friendlies[i].fixednode = false;
friendlies[i] setgoalnode( north_side_nodes[num] );
friendlies[i] setgoalvolume( nates_roof_volume_north );
num++;
wait 1;
}
}
}
spawn_nates_defenders()
{
flag_wait( "leaving_gas_station" );
//wait .05;//wait for flag
if( flag ( "nates_bomb_incoming" ) )
return;
nates_defenders = getentarray( "nates_defenders", "script_noteworthy" );
foreach( guy in nates_defenders )
guy spawn_ai();
}
spawn_nates_attackers_in_alley()
{
flag_wait( "spawn_nates_attackers_in_alley" );
alley_nates_attackers = getentarray( "alley_nates_attackers", "script_noteworthy" );
foreach( guy in alley_nates_attackers )
guy spawn_ai();
}
spawn_battle_when_in_uav()
{
//level endon ( "bmps_from_north_dead" );
//while( 1 )
//{
level waittill( "player_is_controlling_UAV" );
//wounded_carry_attackers_TC = getentarray( "wounded_carry_attackers_TC", "targetname" );
//array_thread( wounded_carry_attackers_TC, ::spawn_ai );
uav_ambient_battle = getentarray( "uav_ambient_battle", "targetname" );
array_thread( uav_ambient_battle, ::spawn_ai );
//bank_nates_attackers = getentarray( "bank_nates_attackers", "targetname" );
//array_thread( bank_nates_attackers, ::spawn_ai );
//burger_town_nates_attackers = getentarray( "burger_town_nates_attackers", "targetname" );
//array_thread( burger_town_nates_attackers, ::spawn_ai );
//wounded_carry_attackers_bus = getentarray( "wounded_carry_attackers_bus", "targetname" );
//array_thread( wounded_carry_attackers_bus, ::spawn_ai );
//}
}
convoy_targets( targets )
{
if( self.classname == "script_vehicle_hummer_minigun" )
{
//get the vehicle first, then...
turret = self.mgturret[0];
turret waittill( "turret_ready" ); // if you grab the vehicle right when it spawns, wait for this, otherwise don't (I will make this an ent flag when P4 unlocks)
mg_guy = turret getturretowner();
mg_guy.ignoreall = true; // this makes him not shoot when we run set_manual_target
turret thread animscripts\hummer_turret\common::set_manual_target( level.player, 1, 6 ); // 3 = minFireTime, 6 = maxFireTime
mg_guy.ignoreall = false; // now he'll shoot at enemies he sees again
}
else
{
while ( !flag( "player_at_convoy" ) )
{
targets = array_randomize( targets );
foreach( tgt in targets )
{
self setturrettargetvec( tgt.origin );
self waittill( "turret_on_target" );
self fireweapon();
wait ( randomfloatrange( .2, .6 ) );
}
}
}
}
dialog_shot_down_heli()
{
wait 3;
//Nice one Roach.
radio_dialogue( "inv_six_niceoneheli" );
}
dialog_come_to_convoy()
{
level endon ( "player_at_convoy" );
wait 10;
//The convoy's here! Everyone on me! We're getting the hell outta here! Let's go, let's go!!
radio_dialogue( "inv_six_convoyshere" );
wait 4;
//Ramirez! The convoy is just south of Burgertown, get your ass over here! Move!
radio_dialogue( "inv_six_southofbtown" );
wait 4;
//Ramirez! We gotta get back to the convoy! Let's go!
radio_dialogue( "inv_tco_backtoconvoy" );
while ( 1 )
{
wait 15;
//The convoy's here! Everyone on me! We're getting the hell outta here! Let's go, let's go!!
radio_dialogue( "inv_six_convoyshere" );
wait 15;
//Ramirez! The convoy is just south of Burgertown, get your ass over here! Move!
radio_dialogue( "inv_six_southofbtown" );
wait 15;
//Ramirez! We gotta get back to the convoy! Let's go!
radio_dialogue( "inv_tco_backtoconvoy" );
}
}
dialog_uav_the_infantry()
{
wait 8;
if( isdefined( level.player.is_controlling_UAV ) )
return;
level endon( "player_is_controlling_UAV" );
if( cointoss() )
{
//Ramirez, use the UAV on the infantry!
radio_dialogue( "inv_six_theinfantry" );
}
else
{
//Ramirez, use the UAV! We got incoming infantry!
radio_dialogue( "inv_six_theinfantry2" );
}
wait 5;
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone" ) );
}
dialog_first_attack_heli()
{
//INTRO
//Hunter Two-One this is Overlord. We got a visual on an enemy attack helicopter headed for your area, over.
radio_dialogue( "inv_hqr_enemyhelo" );
//Hunter Two-One, be advised, enemy helo approaching your sector. CAP is unavailable at this time, good luck, over.
//radio_dialogue( "inv_hqr_capunavail" );
//Solid copy Overlord. Ramirez! Take down that helicopter! Go!
radio_dialogue( "inv_six_takedown" );
thread dialog_get_stinger();
}
dialog_get_stinger()
{
level.attack_heli endon( "death" );
wait 3;
nates_dialog_current = 0;
nates_dialog = [];
//Ramirez! I saw a couple Stingers on the roof of Nate's!
nates_dialog[ nates_dialog.size ] = "inv_tco_roofofnates";
//Use 'em to take down that sonofabitch! Go! inv_tco_roofofnates2";
//Ramirez! There's Stingers on the roof of Nate's restaurant!
nates_dialog[ nates_dialog.size ] = "inv_tco_killthathelo";
//Use 'em to kill that helo! Go! Go! inv_tco_killthathelo2";
//Ramirez! Check the roof of Nate's restaurant! I saw some Stingers up there!
nates_dialog[ nates_dialog.size ] = "inv_six_checktheroof";
//Ramirez! There's some Stingers by the supply drop on the roof of Nate's!
nates_dialog[ nates_dialog.size ] = "inv_six_supplydroponroof";
diner_dialog_current = 0;
diner_dialog = [];
//Ramirez! I saw a Stinger missile in that diner to the west!
diner_dialog[ diner_dialog.size ] = "inv_tco_dispatchchopper";
//Use it to to dispatch that chopper! I'll cover you! Go! inv_tco_dispatchchopper2";
//Ramirez! There's a Stinger missile in that stockpile to the west!
diner_dialog[ diner_dialog.size ] = "inv_tco_insidediner";
//It's inside the diner! Move! I got ya covered! inv_tco_insidediner2";
//Ramirez! Next to the gas station to the west is a diner! Check there for a Stinger missile!
diner_dialog[ diner_dialog.size ] = "inv_tco_nexttostation";
//Ramirez! I saw a Stinger missile in the diner where we got the UAV control rig!
diner_dialog[ diner_dialog.size ] = "inv_tco_dineruav";
//stingers = getentarray( "stinger", "targetname" );
//closest_stinger = getClosest( level.player.origin, stingers );
while( 1 )
{
needs_stinger = true;
weapons = level.player GetWeaponsListAll();
foreach( weap in weapons )
if( weap == "stinger" )
needs_stinger = false;
if( !needs_stinger )
{
wait 3;
continue;
}
diner_stinger = getent( "diner", "script_noteworthy" );
if( isdefined( diner_stinger ) )
{
selected_line = diner_dialog[ diner_dialog_current ];
radio_dialogue( selected_line );
if( selected_line == "inv_tco_roofofnates" )
radio_dialogue( "inv_tco_roofofnates2" );
if( selected_line == "inv_tco_killthathelo" )
radio_dialogue( "inv_tco_killthathelo2" );
diner_dialog_current++;
if( diner_dialog_current >= diner_dialog.size )
diner_dialog_current = 0;
}
else
{
selected_line = nates_dialog[ nates_dialog_current ];
radio_dialogue( selected_line );
if( selected_line == "inv_tco_dispatchchopper" )
radio_dialogue( "inv_tco_dispatchchopper2" );
if( selected_line == "inv_tco_insidediner" )
radio_dialogue( "inv_tco_insidediner2" );
nates_dialog_current++;
if( nates_dialog_current >= nates_dialog.size )
nates_dialog_current = 0;
}
wait 50;
}
}
//dialog_second_get_stinger()
//{
// level.attack_heli endon( "death" );
// wait 3;
//
// if( level.first_stinger == "diner" )
// {
// //Ramirez! I saw some Stinger missiles in that diner to the west! Use them to to dispatch that chopper! I'll cover you! Go!
// radio_dialogue( "inv_tco_dispatchchopper" );
//
// wait 12;
//
// //Ramirez! There's Stinger missiles in that stockpile to the west, inside the diner! Move! I got ya covered!
// radio_dialogue( "inv_tco_insidediner" );
//
// wait 20;
//
// //Ramirez! I saw some Stinger missiles in that diner to the west! Use them to to dispatch that chopper! I'll cover you! Go!
// radio_dialogue( "inv_tco_dispatchchopper" );
// }
// else
// {
// //Ramirez! I saw a couple Stingers on the roof of Nate's! Use 'em to take down that sonofabitch! Go!
// radio_dialogue( "inv_tco_roofofnates" );
//
// wait 12;
//
// //Ramirez! There's Stingers on the roof of Nate's restaurant! Use 'em to kill that helo! Go! Go!
// radio_dialogue( "inv_tco_killthathelo" );
//
// wait 20;
//
// //Ramirez! I saw a couple Stingers on the roof of Nate's! Use 'em to take down that sonofabitch! Go!
// radio_dialogue( "inv_tco_roofofnates" );
// }
//}
dialog_destroyed_btr_with_uav()
{
level waittill( "bmp_died" );
if( isdefined( level.player.fired_hellfire_missile ) )
{
wait 3;
if( flag( "bmps_from_north_dead" ) )//both are dead
return;
//Good effect on target. That's a kill. One more to go.
radio_dialogue( "inv_six_onemore" );
}
}
dialog_second_attack_heli()
{
//SECOND
//Hunter Two-One, relay from Goliath One: you got an enemy helicopter loaded for bear, approaching your area, over.
radio_dialogue( "inv_hqr_relaygol1" );
//Eyes up!!! Enemy gunship comin' in hot!!!
radio_dialogue( "inv_tco_eyesup" );
//Roger Overlord, Hunter copies all. Ramirez, we've got another enemy helo, take it out!!
radio_dialogue( "inv_six_anotherhelo" );
thread dialog_get_stinger();
}
//dialog_attack_heli_nags()
//{
// dialog = [];
// //Ramirez, take out that helicopter before the convoy arrives!! Move!!
// dialog[dialog.size] = "inv_six_beforeconvoy";
//
// //Ramirez, find an anti-aircraft weapon and take out the gunship!!
// dialog[dialog.size] = "inv_six_antiaircraft";
//
// //Ramirez! Take out that gunship before the convoy arrives! Go! Go!
// dialog[dialog.size] = "inv_six_takegunship";
// start = 0;
//
// while( 1 )
// {
// wait 60;
// if( isalive( level.attack_heli ) )
// {
// radio_dialogue( dialog[start] );
// start++;
// if( start >= dialog.size )
// start = 0;
// }
// }
//}
fire_stinger_at_uav()
{
if( isdefined( level.uav_is_destroyed ) )
return;
// thread uav_forward();
level.uav maps\_vehicle::godoff();
level.uav.health = 400;
level waittill( "player_is_controlling_UAV" );
wait 2;
//enemies = getaiarray( "axis" );
//stinger_source = get_closest_to_player_view( enemies );
// if( !isdefined( stinger_source ) )
// continue;
thread dialog_missile_fired_at_stinger();
forward = AnglesToForward( level.uav.angles );
forwardfar = vector_multiply( forward, 10000 );
end = forwardfar + level.uav.origin;
attractor = Missile_CreateAttractorEnt( level.uav, 100000, 60000 );
newMissile = MagicBullet( "zippy_rockets", ( 497.8, -3564.4, 2346 ), end );
newMissile Missile_SetTargetEnt( level.uav );
old_org = level.uav.origin;
old_dist = 9999999999;
while ( IsDefined( newMissile ) )
{
if( !isalive( level.uav ) )
break;
dist = Distance( newMissile.origin, level.uav.origin );
if ( dist <= 200 )
break;
if( dist > ( old_dist + 100 ) )
break;
old_dist = dist;
old_org = level.uav.origin;
wait .05;
}
Missile_DeleteAttractor( attractor );
if( IsDefined( newMissile ) )
newMissile delete();
playfx( getfx( "uav_explosion" ), old_org );
level.uav_is_destroyed = true;
level.player maps\_remotemissile::remove_uav_weapon();
if( isdefined( level.uav ) )
level.uav delete();
level notify( "uav_destroyed" );
wait 2;
radio_dialogue_clear_stack();
//Be advised, the UAV is offline I repeat, the UAV is offline!! <Garble!>
radio_dialogue( "inv_tco_uavoffline" );
}
dialog_missile_fired_at_stinger()
{
wait 2;
radio_dialogue_clear_stack();
//<Garble!> Someone just fired a missile at the UAV!
radio_dialogue( "inv_tco_firedmissile" );
}
//uav_forward()
//{
// while( 1 )
// {
// forward = AnglesToForward( level.uav.angles );
// forwardfar = vector_multiply( forward, 10000 );
// end = forwardfar + level.uav.origin;
//
// maps\_debug::drawArrow( end, level.uav.angles );
// wait .05;
// }
//}
dialog_enemy_attack_heli()
{
//Hunter Two-One this is Overlord. We got a visual on an enemy attack helicopter headed for your area, over.
radio_dialogue( "inv_hqr_enemyhelo" );
//Hunter Two-One, relay from Goliath One: you got an enemy helicopter loaded for bear, approaching your area, over.
radio_dialogue( "inv_hqr_relaygol1" );
//Hunter Two-One, be advised, enemy helo approaching your sector. CAP is unavailable at this time, good luck, over.
radio_dialogue( "inv_hqr_capunavail" );
//Eyes up!!! Enemy gunship comin' in hot!!!
radio_dialogue( "inv_tco_eyesup" );
}
spawn_redshirts_during_BT_defend()
{
friendly_redshirts = getentarray( "friendly_redshirt", "script_noteworthy" );
foreach( thing in friendly_redshirts )
{
if( isai( thing ) )
{
if( isalive( thing ) )
{
thing thread keep_red_shirts_alive_until_close();
thing thread smart_roaming_barney();
}
}
else
{
if( isspawner( thing ) )
{
thing add_spawn_function( ::keep_red_shirts_alive_until_close );
thing add_spawn_function( ::smart_roaming_barney );
}
}
}
if( !isdefined( level.redshirts ) )
level.redshirts = [];
//final_goal = getent( "convoy_obj", "targetname" ).origin;
//previous_goal = final_goal;
level endon ( "time_to_goto_convoy" );
while( 1 )
{
//while( level.redshirts.size > 0 )
//{
// wait 1;
// new_array = [];
// foreach( redshirt in level.redshirts )
// {
// if( isalive( redshirt ) )
// new_array[new_array.size] = redshirt;
// }
// level.redshirts = new_array;
//}
wait 1;
//get goal
//stingers = getentarray( "stinger", "targetname" );
//goal = final_goal;
//if( ( isdefined( stingers ) ) && ( stingers.size > 0 ) )
//{
// if( stingers.size > 1 )
// goal = ( getfarthest( level.player.origin, stingers ) ).origin;
// else
// goal = stingers[0].origin;
//}
//else
//{
// goal = final_goal;
//}
redshirts_desired = 3;
level.redshirts = redshirts_respawn( redshirts_desired );
//foreach( redshirt in level.redshirts )
//{
//}
//assign new goal to all redshirts
//if( previous_goal != goal )
}
}
keep_red_shirts_alive_until_close()
{
self.ignored_by_attack_heli = true;
self thread magic_bullet_shield();
self waittill_entity_in_range( level.player, 600 );
self.ignored_by_attack_heli = undefined;
self thread stop_magic_bullet_shield();
}
smart_barney( end_flag, end_goal, end_volume )
{
self endon( "stop_barney" );
self endon( "death" );
self ClearGoalVolume();
self thread friendly_adjust_movement_speed();
self.goalheight = 80;
self.goalradius = 500;
self.useChokePoints = false;
//level.taco setgoalentity( level.player );
self.fixednode = false;
nates_roof_goal_volume = getent( "nates_roof_goal_volume", "targetname" );
BT_roof_goal_volume = getent( "BT_roof_goal_volume", "targetname" );
if( !isdefined( self.favoriteenemy ) )
{
goal_enemies = end_volume get_ai_touching_volume( "axis" );
if( goal_enemies.size )
self.favoriteenemy = goal_enemies[0];
}
while( !flag( end_flag ) )
{
if( flag( "player_on_burgertown_roof" ) )
{
self setgoalpos( BT_roof_goal_volume.origin );
self setgoalvolume( BT_roof_goal_volume );
}
else if( flag( "player_on_roof" ) )
{
self setgoalpos( nates_roof_goal_volume.origin );
self setgoalvolume( nates_roof_goal_volume );
}
else
{
self cleargoalvolume();
player = level.player.origin;
vec = VectorNormalize( end_goal - player );
forward = vector_multiply( vec, 400 );
goal = forward + player;
self setgoalpos( goal );
}
//check for nearby BMPs
wait 2;
self.favoriteenemy = undefined;
}
self notify( "stop_adjust_movement_speed" );
self.moveplaybackrate = 1.0;
self setgoalpos( end_goal );
self setgoalvolume( end_volume );
}
smart_roaming_barney()
{
self notify( "stop_barney" );
self endon( "stop_barney" );
self endon( "death" );
self ClearGoalVolume();
self thread friendly_adjust_movement_speed();
self.goalheight = 80;
self.useChokePoints = false;
if( !isdefined( self.big_goal ) )
self.goalradius = 500;
else
self.goalradius = 1000;
self.fixednode = false;
nates_roof_goal_volume = getent( "nates_roof_goal_volume", "targetname" );
BT_roof_goal_volume = getent( "BT_roof_goal_volume", "targetname" );
while( 1 )
{
if( flag( "player_on_burgertown_roof" ) )
{
self setgoalpos( BT_roof_goal_volume.origin );
self setgoalvolume( BT_roof_goal_volume );
}
else if( flag( "player_on_roof" ) )
{
self setgoalpos( nates_roof_goal_volume.origin );
self setgoalvolume( nates_roof_goal_volume );
}
else
{
self cleargoalvolume();
if( isdefined( level.obj_pos ) )
{
end_goal = level.obj_pos;
player = level.player.origin;
vec = VectorNormalize( end_goal - player );
forward = vector_multiply( vec, 400 );
my_origin = self.origin;
forward = (forward[0], forward[1], 0);//keeep z goal same as player position
goal = forward + player;
//goal = (goal[0], goal[1], my_origin[2] );//keep z goal the same as where you are
}
else
{
goal = level.player.origin;
}
self setgoalpos( goal );
}
wait 2;
}
self notify( "stop_adjust_movement_speed" );
self.moveplaybackrate = 1.0;
}
enemy_monitor()
{
if( !isdefined( level.num_of_enemy_forces_spawned ) )
level.num_of_enemy_forces_spawned = 0;
level.enemy_force[ 0 ] = "taco_enemies";
level.enemy_force[ 1 ] = "gas_station_enemies";
level.enemy_force[ 2 ] = "bank_enemies";
//level.enemy_force[ 3 ] = "spawners_exit";
//level.enemy_force[ 4 ] = "30_seconds_pause";
//level.enemy_force[ 5 ] = "40_seconds_pause";
//level.enemy_force[ 6 ] = "enemy_heli_attack";
level.dialog = [];
//Hunter Two-One this is Overlord Actual, we're seeing enemy reinforcements to your north, over.
level.dialog[ "bank_enemies" ][ 0 ] = "inv_hqr_enemynorth";
//Be advised Hunter Two-One, you got enemy infantry by that bank to the north, over.
level.dialog[ "bank_enemies" ][ 1 ] = "inv_hqr_banktonorth";
//Hunter Two-One, be advised, enemy foot-mobiles approaching north of your location, over.
level.dialog[ "bank_enemies" ][ 2 ] = "inv_hqr_footmobiles";
//Hunter Two-One, Overlord. Enemy foot-mobiles approaching you from the southeast, over.
level.dialog[ "taco_enemies" ][ 0 ] = "inv_hqr_southeast";
//Hunter Two-One, Goliath One has a visual on hostiles coming from the southeast, over.
level.dialog[ "taco_enemies" ][ 1 ] = "inv_hqr_visualse";
//Hunter Two-One, be advised, enemy foot-mobiles have been sighted near the taco joint, over.
level.dialog[ "taco_enemies" ][ 2 ] = "inv_hqr_tacojoint";
//Hunter Two-One, Hunter Four has a visual on hostiles near the Nova gas station, over.
level.dialog[ "gas_station_enemies" ][ 0 ] = "inv_hqr_novagasstation";
//Hunter Two-One, relay from Goliath Two, enemy reinforcements approaching from the west, over.
level.dialog[ "gas_station_enemies" ][ 1 ] = "inv_hqr_enemywest";
//Hunter Two-One, tangos approaching near the diner to the west, over.
level.dialog[ "gas_station_enemies" ][ 2 ] = "inv_hqr_dinerwest";
level.enemy_heli_attacking = false;
level.enemy_force = array_randomize( level.enemy_force );
level.selection = 0;
level.enemy_groups = getentarray( "enemy_groups", "targetname" );
//level.enemy_force[ 0 ] = "enemy_heli_attack";//TEMP DEBUG
while ( true )
{
enemies = getaiarray( "axis" );
total = enemies.size;
roaming = total;
println ( " total: " + total );
/*
for ( i = 0 ; i < enemies.size ; i++ )
if ( isdefined( enemies[ i ].script_noteworthy ) )
if ( enemies[ i ].script_noteworthy == "defender" )
roaming -- ;
*/
//println( " roaming/total: " + roaming + "/" + total );
//if ( ( level.enemy_heli_attacking ) && ( roaming < 1 ) )
// spawn_enemy_group();
//else
if ( roaming < 7 )
{
if( flag( "first_attack_heli_dead" ) )
{
level.num_of_enemy_forces_spawned++;
level notify( "enemy_group_spawning" );
println ( " level.num_of_enemy_forces_spawned: " + level.num_of_enemy_forces_spawned );
spawn_enemy_group();
wait 9;
flag_set( "second_attack_heli_spawned" );
thread autosave_by_name( "reinforcements" );
flag_wait( "second_attack_heli_dead" );
thread autosave_by_name( "reinforcements" );
return;
}
if( ( level.num_of_enemy_forces_spawned == 3 ) && !flag( "first_attack_heli_spawned" ) )
{
wait 12;
thread autosave_by_name( "reinforcements" );
flag_set( "first_attack_heli_spawned" );
flag_wait( "first_attack_heli_dead" );
wait 5;
continue;
}
if( level.num_of_enemy_forces_spawned >= 2 )
thread fire_stinger_at_uav();
level.num_of_enemy_forces_spawned++;
level notify( "enemy_group_spawning" );
println ( " level.num_of_enemy_forces_spawned: " + level.num_of_enemy_forces_spawned );
if( level.num_of_enemy_forces_spawned == 1 )
thread dialog_uav_the_infantry();
if( level.num_of_enemy_forces_spawned == 2 )
thread dialog_uav_the_infantry();
spawn_enemy_group();
}
wait 1;
}
}
spawn_enemy_group()
{
closest = getclosest( level.player.origin, level.enemy_groups );
if( closest.target == level.enemy_force[ level.selection ] )
level.selection++;
if ( level.selection >= level.enemy_force.size )
level.selection = 0;
selection = level.enemy_force[ level.selection ];
level.selection++ ;
if ( level.selection >= level.enemy_force.size )
level.selection = 0;
if( selection == "bank_enemies" )
level.obj_direction = "north";
if( selection == "gas_station_enemies" )
level.obj_direction = "west";
if( selection == "taco_enemies" )
level.obj_direction = "east";
wait 1;
thread autosave_by_name( "reinforcements" );
wait 3;
enemy_spawners = getentarray( selection, "targetname" );
for ( i = 0 ; i < enemy_spawners.size ; i++ )
{
enemy_spawners[ i ].count = 1;
guy = enemy_spawners[ i ] spawn_ai();
wait .1;
}
wait 1;// make sure the spawning is done before checking to see how many are spawned
//iprintlnbold ( dialog[ selection ][ randomint ( dialog[ selection ].size ) ] );
//iprintlnbold ( "Danger enemies coming from " + selection );
sound_selection = randomint( level.dialog[ selection ].size );
thread radio_dialogue( level.dialog[ selection ][ sound_selection ] );
wait 3;
if( !isdefined( level.uavTargetPos ) )
{
if( level.num_of_enemy_forces_spawned < 3 )
{
foreach( group in level.enemy_groups )
if( group.target == selection )
level.uavTargetPos = group.origin;
}
}
}
dialog_team_were_inside()
{
//Team, we're inside, we've got the President!
radio_dialogue( "inv_six_gotthepresident" );
//Friendly convoy is oscar mike.
radio_dialogue( "inv_six_friedlyconvoy" );
}
mission_fail_if_leaves_BT()
{
level endon( "convoy_is_here" );
while( 1 )
{
flag_waitopen ( "player_is_close_to_BT" );
thread mission_fail_if_leaves_BT_waiter();
flag_wait ( "player_is_close_to_BT" );
}
}
mission_fail_if_leaves_BT_waiter()
{
level endon( "convoy_is_here" );
level endon ( "player_is_close_to_BT" );
level notify( "warning_player_is_leaving_BT" );
wait 2;
level notify( "warning_player_is_leaving_BT" );
wait 2;
level notify( "warning_player_is_leaving_BT" );
wait 1;
setDvar( "ui_deadquote", &"INVASION_FAIL_ABANDONED" );
maps\_utility::missionFailedWrapper();
}
//dialog_stay_near_BT_nags()
//{
// while( 1 )
// {
// level waittill( "warning_player_is_leaving_BT" );
//
// //Stay with us Roach!
// thread radio_dialogue( "inv_six_staywithus" );
//
// level waittill( "warning_player_is_leaving_BT" );
//
// //Get over here!
// thread radio_dialogue( "inv_six_getoverhere" );
//
// level waittill( "warning_player_is_leaving_BT" );
//
// //Roach, on me! Regroup with the squad!
// thread radio_dialogue( "inv_six_roachonme" );
// }
//}
nates_locker_door_open()
{
nates_meat_locker_door = getent( "nates_meat_locker_door", "targetname" );
nates_meat_locker_door_model = getent( nates_meat_locker_door.target, "targetname" );
nates_meat_locker_door_model LinkTo( nates_meat_locker_door );
nates_meat_locker_door rotateyaw( -82, .1, 0, 0 );
nates_meat_locker_door connectpaths();
flag_wait( "player_on_roof" );
wait 3;
flag_wait( "player_on_roof" );
nates_meat_locker_door rotateyaw( 82, .1, 0, 0 );
nates_meat_locker_door disconnectpaths();
}
bt_locker_door_open()
{
BT_locker_door = getent( "BT_locker_door", "targetname" );
BT_locker_door rotateyaw( -172, .1, 0, 0 );
BT_locker_door connectpaths();
}
bt_locker_door_close()
{
wait 1;
flag_waitopen( "player_is_near_BT_locker_door" );
BT_locker_door = getent( "BT_locker_door", "targetname" );
BT_locker_door rotateyaw( 172, .1, 0, 0 );
BT_locker_door disconnectpaths();
//The door is shut - you guys keep Ivan out.
thread radio_dialogue( "inv_six_gotthepresident2" );
if( isalive( level.president ) )
{
if( isdefined( level.president.being_carried ) )
level.president waittill( "stop_putdown" );
level.president stop_magic_bullet_shield();
level.president delete();
}
level.raptor stop_magic_bullet_shield();
level.raptor delete();
}
keep_enemies_away()
{
vip_escort_bad_place1 = getent( "vip_escort_bad_place1", "targetname" );
vip_escort_bad_place2 = getent( "vip_escort_bad_place2", "targetname" );
vip_escort_bad_place3 = getent( "vip_escort_bad_place3", "targetname" );
//BadPlace_Brush( <name>, <duration>, <brush entity>, <team>, ... )
BadPlace_Brush( "vip_escort_bad_place1", -1, vip_escort_bad_place1, "axis" );
BadPlace_Brush( "vip_escort_bad_place2", -1, vip_escort_bad_place2, "axis" );
BadPlace_Brush( "vip_escort_bad_place3", -1, vip_escort_bad_place3, "axis" );
flag_wait ( "president_in_BT_meat_locker" );
BadPlace_Delete( "vip_escort_bad_place1" );
BadPlace_Delete( "vip_escort_bad_place2" );
BadPlace_Delete( "vip_escort_bad_place3" );
/*
node = getent( "wounded_carry_path", "targetname" );
BadPlace_Cylinder( "", 20, node.origin, 400, 300, "axis" );
while( isdefined ( node.target ) )
{
node = getent( node.target, "targetname" );
BadPlace_Cylinder( "", 20, node.origin, 400, 300, "axis" );
}
*/
//flag_wait ( "president_in_BT_meat_locker" );
//BadPlace_Delete( "raptor" );
}
dialog_go_to_yards()
{
wait 2;
flag_set( "follow_foley" );
//Seal Six-One: Team, this way! Let's go let's go!
level.raptor dialogue_queue( "inv_six_teamthisway" );
}
dialog_yards_story()
{
level endon( "dialog_bmp_hasnt_spotted_us" );
//Overlord this is Raptor Six requesting air support, over!
level.raptor dialogue_queue( "inv_six_reqairsupport" );
//Raptor Six, all air support is already engaged.
level.raptor dialogue_queue( "inv_hqr_engaged" );
//Additional ground support is enroute to your position but has encountered heavy resistance, over.
level.raptor dialogue_queue( "inv_hqr_engaged2" );
//Roger that Overlord.
level.raptor dialogue_queue( "inv_six_onfoot" );
//Be advised, we have encountered enemy armor and are proceeding on foot, over.
level.raptor dialogue_queue( "inv_six_onfoot2" );
//Overlord copies all. Good luck. Out.
level.raptor dialogue_queue( "inv_hqr_goodluck" );
wait 2;
//Sarge, did HQ just tell us to 'F' ourselves?
level.raptor dialogue_queue( "inv_tco_fourselves" );
//Pretty much, Corporal!
level.taco dialogue_queue( "inv_six_prettymuch" );
wait 4;
//Seal Six-One: I got a fix on the package. 300 meters east.<2E>
level.raptor dialogue_queue( "inv_six_300meast" );
//Taco: Roger that.
level.taco dialogue_queue( "inv_tco_rogerthat" );
//radio_dialogue( "inv_tco_rogerthat" );
}
//dialog_yards_objective()
//{
// //Seal Six-One: I got a fix on the package. 300 meters east.<2E>
// level.raptor dialogue_queue( level.raptor, "inv_six_300meast" );
//}
bomb_nates()
{
migs = spawn_vehicles_from_targetname_and_drive( "bomb_nates" );
//Seal Six-One: Enemy fast moverrrs!!! Take coverr!!!
thread radio_dialogue( "inv_six_fastmovers" );
wait 3.5;
remove_tvs();
exploder( 333 );
bomb_center = (257.2, -4669.1, 2381);
if( distance( level.player.origin, bomb_center ) < 500 )
level.player dodamage( ( level.player.health + 1000 ), bomb_center );
delaythread( 2, ::falling_debri_on_player );
//Earthquake( <scale>, <duration>, <source>, <radius> )
earthquake( .4, 3, level.player.origin, 8000 );
}
falling_debri_on_player()
{
player = getentarray( "player", "classname" )[ 0 ];
numLoops = 30;
for ( i = 0 ; i < numLoops ; i++ )
{
playfx( level._effect[ "falling_debris_player" ], player.origin + ( 0, 0, 500 ) );
wait( 0.25 );
}
}
remove_tvs()
{
// delete destructible TVs where the explosion takes place
destructible_tvs = getentarray( "exploder_tv_333", "script_noteworthy" );
foreach ( tvi, tv in destructible_tvs )
tv Delete();
}
enable_water_fx()
{
friendlies = getaiarray( "allies" );
// foreach( friend in friendlies )
// friend thread waterfx( "start_house_destroyer" );
// level.player thread waterfx( "start_house_destroyer" );
}
friendlies_try_to_get_off_roof()
{
wait 5;
off_roof_array = getnodearray( "off_roof", "targetname" );
pos = 0;
roof_volume = getent( "roof_volume", "targetname" );
friendlies = getaiarray( "allies" );
foreach( friend in friendlies )
{
if( friend == level.taco )
continue;
if( friend istouching( roof_volume ) )
{
friend setgoalnode( off_roof_array[ pos ] );
pos++;
friend.goalradius = 96;
friend.goalheight = 64;
}
}
}
setup_count_predator_infantry_kills()
{
self waittill( "death" );
wait .05;
if( !isdefined( level.enemies_killed ) )
level.enemies_killed = 1;
else
level.enemies_killed++;
}
dialog_handle_predator_infantry_kills()
{
dialog10 = [];
//Ten plus KIAs. Good hit. Good hit.
dialog10[dialog10.size] = "inv_hqr_tenpluskia";
//Oh man. Thats at least ten more confirms hunter two one. Good shooting.
dialog10[dialog10.size] = "inv_hqr_tenmoreconfirms";
//That looks to be at least five no, ten kills, hunter two one. Keep it up.
dialog10[dialog10.size] = "inv_hqr_fivenotenkills";
current_dialog10 = 0;
dialog5 = [];
//Five plus confirmed kills. Nice work. Hunter two one.
dialog5[dialog5.size] = "inv_hqr_fiveplus";
//Hunter two one, thats another five plus confirmed.
dialog5[dialog5.size] = "inv_hqr_another5plus";
//Good hit. More than five KIAs.
dialog5[dialog5.size] = "inv_hqr_morethanfive";
current_dialog5 = 0;
said_hes_down = false;
said_direct_hit = false;
level.enemies_killed = 0;
kills = 0;
while( 1 )
{
level waittill( "remote_missile_exploded" );
old_num = level.enemies_killed;
wait .1;
if( isdefined( level.uav_killstats[ "ai" ] ) )
kills = level.uav_killstats[ "ai" ];
if( kills == 0 )
{
continue;
}
wait .5;
if( isdefined( level.uav_is_destroyed ) )
return;
if( kills == 1 )
{
if( said_hes_down )
{
//You got 'em. Good kill.
radio_dialogue( "inv_hqr_yougotem" );
said_hes_down = false;
}
else
{
//He's down.
radio_dialogue( "inv_hqr_hesdown" );
said_hes_down = true;
}
continue;
}
if( kills >= 10 )
{
radio_dialogue( dialog10[current_dialog10] );
current_dialog10++;
if( current_dialog10 >= dialog10.size )
current_dialog10 = 0;
continue;
}
if( kills >= 5 )
{
radio_dialogue( dialog5[current_dialog5] );
current_dialog5++;
if( current_dialog5 >= dialog5.size )
current_dialog5 = 0;
continue;
}
else
{
if( said_direct_hit )
{
//Good kills hunter two one. Good kills.
radio_dialogue( "inv_hqr_goodkills" );
said_direct_hit = false;
}
else
{
//Thats a direct hit hunter two one, keep up the fire.
radio_dialogue( "inv_hqr_directhit" );
said_direct_hit = true;
}
continue;
}
}
}
//friendlies_stop_ignoring_when_flag( msg )
//{
// flag_wait( msg );
// friendlies = getaiarray( "allies" );
// foreach( friend in friendlies )
// friend.ignoreall = false;
//}
//
//friendlies_start_ignoreall()
//{
// friendlies = getaiarray( "allies" );
// foreach( friend in friendlies )
// friend.ignoreall = true;
//}
//activate_this_friendly()
//{
// self waittill( "trigger", other );
// other.fixednode = false;
// other.ignoreall = false;
// other.pathenemyfightdist = 4000;
// other.pathenemylookahead = 4000;
//
// wait 10;
//
// other.fixednode = true;
// other.ignoreall = true;
// other.pathenemyfightdist = 128;
// other.pathenemylookahead = 128;
//}
diner_backdoor_attack()
{
flag_wait( "player_in_diner" );
autosave_by_name( "at_diner" );
wait 2;
flag_wait( "player_in_diner" );
//Taco: Incoming!
level.taco dialogue_queue( "inv_tco_incoming" );
thread diner_back_door_open();
trigger = getent( "diner_enemy_counter_attack_trigger", "targetname" );
spawners = getentarray( trigger.target, "targetname" );
array_thread( spawners, ::add_spawn_function, ::setup_diner_backdoor_attackers );
activate_trigger_with_targetname( "diner_enemy_counter_attack_trigger" );
flag_set( "back_door_attack_start" );
//Taco: Back door!
level.taco dialogue_queue( "inv_tco_backdoor" );
}
diner_back_door_open()
{
diner_back_door = getent( "diner_back_door", "targetname" );
diner_back_door rotateyaw( 85, .3 );//counter clockwise
diner_back_door playsound( "diner_backdoor_slams_open" );
diner_back_door connectpaths();
}
dialog_smoke_to_north()
{
flag_clear( "smoke_screen_starting" );
flag_wait( "smoke_screen_starting" );
wait 4;
//They're layin' down a smokescreen to the north.
radio_dialogue( "inv_tco_smokescrnth" );
//Roger. Switch to thermal if you got it.
radio_dialogue( "inv_six_switchthermal" );
}
//dialog_come_cover_us_nag()
//{
// level endon( "player_in_pos_to_cover_vip" );
//
// //Taco, get on the roof of Burger Town and provide overwatch! Roach, regroup on me! We're gonna move the package!
// radio_dialogue( "inv_six_overwatch" );
//
// wait 25;
//
// while( 1 )
// {
// //Roach, Taco's got the roof covered! We need you back here! Move!
// radio_dialogue( "inv_six_backhere" );
//
// //Roger that! Moving! Roach - regroup with the squad, go!
// //radio_dialogue( "inv_tco_regroupsquad" );
//
// wait 25;
//
// //Roach, on me! Regroup with the squad!
// radio_dialogue( "inv_six_roachonme" );
//
// wait 25;
//
//
// //wait 15;
//
// /*
// //Seal Six-One: Taco, Roach! Clear the Burgertown roof asap!
// radio_dialogue( "inv_six_clearbtroof" );
//
// wait 15;
//
// //Roach, get on the roof of that Burger Town and get ready to cover us.
// radio_dialogue( "inv_six_readytocover" );
//
// wait 15;
//
// //Taco, Roach - cover us from the Burger Town roof. Go!
// radio_dialogue( "inv_six_coverusgo" );
//
// wait 15;
// */
// }
//}
prep_prez_for_run()
{
wells_in_nates_prep = getent( "wells_in_nates_prep", "targetname" );
level.wells setgoalpos( wells_in_nates_prep.origin );
raptor_prep = getent( "raptor_in_nates_prep", "targetname" );
level.raptor maps\_carry_ai::move_president_to_node( level.president, raptor_prep );
}
//raptor_can_die()
//{
// level.raptor thread stop_magic_bullet_shield();
// level.raptor.health = 1000;
// level.raptor thread mission_fail_if_prez_dies();
//
// flag_wait( "president_in_BT_meat_locker" );
//
// level.raptor thread magic_bullet_shield();
//
//}
//mission_fail_if_prez_dies()
//{
// level endon ( "president_in_BT_meat_locker" );
// while( 1 )
// {
// self waittill ( "damage" );
// if( self.health < 800 )
// break;
// }
//
// setDvar( "ui_deadquote", &"INVASION_FAIL_PREZ" );
// maps\_utility::missionFailedWrapper();
//}
wounded_carry_attackers()
{
//level.wounded_carry_attackers_dead = 0;
//set up all spawners
//wounded_carry_attackers = getentarray( "wounded_carry_attackers", "script_noteworthy" );
//array_thread( wounded_carry_attackers, ::add_spawn_function, ::wounded_carry_attackers_counter );
while( ( getaiarray( "axis" ) ).size > 4 )
wait 1;
wounded_carry_attackers_gas = getentarray( "wounded_carry_attackers_gas", "targetname" );
array_thread( wounded_carry_attackers_gas, ::spawn_ai );
while( ( getaiarray( "axis" ) ).size > 4 )
wait 1;
wounded_carry_attackers = getentarray( "wounded_carry_attackers_bus", "targetname" );
array_thread( wounded_carry_attackers, ::spawn_ai );
while( ( getaiarray( "axis" ) ).size > 4 )
wait 1;
//while( level.wounded_carry_attackers_dead < 6 )
// wait 1;
wounded_carry_attackers_TC = getentarray( "wounded_carry_attackers_TC", "targetname" );
array_thread( wounded_carry_attackers_TC, ::spawn_ai );
//while( level.wounded_carry_attackers_dead < 12 )
// wait 1;
//array_thread( wounded_carry_attackers_TC, ::spawn_ai );
}
wells_cover_path()
{
level.raptor endon ( "death" );
level.wells endon ( "death" );
wells_cover_path = getnode( "wells_cover_path", "script_noteworthy" );
level.wells SetGoalNode( wells_cover_path );
level.wells waittill( "goal" );
current_node = wells_cover_path;
while( 1 )
{
while( distance( level.wells.origin, level.raptor.origin ) > 300 )
wait .1;
if( !isdefined( current_node.target ) )
break;
new_goal = getnode( current_node.target, "targetname" );
level.wells SetGoalNode( new_goal );
current_node = new_goal;
level.wells waittill( "goal" );
}
}
dialog_keep_guys_off_me()
{
level endon( "president_in_BT_meat_locker" );
level.raptor endon( "death" );
//24 seconds
wait 6;
//Seal Six-One: Team, this way! Let's go let's go!
level.raptor dialogue_queue( "inv_six_teamthisway" );
wait 5;
//Seal Six-One: Keep these guys off me!
level.raptor dialogue_queue( "inv_six_keepoffme" );
wait 1;
//He's down!
level.taco dialogue_queue( "inv_tco_hesdown" );
wait 5;
//On me!
level.raptor dialogue_queue( "inv_six_onme" );
//Go go go!
level.raptor dialogue_queue( "inv_six_gogogo" );
wait 4;
//Stay with us Roach!
//level.raptor dialogue_queue( level.raptor, "inv_six_staywithus" );
}
dialog_regroup_at_nates_nag()
{
flag_wait( "bmp_north_left_dead" );
flag_wait( "bmp_north_mid_dead" );
diner_backdoor_fight_area = getent( "diner_backdoor_fight_area", "targetname" );
diner_backdoor_fight_area waittill_volume_dead();
//flag_wait( "diner_enemies_dead" );
if( flag( "leaving_diner" ) )
return;
level endon( "leaving_diner" );
//flag_wait( "diner_enemies_dead" );
while( 1 )
{
wait 2;
//Nice work team. Regroup over here.
radio_dialogue( "inv_six_regroup" );
wait 15;
//Taco, Roach, regroup in the restaurant.
radio_dialogue( "inv_six_regroupinrest" );
wait 15;
}
}
spawn_wells( start_ent)
{
if( isdefined( level.wells ) )
return;
spawner = getent( "wells", "script_noteworthy" );
level.wells = spawner spawn_ai();
if( isdefined( start_ent ) )
{
wait .5;
level.wells teleport_ent( start_ent );
level.wells setgoalpos( start_ent.origin );
}
}
spawn_president()
{
if( isdefined( level.president ) )
return;
president_spawner = getent( "president", "script_noteworthy" );
level.president = president_spawner spawn_ai();
}
setup_president()
{
self.has_no_ir = true;
level.president = self;
self thread magic_bullet_shield();
//president = getent( "president", "targetname" );
president_start_node = getent( "president_in_nates_meat_locker", "targetname" );
self thread maps\_carry_ai::setWounded( president_start_node );
flag_wait( "move_president_to_prep" );
president_start_node notify( "stop_wounded_idle" );
president_start_node = getent( "president_in_nates_prep", "targetname" );
self maps\_carry_ai::setWounded( president_start_node );
}
dialog_house_destroyer_unloading()
{
flag_wait( "house_destroyer_unloading" );
autosave_by_name( "unloading" );
//Seal Six-One: We're spotted! Roach - grab that RPG! Taco, Worm - cover him!
level.raptor dialogue_queue( "inv_six_grabrpg" );
}
//dialog_house_destroyer_destroyed()
//{
// self waittill( "death" );
// if( !isdefined( self ) )
// return;
// //Nice one Roach.
// level.raptor dialogue_queue( "inv_six_niceone" );
// //level.scr_radio[ "inv_six_niceone" ] = "inv_six_niceone";
//}
dialog_incoming_south_side()
{
//Taco: Incoming, north side!
radio_dialogue( "inv_tco_incomingnorth" );
//Taco: Contact to the north!
radio_dialogue( "inv_tco_contactnorth" );
}
dialog_incoming_northside()
{
//Taco: Incoming, south side!
radio_dialogue( "inv_tco_incomingsouth" );
//Taco: Contact to the south!
radio_dialogue( "inv_tco_contactsouth" );
}
dialog_foot_mobiles()
{
wait 12;
//Incoming from the south! Two dozen plus foot mobiles!
radio_dialogue("inv_six_2dozen" );
}
dialog_intro()
{
//The Russians have everything east of I-95! My sector's gonna fall within the hour!
radio_dialogue("inv_gm1_eastof95" );
//We've lost contact with Annapolis, where is the air support!
radio_dialogue("inv_gm2_airsupport" );
//Counterbattery fire is unable to engage! Enemy paratroopers have infiltrated their positions, we are cut off, I repeat we are cut off!
radio_dialogue("inv_gm3_cutoff" );
//Broken arrow broken arrow! Drop that thousand pounder on the red smoke, now!
radio_dialogue("inv_gm4_brokenarrow" );
//Interrogative, can your Harriers take out the interchange at I-495 and US-50 over?
radio_dialogue("inv_gm1_495and50" );
}
player_shooting_nates()
{
level endon( "player_on_roof" );
level endon( "crash_objective" );
flag_wait( "player_shooting_nates" );
//Seal Six-One: Check your fire check your fire! Friendlies at 10 o'clock in the purple building.
level.raptor thread dialogue_queue( "inv_six_purplebuilding" );
}
dialog_going_to_crash_site()
{
//On me!
radio_dialogue( "inv_six_onme" );
//Go go go!
radio_dialogue( "inv_six_gogogo" );
}
dialog_waiting_at_crash_site()
{
last_line = true;
level endon( "crash_objective" );
flag_wait( "raptor_at_crash_site" );
//Get over here!
//radio_dialogue( "inv_six_getoverhere" );
while( 1 )
{
wait 10;
if( last_line )
{
//Roach, we're at the crash site get over here.
radio_dialogue( "inv_six_crashsite" );
last_line = false;
}
else
{
//The crash site is on the north side of Nate's restaurant.
radio_dialogue( "inv_six_northofnates" );
last_line = true;
}
}
}
friendlies_duck_from_house_destroyer()
{
//pos = getvehiclenode( "get_down", "script_noteworthy" );
//pos waittill( "trigger" );
wait 1;
allies = getaiarray( "allies" );
for ( i = 0; i < allies.size; i++ )
{
allies[ i ] thread prone_till_flag( "bmp_out_of_sight" );
}
//pos = getvehiclenode( "bmp_out_of_sight", "script_noteworthy" );
//pos waittill( "trigger" );
wait 5;
flag_set( "bmp_out_of_sight" );
}
prone_till_flag( msg )
{
self endon( "death" );
wait( randomfloatrange( 0, .5 ) );
self allowedstances( "prone" );
old_goal = self.goalpos;
self anim_generic_custom_animmode( self, "gravity", "pronehide_dive" );
//self setgoalpos( self.origin );
//self.goalradius = 4;
flag_wait( msg );
wait( randomfloatrange( 0, .5 ) );
self allowedstances( "stand", "prone", "crouch" );
//self setgoalpos( old_goal );
}
btr_backed_off()
{
pos = getvehiclenode( "friendlies_move_to_alley", "script_noteworthy" );
pos waittill( "trigger" );
flag_set( "btr_backed_away" );
level.house_destroyer notify ( "backed_away" );
//if( !flag( "entered_alley" ) )
activate_trigger_with_targetname( "friendlies_hide_in_alley" );
}
hint_drone_steering()
{
while( !flag( "bmps_from_north_dead" ) )
{
level waittill( "player_fired_remote_missile" );
num = level.bmps_from_north_dead;
level waittill( "remote_missile_exploded" );
wait 1;
if( !( level.bmps_from_north_dead > num ) )
{
level.hint_steer_drone_time = gettime();
level.player thread display_hint( "hint_steer_drone" );
}
}
}
wait_till_time_to_destroy_BMPS()
{
level endon( "leaving_diner" );
//flag_wait( "diner_enemies_dead" );
//flag_wait( "diner_enemy_counter_attack_dead" );
diner_backdoor_fight_area = getent( "diner_backdoor_fight_area", "targetname" );
diner_backdoor_fight_area waittill_volume_dead();
wait 2;//dont nag immediately after picking up control rig
}
dialog_time_to_destroy_BMPS()
{
level endon ( "bmps_from_north_dead" );
wait_till_time_to_destroy_BMPS();
if( flag( "bmps_from_north_dead" ) )
return;
//if( ( flag( "bmp_north_left_dead" ) ) && ( flag( "bmp_north_mid_dead" ) ) )
// return;
//Roach, neutralize that enemy armor.
radio_dialogue( "inv_six_neutralizearmor" );
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone_vs_bmps" ) );
thread hint_drone_steering();
wait 25;
while( 1 )
{
//if( ( flag( "bmp_north_left_dead" ) ) && ( flag( "bmp_north_mid_dead" ) ) )
// return;
if( ( flag( "bmp_north_left_dead" ) ) || ( flag( "bmp_north_mid_dead" ) ) )
{
r = randomint( 3 );
if( r == 0 )
{
//There's still one BMP left!
dialog_time_to_destroy_BMPS_action( "inv_six_stillonebmp" );
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone_vs_bmps" ) );
}
else if( r == 1 )
{
//Waste that BMP now!
dialog_time_to_destroy_BMPS_action( "inv_six_wastethatbmpnow" );
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone_vs_bmps" ) );
}
else
{
//Roach, neutralize that enemy armor.
dialog_time_to_destroy_BMPS_action( "inv_six_neutralizearmor" );
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone_vs_bmps" ) );
}
}
else
{
if( cointoss() )
{
//Seal Six-One: Roach! Waste those BMPs! Now!
dialog_time_to_destroy_BMPS_action( "inv_six_wastebmpsnow" );
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone_vs_bmps" ) );
}
else
{
//Destroy those APCs!
dialog_time_to_destroy_BMPS_action( "inv_six_destroyapcs" );
// get_remotemissile_hint_string() Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
level.player thread display_hint( level.player get_remotemissile_hint_string( "hint_predator_drone_vs_bmps" ) );
}
}
wait 25;
}
}
dialog_time_to_destroy_BMPS_action( dialog )
{
if( flag( "nates_bomb_incoming" ) && !flag( "nates_bombed" ) )
return;
radio_dialogue( dialog );
}
dialog_dont_engage_that_APC()
{
level endon ( "crash_objective" );
pos = getvehiclenode( "dont_engage_dialog", "script_noteworthy" );
pos waittill( "trigger", apc );
apc waittill_player_lookat_for_time( .4, .99 );
//Seal Six-One: Team, don<6F>t engage that APC - our objective is the crash site.
level.raptor thread dialogue_queue( "inv_six_dontengageapc" );
}
dialog_two_bmps_from_north()
{
//Seal Six-One: Taco, be advised, two BMPs coming in from the north.
radio_dialogue( "inv_six_bmpsfromnorth" );
//Taco: Roger that.
radio_dialogue( "inv_tco_rogerthat" );
}
dialog_clear_burgertown_nag()
{
if( flag( "burger_town_lower_cleared" ) )
return;
level endon ( "burger_town_lower_cleared" );
wait 60;
while( 1 )
{
flag_waitopen( "player_in_burgertown" );
//Seal Six-One: Taco, Roach, we still got hostiles in the Burgertown, move it!
radio_dialogue( "inv_six_hostilesinbt" );
wait 20;
flag_waitopen( "player_in_burgertown" );
//Taco, Roach, we need to move ASAP! Clear that restaurant!
radio_dialogue( "inv_six_needtomove" );
wait 20;
flag_waitopen( "player_in_burgertown" );
//Team, what's the hold up? Secure that restaurant!
radio_dialogue( "inv_six_whatsholdup" );
wait 20;
}
}
// wait 45;
// if( !flag( "burger_town_lower_cleared" ) )
// {
// //Seal Six-One: Taco, Roach, we still got hostiles in the Burgertown, move it!
// radio_dialogue( "inv_six_hostilesinbt" );
// }
// else
// {
// if( !flag( "burger_town_roof_cleared" ) )
// {
// //Seal Six-One: Taco, Roach! Clear the Burgertown roof asap!
// radio_dialogue("inv_six_clearbtroof" );
// }
// else
// break;
// }
// }
//}
spawn_rpg_redshirts()
{
//if( flag( "president_in_BT_meat_locker" ) )
group = "friendly_redshirt_rpg_BT_spawners";
//else
// group = "friendly_redshirt_rpg_NATES_spawners";
redshirt_spawn_groups = getentarray( group, "targetname" );
respawns = 5;
while( respawns > 0 )
{
farthest_spawner = getfarthest( level.player.origin, redshirt_spawn_groups );
farthest_spawner.count = 1;
guy = farthest_spawner spawn_ai();
respawns--;
if( isalive( guy ) )
guy waittill( "death" );
else
wait 1;
}
}
setup_rpg_redshirts()
{
self.big_goal = true;
//self thread maps\_debug::drawOriginForever();
self thread smart_roaming_barney();
//SetThreatBias( "rpg_friendlies", "attack_helis", 10000 );
self.ignored_by_attack_heli = true;
self thread magic_bullet_shield();
self waittill_entity_in_range( level.player, 600 );
self.ignored_by_attack_heli = undefined;
self thread stop_magic_bullet_shield();
self endon( "death" );
while( !isalive( level.attack_heli ) )
wait 1;
self.combatmode = "no_cover";
self setentitytarget( level.attack_heli );
wait 1;
self.combatmode = "no_cover";
while( isalive( level.attack_heli ) )
wait 1;
//wait 5;
self clearentitytarget();
}
spawn_redshirts( desired_num )
{
if( !isdefined( desired_num ) )
desired_num = 3;
if( flag( "president_in_BT_meat_locker" ) )
group = "redshirt_spawn_group_BT";
else
group = "redshirt_spawn_group";
redshirt_spawn_groups = getstructarray( group, "targetname" );
farthest = getfarthest( level.player.origin, redshirt_spawn_groups );
spawners = getentarray( farthest.target, "targetname" );
println( " selected redshirt group: " + farthest.script_noteworthy );
//closest = getclosest( level.player.origin, redshirt_spawn_groups );
//redshirt_spawn_groups = array_remove( redshirt_spawn_groups, closest );
//second_closest = getclosest( level.player.origin, redshirt_spawn_groups );
//spawners = getentarray( second_closest.target, "targetname" );
guys = [];
foreach( spawner in spawners )
{
if( guys.size < desired_num )
{
spawner.count = 1;
guys[guys.size] = spawner spawn_ai();
}
}
return guys;
}
redshirts_respawn( redshirts_desired )
{
current_redshirts = [];
foreach( redshirt in level.redshirts )
{
if( isalive( redshirt ) )
current_redshirts[current_redshirts.size] = redshirt;
}
num_desired = redshirts_desired - current_redshirts.size;
new_guys = [];
if( num_desired > 0 )
new_guys = spawn_redshirts( num_desired );
guys = array_merge( current_redshirts, new_guys );
return guys;
}
taco_goes_to_BT()
{
flag_wait( "leaving_diner" );
BT_goal = getnode( "taco_in_BT", "script_noteworthy" );
BT_org = BT_goal.origin;
BT_goal_volume = getent( "BT_goal_volume", "targetname" );
//guy smart_barney( end_flag, end_goal, end_volume );
level.taco thread smart_barney( "player_in_burgertown", BT_org, BT_goal_volume );
redshirts_desired = 3;
level.redshirts = redshirts_respawn( redshirts_desired );
foreach( redshirt in level.redshirts )
redshirt thread smart_barney( "player_in_burgertown", BT_org, BT_goal_volume );
}
taco_goes_to_diner()
{
flag_waitopen( "player_on_roof" );
wait 2;
flag_waitopen( "player_inside_nates" );
diner_goal_volume = getent( "diner_goal_volume", "targetname" );
diner_org = getent( "predator_drone_control", "targetname" ).origin;
//guy smart_barney( end_flag, end_goal, end_volume );
level.taco thread smart_barney( "player_in_diner", diner_org, diner_goal_volume );
level.redshirts = spawn_redshirts( 3 );
foreach( redshirt in level.redshirts )
redshirt thread smart_barney( "player_in_diner", diner_org, diner_goal_volume );
}
smart_barney_on_raptor( end_goal, end_volume )
{
self endon( "stop_barney" );
self endon( "death" );
self ClearGoalVolume();
//self thread friendly_adjust_movement_speed();
self.goalheight = 80;
self.goalradius = 500;
//level.taco setgoalentity( level.player );
self.fixednode = false;
while( !flag( "president_in_BT_meat_locker" ) )
{
leader = level.raptor.origin;
vec = VectorNormalize( end_goal - leader );
forward = vector_multiply( vec, 400 );
goal = forward + leader;
self setgoalpos( goal );
//println(" player " + level.player.origin + " goal " + forward );
if( !isdefined( self.favoriteenemy ) )
{
self.favoriteenemy = get_closest_ai( self.origin, "axis" );
}
//check for nearby BMPs
wait .5;
}
//self notify( "stop_adjust_movement_speed" );
//self.moveplaybackrate = 1.0;
self setgoalpos( end_goal );
self setgoalvolume( end_volume );
}
friendly_adjust_movement_speed()
{
self notify( "stop_adjust_movement_speed" );
self endon( "death" );
self endon( "stop_adjust_movement_speed" );
for(;;)
{
wait randomfloatrange( .5, 1.5 );
while( friendly_should_speed_up() )
{
//iPrintLnBold( "friendlies speeding up" );
self.moveplaybackrate = 2.5;
wait 0.05;
}
self.moveplaybackrate = 1.0;
}
}
friendly_should_speed_up()
{
prof_begin( "friendly_movement_rate_math" );
if ( distanceSquared( self.origin, self.goalpos ) <= level.goodFriendlyDistanceFromPlayerSquared )
{
prof_end( "friendly_movement_rate_math" );
return false;
}
// check if AI is visible in player's FOV
if ( within_fov( level.player.origin, level.player getPlayerAngles(), self.origin, level.cosine[ "60" ] ) )
{
prof_end( "friendly_movement_rate_math" );
return false;
}
prof_end( "friendly_movement_rate_math" );
return true;
}
taco_goes_to_BT_roof()
{
level.taco.goalradius = 128;
level.taco.goalheight = 64;
level.taco SetGoalNode( getnode( "taco_on_BT_roof", "script_noteworthy" ) );
flag_wait( "president_in_BT_meat_locker" );
level.taco.goalradius = 1024;
}
//set_ammo()
//{
// if ( (self.classname == "weapon_fraggrenade") || (self.classname == "weapon_flash_grenade") )
// self ItemWeaponSetAmmo( 1, 0 );
// else
// self ItemWeaponSetAmmo( 999, 999 );
//}
//
//delete_if_obj_complete( obj_flag )
//{
// self endon ( "death" );
// flag_wait ( obj_flag );
// self delete();
//}
//
//ammoRespawnThink( flag, type, obj_flag )
//{
// wait .2; //timing
// weapon = self;
// ammoItemClass = weapon.classname;
// ammoItemOrigin = ( weapon.origin + (0,0,8) ); //wont spawn if inside something
// ammoItemAngles = weapon.angles;
// weapon set_ammo();
//
// obj_model = undefined;
// if ( isdefined ( weapon.target ) )
// {
// obj_model = getent ( weapon.target, "targetname" );
// obj_model.origin = weapon.origin;
// obj_model.angles = weapon.angles;
// }
//
// if ( type == "flash_grenade" )
// ammo_fraction_required = 1;
// else
// ammo_fraction_required = .2;
//
// if ( isdefined ( flag ) )
// {
// //self delete();
// self.origin = self.origin + (0, 0, -10000);
// if ( isdefined ( obj_model ) )
// obj_model hide();
//
// flag_wait ( flag );
//
// if ( isdefined ( obj_model ) )
// obj_model show();
// self.origin = self.origin + (0, 0, 10000);
// //weapon = spawn ( ammoItemClass, ammoItemOrigin );
// //weapon.angles = ammoItemAngles;
// weapon set_ammo();
// }
//
// //if ( isdefined ( obj_model ) )
// // obj_model hide();//temp hiding of glowing weapons
//
// if ( ( isdefined ( obj_model ) ) && ( isdefined ( obj_flag ) ) )
// obj_model thread delete_if_obj_complete( obj_flag );
//
// weapon waittill ( "trigger" );
//
// if ( isdefined ( obj_model ) )
// obj_model delete();
//
// while ( 1 )
// {
// wait 1;
//
// if ( ( level.player GetFractionMaxAmmo( type ) ) < ammo_fraction_required )
// {
// while ( distance( level.player.origin, ammoItemOrigin ) < 160 )
// wait 1;
//
// //if ( level.player pointInFov( ammoItemOrigin ) )
// // continue;
//
// weapon = spawn ( ammoItemClass, ammoItemOrigin, 1 ); //suspended bit flag
// //weapon = spawn ( "weapon_mp5", ammoItemOrigin );
// weapon.angles = ammoItemAngles;
// weapon set_ammo();
// wait .2;
// weapon.origin = ( ammoItemOrigin + (0,0,-8) );
// //weapon.angles = ammoItemAngles;
//
// //weapon waittill ( "trigger" );
// while ( isdefined ( weapon ) )
// wait 1;
// }
// }
//}
set_up_predator_drone_control_pickup()
{
predator_drone_control = getent( "predator_drone_control", "targetname" );
predator_drone_control show();
predator_drone_control glow();
predator_drone_control setCursorHint( "HINT_NOICON" );
// Press and hold ^3&&1^7 to pick up the turret.
predator_drone_control setHintString( &"INVASION_DRONE_PICKUP" );
predator_drone_control makeUsable();
predator_drone_control waittill( "trigger", player );
predator_drone_control playsound( "scn_invasion_controlrig_pickup" );
thread give_player_predator_drone();
predator_drone_control stopGlow();
}
give_player_predator_drone()
{
flag_set( "player_has_predator_drones" );
thread dialog_handle_predator_infantry_kills();
// level.player giveWeapon( "remote_missile_detonator" );
// level.player SetActionSlot( 4, "weapon", "remote_missile_detonator" );
level.player maps\_remotemissile::give_remotemissile_weapon( "remote_missile_detonator" );
predator_drone_control = getent( "predator_drone_control", "targetname" );
predator_drone_control hide();
predator_drone_control makeUnusable();
}
enemy_uses_smoke()
{
self waittill( "trigger" );
flag_set( "smoke_screen_starting" );
playfx( getfx( "smokescreen" ), self.origin );
self thread play_sound_in_space( "smokegrenade_explode_default" );
//MagicGrenade( "smoke_grenade_american", ( self.origin + (0,0,32) ), self.origin, .1 );
}
dialog_they_are_using_smoke()
{
flag_wait( "smoke_screen_starting" );
wait 7;
//They're using smoke to cover their advance!
radio_dialogue( "inv_tco_usingsmoke" );
wait 1;
//Seal Six-One: Team, this is raptor. Switch to thermal optics if you got 'em.
radio_dialogue( "inv_six_thermaloptics" );
}
dialog_pickup_drone_control_nag()
{
last_line = true;
flag_wait( "player_in_diner" );
flag_wait( "back_door_attack_start" );
wait 4;
//flag_wait( "diner_enemies_dead" );
//flag_wait( "diner_enemy_counter_attack_dead" );
diner_backdoor_fight_area = getent( "diner_backdoor_fight_area", "targetname" );
diner_backdoor_fight_area waittill_volume_dead();
wait 4;
while( !flag( "player_has_predator_drones" ) )
{
if( last_line )
{
//Taco: Roach - get the control rig for the UAV!
level.taco dialogue_queue( "inv_tco_controlrig" );
last_line = false;
}
else
{
//Taco: Roach - I got you covered! Pick up the control rig!
level.taco dialogue_queue( "inv_tco_pickupcontrolrig" );
last_line = true;
}
wait 15;
}
}
dialog_nates_bombing_reaction()
{
if( flag( "taco_goes_to_roof" ) )
return;
level endon( "taco_goes_to_roof" );
wait 3;
//Taco: raptor you still there?
radio_dialogue( "inv_tco_stillthere" );
wait 1;
//Seal Six-One: <cough> Taco, Roach, new plan.
radio_dialogue( "inv_six_newplan" );
//Seal Six-One: Secure the Burgertown and get on the <cough> roof.
radio_dialogue( "inv_six_secureburgertown" );
flag_set( "time_to_clear_burgertown" );
//Seal Six-One: Everyone on this net, listen up, we're moving the package asap.
radio_dialogue("inv_six_listenup" );
//Seal Six-One: We need to get the hell out of this building before those fast movers make another pass.
radio_dialogue( "inv_six_anotherpass" );
flag_set( "nates_bombed" );
}
dialog_hellfire_attack_reaction()
{
wait 4.5;
if( flag( "player_on_roof" ) )
{
//Worm: What the hell was that?!
radio_dialogue( "inv_wrm_whatwasthat" );
}
wait 1;
while( flag( "player_on_roof" ) )
{
r = randomint( 3 );
if( r == 0 )
{
//Seal Six-One: Roach! Get the <garble> off the roof!
radio_dialogue( "inv_six_offtheroof" );
}
if( r == 1 )
{
//Get off the roof!
radio_dialogue( "inv_six_getoffroof2" );
}
if( r == 2 )
{
//Get down from the roof now!
radio_dialogue( "inv_six_getoffroofnow" );
}
wait( randomfloatrange( 1, 2 ) );
}
}
hellfire_attacks()
{
thread hellfire_attacks_after_player_got_off_roof();
level endon ( "player_on_roof" );
level.player endon ( "death" );
targets = getentarray( "hellfire_attack_target", "targetname" );
//first in front
first_tgt = get_closest_to_player_view( targets );
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), first_tgt.origin );
wait ( randomfloatrange( 3, 5 ) );
//second closest to view but not the same, & diff
remainingtargets = array_remove( targets, first_tgt );
targetpos = get_closest_to_player_view( remainingtargets );
//targetpos = remainingtargets[ randomint( remainingtargets.size ) ];
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), targetpos.origin );
wait ( randomfloatrange( 3, 5 ) );
//third random & diff
remainingtargets = array_remove( targets, targetpos );
targetpos = remainingtargets[ randomint( remainingtargets.size ) ];
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), targetpos.origin );
wait ( randomfloatrange( 3, 5 ) );
//forth random & diff
remainingtargets = array_remove( targets, targetpos );
targetpos = remainingtargets[ randomint( remainingtargets.size ) ];
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), targetpos.origin );
wait ( randomfloatrange( 3, 5 ) );
//fifth kills player or hits roof
//if( !flag( "player_inside_nates" ) )
if( flag( "player_on_roof" ) )
{
rocket_target = level.player.origin;
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), rocket_target );
while( isdefined( rocket ) )
wait .05;
if( flag( "player_on_roof" ) )
level.player dodamage( ( level.player.health + 1000 ), rocket_target );
}
}
hellfire_attacks_after_player_got_off_roof()
{
wait .2;//timing issue with start point
flag_waitopen ( "player_on_roof" );
//sixth kill sentry
ceiling_dust = getentarray( "ceiling_dust", "targetname" );
if( sentry_is_on_roof() )
{
level waittill( "hellfire" );
rocket_target = level.obj_sentry.origin;
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), rocket_target );
array_thread( ceiling_dust, ::drop_dust );
while( isdefined( rocket ) )
wait .05;
level.obj_sentry notify ( "deleted" );
level.obj_sentry delete();
//level.obj_sentry dodamage( ( level.obj_sentry.health + 1000 ), rocket_target );
}
//remainder hit roof (add ceiling dust)
targets = getentarray( "hellfire_attack_target_roof", "targetname" );
while( 1 )
{
level waittill( "hellfire" );
targetpos = targets[ randomint( targets.size ) ];
target_org = targetpos.origin;
//println( " origin " + target_org );
rocket = MagicBullet( "remote_missile_not_player_invasion", ( level.uav.origin + (0,0,-128) ), target_org );
array_thread( ceiling_dust, ::drop_dust );
}
}
sentry_is_on_roof()
{
if( isdefined( level.player.placingSentry ) )
return false;
if( !isdefined( level.obj_sentry ) )
return false;
//if( level.obj_sentry.health <= 0 )
// return false;
roof_volume = getent( "roof_volume", "targetname" );
if( level.obj_sentry isTouching( roof_volume ) )
return true;
else
return false;
}
drop_dust()
{
wait 3;
playfx( getfx( "ceiling_dust" ), self.origin );
}
dialog_taco_sees_uav_op()
{
level notify( "hellfire" );
wait 4;
//I have a visual on an enemy UAV operator remote-piloting those missiles!
radio_dialogue( "inv_tco_uavop" );
//He's inside that diner to the west, over!
radio_dialogue( "inv_tco_uavop2" );
//Ramirez! Get over there, and kill that SOB!
radio_dialogue( "inv_six_killthatsob" );
//I'm sending part of the squad to help you out! Go!
radio_dialogue( "inv_six_killthatsob2" );
level notify( "hellfire" );
flag_set( "time_to_go_get_UAV_control" );
if( flag( "player_inside_nates" ) )
autosave_by_name( "go_to_diner2" );
wait 3;
level notify( "hellfire" );
wait 4;
//if( flag( "player_inside_nates" ) )
//{
// //I have a visual on an enemy UAV operator remote-piloting those missiles!
// radio_dialogue( "inv_tco_uavop" );
//
// //He's inside that diner to the west, over!
// radio_dialogue( "inv_tco_uavop2" );
//
// //Ramirez! Get over there, and kill that SOB!
// radio_dialogue( "inv_six_killthatsob" );
//
// //I'm sending part of the squad to help you out! Go!
// radio_dialogue( "inv_six_killthatsob2" );
//}
}
setup_gas_station_truck()
{
gas_station_truck = spawn_vehicle_from_targetname_and_drive( "gas_station_truck" );
wait 4;
//Seal Six-One: Incoming! Truck 12 o<>clock!
level.raptor dialogue_queue( "inv_six_truck12" );
}
//friendlies_peal_back()
//{
// wait 8;
// friendlies = get_force_color_guys( "allies", "r" );
// foreach( friend in friendlies )
// {
// if( isalive( friend ) )
// {
// friend set_force_color( "o" );
// wait 2;
// }
// }
//
// flag_wait( "juggernaut_dead" );
//
// foreach( friend in friendlies )
// {
// if( isalive( friend ) )
// {
// friend set_force_color( "r" );
// }
// }
//
// //He's down!
// radio_dialogue( "inv_tco_hesdown" );
//
// //Nice one guys.
// radio_dialogue( "inv_six_niceoneguys" );
//}
dialog_bmp_hasnt_spotted_us()
{
wait 2;
if( isalive( level.house_destroyer ) )
{
level notify( "dialog_bmp_hasnt_spotted_us" );
//Seal Six-One: That BMP hasn<73>t spotted us! Hang to the right and stay behind it!
level.raptor dialogue_queue( "inv_six_hangright" );
}
if( isalive( level.house_destroyer ) )
{
//Hang right and stay behind it!
level.raptor dialogue_queue( "inv_six_staybehind" );
}
}
spawn_tangled_chute_struggler()
{
flag_wait( "take_point" );
tangled_parachute_guy = getent( "tangled_parachute_guy", "script_noteworthy" );
guy = tangled_parachute_guy spawn_ai();
}
//dialog_take_point()
//{
// level endon ( "entered_alley" );
// level.house_destroyer waittill_either ( "death", "backed_away" );
//
// flag_wait( "take_point" );
//
// //Team the crashed heli at 12 o'clock is our objective.
// level.raptor dialogue_queue( "inv_six_ourobjective" );
//
// //Seal Six-One: Roach, take point - we're cuttin' to the right.
// level.raptor dialogue_queue( "inv_six_takepoint" );
//}
dialog_sentry_nags()
{
//level endon ( "sentry_in_position" );
flag_wait( "wells_intro_done" );
level endon ( "player_on_roof" );
wait 5;
while( ! flag( "player_on_roof" ) )
{
if( flag( "truck_guys_retreat" ) )
return;
if( cointoss() )
{
//Seal Six-One: Roach, use the ladder in the kitchen and get to the roof.
radio_dialogue( "inv_six_ladderinkitchen" );
}
else
{
//Seal Six-One: Roach this is raptor. Get to the roof, there's a maintenance ladder in the kitchen.
radio_dialogue( "inv_six_gettoroof" );
}
wait 15;
}
/*
while( ! flag( "sentry_in_position" ) )
{
//Seal Six-One: Roach, you on the roof yet? Get that sentry gun online and make sure its pointed south.
radio_dialogue( "inv_six_onroofyet" );
wait 15;
}
*/
}
taco_to_meat_locker()
{
meat_locker_taco = getnode( "meat_locker_taco", "script_noteworthy" );
level.taco disable_ai_color();
level.taco setgoalnode ( meat_locker_taco );
level.taco.goalradius = 16;
}
move_raptor_wells_and_worm()
{
//wells_inside = getnode( "wells_inside", "script_noteworthy" );
wells_inside = getnode( "wells_kitchen", "targetname" );
if( isalive( level.wells ) )
{
level.wells disable_ai_color();
level.wells setgoalnode ( wells_inside );
level.wells.goalradius = 64;
level.wells.fixednode = true;
//level.wells.goalradius = 190;
//level.wells.fixednode = false;
}
//wait 2;
//flag_wait( "wells_intro_done" );
//raptor_inside = getnode( "raptor_inside", "script_noteworthy" );
raptor_inside = getnode( "raptor_kitchen", "targetname" );
level.raptor disable_ai_color();
level.raptor setgoalnode ( raptor_inside );
level.raptor.goalradius = 64;
level.raptor.fixednode = true;
//level.raptor.goalradius = 190;
//level.raptor.fixednode = false;
//wait 2;
if( isalive( level.worm ) )
{
worm_inside = getnode( "worm_inside", "script_noteworthy" );
level.worm disable_ai_color();
level.worm setgoalnode ( worm_inside );
level.worm.goalradius = 190;
level.worm.fixednode = false;
}
}
should_break_get_smoke()
{
clipCount = level.player GetWeaponAmmoStock( "smoke_grenade_american" );
if( clipCount < 1 )
return false;
else
return true;
}
should_break_throw_smoke()
{
if( flag( "threw_smoke" ) )
return true;
else
return false;
}
//should_break_get_semtex()
//{
// clipCount = level.player GetWeaponAmmoStock( "semtex_grenade" );
// if( clipCount < 1 )
// return false;
// else
// return true;
//}
//
//should_break_throw_semtex()
//{
// if( flag( "threw_semtex" ) )
// return true;
// else
// return false;
//}
// level.player thread display_hint( "hint_throw_semtex" );
// level.player thread display_hint( "hint_get_semtex" );
//watch_for_semtex_throws()
dialog_semtex_that_bmp()
{
level endon( "btr_smoke_starting" );
//level.house_destroyer endon( "death" );
level endon ( "entered_alley" );
dialog = [];
//We're spotted! Roach - grab those Semtex explosives! Taco, Worm - cover him!
//dialog[dialog.size] = "inv_six_grabrpg";
//Roach - there<72>s explosives by that supply drop! Move!
dialog[dialog.size] = "inv_six_rpgsupplydrop";
//Pick up the explosives by the supply drop!
dialog[dialog.size] = "inv_six_pickup";
//Roach get more explosives from the supply drop!
dialog[dialog.size] = "inv_six_getmore";
dialog_start = 0;
throw_dialog = [];
//Ramirez, throw some Semtex on that BMP!
throw_dialog[throw_dialog.size] = "inv_six_throwsemtex";
//Ramirez, get some Semtex on that BMP!
throw_dialog[throw_dialog.size] = "inv_six_getsemtex";
//Ramirez, destroy that BMP with Semtex!
throw_dialog[throw_dialog.size] = "inv_six_destroy";
throw_dialog_start = 0;
flag_wait( "house_destroyer_unloading" );
wait 4;
level.house_destroyer endon ( "backed_away" );
while( 1 )
{
//if( distance ( level.house_destroyer.origin, level.player.origin ) > 2000 )
// break;
//player_has_semtex = level.player GetWeaponAmmoStock( "semtex_grenade" );
player_has_semtex = level.player GetWeaponAmmoStock( "smoke_grenade_american" );
if( player_has_semtex )
{
if( !flag( "threw_smoke" ) )
{
thread watch_for_smoke_throws();
level.raptor dialogue_queue( throw_dialog[throw_dialog_start] );
throw_dialog_start++;
if( throw_dialog_start >= throw_dialog.size )
throw_dialog_start = 0;
level.player thread display_hint_timeout( "hint_throw_smoke", 5 );
}
}
else
{
level.player thread display_hint_timeout( "hint_get_smoke", 5 );
level.raptor dialogue_queue( dialog[dialog_start] );
dialog_start++;
if( dialog_start >= dialog.size )
dialog_start = 0;
}
wait 10;
}
}
watch_for_smoke_throws()
{
flag_clear( "threw_smoke" );
while( 1 )
{
level.player waittill ( "grenade_fire", grenade, weaponName );
if ( weaponname == "smoke_grenade_american" )
{
break;
}
}
flag_set( "threw_smoke" );
wait 5;
flag_clear( "threw_smoke" );
}
wait_till_btr_smoked()
{
level endon( "btr_smoke_starting" );
thread hint_if_smoke_too_far();
smoke_position = getvehiclenode( "house_destroyer_backwards_path", "targetname" ).origin;
while ( 1 )
{
level.player waittill ( "grenade_fire", grenade, weaponName );
if ( weaponname == "smoke_grenade_american" )
{
tracker = spawn ("script_origin", (0,0,0));
grenade thread track_grenade_origin( tracker );
grenade thread flag_if_close_to_btr( tracker, smoke_position );
}
}
}
track_grenade_origin( tracker )
{
level endon ( "btr_smoked" );
self endon ( "death" );
while ( 1 )
{
tracker.origin = self.origin;
wait .05;
}
}
flag_if_close_to_btr( tracker, smoke_position )
{
level endon ( "btr_smoke_starting" );
self waittill( "death" );
if( distance( tracker.origin, smoke_position ) < 400 )
thread dialog_goto_alley();
else
level notify( "btr_smoke_too_far" );
}
hint_if_smoke_too_far()
{
if( flag( "house_destroyer_moving_back" ) )
return;
level endon ( "house_destroyer_moving_back" );
//while( !flag( "btr_smoke_starting" ) )
//{
level waittill( "btr_smoke_too_far" );
if( !flag( "btr_smoke_starting" ) )
display_hint_timeout( "hint_smoke_too_far", 5 );
// wait 10;
//}
}
should_break_smoke_too_far()
{
if( flag( "btr_smoke_starting" ) )
return true;
else
return false;
}
dialog_goto_alley()
{
flag_set( "btr_smoke_starting" );
wait 10;
autosave_by_name( "btr_smoked" );
flag_set( "btr_smoked" );
activate_trigger_with_targetname( "friendlies_hide_in_alley" );
//Use the cover of the smoke to run past the BTR into the alley!
level.raptor dialogue_queue( "inv_six_coverofsmoke" );
wait 5;
if( flag( "entered_alley" ) )
return;
//Ramirez! Come to alley!
level.raptor dialogue_queue( "inv_six_cometoalley" );
}
diner_window_traverses()
{
diner_window_traverses = getent( "diner_window_traverses", "targetname" );
if( !isdefined( diner_window_traverses ) )
return;
diner_window_traverses disconnectpaths();
flag_wait( "crash_objective" );
diner_window_traverses MoveZ( -1000, .1, 0, 0 );
diner_window_traverses connectpaths();
}
truck_group_enemies_count_deaths()
{
level.truck_group_enemies_count_lives++;
level.truck_group_enemies_alive++;
self waittill( "death" );
level.truck_group_enemies_count_deaths++;
level.truck_group_enemies_alive--;
level notify ( "truck_guy_died" );
}
truck_group_enemies_setup_retreat()
{
self endon ( "death" );
flag_wait( "truck_guys_retreat" );
if( isdefined( self.target ) )
self setgoalpos( getent( self.target, "targetname" ).origin );
else
self setgoalpos( getent( "truck_guy_retreat_goal", "targetname" ).origin );
self.goalradius = 32;
self waittill( "goal" );
while( self cansee ( level.player ) )
wait 1;
self kill();
}
bank_enemies_setup_retreat()
{
self endon ( "death" );
flag_wait( "bank_guys_retreat" );
self setgoalpos( getent( "north_trucks_retreat_point", "targetname" ).origin );
self.ignoreme = true;
self.goalradius = 32;
self waittill( "goal" );
while( self cansee ( level.player ) )
wait 1;
self kill();
}
//waittill_sentry_moved()
//{
// self thread mission_fail_if_sentry_dies();
//
// south_side_of_roof = getent( "south_side_of_roof", "targetname" );
// while( 1 )
// {
// if( self isTouching( south_side_of_roof ) )
// break;
// wait .5;
// }
//
// flag_set ( "sentry_in_position" );
//}
mission_fail_if_sentry_dies()
{
level endon ( "sentry_in_position" );
self waittill ( "death" );
setDvar( "ui_deadquote", &"INVASION_FAIL_SENTRY" );
maps\_utility::missionFailedWrapper();
}
mig_fly_overs()
{
migs = spawn_vehicles_from_targetname_and_drive( "first_fast_movers" );
wait 7;
//Seal Six-One: Team be advised, enemy has close air support operating in our AO.
//level.raptor dialogue_queue( "inv_six_closeairsupport" );
//wait 3;
flag_wait( "wells_intro_done" );
migs = spawn_vehicles_from_targetname_and_drive( "first_fast_movers" );
}
one_bmp_from_south()
{
bmp = thread spawn_vehicle_from_targetname_and_drive( "crash_objective_bmp" );
bmp thread turret_spotlight();
bmp thread maps\_vehicle::damage_hints();
bmp endon ( "death" );
current = getent( "west_side", "targetname" );
bmp SetTurretTargetVec( current.origin );
pos = getvehiclenode( "first_volley_at_nates", "script_noteworthy" );
pos waittill( "trigger" );
bmp bmp_fires_first_volley_at_nates();
pos = getvehiclenode( "crash_obj_bmp_in_pos", "script_noteworthy" );
pos waittill( "trigger" );
bmp vehicle_setspeed( 0, 15, 15 );
bmp bmp_fires_at_nates();
//array_thread( getvehiclenodearray( "new_target", "script_noteworthy" ), ::new_target_think );
bmp vehicle_setspeed( 10, 3, 3 );
bmp thread bmp_fires_more_volleys_at_nates();
bmp waittill( "reached_end_node" );
//end_if_cant_see, no_misses
bmp thread bmp_turret_attack_player( false, false );
flag_wait( "crash_objective" );
bmp delete();
}
two_bmps_from_north()
{
level.bmp_north_mid = spawn_vehicle_from_targetname_and_drive( "nate_attacker_mid" );
level.bmp_north_left = spawn_vehicle_from_targetname_and_drive( "nate_attacker_left" );
array_thread( getvehiclenodearray( "new_target", "script_noteworthy" ), ::new_target_think );
bmps = [];
bmps[ bmps.size ] = level.bmp_north_mid;
bmps[ bmps.size ] = level.bmp_north_left;
thread aim_predator_drone_at_btrs();
thread dialog_bmp_spotted_you();
thread dialog_destroyed_btr_with_uav();
//thread dialog_bmp_lost_you();
foreach( vehicle in bmps )
{
vehicle thread watch_for_player();
vehicle thread maps\_remotemissile::setup_remote_missile_target();
vehicle thread save_on_death();
vehicle thread ent_flag_init( "spotted_player" );
vehicle thread turret_spotlight();
vehicle thread maps\_vehicle::damage_hints();
}
//bmps[ 0 ] thread dialog_bmp_lost_you( bmps[ 1 ] );//one thread for both
//bmps[ 1 ] thread dialog_bmp_lost_you( bmps[ 0 ] );
return bmps;
}
aim_predator_drone_at_btrs()
{
while( 1 )
{
level waittill( "starting_predator_drone_control" );
bmps = [];
if( isalive( level.bmp_north_mid ) )
bmps[ bmps.size ] = level.bmp_north_mid;
if( isalive( level.bmp_north_left ) )
bmps[ bmps.size ] = level.bmp_north_left;
if( bmps.size == 0 )
{
level.uavTargetEnt = undefined;
return;
}
if( bmps.size > 1 )
level.uavTargetEnt = ( get_closest_to_player_view( bmps ) );
else
level.uavTargetEnt = bmps[0];
}
}
save_on_death()
{
self waittill( "death" );
//level.cansave = undefined;
if( self ent_flag( "spotted_player" ) )
flag_clear ("bmp_has_spotted_player" );
//thread autosave_by_name( "go_to_diner" );
level notify( "bmp_died" );
level.bmps_from_north_dead++;
}
dialog_bmp_spotted_you()
{
level endon ( "player_has_predator_drones" );
num = randomint( 3 );
while( 1 )
{
flag_wait ("bmp_has_spotted_player" );
//self ent_flag_wait( "spotted_player" );
switch( num )
{
case 0:
//Roach take cover! That BMP's spotted you!
dialog_bmp_spotted_you_action( "inv_six_bmpspottedyou" );
break;
case 1:
//Roach take cover! One of the BMPs has a visual on you!
dialog_bmp_spotted_you_action( "inv_six_bmphasavisual" );
break;
case 2:
//Get behind something solid! That BMP's got you in his sights!
dialog_bmp_spotted_you_action( "inv_six_behindsolid" );
break;
}
num++;
if( num > 2 )
num = 0;
wait 10;
}
}
dialog_bmp_spotted_you_action( dialog )
{
if( flag( "player_in_diner" ) )
return;
if( flag( "player_in_burgertown" ) )
return;
if( flag( "player_on_burgertown_roof" ) )
return;
radio_dialogue( dialog );
}
//save_halfway_to_diner( bmps )
//{
// flag_wait( "player_halfway_to_diner" );
//
// if(
// ( !bmps[1] ent_flag( "spotted_player" ) || !isalive( bmps[1] ) )
// && ( !bmps[0] ent_flag( "spotted_player" ) || !isalive( bmps[0] ) )
// )
// {
// autosave_by_name( "halfway_to_diner" );
// return;
// }
//
// if( bmps[0] ent_flag( "spotted_player" ) && isalive( bmps[0] ) )
// {
// bmps[0] add_wait( ::ent_flag_wait, "spotted_player" );
// bmps[0] add_endon( "death" );
// do_wait_any();
//
// if( !bmps[1] ent_flag( "spotted_player" ) || !isalive( bmps[1] ) )
// {
// autosave_by_name( "halfway_to_diner" );
// return;
// }
// }
//
//
// if( bmps[1] ent_flag( "spotted_player" ) && isalive( bmps[1] ) )
// {
// bmps[1] add_wait( ::ent_flag_wait, "spotted_player" );
// bmps[1] add_endon( "death" );
// do_wait_any();
//
// if( !bmps[0] ent_flag( "spotted_player" ) || !isalive( bmps[0] ) )
// {
// autosave_by_name( "halfway_to_diner" );
// return;
// }
// }
//}
dialog_bmp_lost_you()
{
level endon ( "player_has_predator_drones" );
level.player endon( "death" );
min_time_between = 10;//was 5
while( 1 )
{
flag_wait ("bmp_has_spotted_player" );
dialog_on_clear( "inv_six_bmplostyou" );
wait min_time_between;
flag_wait ("bmp_has_spotted_player" );
dialog_on_clear( "inv_six_bmplostyoumove" );
wait min_time_between;
flag_wait ("bmp_has_spotted_player" );
dialog_on_clear( "inv_six_bmplostyougo" );
wait min_time_between;
}
}
dialog_on_clear( dialog )
{
level endon( "bmp_died" );
flag_waitopen ("bmp_has_spotted_player" );
wait 4;
flag_waitopen ("bmp_has_spotted_player" );
radio_dialogue( dialog );
}
watch_for_player()
{
self endon( "death" );
self.turret_busy = false;
while( 1 )
{
wait .05;
if( flag ( "player_inside_nates" ) )
continue;
if( flag ( "player_in_diner" ) )
continue;
if( flag ("bmp_has_spotted_player" ) )
continue;
if( distance( self.origin, level.player.origin ) > 2400 )
continue;
if( distance( self.origin, level.player.origin ) < level.min_btr_fighting_range )
continue;
tag_flash_angles = self getTagAngles( "tag_flash" );
if( !within_fov( self.origin, tag_flash_angles, level.player.origin, level.cosine[ "25" ] ) )
continue;
if( !can_see_player( level.player ) )
continue;
//thread draw_line_for_time( self.origin, level.player.origin, 1, 0, 0, 1 );
flag_set ("bmp_has_spotted_player" );//level flag for both btrs
self notify( "new_target" );//clears ambient target shooting
self.turret_busy = true;
self ent_flag_set( "spotted_player" );
//self Vehicle_SetSpeed( 0, 10 );
//saw player, now miss for 2 bursts
miss_player( level.player );
wait( randomfloatrange( 0.8, 2.4 ) );
miss_player( level.player );
wait( randomfloatrange( 0.8, 2.4 ) );
//if player is still exposed then hit him
while ( can_see_player( level.player ) )
{
fire_at_player( level.player );
wait( randomfloatrange( 2, 3 ) );
}
self clearturrettarget();
self.turret_busy = false;
self ent_flag_clear( "spotted_player" );
//self Vehicle_SetSpeed( 10, 1 );
flag_clear ("bmp_has_spotted_player" );//level flag for both btrs
}
}
new_target_think()
{
level endon( "bmps_from_north_dead" );
targets = getentarray( self.script_linkto, "script_linkname" );
while( 1 )
{
//self waittillmatch( "trigger", vehicle );
self waittill( "trigger", vehicle );
if( !isalive( vehicle ) )
return;
if( vehicle.turret_busy )
continue;
vehicle notify( "new_target" );
vehicle setturrettargetent( targets[0] );
thread btr_fire_at_targets( vehicle );
}
//vehicle clearturrettarget();
}
btr_fire_at_targets( vehicle )
{
vehicle endon( "new_target" );
//vehicle endon( "unload" );
vehicle endon( "death" );
vehicle waittill( "turret_on_target" );
while( 1 )
{
s = randomintrange( 4, 6 );
for ( j = 0; j < s; j++ )
{
vehicle fireWeapon();
wait .2;
}
wait( randomfloatrange( 1, 2 ) );
}
}
/*
bmp_target_think()
{
while( 1 )
{
//targets = get_array_of_closest( org, array, excluders, max, maxdist, mindist )
if( level.bmp_targets.size < 1 )
break;
bmp = level.bmps [ randomint( level.bmps.size ) ];
turret_angle = bmp getTagAngles( "tag_flash" );
vec = anglestoforward( turret_angle );
vec *= 100;
pos = vec + bmp.origin;
target = get_highest_dot( bmp.origin, pos, level.bmp_targets );
//closest_index = get_closest_index( bmp.origin, level.bmp_targets, undefined );
bmp setturrettargetent( target );
level.bmp_targets = array_remove( level.bmp_targets, target );
//level.bmp_targets = array_remove_index( level.bmp_targets, closest_index );
bmp waittill( "turret_on_target" );
//wait( randomfloatrange( 1, 2 ) );
s = randomintrange( 4, 6 );
for ( j = 0; j < s; j++ )
{
bmp fireWeapon();
wait .2;
}
bmp clearturrettarget();
}
}
*/
rush_restaurant_enemies_setup()
{
self endon( "death" );
nates_restaurant_goal = getent( "nates_restaurant_goal", "targetname" );
self ClearGoalVolume();
self.goalheight = 100;//was 800
self enable_danger_react( 5 );
self setgoalpos ( nates_restaurant_goal.origin );
self.goalradius = 4000;
self.aggressivemode = true;
flag_wait( "truck_guys_retreat" );
self setgoalpos( getent( "truck_guy_retreat_goal", "targetname" ).origin );
self.goalradius = 32;
self waittill( "goal" );
while( self cansee ( level.player ) )
wait 1;
self kill();
}
truck_group_enemies_setup()
{
self waittill( "jumpedout" );
level endon( "truck_guys_retreat" );
self endon( "death" );
nates_restaurant_goal = getent( "nates_restaurant_goal", "targetname" );
self.goalheight = 100;//was 800
self enable_danger_react( 5 );
if( randomint( 3 ) > 0 )
{
self setgoalpos ( nates_restaurant_goal.origin );
self.goalradius = nates_restaurant_goal.radius;
cover_time = randomintrange( 1, 22 );
wait cover_time;
self setgoalpos ( self.origin );
self.goalradius = 900;
wait randomfloatrange( 2, 4 );
self setgoalpos ( nates_restaurant_goal.origin );
self.goalradius = nates_restaurant_goal.radius;
}
else
{
self setgoalpos ( nates_restaurant_goal.origin );
self.goalradius = 4000;
//self.aggressivemode = true;//too easy
}
}
BT_nates_attackers_setup()
{
while( 1 )
{
self waittill( "enemy" );
if( isplayer( self.enemy ) )
{
self.goalradius = 3000;
break;
}
}
}
alley_nates_attackers_setup()
{
while( 1 )
{
self waittill( "enemy" );
if( isplayer( self.enemy ) )
{
self.goalradius = 3000;
break;
}
}
}
setup_hunter_enemies()
{
goals = getentarray( "closest_goal_radius", "targetname" );
level.current_goal = getclosest( level.player.origin, goals );
level.hunter_enemies = [];
current_enemies = getaiarray( "axis" );
array_thread( current_enemies, ::create_hunter_enemy );
bank_enemies = getentarray( "bank_enemies", "targetname" );
gas_station_enemies = getentarray( "gas_station_enemies", "targetname" );
taco_enemies = getentarray( "taco_enemies", "targetname" );
array_thread( bank_enemies, ::add_spawn_function, ::create_hunter_enemy );
array_thread( gas_station_enemies, ::add_spawn_function, ::create_hunter_enemy );
array_thread( taco_enemies, ::add_spawn_function, ::create_hunter_enemy );
array_thread( bank_enemies, ::add_spawn_function, ::setup_predator_deaths );
array_thread( gas_station_enemies, ::add_spawn_function, ::setup_predator_deaths );
array_thread( taco_enemies, ::add_spawn_function, ::setup_predator_deaths );
thread maintain_closest_goal( goals );
}
predator_death_func()
{
if ( isdefined( self.damageMod ) && self.damageMod == "MOD_PROJECTILE_SPLASH" &&
isdefined( self.lastAttacker ) && isdefined( self.lastAttacker.fired_hellfire_missile ) )
self.skipDeathAnim = true;
return false;
}
setup_predator_deaths()
{
self.deathFunction = ::predator_death_func;
}
maintain_closest_goal( goals )
{
while ( 1 )
{
closest_goal = getclosest( level.player.origin, goals );
//only goal enemies to one of the players and assume they stay together
//also its cool for player2 to feel hidden from the hunters
if ( level.current_goal != closest_goal )
{
level.current_goal = closest_goal;
move_hunters_to_new_goal( closest_goal );
}
wait 1;
}
}
create_hunter_enemy()
{
self.goalradius = 2048;
self.goalheight = 512;
level.hunter_enemies[ self.unique_id ] = self;
self setgoalpos( level.current_goal.origin );
self.pathrandompercent = 200;
self enable_danger_react( 5 );
self waittill( "death" );
level.hunter_enemies[ self.unique_id ] = undefined;
}
move_hunters_to_new_goal( closest_goal )
{
waittillframeend;
//waittillframeend because you may be in the part of the frame that is before
//the script has received the "death" notify but after the AI has died.
foreach ( enemy in level.hunter_enemies )
enemy setgoalpos( closest_goal.origin );
}
wounded_carry_attackers_counter()
{
self waittill ( "death" );
level.wounded_carry_attackers_dead++;
}
setup_wounded_carry_attackers()
{
self endon ( "death" );
self.aggressivemode = true;
self.useChokePoints = false;
self waittill( "goal" );
self.goalradius = 2000;
self waittill( "goal" );
self.goalradius = 2000;
}
setup_diner_backdoor_attackers()
{
self endon( "death" );
self.aggressivemode = true;
self.useChokePoints = false;
wait 12;
self.goalradius = 100;
self.favoriteenemy = level.player;
self setgoalentity( level.player );
//wait 8;
//self.goalradius = 100;
}
setup_BT_enemy_defenders()
{
self endon ( "death" );
self.combatMode = "ambush";
self.grenadeawareness = .9;
flag_wait( "player_in_burgertown" );
wait 8;
self.combatMode = "cover";
self setgoalentity( level.player );
self.goalradius = 100;
}
nates_defenders_setup()
{
self endon( "death" );
//self.threatbias = 3000;
self thread magic_bullet_shield();
flag_wait( "player_on_roof" );
self stop_magic_bullet_shield();
//wait 1;
//self kill();
}
//setup_ramirez()
//{
// //self.threatbias = 3000;
// self thread magic_bullet_shield();
//
// flag_wait( "player_on_roof" );
// self stop_magic_bullet_shield();
// self.goalradius = 1500;
//}
//
//setup_collins()
//{
// //self.threatbias = 3000;
// self thread magic_bullet_shield();
//
// flag_wait( "player_on_roof" );
// self stop_magic_bullet_shield();
// self.goalradius = 1500;
//}
setup_wells()
{
level.wells = self;
self.animname = "wells";
self thread magic_bullet_shield();
//flag_wait( "wells_intro_done" );
//self thread stop_magic_bullet_shield();
level.wells setgoalnode( getnode( "wells_intro_node", "targetname" ) );
level.wells.goalradius = 16;
flag_wait( "move_president_to_prep" );
wells_in_nates_prep = getent( "wells_in_nates_prep", "targetname" );
level.wells setgoalpos( wells_in_nates_prep.origin );
}
setup_worm()
{
level.worm = self;
self.animname = "worm";
}
setup_taco()
{
level.taco = self;
self.animname = "taco";
self thread magic_bullet_shield();
}
setup_raptor()
{
level.raptor = self;
self.animname = "raptor";
self thread magic_bullet_shield();
flag_wait( "move_president_to_prep" );
level.raptor.goalradius = 64;
raptor_prep = getent( "raptor_in_nates_prep", "targetname" );
level.raptor setgoalpos( raptor_prep.origin );
}
//plane_start_drop()
//{
// self waittill( "trigger", other );
// other notify( "start_drop" );
//}
//
//plane_stop_drop()
//{
// self waittill( "trigger", other );
// other notify( "stop_drop" );
//}
is_west_group( group_name )
{
if( group_name == "ambient_paradrop3" )
return true;
if( group_name == "ambient_west_group3" )
return true;
if( group_name == "ambient_west_group2" )
return true;
return false;
}
paradrops_ambient()
{
flag_wait_either( "leaving_gas_station", "crash_objective" );
drop_groups = [];
drop_groups[drop_groups.size] = "ambient_paradrop1";
drop_groups[drop_groups.size] = "ambient_paradrop2";
drop_groups[drop_groups.size] = "ambient_paradrop3";
drop_groups[drop_groups.size] = "ambient_west_group3";
drop_groups[drop_groups.size] = "ambient_west_group2";
drop_groups[drop_groups.size] = "ambient_south_group2";
drop_groups[drop_groups.size] = "ambient_south_group3";
drop_groups[drop_groups.size] = "ambient_east_group2";
drop_groups[drop_groups.size] = "ambient_east_group3";
drop_groups[drop_groups.size] = "ambient_north_group1";
drop_groups[drop_groups.size] = "ambient_north_group2";
drop_groups[drop_groups.size] = "ambient_north_group3";
drop_groups[drop_groups.size] = "curved_mig_flight1";
//drop_groups[drop_groups.size] = "first_fast_movers";
drop_groups[drop_groups.size] = "paradrop_escort";
drop_groups = array_randomize( drop_groups );
selected = 0;
north_groups = [];//towards bank
north_groups[north_groups.size] = "ambient_north_group1";
north_groups[north_groups.size] = "ambient_north_group2";
north_groups[north_groups.size] = "ambient_north_group3";
south_groups = [];//towards BT
south_groups[south_groups.size] = "ambient_paradrop2";
south_groups[south_groups.size] = "ambient_south_group2";
south_groups[south_groups.size] = "ambient_south_group3";
west_groups = [];//towards diner
west_groups[west_groups.size] = "ambient_paradrop3";
west_groups[west_groups.size] = "ambient_west_group3";
west_groups[west_groups.size] = "ambient_west_group2";
east_groups = [];//towards nates
east_groups[east_groups.size] = "ambient_paradrop1";
east_groups[east_groups.size] = "ambient_east_group2";
east_groups[east_groups.size] = "ambient_east_group3";
while( 1 )
{
planes = undefined;
dir_selection = undefined;
old_selection = undefined;
if( isdefined( level.obj_direction ) )
{
if( level.obj_direction == "east" )
dir_selection = east_groups[ randomint( east_groups.size ) ];
if( level.obj_direction == "north" )
dir_selection = north_groups[ randomint( north_groups.size ) ];
if( level.obj_direction == "south" )
dir_selection = south_groups[ randomint( south_groups.size ) ];
if( ( level.obj_direction == "west" ) && !flag( "player_is_near_houses" ) )
dir_selection = west_groups[ randomint( west_groups.size ) ];
if( isdefined( dir_selection ) )
{
planes = getentarray( dir_selection, "targetname" );
println( " z: ambient paradrop: " + dir_selection );
}
}
if( !isdefined( planes ) )//no obj direction
{
if( selected >= drop_groups.size )
selected = 0;
group_name = drop_groups[selected];
if( flag( "player_is_near_houses" ) && is_west_group( group_name ) )
{
selected++;
continue;
}
println( " %%%% ambient paradrop: " + group_name );
planes = getentarray( drop_groups[selected], "targetname" );
old_selection = selected;
selected++;
}
first_plane = true;
antonov = false;
foreach( plane in planes )
{
if( plane.classname == "script_vehicle_antonov" )
antonov = true;
if( antonov )
{
//only the first of the antonovs plays the sound.
if( first_plane )
{
plane thread paradrop( first_plane );
first_plane = false;
}
else
{
plane thread paradrop();
}
}
else
{
plane thread maps\_vehicle::spawn_vehicle_and_gopath();
}
}
if( !antonov )//jets only fly over once
{
drop_groups = array_remove( drop_groups, drop_groups[old_selection] );
}
wait 20;//was 30
if ( GetDvar( "invasion_minspec" ) == "1" )
wait 80;
}
}
paradrop_vehicle()
{
airplane_spawner = undefined;
self waittill( "trigger" );
targets = getentarray( self.target, "targetname" );
for( i = 0 ; i < targets.size ; i++ )
{
//if( !isdefined ( tgt.script_noteworthy ) )
// continue;
//if( tgt.script_noteworthy == "airplane" )
if( i == 0 )
{
first_plane = true;
targets[i] thread paradrop( first_plane );
}
else
{
targets[i] thread paradrop();
}
}
}
//paradrop_bmp()
//{
// airplane = self thread maps\_vehicle::spawn_vehicle_and_gopath();
// airplane ent_flag_init( "start_drop" );
// airplane ent_flag_init( "stop_drop" );
//
// airplane ent_flag_wait( "start_drop" );
// println( "do BMP drop " );
// thread drop_bmp();
//}
drop_bmp()
{
chute = spawn_anim_model( "bmp_chute_paradrop" );
chuteA = spawn_anim_model( "paradrop_cargo_tank_chuteA" );
chuteB = spawn_anim_model( "paradrop_cargo_tank_chuteB" );
chuteC = spawn_anim_model( "paradrop_cargo_tank_chuteC" );
bmp = spawn_anim_model( "bmp_paradrop" );
bmp linkto( self );
chute linkto( self );
chuteA linkto( self );
chuteB linkto( self );
chuteC linkto( self );
self thread anim_single_solo( chute, "bmp_chute_paradrop" );
self thread anim_single_solo( chuteA, "paradrop_cargo_tank_chuteA" );
self thread anim_single_solo( chuteB, "paradrop_cargo_tank_chuteB" );
self thread anim_single_solo( chuteC, "paradrop_cargo_tank_chuteC" );
self anim_single_solo( bmp, "bmp_paradrop" );
chute delete();
chuteA delete();
chuteB delete();
chuteC delete();
bmp delete();
}
paradrop( first_plane )
{
/*
spawner_right = undefined;
spawner_left = undefined;
links = self get_links();
targets = getentarray( links[ 0 ], "script_linkname" );
foreach( tgt in targets )
{
if( !isdefined ( tgt.script_noteworthy ) )
continue;
if( tgt.script_noteworthy == "paradrop_guy_right" )
spawner_right = tgt;
if( tgt.script_noteworthy == "paradrop_guy_left" )
spawner_left = tgt;
}
*/
assert( isdefined( level.paradropper_left ) );
assert( isdefined( level.paradropper_right ) );
airplane = self thread maps\_vehicle::spawn_vehicle_and_gopath();
if( isdefined ( first_plane ) )
airplane playloopsound( "veh_jet_passenger_slow" );
airplane.script_vehicle_selfremove = 1;
airplane ent_flag_init( "start_drop" );
airplane ent_flag_init( "stop_drop" );
airplane endon( "stop_drop" );
drop_time = 16;
if( isdefined ( self.script_duration ) )
drop_time = self.script_duration;
airplane ent_flag_wait( "start_drop" );
//println( "start drop, airplane num: " + links[0] );
println( "start drop, airplane num: " );
if( isdefined( self.script_noteworthy ) && self.script_noteworthy == "drop_bmp" )
{
airplane thread drop_bmp();
wait 2;
}
while( 1 )
{
level.paradropper_right.count = 1;
level.paradropper_left.count = 1;
paradrop_guy_left = level.paradropper_left spawn_ai();
paradrop_guy_left thread setup_paradrop_guy_left ( airplane, drop_time );
paradrop_guy_right = level.paradropper_right spawn_ai();
paradrop_guy_right thread setup_paradrop_guy_right ( airplane, drop_time );
wait ( randomfloatrange( .4, .8 ) );
}
}
setup_paradrop_guy_left( paradrop_airplane, drop_time )
{
//time = gettime();
level.droppers++;
//println(" droppers = " + level.droppers );
self.health = 1;
self.ignoreme = true;
chute = spawn_anim_model( "distant_parachute_guy" );
self linkto( paradrop_airplane );
chute linkto( paradrop_airplane );
if( cointoss() )
{
paradrop_airplane thread anim_single_solo( chute, "distant_parachute_guy_left1" );
paradrop_airplane thread anim_generic( self, "distant_parachute_guy_left1" );
}
else
{
paradrop_airplane thread anim_single_solo( chute, "distant_parachute_guy_left2" );
paradrop_airplane thread anim_generic( self, "distant_parachute_guy_left2" );
}
wait drop_time;//anim time is 16.9
chute delete();
if( isalive ( self ) )
self delete();
level.droppers--;
level.dropped++;
//drop_time = ( gettime() - time );
//println(" DROPPED = " + level.dropped + " time: " + drop_time );
}
setup_paradrop_guy_right( paradrop_airplane, drop_time )
{
//time = gettime();
level.droppers++;
//println(" droppers = " + level.droppers );
self.health = 1;
self.ignoreme = true;
chute = spawn_anim_model( "distant_parachute_guy" );
self linkto( paradrop_airplane );
chute linkto( paradrop_airplane );
if( cointoss() )
{
paradrop_airplane thread anim_single_solo( chute, "distant_parachute_guy_right1" );
paradrop_airplane thread anim_generic( self, "distant_parachute_guy_right1" );
}
else
{
paradrop_airplane thread anim_single_solo( chute, "distant_parachute_guy_right2" );
paradrop_airplane thread anim_generic( self, "distant_parachute_guy_right2" );
}
wait drop_time;//anim time is 16.9
chute delete();
if( isalive ( self ) )
self delete();
level.droppers--;
level.dropped++;
//drop_time = ( gettime() - time );
//println(" DROPPED = " + level.dropped + " time: " + drop_time );
}
setup_shotgun_guy2()
{
humvee_opening_node = getent("humvee_opening", "targetname" );
humvee_opening_node anim_generic( self, "invasion_opening_hummer1_soldier2" );
self.allowdeath = true;
self.a.nodeath = true;
self kill();
}
setup_backseat_right_guy2()
{
humvee_opening_node = getent("humvee_opening", "targetname" );
humvee_opening_node anim_generic( self, "invasion_opening_hummer1_soldier1" );
self.allowdeath = true;
self.a.nodeath = true;
self kill();
}
setup_player_humvee_driver()
{
humvee_opening_node = getent("humvee_opening", "targetname" );
humvee_opening_node anim_generic( self, "invasion_opening_hummer2_soldier1" );
//println( "worm done" );
}
btr80_notetrack_fire( guy )
{
level.humvee_destroyer fireWeapon();
//println( "fire" );
level notify ( "humvee_destroyer_fired" );
}
//ammo_cache_guy_setup()
//{
// using_supply_crate = getent ( "using_supply_crate", "targetname" );
// self.animname = "generic";
// self.allowdeath = true;
// self.health = 1;
// //chair_guy teleport ( chair_guy_origin.origin );
// //anim_loop_solo( guy, anime, ender, tag )
// using_supply_crate thread anim_loop_solo(self, "airdrop_idles", "stop_idle", undefined);
//
// level.player waittill_entity_in_range( self, 800 );
// using_supply_crate notify ( "stop_idle" );
//}
fire_at_chain( current )
{
self endon( "death" );
while( 1 )
{
self SetTurretTargetVec( current.origin );
house_destroyer_fire( current.origin );
exploder( current.script_prefab_exploder );
if( !isdefined( current.target ) )
break;
next = getent( current.target, "targetname" );
if( !isdefined( next ) )
break;
current = next;
}
}
bmp_fires_first_volley_at_nates()
{
self endon( "death" );
current = getent( "north_side_low", "targetname" );
self SetTurretTargetVec( current.origin );
self waittill( "turret_on_target" );
self fire_at_chain( current );
//wait 2;
current = getent( "north_side_high", "targetname" );
self SetTurretTargetVec( current.origin );
self waittill( "turret_on_target" );
self fire_at_chain( current );
}
bmp_fires_more_volleys_at_nates()
{
self endon( "reached_end_node" );
self endon( "death" );
targets = getentarray( "hellfire_attack_target_roof", "targetname" );
while( 1 )
{
wait randomfloatrange( 1, 3 );
target_origin = targets[ randomint ( targets.size ) ];
self SetTurretTargetVec( target_origin.origin );
shots = randomintrange( 3, 6 );
for( i = 0 ; i < shots ; i++ )
{
self fireWeapon();
wait .2;
}
}
}
setup_nates_kitchen_ladder_clip()
{
nates_kitchen_ladder_clip = getent( "nates_kitchen_ladder_clip", "targetname" );
while( 1 )
{
//ladder works
nates_kitchen_ladder_clip notsolid();
flag_wait( "player_on_roof" );
while( level.player istouching( nates_kitchen_ladder_clip ) )
wait 1;
//ladder blocked
nates_kitchen_ladder_clip solid();
flag_waitopen( "player_on_roof" );
}
}
setup_bt_ktichen_ladder_clip()
{
bt_ktichen_ladder_clip = getent( "bt_ktichen_ladder_clip", "targetname" );
while( 1 )
{
//ladder works
bt_ktichen_ladder_clip notsolid();
flag_wait( "player_on_burgertown_roof" );
while( level.player istouching( bt_ktichen_ladder_clip ) )
wait 1;
//ladder blocked
bt_ktichen_ladder_clip solid();
flag_waitopen( "player_on_burgertown_roof" );
}
}
bmp_fires_at_nates()
{
current = getent( "west_side", "targetname" );
self SetTurretTargetVec( current.origin );
self waittill( "turret_on_target" );
self fire_at_chain( current );
//wait 2;
}
add_org_to_tank_targets( ent, org, exploder )
{
array = [];
array[ "exploder" ] = exploder;
array[ "origin" ] = org;
ent.targets[ ent.targets.size ] = array;
}
roof_parachute_landing_guy_humvee()
{
roof_parachute_landing_guy_humvee = getent( "humvee_ride_roof_landing", "targetname" );
level.roof_parachute_landing_guy_humvee = roof_parachute_landing_guy_humvee spawn_ai();
if( isdefined( level.animated_ride_in ) )
level.roof_parachute_landing_guy_humvee.ignoreme = true;
level.roof_parachute_landing_guy_humvee waittill( "death" );
//println( "re aim" );
if( isdefined( level.animated_ride_in ) )
return;
turret = level.humvee_front.mgturret[ 0 ];
target = getent( "humvee_destroyer_init_target", "targetname" );
turret_guy = turret getTurretOwner();
turret_guy.ignoreall = true;
turret thread animscripts\hummer_turret\common::set_manual_target( target );
level waittill ( "humvee_destroyer_fired" );
turret_guy kill();
}
humvee_explosion1( guy )
{
playfx( getfx( "humvee_explosion" ), level.humvee_front.origin );
}
humvee_explosion2( guy )
{
//playfx( getfx( "humvee_explosion" ), level.humvee_front.origin );
level.humvee_front maps\_vehicle::godoff();
level.humvee_front kill();
}
humvee_destroyer_action()
{
self endon( "death" );
self thread turret_spotlight();
self thread maps\_vehicle::damage_hints();
//humvee_destroyer_init_target = getent( "humvee_destroyer_init_target", "targetname" );
//self setturrettargetvec( humvee_destroyer_init_target.origin );
//self waittill( "reached_end_node" );
//level.humvee_front maps\_vehicle::godon();
//level.humvee_player maps\_vehicle::godon();
level.humvee_front.health = 30000;
level.humvee_player.health = 30000;
//self thread impact_causes_physics();
self setturrettargetent( level.humvee_front, (0,0,40) );
wait 1.5;
level notify( "humvee_blows_up" );//starts animation
//self waittill( "turret_on_target" );
wait 2.5;
turret_guys = getentarray( "turret_guy", "script_noteworthy" );
foreach( guy in turret_guys )
{
if( isalive( guy ) )
guy kill();
}
for ( j = 0; j < 2; j++ )
{
physicsSphere( level.humvee_front.origin );
self fireWeapon();
wait .2;
}
//level.humvee_front maps\_vehicle::godoff();
//level.humvee_front kill();
self setturrettargetent( level.humvee_player, (0,0,40) );
wait 1;
//self waittill( "turret_on_target" );
//wait 1;
for ( j = 0; j < 3; j++ )
{
self fireWeapon();
wait .2;
}
level.humvee_player maps\_vehicle::godoff();
level.humvee_player kill();
//playfx( getfx( "humvee_explosion" ), level.humvee_player.origin );
self setturrettargetent( level.humvee_front, (0,0,40) );
wait 1;
for ( j = 0; j < 5; j++ )
{
self fireWeapon();
wait .2;
}
//this vehicle is killed via notetrack function humvee_explosion2()
//level.humvee_front playfx( getfx( "humvee_explosion" ), self );
humvee_destroyer_fires_at_pillars_and_player();
}
humvee_destroyer_fires_at_pillars_and_player()
{
self endon( "death" );
ent = spawnstruct();
ent.targets = [];
org = getstruct( "pillar1", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 9990 );
org = getstruct( "pillar2", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 9991 );
org = getstruct( "pillar3", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 9992 );
self setturrettargetvec( ent.targets[ 0 ][ "origin" ] );
wait 1.5;
for ( i = 0; i < ent.targets.size; i++ )
{
self setturrettargetvec( ent.targets[ i ][ "origin" ] );
//self waittill( "turret_on_target" );
house_destroyer_fire( ent.targets[ i ][ "origin" ] );
Earthquake( 0.3, .3, ent.targets[ i ][ "origin" ], 850 );
if( ent.targets[ i ][ "exploder" ] > 0 )
exploder( ent.targets[ i ][ "exploder" ] );
//wait .1;
}
wait 1;
self ent_flag_init( "spotted_player" );
thread bmp_turret_attack_player( false, true );
flag_wait( "start_house_destroyer" );
self delete();
}
setup_house_destroyer()
{
self thread turret_spotlight();
self thread maps\_vehicle::damage_hints();
self thread house_destroyer_move();
self.damageIsFromPlayer = true;
//self thread impact_causes_physics();
self endon( "death" );
ent = spawnstruct();
ent.targets = [];
org = getstruct( "bh_roof", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 12 );
org = getstruct( "bh_corner", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 13 );
org = getstruct( "bh_garage_left", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 10 );
org = getstruct( "bh_garage_right", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 11 );
for ( i = 0; i < ent.targets.size; i++ )
{
self setturrettargetvec( ent.targets[ i ][ "origin" ] );
//self waittill( "turret_on_target" );
house_destroyer_fire( ent.targets[ i ][ "origin" ] );
if( ent.targets[ i ][ "exploder" ] > 0 )
exploder( ent.targets[ i ][ "exploder" ] );
}
//targets[ 4 ] = spawnstruct();
//targets[ 4 ].pos = getent( "cop_car", "targetname" );
//targets[ 4 ].num = -1;
t = getstruct( "cop_car", "targetname" );
self setturrettargetvec( t.origin );
self waittill( "turret_on_target" );
while( !flag( "house_destroyer_stage2" ) )
{
s = randomintrange( 4, 6 );
for ( j = 0; j < s; j++ )
{
self fireWeapon();
wait .2;
}
delay = ( randomintrange( 40, 60 ) );
for ( d = 0; d < delay; d++ )
{
if( flag( "house_destroyer_stage2" ) )
break;
wait ( .05 );
}
}
ent = spawnstruct();
ent.targets = [];
org = getstruct( "roof_corner", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 4 );
org = getstruct( "bh_corner", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 2 );
org = getstruct( "big_windows", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 1 );
org = getstruct( "back_windows", "targetname" ).origin;
add_org_to_tank_targets( ent, org, 3 );
thread animate_burning_tree();
thread maps\invasion_fx::tree_fire_light();
for ( i = 0; i < ent.targets.size; i++ )
{
self setturrettargetvec( ent.targets[ i ][ "origin" ] );
//self waittill( "turret_on_target" );
house_destroyer_fire( ent.targets[ i ][ "origin" ] );
if( ent.targets[ i ][ "exploder" ] > 0 )
exploder( ent.targets[ i ][ "exploder" ] );
}
self endon( "stop_shooting" );
thread house_destroyer_shoot_agro_player();
t = getstruct( "beemer", "targetname" );
self setturrettargetvec( t.origin );
self waittill( "turret_on_target" );
s = randomintrange( 4, 6 );
for ( j = 0; j < s; j++ )
{
self fireWeapon();
wait .2;
}
t = getstruct( "barrier_car", "targetname" );
self setturrettargetvec( t.origin );
self waittill( "turret_on_target" );
for ( i = 0; i < 3; i++ )
{
s = randomintrange( 4, 6 );
for ( j = 0; j < s; j++ )
{
self fireWeapon();
wait .2;
}
}
//targets[ 4 ].pos = getent( "driveway_car", "targetname" );
//targets[ 4 ].pos = getent( "barrier_car", "targetname" );
/*
while( 1 )
{
t = randomint( targets.size );
self setturrettargetent( targets[ t ].pos );
self waittill( "turret_on_target" );
house_destroyer_fire( targets[ t ].pos.origin );
wait( .7 );
}
*/
}
house_destroyer_shoot_agro_player()
{
self endon( "death" );
self endon( "stop_shooting" );
while( 1 )
{
if( within_fov( self.origin, self.angles, level.player.origin, level.cosine[ "60" ] ) )
if ( SightTracePassed( ( self.origin + (0,0,64) ), level.player geteye(), false, self ) )
break;
wait 1;
}
thread bmp_turret_attack_player();
}
house_destroyer_move()
{
self endon( "death" );
self ent_flag_init( "spotted_player" );
house_destroyer_first_path = getVehicleNode( "house_destroyer_first_path", "targetname" );
self startPath( house_destroyer_first_path );
//self waittill( "reached_end_node" );
flag_wait( "house_destroyer_stage2" );
house_destroyer_path = getVehicleNode( "house_destroyer_path", "targetname" );
self startPath( house_destroyer_path );
self waittill( "reached_end_node" );
level.player waittill_entity_in_range_or_timeout( self, 950, 4 );
//level.player waittill_entity_in_range( self, 950 );
flag_set( "house_destroyer_unloading" );
self thread vehicle_unload();
//add get down dialog
//self setturrettargetent( level.player );
wait 6;
//self waittill( "turret_on_target" );
//self thread bmp_door_close();
thread bmp_turret_attack_player();
wait 16;
flag_wait( "take_point" );
bmp_bad_places = getentarray( "bmp_bad_places", "script_noteworthy" );
foreach( place in bmp_bad_places )
{
BadPlace_Cylinder( "", 20, place.origin, place.radius, 300 );
}
flag_set( "house_destroyer_moving_back" );
house_destroyer_backwards_path = getVehicleNode( "house_destroyer_backwards_path", "targetname" );
self startPath( house_destroyer_backwards_path );
self vehicle_wheels_backward();
flag_wait( "leaving_gas_station" );
self notify( "stop_shooting" );
self delete();
}
house_destroyer_fire( center )
{
//self fireWeapon();
physicsSphere( center );
self fireWeapon();
wait .2;
// s = randomintrange( 1, 2 );
// for ( j = 0; j < s; j++ )
// {
// self fireWeapon();
// wait .2;
// }
}
//impact_causes_physics()
//{
// for( ;; )
// {
// self waittill( "projectile_impact", weaponName, position, radius );
// thread physicsSphere( position );
// }
//}
physicsSphere( center )
{
assert( isdefined( center ) );
wait 0.1;
//PhysicsExplosionSphere( <position>, <outer radius>, <inner radius>, <magnitude> )
physicsExplosionSphere( center, 200, 100, 4.0 );
}
bmp_turret_attack_player( end_if_cant_see, no_misses )
{
if( !isdefined( end_if_cant_see ) )
end_if_cant_see = false;
if( !isdefined( no_misses ) )
no_misses = false;
self notify( "stop_shooting" );
//self thread debug_bmp_hit_player();
self endon( "stop_shooting" );
self endon( "death" );
self endon( "delete" );
while ( 1 )
{
//choose our target based on distance and visibility
player = get_closest_player( self.origin );
/*
if ( ! can_see_player( player ) )
{
dif_player = get_different_player( player );
if ( can_see_player( dif_player ) )
player = dif_player;
}
*/
wait( randomfloatrange( 0.8, 1.3 ) );
// don't try to shoot a player with an RPG or Stinger
//if ( player usingAntiAirWeapon() )
// continue;
//dont try to shoot a player who is hiding a safe volume
//if ( player is_hidden_from_heli( self ) )
// continue;
//wait for player to be visible
while ( !can_see_player( player ) )
wait( randomfloatrange( 0.2, 0.6 ) );//was .8 1.3
if( !no_misses )
{
//saw player, now miss for 2 bursts
miss_player( player );
wait( randomfloatrange( 0.8, 2.4 ) );
miss_player( player );
wait( randomfloatrange( 0.8, 2.4 ) );
}
//if player is still exposed then hit him
while ( can_see_player( player ) )
{
fire_at_player( player );
wait( randomfloatrange( 2, 3 ) );
}
//player is hidden, now will suppress/hit him for 1 burst if he tries to peek out
//fire_at_player( player );
//wait( randomfloatrange( .3, 1 ) );
if( end_if_cant_see )
{
if( !can_see_player( player ) )
{
self clearturrettarget();
self.turret_busy = false;
self ent_flag_clear( "spotted_player" );
flag_clear ("bmp_has_spotted_player" );
self notify( "stop_shooting" );
}
}
//fire_at_player( player );
}
}
debug_bmp_hit_player()
{
self endon ( "death" );
while( 1 )
{
level.player waittill( "damage", amount, who );
if( who == self )
println( " bmp damaged player" );
}
}
fire_at_player( player )
{
//level.cansave = false;
burstsize = randomintrange( 3, 5 );
println(" **HITTING PLAYER, burst: " + burstsize );
fireTime = .2;
for ( i = 0; i < burstsize; i++ )
{
self setturrettargetent( player, randomvector( 20 ) + ( 0, 0, 32 ) );//randomvec was 50
self fireweapon();
wait fireTime;
}
//level.cansave = undefined;
}
miss_player( player )
{
//println(" missing player" );
//miss_vec = randomvector( 100 );
//miss_vec = randomvectorrange( 40, 100 );
//point in front of player
forward = AnglesToForward( level.player.angles );
forwardfar = vector_multiply( forward, 100 );
miss_vec = forwardfar + randomvector( 50 );
burstsize = randomintrange( 4, 6 );
fireTime = .2;
for ( i = 0; i < burstsize; i++ )
{
offset = randomvector( 15 ) + miss_vec + (0,0,64);
//println( " offset: " + offset );
//thread draw_line_for_time( self.origin+(0,0,128), player.origin+offset, 0, 0, 1, 2 );
//thread draw_line_for_time( player.origin+offset+(0,0,4), player.origin+offset, 0, 0, 1, 2 );
self setturrettargetent( player, offset );
self fireweapon();
wait fireTime;
}
}
can_see_player( player )
{
if( flag( "player_inside_nates" ) )
return false;
if( flag( "player_in_diner" ) )
return false;
if( distance( self.origin, level.player.origin ) < level.min_btr_fighting_range )
return false;
tag_flash_loc = self getTagOrigin( "tag_flash" );
//BulletTracePassed( <start>, <end>, <hit characters>, <ignore entity> );
player_eye = player geteye();
if ( SightTracePassed( tag_flash_loc, player_eye, false, self ) )
{
if( isdefined( level.debug ) )
line( tag_flash_loc, player_eye, ( 0.2, 0.5, 0.8 ), 0.5, false, 60 );
return true;
}
else
{
//println( " ---trace failed" );
return false;
}
}
end_of_script()
{
// End of current level.
iprintlnbold( &"SCRIPT_DEBUG_LEVEL_END" );
}
flag_save( _flag )
{
flag_wait( _flag );
autosave_by_name( "hello" );;
}
registerObjective( objName, objText, objOrigin )
{
flag_init( objName );
if( !isdefined( level.objectives ) )
level.objectives = [];
objID = level.objectives.size;
newObjective = spawnStruct();
newObjective.name = objName;
newObjective.id = objID;
newObjective.state = "invisible";
newObjective.text = objText;
newObjective.origin = objOrigin;
newObjective.added = false;
level.objectives[objName] = newObjective;
return newObjective;
}
setObjectiveState( objName, objState )
{
assert( isDefined( level.objectives[objName] ) );
objective = level.objectives[objName];
objective.state = objState;
if ( !objective.added )
{
objective_add( objective.id, objective.state, objective.text, objective.origin );
objective.added = true;
}
else
{
objective_state( objective.id, objective.State );
}
if ( objective.state == "done" )
flag_set( objName );
}
setObjectiveString( objName, objString )
{
objective = level.objectives[objName];
objective.text = objString;
objective_string( objective.id, objString );
}
setObjectiveLocation( objName, objLoc )
{
level notify( "moving " + objName );
level endon( "moving " + objName );
objective = level.objectives[objName];
objective.loc = objLoc;
level.obj_pos = objLoc;
objective_position( objective.id, level.obj_pos );
}
setObjectiveLocation_nearest_enemy( objName )
{
level notify( "moving " + objName );
level endon( "moving " + objName );
objective = level.objectives[objName];
closest_enemy = undefined;
setObjectiveWaypoint( objName, &"INVASION_WAYPOINT_HOSTILES" );
north_trucks_retreat_point = getent( "north_trucks_retreat_point", "targetname" );
while( objective.state != "done" )
{
enemies = getaiarray( "axis" );
if( enemies.size < 1 )
{
level.obj_pos = north_trucks_retreat_point.origin;
objective_position( objective.id, level.obj_pos );
wait 3;
}
else
{
enemy_positions = [];
foreach( guy in enemies )
enemy_positions[ enemy_positions.size ] = guy.origin;
level.obj_pos = AveragePoint( enemy_positions );
objective_position( objective.id, level.obj_pos + (0,0,70) );
//closest_enemy = getclosest( level.player.origin, enemies );
//level.obj_pos = closest_enemy.origin + (0,0,70);
//Objective_OnEntity( objective.id, closest_enemy, (0,0,70) );
//closest_enemy waittill( "death" );
wait 2.2;
}
//if( isalive( closest_enemy ) )
// closest_enemy waittill( "death" );
}
}
setObjectiveWaypoint( objName, text )
{
objective = level.objectives[objName];
if( isdefined( text ) )
Objective_SetPointerTextOverride( objective.id, text );
else
Objective_SetPointerTextOverride( objective.id );
}
setObjectiveLocationMoving( objName, objEnt, offset )
{
level notify( "moving " + objName );
level endon( "moving " + objName );
objective = level.objectives[objName];
Objective_OnEntity( objective.id, objEnt, offset );
//while( objective.state != "done" )
//{
// if( !isdefined( objEnt ) )
// break;
// level.obj_pos = objEnt.origin;
// objective_position( objective.id, level.obj_pos );
// wait .05;
//}
}
setObjectiveRemaining( objName, objString, objRemaining )
{
assert( isDefined( level.objectives[objName] ) );
objective = level.objectives[objName];
if ( !objRemaining )
objective_string( objective.id, objString );
else
objective_string( objective.id, objString, objRemaining );
}
set_threatbias_group( group )
{
assert( threatbiasgroupexists( group ) );
self setthreatbiasgroup( group );
}
bmps_from_north_dead()
{
flag_wait( "bmp_north_left_dead" );
flag_wait( "bmp_north_mid_dead" );
flag_set( "bmps_from_north_dead" );
level notify ( "bmps_from_north_dead" );
}
//drone_hint()
//{
// if( !flag( "diner_enemies_dead" ) && !flag( "leaving_diner" ) )
// level waittill_either ( "leaving_diner", "diner_enemies_dead" );
//
// wait 2;
//
// if( flag( "bmps_from_north_dead" ) )
// return;
// level.player thread display_hint( "hint_predator_drone" );
//
// while( !flag( "bmps_from_north_dead" ) )
// {
// level waittill( "player_fired_remote_missile" );
// num = level.bmps_from_north_dead;
// level waittill( "remote_missile_exploded" );
// wait 1;
// if( !( level.bmps_from_north_dead > num ) )
// level.player thread display_hint( "hint_steer_drone" );
// }
//}
should_break_use_drone_vs_bmps()
{
break_hint = false;
if( isdefined( level.player.is_flying_missile ) )
break_hint = true;
if( level.player getCurrentWeapon() == "remote_missile_detonator" )
break_hint = true;
if( flag ( "bmps_from_north_dead" ) )
break_hint = true;
return break_hint;
}
should_break_use_drone()
{
break_hint = false;
if( isdefined( level.player.is_flying_missile ) )
break_hint = true;
if( level.player getCurrentWeapon() == "remote_missile_detonator" )
break_hint = true;
return break_hint;
}
should_break_steer_drone()
{
break_hint = false;
if( level.player getCurrentWeapon() == "remote_missile_detonator" )
break_hint = true;
if( ( level.hint_steer_drone_time + 5000 ) < gettime() )
break_hint = true;
return break_hint;
}
magic_glass_breaker()
{
toweaken = getdvarfloat( "glass_damageToWeaken" );
todestroy = getdvarfloat( "glass_damageToDestroy" );
bullets = ( toweaken + todestroy ) / 100;
trgt = getent( self.target, "targetname" );
for( i = 0; i < bullets; i++ )
{
magicbullet( "nosound_magicbullet", self.origin, trgt.origin );
}
}
UAVRigAiming()
{
level.uav endon ( "death" );
for ( ;; )
{
if ( IsDefined( level.uavTargetEnt ) )
targetPos = level.uavTargetEnt.origin;
else if ( IsDefined( level.uavTargetPos ) )
targetPos = level.uavTargetPos;
else
targetpos = ( -553.753, -2970, 2369.84 ); // you could put this in invasion.map if you'd like.
angles = VectorToAngles( targetPos - level.uav.origin );
level.uavRig MoveTo( level.uav.origin, 0.10, 0, 0 );
level.uavRig RotateTo( ANGLES, 0.10, 0, 0 );
wait 0.05;
}
}
cleanse_the_world()
{
volume = getent( "house_area_volume", "targetname" );
entities = getentarray();
ignore_classnames = [];
ignore_classnames[ "script_vehicle_corpse" ] = true;
ignore_classnames[ "script_model" ] = true;
ignore_classnames[ "script_brushmodel" ] = true;
//ignore_classnames[ "choose_light" ] = true;
ignore_classnames[ "script_vehicle_collmap" ] = true;
ignore_classnames[ "info_volume_breachroom" ] = true;
ignore_classnames[ "actor_ally_hero_foley" ] = true;
ignore_classnames[ "actor_ally_hero_dunn" ] = true;
ignore_classnames[ "stage" ] = true;
foreach ( ent in entities )
{
if ( isalive( ent ) )
continue;
// keep these
//if ( isdefined( ent.script_ghettotag ) )
// continue;
//if ( ent.origin[ 2 ] < 1850 )
// continue;
if ( !isdefined( ent.classname ) )
{
if ( ent istouching( volume ) )
{
// looper that should be off anyway
ent delete();
}
continue;
}
if ( isdefined( ignore_classnames[ ent.classname ] ) )
continue;
if ( isdefined( ignore_classnames[ ent.code_classname ] ) )
continue;
if( ent == volume )
continue;
if ( ent needs_ent_testing() )
{
// triggers must have their center in the vol to survive
org = spawn( "script_origin", ent.origin );
if ( org istouching( volume ) )
{
ent delete();
}
org delete();
continue;
}
if ( ent istouching( volume ) )
ent delete();
}
}
needs_ent_testing()
{
if ( issubstr( self.code_classname, "script_vehicle" ) )
return true;
if ( issubstr( self.code_classname, "script_vehicle_corpse" ) )
return true;
if ( issubstr( self.code_classname, "script_brushmodel" ) )
return true;
if ( issubstr( self.code_classname, "trigger" ) )
return true;
return self.code_classname == "info_volume";
}
delete_house_area_entities()
{
house_area_volume = getent( "house_area_volume", "targetname" );
ents = getentarray();
foreach( thing in ents )
{
if( !isdefined( thing ) )
continue;
if( thing istouching( house_area_volume ) )
thing delete();
}
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
objective_main()
{
switch( level.start_point )
{
case "default":
case "humvee":
wait_for_yards();
case "yards":
case "bmp":
case "pizza":
case "gas_station":
case "crash":
objective_crash();
case "nates_roof":
objective_roof();
//objective_sentry();
objective_defend_roof();
case "attack_diner":
objective_predator();
case "defend_diner":
objective_BMPs();
case "diner":
objective_burgertown();
case "burgertown":
case "vip_escort":
//objective_regroup_at_nates();
case "defend_bt":
case "helis":
objective_defend_raptor();
objective_destroy_helicopter();
objective_defend_raptor2();
objective_destroy_helicopter2();
objective_defend_raptor3();
case "convoy":
objective_convoy();
}
}
wait_for_yards()
{
flag_wait_either( "follow_foley", "entering_yards" );
}
objective_crash()
{
//obj = getEntWithFlag( "crash_objective" );
obj = getstruct( "police_car_moment", "script_noteworthy" );
origin = obj.origin;
registerObjective( "obj_crash", &"INVASION_OBJ_FOLEY", level.raptor.origin );
setObjectiveState( "obj_crash", "current" );
thread setObjectiveLocationMoving( "obj_crash", level.raptor, (0,0,70) );
flag_wait( "crash_objective" );
flag_wait_either( "player_goto_roof", "player_on_roof" );
setObjectiveState( "obj_crash", "done" );
}
objective_roof()
{
if( !flag( "player_on_roof" ) )
{
origin = level.obj_sentry.origin;
registerObjective( "obj_roof", &"INVASION_OBJ_ROOF", origin );
setObjectiveState( "obj_roof", "current" );
flag_wait( "player_on_roof" );
setObjectiveState( "obj_roof", "done" );
}
}
//objective_sentry()
//{
// origin = level.obj_sentry.origin;
//
// registerObjective( "obj_sentry", &"INVASION_OBJ_SENTRY", origin );
// setObjectiveState( "obj_sentry", "current" );
//
// flag_wait( "sentry_in_position" );
//
// setObjectiveState( "obj_sentry", "done" );
//}
objective_defend_roof()
{
south_side_of_roof = getstruct( "south_side_of_roof_obj_loc", "targetname" );
origin = south_side_of_roof.origin;
registerObjective( "obj_defend", &"INVASION_OBJ_DEFEND", origin );
setObjectiveState( "obj_defend", "current" );
setObjectiveWaypoint( "obj_defend", &"INVASION_WAYPOINT_DEFEND" );
flag_wait( "northside_roof" );
northside_roof = getstruct( "northside_roof", "targetname" );
setObjectiveLocation( "obj_defend", northside_roof.origin );
setObjectiveWaypoint( "obj_defend", &"INVASION_WAYPOINT_DEFEND" );
flag_wait( "truck_guys_retreat" );
off_the_roof = getstruct( "off_the_roof", "targetname" );
setObjectiveLocation( "obj_defend", off_the_roof.origin );
setObjectiveWaypoint( "obj_defend" );//clear it
flag_wait( "time_to_go_get_UAV_control" );
setObjectiveState( "obj_defend", "done" );
}
objective_predator()
{
predator_drone_control = getent( "predator_drone_control", "targetname" );
origin = predator_drone_control.origin;
registerObjective( "obj_predator", &"INVASION_OBJ_PREDATOR", origin );
setObjectiveState( "obj_predator", "current" );
flag_wait( "player_has_predator_drones" );
setObjectiveState( "obj_predator", "done" );
}
objective_burgertown()
{
nates_restaurant_goal = getent( "nates_restaurant_goal", "targetname" );
origin = nates_restaurant_goal.origin;
registerObjective( "obj_burgertown", &"INVASION_OBJ_REGROUP", origin );
setObjectiveState( "obj_burgertown", "current" );
flag_wait( "time_to_clear_burgertown" );
objective_burgertown_groundfloor = getent( "objective_burgertown_groundfloor", "targetname" );
origin = objective_burgertown_groundfloor.origin;
setObjectiveString( "obj_burgertown", &"INVASION_OBJ_BURGERTOWN" );
setObjectiveLocation( "obj_burgertown", origin );
flag_wait( "burger_town_lower_cleared" );
wait 2;
setObjectiveState( "obj_burgertown", "done" );
}
objective_BMPs()
{
wait .2;
if( !flag( "bmp_north_left_dead" ) )
{
registerObjective( "obj_bmps", &"INVASION_OBJ_BMPS", level.bmp_north_left.origin );
setObjectiveState( "obj_bmps", "current" );
thread setObjectiveLocationMoving( "obj_bmps", level.bmp_north_left, (0,0,96) );
//setObjectiveWaypoint( "obj_bmps", &"INVASION_WAYPOINT_HOSTILES" );
}
else
{
if( !flag( "bmp_north_mid_dead" ) )
{
registerObjective( "obj_bmps", &"INVASION_OBJ_BMPS", level.bmp_north_mid.origin );
setObjectiveState( "obj_bmps", "current" );
thread setObjectiveLocationMoving( "obj_bmps", level.bmp_north_mid, (0,0,96) );
//setObjectiveWaypoint( "obj_bmps", &"INVASION_WAYPOINT_HOSTILES" );
}
else
return;
}
flag_wait( "bmp_north_left_dead" );
if( !flag( "bmp_north_mid_dead" ) )
{
thread setObjectiveLocationMoving( "obj_bmps", level.bmp_north_mid, (0,0,96) );
//setObjectiveWaypoint( "obj_bmps", &"INVASION_WAYPOINT_HOSTILES" );
}
flag_wait( "bmp_north_mid_dead" );
setObjectiveState( "obj_bmps", "done" );
}
objective_regroup_at_nates()
{
objective = getent( "raptor_in_nates_prep", "targetname" );
origin = objective.origin;
registerObjective( "obj_nates_regroup", &"INVASION_OBJ_NATES_REGROUP", origin );
setObjectiveState( "obj_nates_regroup", "current" );
flag_wait( "player_in_pos_to_cover_vip" );
setObjectiveState( "obj_nates_regroup", "done" );
}
objective_defend_raptor()
{
//objective_burgertown_groundfloor = getent( "objective_burgertown_groundfloor", "targetname" );
origin = level.raptor.origin;
registerObjective( "obj_raptor_defend", &"INVASION_OBJ_VIP_ESCORT", origin );
setObjectiveState( "obj_raptor_defend", "current" );
thread setObjectiveLocationMoving( "obj_raptor_defend", level.raptor, (0,0,70) );
setObjectiveWaypoint( "obj_raptor_defend", &"INVASION_WAYPOINT_PROTECT" );
flag_wait( "president_in_BT_meat_locker" );
setObjectiveString( "obj_raptor_defend", &"INVASION_OBJ_BURGERTOWN_DEFEND" );
thread setObjectiveLocation_nearest_enemy( "obj_raptor_defend" );
flag_wait( "first_attack_heli_spawned" );
wait 9;
//setObjectiveState( "obj_raptor_defend", "done" );
}
setup_stingers()
{
level.nates_stinger = [];
nates_stinger = getent( "nates_stinger", "script_noteworthy" );
level.nates_stinger["origin"] = nates_stinger.origin;
level.nates_stinger["angles"] = nates_stinger.angles;
level.nates_stinger["classname"] = nates_stinger.classname;
level waittill( "attack_heli_spawned" );
diner_stinger = getent( "diner", "script_noteworthy" );
if( isdefined( diner_stinger ) )
diner_stinger SetModel( "weapon_stinger_obj" );
if( isdefined( nates_stinger ) )
nates_stinger SetModel( "weapon_stinger_obj" );
while( 1 )
{
wait 2;
if( !isalive( level.attack_heli ) )
continue;
needs_stinger = true;
weapons = level.player GetWeaponsListAll();
foreach( weap in weapons )
if( weap == "stinger" )
needs_stinger = false;
if( !needs_stinger )
continue;
nates_stinger = getent( "nates_stinger", "script_noteworthy" );
if( !isdefined( nates_stinger ) )
{
weapon = spawn ( level.nates_stinger["classname"], level.nates_stinger["origin"], 1 );
weapon.angles = level.nates_stinger["angles"];
weapon ItemWeaponSetAmmo( 1, 0 );
weapon.script_noteworthy = "nates_stinger";
weapon setmodel( "weapon_stinger_obj" );
}
}
}
objective_destroy_helicopter( second_heli )
{
level notify( "attack_heli_spawned" );
needs_stinger = true;
weapons = level.player GetWeaponsListAll();
foreach( weap in weapons )
if( weap == "stinger" )
needs_stinger = false;
if( needs_stinger )
{
stinger_loc = level.nates_stinger["origin"];
diner_stinger = getent( "diner", "script_noteworthy" );
if( isdefined( diner_stinger ) )
{
stinger_loc = diner_stinger.origin;
level.obj_direction = "west";
}
else
{
level.obj_direction = "east";
}
origin = stinger_loc;
}
else
{
origin = level.attack_heli.origin;
}
//if( !isdefined( second_heli ) )
//{
level notify( "moving obj_raptor_defend" );
setObjectiveString( "obj_raptor_defend", &"INVASION_OBJ_ATTACK_HELI" );
setObjectiveLocation( "obj_raptor_defend", origin );
setObjectiveWaypoint( "obj_raptor_defend" );
//registerObjective( "obj_destroy_helicopter", &"INVASION_OBJ_ATTACK_HELI", origin );
//}
//else
//{
// setObjectiveLocation( "obj_raptor_defend", origin );
//}
//setObjectiveState( "obj_destroy_helicopter", "current" );
if( needs_stinger )
level.attack_heli waittill_death_or_stinger();
if( isalive( level.attack_heli ) )
{
//objective_burgertown_groundfloor = getent( "objective_burgertown_groundfloor", "targetname" );
//thread setObjectiveLocationMoving( "obj_destroy_helicopter", level.attack_heli );
level notify( "moving obj_raptor_defend" );
thread setObjectiveLocationMoving( "obj_raptor_defend", level.attack_heli, (0,0,128) );
level.attack_heli waittill( "death" );
}
//setObjectiveState( "obj_destroy_helicopter", "done" );
}
waittill_death_or_stinger()
{
self endon ( "death" );
while( 1 )
{
level.player waittill( "weapon_change" );
weap = level.player getCurrentWeapon();
if ( weap == "stinger" )
{
autosave_by_name( "got_stinger" );
break;
}
}
}
objective_defend_raptor2()
{
//meat_locker = getent( "president_in_burgertown_meat_locker", "targetname" );
//origin = meat_locker.origin;
// registerObjective( "obj_raptor_defend", &"INVASION_OBJ_BURGERTOWN_DEFEND", origin );
level notify( "moving obj_raptor_defend" );
setObjectiveString( "obj_raptor_defend", &"INVASION_OBJ_BURGERTOWN_DEFEND" );
thread setObjectiveLocation_nearest_enemy( "obj_raptor_defend" );
//setObjectiveLocation( "obj_raptor_defend", origin );
//setObjectiveState( "obj_raptor_defend", "current" );
flag_wait( "second_attack_heli_spawned" );
wait 9;
//setObjectiveState( "obj_raptor_defend", "done" );
}
objective_destroy_helicopter2()
{
second_heli = true;
objective_destroy_helicopter( second_heli );
}
objective_defend_raptor3()
{
//meat_locker = getent( "president_in_burgertown_meat_locker", "targetname" );
//origin = meat_locker.origin;
level notify( "moving obj_raptor_defend" );
// registerObjective( "obj_raptor_defend", &"INVASION_OBJ_BURGERTOWN_DEFEND", origin );
setObjectiveString( "obj_raptor_defend", &"INVASION_OBJ_BURGERTOWN_DEFEND" );
//setObjectiveLocation( "obj_raptor_defend", origin );
thread setObjectiveLocation_nearest_enemy( "obj_raptor_defend" );
//setObjectiveState( "obj_raptor_defend", "current" );
flag_wait( "time_to_goto_convoy" );
setObjectiveState( "obj_raptor_defend", "done" );
}
objective_convoy()
{
flag_wait( "time_to_goto_convoy" );
if( !isdefined( level.convoy ) )
level.convoy = getent( "convoy_obj", "targetname" );
//origin = convoy_obj.origin;
registerObjective( "obj_convoy", &"INVASION_OBJ_CONVOY", level.convoy.origin );
thread setObjectiveLocationMoving( "obj_convoy", level.convoy, (0,0,128) );
setObjectiveState( "obj_convoy", "current" );
//flag_wait( "player_at_convoy" );
//setObjectiveState( "obj_convoy", "done" );
}
// Concatenates the proper hint string to use depending which weapon (claymore or remotemissile) is equipped first
get_remotemissile_hint_string( str )
{
if ( IsDefined( self.remotemissile_actionslot ) )
{
return str + "_" + self.remotemissile_actionslot;
}
else
{
return str + "_4";
}
}