cod4-sdk/raw/maps/ambush.gsc
2008-01-19 00:00:00 +00:00

4024 lines
No EOL
103 KiB
Text

#include maps\_utility;
#include maps\_anim;
#include common_scripts\utility;
#include maps\_hud_util;
main()
{
if ( getdvar( "r_reflectionProbeGenerate" ) == "1" )
return;
setsaveddvar( "sm_sunShadowScale", "0.7" ); // optimization
add_start( "ambush", ::start_ambush, &"STARTS_AMBUSH" );
add_start( "village", ::start_village, &"STARTS_VILLAGE");
add_start( "morpheus", ::start_morpheus, &"STARTS_MORPHEUS");
add_start( "apartment", ::start_apartment, &"STARTS_APARTMENT");
default_start( ::start_default );
createthreatbiasgroup( "player" );
createthreatbiasgroup( "oblivious" );
createthreatbiasgroup( "group1" );
createthreatbiasgroup( "group2" );
createthreatbiasgroup( "badguy" );
maps\_bm21_troops::main( "vehicle_bm21_mobile_cover" );
maps\_bmp::main( "vehicle_bmp_low" );
maps\_blackhawk::main("vehicle_blackhawk");
maps\_uaz::main( "vehicle_uaz_open" );
maps\_vehicle::build_aianims( ::uaz_anims, ::uaz_vehicle_anims );
precacheItem( "hunted_crash_missile" );
precacheModel( "viewhands_op_force" );
precacheTurret( "heli_minigun_noai" );
precacheShader( "overlay_hunted_black" );
precachestring(&"AMBUSH_OBJ_CHECKPOINT" );
precachestring(&"AMBUSH_OBJ_GET_IN_POSITION" );
precachestring(&"AMBUSH_OBJ_SECURE_CHECKPOINT" );
precachestring(&"AMBUSH_TWO_HOURS_LATER" );
precachestring(&"AMBUSH_OBJ_CAPTURE_TARGET" );
precachestring(&"AMBUSH_OBJ_AMBUSH_CONVOY" );
precachestring(&"AMBUSH_MISSIONFAIL_KILLED_TARGET" );
precachestring(&"AMBUSH_MISSIONFAIL_STARTED_EARLY" );
precachestring(&"AMBUSH_MISSIONFAIL_ESCAPED" );
precachestring(&"AMBUSH_MISSIONFAIL_ESCAPED_WRONG_WAY" );
precachestring(&"AMBUSH_INTROSCREEN_LINE_1" );
precachestring(&"AMBUSH_INTROSCREEN_LINE_2" );
precachestring(&"AMBUSH_INTROSCREEN_LINE_3" );
precachestring(&"AMBUSH_INTROSCREEN_LINE_4" );
precachestring(&"AMBUSH_INTROSCREEN_LINE_5" );
level.weaponClipModels = [];
level.weaponClipModels[0] = "weapon_m16_clip";
level.weaponClipModels[1] = "weapon_mp5_clip";
level.weaponClipModels[2] = "weapon_ak74u_clip";
level.weaponClipModels[3] = "weapon_ak47_clip";
level.weaponClipModels[4] = "weapon_dragunov_clip";
level.weaponClipModels[5] = "weapon_g36_clip";
level.weaponClipModels[6] = "weapon_saw_clip";
level.weaponClipModels[7] = "weapon_g3_clip";
maps\_load::set_player_viewhand_model( "viewhands_player_sas_woodland" );
setup_flags();
maps\ambush_fx::main();
maps\_load::main();
level thread maps\ambush_amb::main();
maps\_compass::setupMiniMap("compass_map_ambush");
maps\ambush_anim::main();
maps\createart\ambush_art::main();
animscripts\dog_init::initDogAnimations();
level.vehicle_aianimthread[ "hide_attack_left" ] = ::guy_hide_attack_left;
level.vehicle_aianimcheck[ "hide_attack_left" ] = ::guy_hide_attack_left_check;
level.vehicle_aianimthread[ "escape" ] = ::guy_escape;
level.vehicle_aianimcheck[ "escape" ] = ::guy_escape_check;
setignoremegroup( "badguy", "allies" ); // allies ignore badguy
setignoremegroup( "badguy", "axis" ); // axis ignore badguy
// make oblivious ingnored and ignore by everything.
setignoremegroup( "allies", "oblivious" ); // oblivious ignore allies
setignoremegroup( "axis", "oblivious" ); // oblivious ignore axis
setignoremegroup( "player", "oblivious" ); // oblivious ignore player
setignoremegroup( "oblivious", "allies" ); // allies ignore oblivious
setignoremegroup( "oblivious", "axis" ); // axis ignore oblivious
setignoremegroup( "oblivious", "oblivious" ); // oblivious ignore oblivious
level.bmpCannonRange = 2048;
level.bmpMGrange = 1200;
level.bmpMGrangeSquared = level.bmpMGrange * level.bmpMGrange;
level.cosine["180"] = cos(180);
level.ai_friendlyFireBlockDuration = getdvarfloat( "ai_friendlyFireBlockDuration" );
level thread ambush_streetlight();
level thread fixednode_trigger_setup();
level.player thread grenade_notifies();
level thread setup_vehicle_pause_node();
level thread ambush_tower_fall();
level thread detonate_car_setup();
level thread music_control();
// add respawn guys to the squad
array_thread( getentarray( "respawn_guy", "script_noteworthy" ), ::add_spawn_function, ::generic_allied );
level.sm_sunsamplesizenear = GetDvarFloat( "sm_sunsamplesizenear" );
}
#using_animtree( "vehicles" );
uaz_vehicle_anims( positions )
{
positions = maps\_uaz::set_vehicle_anims( positions );
// positions[ 0 ].vehicle_getoutanim = undefined;
positions[ 0 ].vehicle_getoutanim = %ambush_VIP_escape_UAZ;
positions[ 0 ].vehicle_getoutanim_clear = false;
return positions;
}
uaz_vehicle_anims_clear()
{
self clearanim( %ambush_VIP_escape_UAZ, 0 );
}
#using_animtree( "generic_human" );
uaz_anims()
{
positions = maps\_uaz::setanims();
positions[ 0 ].idle = %uaz_driver_idle_drive;
positions[ 0 ].getout = %ambush_VIP_escape_son;
positions[ 0 ].hide_attack_left = %UAZ_Lguy_fire_side_v1;
positions[ 0 ].escape = %uaz_driver_idle_drive;
// positions[ 2 ].idle = %uaz_passenger_idle_drive;
positions[ 2 ].idle = %UAZ_Lguy_idle_hide;
positions[ 2 ].hide_attack_left[0] = %UAZ_Lguy_standfire_side_v3;
positions[ 2 ].hide_attack_left[1] = %UAZ_Lguy_standfire_side_v4;
positions[ 2 ].hide_attack_left_occurrence[0] = 500;
positions[ 2 ].hide_attack_left_occurrence[1] = 500;
positions[ 2 ].escape[0] = %UAZ_Lguy_fire_side_v1;
positions[ 2 ].escape[1] = %UAZ_Lguy_fire_side_v2;
positions[ 2 ].escape_occurrence[0] = 500;
positions[ 2 ].escape_occurrence[1] = 500;
return positions;
}
guy_escape( guy, pos )
{
guy endon( "newanim" );
self endon( "death" );
guy endon( "death" );
animpos = maps\_vehicle_aianim::anim_pos( self, pos );
assert( isdefined( animpos.escape ) );
while ( 1 )
{
if ( isdefined( animpos.escape_occurrence ) )
{
theanim = maps\_vehicle_aianim::randomoccurrance( guy, animpos.escape_occurrence );
maps\_vehicle_aianim::animontag( guy, animpos.sittag, animpos.escape[ theanim ] );
}
else
maps\_vehicle_aianim::animontag( guy, animpos.sittag, animpos.escape );
}
}
guy_escape_check( guy, pos )
{
return isdefined( maps\_vehicle_aianim::anim_pos( self, pos ).escape );
}
guy_hide_attack_left( guy, pos )
{
guy endon( "newanim" );
self endon( "death" );
guy endon( "death" );
animpos = maps\_vehicle_aianim::anim_pos( self, pos );
assert( isdefined( animpos.hide_attack_left ) );
while ( 1 )
{
if ( isdefined( animpos.hide_attack_left_occurrence ) )
{
theanim = maps\_vehicle_aianim::randomoccurrance( guy, animpos.hide_attack_left_occurrence );
maps\_vehicle_aianim::animontag( guy, animpos.sittag, animpos.hide_attack_left[ theanim ] );
}
else
maps\_vehicle_aianim::animontag( guy, animpos.sittag, animpos.hide_attack_left );
}
}
guy_hide_attack_left_check( guy, pos )
{
return isdefined( maps\_vehicle_aianim::anim_pos( self, pos ).hide_attack_left );
}
setup_flags()
{
// stat_flags
flag_init( "aa_takeover" );
flag_init( "aa_ambush" );
flag_init( "aa_hunt" );
flag_init( "aa_village" );
flag_init( "aa_morpheus" );
flag_init( "aa_apartment" );
takeover_flags();
ambush_flags();
village_flags();
morpheus_flags();
apartment_flags();
}
takeover_flags()
{
// takeover
flag_trigger_init( "takeover_danger", getent( "takeover_danger_trigger", "targetname" ) );
flag_trigger_init( "takeover_setup", getent( "takeover_setup", "targetname" ) );
flag_init( "takeover_checkpoint_located" );
flag_trigger_init( "takeover_inplace", getent( "takeover_inplace", "targetname" ) );
flag_trigger_init( "takeover_force", getent( "takeover_boundary", "targetname" ) );
flag_trigger_init( "takeover_advance", getent( "takeover_boundary", "targetname" ) );
flag_init( "takeover_done" );
flag_init( "takeover_briefing_done" );
flag_init( "takeover_fade" );
flag_init( "takeover_fade_clear" );
flag_init( "takeover_fade_done" );
}
ambush_flags()
{
// ambush
flag_init( "caravan_on_the_move" );
flag_init( "ambush_mission_fail" );
flag_init( "ambush_early_start" );
flag_init( "ambush_vehicles_inplace" );
flag_init( "ambush_badguy_spotted" );
flag_init( "ambush_rocket" );
flag_init( "ambush_start" );
flag_init( "ambush_rear_bmp_destroyed" );
flag_init( "ambush_truck_hit" );
flag_init( "ambush_tower_fall" );
flag_init( "ambush_switch_tower" );
flag_init( "ambush_recovered" );
flag_init( "player_tower_hits_ground" );
flag_init( "son_of_zakhaev_money_shot" );
}
village_flags()
{
flag_init( "village_helicopter_greeting" );
flag_trigger_init( "village_gasstation", getent( "village_gasstation", "targetname" ), true );
flag_trigger_init( "junkyard_exit", getent( "junkyard_exit", "targetname" ) );
flag_trigger_init( "village_road", getent( "village_road", "targetname" ) );
flag_trigger_init( "village_approach", getent( "village_approach", "targetname" ) );
flag_init( "village_defend" );
flag_trigger_init( "village_retreat", getent( "village_retreat", "targetname" ) );
flag_trigger_init( "village_force_escape", getent( "village_force_escape", "targetname" ) );
flag_trigger_init( "village_wrong_way", getent( "village_wrong_way", "targetname" ) );
flag_trigger_init( "village_past_alley", getent( "village_past_alley", "targetname" ) );
flag_init( "village_badguy_escape" );
flag_init( "village_alley" );
}
morpheus_flags()
{
flag_trigger_init( "morpheus_quick_start", getent( "morpheus_quick_start", "targetname" ) );
flag_trigger_init( "morpheus_dumpster", getent( "morpheus_dumpster", "targetname" ) );
flag_trigger_init( "morpheus_green_car", getent( "morpheus_green_car", "targetname" ) );
flag_trigger_init( "morpheus_iron_fence", getent( "morpheus_iron_fence", "targetname" ) );
flag_init( "morpheus_iron_fence_fight" );
flag_trigger_init( "morpheus_flanker", getent( "morpheus_flanker", "targetname" ) );
flag_trigger_init( "morpheus_rpg", getent( "morpheus_rpg", "targetname" ) );
flag_trigger_init( "morpheus_2nd_floor", getent( "morpheus_2nd_floor", "targetname" ) );
flag_trigger_init( "morpheus_single", getent( "morpheus_single", "targetname" ) );
flag_trigger_init( "morpheus_target", getent( "morpheus_target", "targetname" ) );
flag_trigger_init( "morpheus_target_moving", getent( "morpheus_target_moving", "targetname" ) );
flag_trigger_init( "morpheus_alley", getent( "morpheus_alley", "targetname" ) );
}
apartment_flags()
{
flag_trigger_init( "apartment_start", getent( "apartment_start", "targetname" ) );
flag_trigger_init( "apartment_badguy_run", getent( "apartment_badguy_run", "targetname" ) );
flag_trigger_init( "apartment_fire", getent( "apartment_fire", "targetname" ) );
flag_init( "apartment_heli_attack" );
flag_init( "apartment_heli_firing" );
flag_init( "apartment_mg_destroyed" );
flag_trigger_init( "apartment_badguy_attack", getent( "apartment_badguy_attack", "targetname" ) );
flag_trigger_init( "apartment_inside", getent( "apartment_inside", "targetname" ) );
flag_trigger_init( "apartment_badguy_3rd_flr", getent( "apartment_badguy_3rd_flr", "targetname" ) );
flag_trigger_init( "apartment_mg_4th_flr", getent( "apartment_mg_4th_flr", "targetname" ) );
flag_init( "apartment_mg_destroyed_2" );
flag_init( "apartment_clear" );
flag_init( "gaz_shouts_at_zakhaev" );
flag_trigger_init( "apartment_roof", getent( "apartment_roof", "targetname" ) );
flag_trigger_init( "apartment_roof_friendlies", getent( "apartment_roof_friendlies","targetname" ) );
flag_trigger_init( "apartment_stairs", getent( "apartment_stairs", "targetname" ) );
flag_trigger_init( "apartment_suicide", getent( "apartment_suicide", "targetname" ) );
flag_init( "obj_flexicuff" );
flag_trigger_init( "stage1", getent( "stage1", "targetname" ) );
flag_trigger_init( "stage2", getent( "stage2", "targetname" ) );
flag_trigger_init( "stage3", getent( "stage3", "targetname" ) );
flag_init( "forced_suicide" );
flag_init( "timed_suicide" );
flag_init( "apartment_suicide_done" );
flag_init( "mission_done" );
}
aarea_takeover_init()
{
delayThread( 1.5, ::activate_trigger_with_targetname, "start_color_init" );
flag_set( "aa_takeover" );
battlechatter_off( "allies" );
battlechatter_off( "axis" );
setExpFog( 600, 2500, 0.690196, 0.721569, 0.67451, 0 );
set_vision_set ( "ambush_start", 0 );
normal_sunlight = 1.5;
start_sunlight = 0.58312;
ratio = ( normal_sunlight / start_sunlight );
r = 0.980392;
g = 0.960784;
b = 0.882353;
r = r / ratio;
g = g / ratio;
b = b / ratio;
//iprintlnbold ("ratio: "+ ratio );
//iprintlnbold ("sunlight: "+ r + " " + g + " " + b );
SetSunLight (r, g, b);
setsaveddvar( "r_specularcolorscale", "1.24265" );
// turn village triggers off.
array_thread( getentarray( "village_trigger", "script_noteworthy" ) , ::trigger_off );
setup_friendlies( 3 );
level.player set_playerspeed( 130 );
array_thread( level.squad, ::enable_cqbwalk );
array_thread( get_generic_allies(), ::replace_on_death );
level thread guardtower_dead_enemies();
level thread takeover_player();
level thread takeover_objective();
level thread takeover_setup();
level thread takeover_attack();
level thread takeover_clear_roof();
level thread takeover_fade();
array_thread( getentarray( "checkpoint_guy", "targetname" ), ::add_spawn_function, ::checkpoint_guy );
scripted_array_spawn( "checkpoint_guy", "targetname", true );
flag_wait( "takeover_fade" );
flag_clear( "aa_takeover" );
level thread aarea_ambush_init();
}
guardtower_dead_enemies()
{
flag_wait( "takeover_fade_clear" );
drone = [];
drone[0] = spawn( "script_model", (0,0,0) );
drone[1] = spawn( "script_model", (0,0,0) );
drone[0] character\character_sp_opforce_geoff::main();
drone[0].animname = "generic";
drone[0] UseAnimTree( #animtree );
drone[1] character\character_sp_opforce_c::main();
drone[1].animname = "generic";
drone[1] UseAnimTree( #animtree );
locations = getentarray( "dead_enemies", "script_noteworthy" );
for( i = 0 ; i < drone.size ; i ++ )
{
locations[i] anim_first_frame_solo( drone[i], "death_pose_" + i );
drone[i] linkto( locations[i] );
}
}
takeover_objective()
{
wait 8;
checkpoint = getent( "obj_checkpoint", "targetname" );
objective_add( 0, "active", &"AMBUSH_OBJ_CHECKPOINT", checkpoint.origin );
objective_current( 0 );
flag_wait_either( "takeover_checkpoint_located", "takeover_force" );
objective_state( 0, "done" );
if ( !flag( "takeover_force" ) )
{
dumpster = getent( "obj_dumpster", "targetname" );
objective_add( 1, "active", &"AMBUSH_OBJ_GET_IN_POSITION", dumpster.origin);
objective_current( 1 );
}
flag_wait( "takeover_force" );
waittill_dead_or_dying( get_ai_group_ai( "tower_guy" ), undefined, 4 );
if ( flag( "takeover_checkpoint_located" ) )
objective_state( 1, "done" );
objective_add( 2, "active", &"AMBUSH_OBJ_SECURE_CHECKPOINT", checkpoint.origin);
objective_current( 2 );
flag_wait( "takeover_done" );
arcademode_checkpoint( 3.5, 1 );
objective_state( 2, "done" );
}
takeover_player()
{
flag_wait( "takeover_danger" );
level thread set_flag_on_player_action( "takeover_force", true, true);
flag_wait( "takeover_force" );
level.player set_playerspeed( 190, 3 );
}
takeover_setup()
{
level endon( "takeover_force" );
wait 4;
level.kamarov.animname = "kamarov";
level.kamarov anim_single_queue( level.kamarov, "ambush_kmr_bestwayin" );
level.kamarov.animname = "generic";
level.price anim_single_queue( level.price, "ambush_pri_notbad" );
level radio_dialogue_queue( "ambush_mhp_radiojammers" );
getent( "gate_open", "targetname" ) hide();
getent( "rear_blocker_open", "targetname" ) hide();
flag_wait( "takeover_setup" );
autosave_by_name( "dumpster" );
flag_set( "takeover_checkpoint_located" );
level.price anim_single_queue( level.price, "ambush_pri_onmymark" );
level.price waittill( "goal" );
activate_trigger_with_targetname( "takeover_setup_color_init" );
flag_wait( "takeover_inplace" );
level.price thread anim_single_queue( level.price, "ambush_pri_takethemout" );
wait 7;
level.price thread anim_single_queue( level.price, "ambush_pri_cleartower" );
wait 7;
flag_set( "takeover_force" );
}
takeover_attack()
{
flag_wait( "takeover_force" );
blocker = getent( "takeout_path_blocker", "targetname" );
blocker connectpaths();
blocker delete();
array_thread( getentarray( "takeover_trigger", "script_noteworthy" ) , ::trigger_off );
activate_trigger_with_targetname( "takeover_attack_color_init" );
level.price thread anim_single_queue( level.price, "ambush_pri_movemove" );
// todo: fit this in here. - done
level.price thread anim_single_queue( level.price, "ambush_pri_goloud" );
battlechatter_on( "allies" );
battlechatter_on( "axis" );
activate_trigger_with_targetname( "takeover_attack_color_init" );
flag_wait_or_timeout( "takeover_advance", 10 );
activate_trigger_with_targetname( "takeover_advance_color_init" );
axis = getaiarray( "axis" );
waittill_dead_or_dying( axis, axis.size - 3 );
if ( isdefined( getent( "takeover_diner_color_init", "targetname" ) ) )
{
activate_trigger_with_targetname( "takeover_diner_color_init" );
getent( "takeover_diner_color_init", "targetname" ) trigger_off();
}
axis = getaiarray( "axis" );
waittill_dead_or_dying( axis );
array_thread( level.squad, ::disable_cqbwalk );
activate_trigger_with_targetname( "takeover_hero_clear_color_init" );
wait 2;
level.mark thread anim_single_queue( level.mark, "ambush_grg_areasecure" );
activate_trigger_with_targetname( "takeover_clear_color_init" );
level thread takeover_briefing();
wait 2;
flag_set( "takeover_done" );
}
takeover_briefing()
{
level.price disable_ai_color();
actors[0] = level.price;
actors[1] = level.kamarov;
anim_ent = getent( "cleanup_animent", "targetname" );
anim_ent anim_reach_and_approach( actors, "tower_briefing" );
level thread takeover_briefing_dialogue();
anim_ent anim_single( actors, "tower_briefing" );
level.price setgoalpos( level.price.origin );
level.kamarov setgoalpos( level.kamarov.origin );
flag_set( "takeover_briefing_done" );
}
takeover_briefing_dialogue()
{
level.price waittillmatch( "single anim", "dialog" );
level.price waittillmatch( "single anim", "dialog" );
level.price waittillmatch( "single anim", "dialog" );
wait 2.5;
flag_set( "takeover_fade" );
}
takeover_clear_roof()
{
trigger = getent( "clear_roof", "targetname" );
trigger waittill( "trigger" );
array_thread( get_ai_group_ai( "roof_guy" ), ::kill_ai, 0, 5 );
}
takeover_fade()
{
flag_wait( "takeover_fade" );
black = create_overlay_element( "black", 0 );
black fadeovertime( 2 );
black.alpha = 1;
thread hud_hide();
wait 2;
level.player FreezeControls( true );
flag_wait( "takeover_fade_clear" );
hud_string();
black fadeovertime( 4 );
black.alpha = 0;
level.player FreezeControls( false );
wait 2;
thread hud_hide( false );
wait 2;
black destroy();
flag_set( "takeover_fade_done" );
}
hud_string()
{
hud_string = createFontString( "objective", 1.5 );
hud_string.sort = 3;
hud_string.glowColor = ( 0.7, 0.7, 0.3 );
hud_string.glowAlpha = 1;
hud_string SetPulseFX( 60, 3500, 700 );
hud_string.foreground = true;
hud_string setPoint( "BOTTOM", undefined, 0, -150 );
hud_string setText( &"AMBUSH_TWO_HOURS_LATER" );
wait 5;
hud_string destroy();
}
checkpoint_guy()
{
self endon( "death" );
if ( isdefined( self.script_aigroup ) && self.script_aigroup == "tower_guy" )
self setflashbangimmunity( true );
self setthreatbiasgroup( "oblivious" );
flag_wait( "takeover_force" );
wait 0.5;
self setthreatbiasgroup( "axis" );
self.fixednode = false;
}
aarea_ambush_init()
{
level thread ambush_mark();
setculldist( 8000 );
battlechatter_off( "allies" );
battlechatter_off( "axis" );
ambush_setup();
autosave_by_name( "ambush" );
flag_set( "aa_ambush" );
blocker = getent( "rear_blocker", "targetname" );
blocker connectpaths();
blocker delete();
getent( "rear_blocker_open", "targetname" ) show();
getent( "badguy", "script_noteworthy" ) add_spawn_function( ::ambush_badguy_spawn_function );
getent( "badguy_passanger", "script_noteworthy" ) add_spawn_function( ::ambush_badguy_passanger_spawn_function );
activate_trigger_with_targetname( "ambush_enemy_color_init" );
level thread ambush_player_interrupt();
level thread ambush_helicopter();
level thread ambush_objective();
level thread ambush_price();
level thread ambush_steve();
level thread ambush_rockets();
level thread ambush_caravan();
flag_wait( "ambush_recovered" );
flag_clear( "aa_ambush" );
level thread aarea_village_init();
}
ambush_player_interrupt()
{
level endon( "ambush_rocket" );
level thread ambush_mission_fail();
vnode = getvehiclenode( "caravan_approach", "script_noteworthy" );
vnode waittill( "trigger" );
level thread set_flag_on_player_action( "ambush_mission_fail", false, true);
flag_wait( "ambush_vehicles_inplace" );
level thread set_flag_on_player_action( "ambush_early_start", false, true);
flag_wait( "ambush_early_start" );
flag_set( "ambush_start" );
flag_set( "ambush_rocket" );
}
ambush_mission_fail()
{
level endon( "ambush_vehicles_inplace" );
flag_wait( "ambush_mission_fail" );
setdvar( "ui_deadquote", "@AMBUSH_MISSIONFAIL_STARTED_EARLY" );
maps\_utility::missionFailedWrapper();
}
ambush_helicopter()
{
flag_wait( "ambush_start" );
level.helicopter = maps\_vehicle::spawn_vehicle_from_targetname( "blackhawk" );
struct = getstruct( level.helicopter.target, "targetname" );
level.helicopter thread heli_path_speed();
level.helicopter sethoverparams( 150, 120, 60);
struct = getstruct( "rocket_attack", "script_noteworthy" );
struct waittill( "trigger" );
level.helicopter setVehWeapon( "hunted_crash_missile" );
level.helicopter setturrettargetent( level.rear_bmp );
level.rear_bmp maps\_vehicle::godoff();
level.helicopter fireweapon( "tag_barrel", level.rear_bmp, ( 0,0,0 ) );
wait 0.5;
missile = level.helicopter fireweapon( "tag_barrel", level.rear_bmp, ( 0,0,0 ) );
assert( isdefined( missile ) );
missile waittill( "death" );
if ( isalive( level.rear_bmp ) )
level.rear_bmp notify( "death" );
flag_set( "ambush_rear_bmp_destroyed" );
}
ambush_objective()
{
flag_wait( "takeover_fade_done" );
objective_add( 3, "active", &"AMBUSH_OBJ_AMBUSH_CONVOY", level.player.origin );
objective_current( 3 );
flag_wait( "ambush_start" );
objective_state( 3, "done" );
}
ambush_badguy_spawn_function()
{
level.badguy = self;
self.name = "V. Zakhaev";
self set_battlechatter( false );
self setthreatbiasgroup( "oblivious" );
self set_ignoreSuppression( true );
self.a.disablePain = true;
self.grenadeawareness = 0;
self.allowdeath = true;
self.deathanim = %death_stand_dropinplace;
self thread badguy_died( 10 );
self setFlashbangImmunity( true );
self.script_immunetoflash = true;
flag_wait( "ambush_switch_tower" );
self thread magic_bullet_shield();
level.badguy animscripts\shared::placeWeaponOn( level.badguy.secondaryweapon, "right" );
level.badguy_jeep waittill( "death" );
self unlink();
node = getnode( "ambush_badguy_path", "targetname" );
self thread maps\_spawner::go_to_node( node );
self waittill( "reached_path_end" );
self notify( "stop_death_fail" );
self stop_magic_bullet_shield();
self delete();
}
ambush_badguy_passanger_spawn_function()
{
self setthreatbiasgroup( "oblivious" );
self.allowdeath = true;
self.deathanim = %death_stand_dropinplace;
self waittill( "jumpedout" );
self setthreatbiasgroup( "axis" );
self.deathanim = undefined;
}
driver_death()
{
self endon( "death" );
self.deathanim = %crouch_death_clutchchest;
flag_wait( "ambush_vehicles_inplace" );
self.allowdeath = true;
flag_wait( "ambush_rocket" );
wait 1.2;
self die();
}
ambush_caravan()
{
array_thread( getentarray( "drivers", "script_noteworthy" ), ::add_spawn_function, ::driver_death );
wait 8;
vehicles = maps\_vehicle::scripted_spawn( 0 );
wait 0.1;
level.badguy_jeep = undefined;
level.rear_truck = undefined;
level.bm21 = undefined;
level.middle_bm21 = undefined;
level.bmp = undefined;
level.rear_bmp = undefined;
for( i = 0 ; i < vehicles.size ; i ++ )
{
thread maps\_vehicle::gopath( vehicles[i] );
if ( !isdefined( vehicles[i].script_noteworthy ) )
continue;
else if ( vehicles[i].script_noteworthy == "ambush_jeep" )
level.badguy_jeep = vehicles[i];
else if ( vehicles[i].script_noteworthy == "rear_truck" )
level.rear_truck = vehicles[i];
if ( vehicles[i].script_noteworthy == "bm21" )
level.bm21 = vehicles[i];
if ( vehicles[i].script_noteworthy == "middle_bm21" )
level.middle_bm21 = vehicles[i];
if ( vehicles[i].script_noteworthy == "bmp" )
level.bmp = vehicles[i];
if ( vehicles[i].script_noteworthy == "rear_bmp" )
level.rear_bmp = vehicles[i];
}
level.badguy_jeep maps\_vehicle::godon();
level.vehicle_ResumeSpeed = 20;
vnode = getvehiclenode( "bm21_inplace", "script_noteworthy" );
vnode waittill( "trigger" );
flag_set( "ambush_vehicles_inplace" );
flag_wait( "ambush_rocket" );
flag_wait_or_timeout( "ambush_start", 1 );
battlechatter_on( "allies" );
battlechatter_on( "axis" );
level.bm21 notify( "unload", "all" );
level.middle_bm21 notify( "unload", "passengers" );
level.rear_bmp thread ambush_bmp_attack();
wait 1;
level.badguy_jeep notify( "groupedanimevent","hide_attack_left" );
flag_wait( "ambush_rear_bmp_destroyed" );
wait 1;
activate_trigger_with_noteworthy( "ambush_extra_enemies" );
wait 3;
activate_trigger_with_targetname( "jeep_vehiclegate" );
level.badguy_jeep notify( "groupedanimevent","escape" );
}
ambush_streetlight()
{
streetlight = getent( "streetlight", "targetname" );
ents = getentarray( streetlight.target, "targetname" );
if ( ents[0].classname == "script_model" )
{
end_angles = ents[0].angles;
end_origin = ents[0].origin;
ents[0] delete();
ents[1] linkto( streetlight );
}
else
{
end_angles = ents[1].angles;
end_origin = ents[1].origin;
ents[1] delete();
ents[0] linkto( streetlight );
}
vnode = getvehiclenode( "streetlight_hit", "script_noteworthy" );
vnode waittill( "trigger" );
streetlight rotateto( end_angles, 0.3, 0, 0.1 );
streetlight moveto( end_origin, 0.3, 0, 0.1 );
vnode = getvehiclenode( "truck_hit", "script_noteworthy" );
vnode waittill( "trigger" );
level.middle_bm21 JoltBody( ( level.middle_bm21.origin + (0,0,64) ), 2 );
}
ambush_bmp_attack()
{
self endon( "death" );
ent = getent( "bmp_target", "targetname" );
level.rear_bmp thread bmp_pan_target( ent );
level.rear_bmp waittill("turret_on_target");
while ( true )
{
level.rear_bmp fireweapon();
wait 0.1;
}
}
bmp_pan_target( ent )
{
self setturrettargetent( ent );
self waittill("turret_on_target");
while( isdefined( ent.target ) )
{
wait 0.5;
ent = getent( ent.target, "targetname" );
self setturrettargetent( ent );
self waittill("turret_on_target");
}
}
ambush_rockets()
{
flag_wait( "ambush_rocket" );
ai = get_ai_group_ai( "rocket_man" );
ai = get_array_of_closest( level.rear_truck.origin , ai );
target1 = getent( "rpg_target1", "targetname" ); // BMP
target2 = getent( "rpg_target2", "targetname" ); // rear BM21
ai[0] notify( "end_patrol" );
ai[0] set_ignoreSuppression( true );
ai[0] setgoalnode( getnode( "bmp_attack_node", "targetname" ) );
ai[0] setstablemissile( true );
ai[0].goalradius = 32;
ai[0] setentitytarget( target1 );
ai[0].a.rockets = 1;
ai[0].maxSightDistSqrd = 8192*8192;
level.bmp thread destroy_rocket_target( ai[0] );
level.bmp maps\_vehicle::godoff();
ai[1] notify( "end_patrol" );
ai[1] set_ignoreSuppression( true );
ai[1] setgoalnode( getnode( "rear_truck_attack_node", "targetname" ) );
ai[1] setstablemissile( true );
ai[1].goalradius = 32;
ai[1] setentitytarget( target2 );
ai[1].a.rockets = 1;
ai[1].maxSightDistSqrd = 8192*8192;
level.rear_truck thread destroy_rocket_target( ai[1] );
level.rear_truck maps\_vehicle::godoff();
}
destroy_rocket_target( ai )
{
while ( true )
{
self waittill( "damage", damage, attacker );
if ( attacker == ai )
{
flag_set( "ambush_start" );
ai clearenemy();
ai setthreatbiasgroup( "allies" );
ai stop_magic_bullet_shield();
if ( isalive( self ) )
self notify( "death" );
break;
}
}
}
ambush_price()
{
wait 6;
level radio_dialogue_queue( "ambush_mhp_enemyconvoy" );
// todo: switch on dialogue I think - done
level.price thread anim_single_queue( level.price, "ambush_pri_nobodyfires" );
// level.price anim_single_queue( level.price, "ambush_pri_copythat" );
// level.price anim_single_queue( level.price, "ambush_pri_targetinjeep" );
// level.price thread anim_single_queue( level.price, "ambush_pri_youknow" );
flag_set( "caravan_on_the_move" );
level thread ambush_price_leadup();
flag_wait_either( "ambush_rocket", "ambush_early_start" );
activate_trigger_with_targetname( "ambush_attack_color_init" );
// todo: switch on dialogue. - done
level.price thread anim_single_queue( level.price, "ambush_pri_smokeem" );
// level.price thread anim_single_queue( level.price, "ambush_pri_go" );
flag_wait_or_timeout( "ambush_start", 3 );
level.price setthreatbiasgroup( "allies" );
level.player setthreatbiasgroup( "player" );
}
ambush_price_leadup()
{
level endon( "ambush_early_start" );
flag_wait( "ambush_badguy_spotted" );
// todo: switch on dialogue. - done
level.price thread anim_single_queue( level.price, "ambush_pri_targetinjeep" );
// level.price anim_single_queue( level.price, "ambush_pri_thirdfront" );
level.price anim_single_queue( level.price, "ambush_pri_takealive" );
level.price anim_single_queue( level.price, "ambush_pri_standby" );
flag_set( "ambush_rocket" );
}
ambush_mark()
{
flag_wait( "takeover_fade_clear" );
wait 2.5;
level.mark pushplayer( true );
level.mark.a.disablePain = true;
level.mark setFlashbangImmunity( true );
// level.mark anim_single_queue( level.mark, "ambush_grg_blackrussian" );
level.mark anim_single_queue( level.mark, "ambush_grg_likeaclown" );
level.mark anim_single_queue( level.mark, "ambush_grg_nothinglikerussian" );
flag_wait( "ambush_rocket" );
ent = getent( "ambush_mark_target", "targetname" );
level.mark setentitytarget( ent, 1 );
flag_wait_or_timeout( "ambush_start", 4 );
level.mark clearenemy();
// make group1 hate group2
setthreatbias( "group2", "group1", 100000 );
level.mark setthreatbiasgroup( "group1" );
ai = get_ai_group_ai( "mark_targets" );
for( i = 0 ; i < ai.size ; i ++ )
{
ai[i] setthreatbiasgroup( "group2" );
}
flag_wait( "ambush_truck_hit" );
level.mark anim_single_queue( level.mark, "ambush_grg_hittower" );
flag_wait( "ambush_tower_fall" );
level.mark setthreatbiasgroup( "oblivious" );
if ( randomint( 2 ) )
level.mark anim_single_queue( level.mark, "ambush_grg_ohno1" );
else
level.mark anim_single_queue( level.mark, "ambush_grg_ohno2" );
level.mark set_run_anim( "sprint" );
flag_wait( "ambush_recovered" );
level.mark setthreatbiasgroup( "allies" );
level.mark.a.disablePain = false;
level.mark pushplayer( false );
level.mark setFlashbangImmunity( false );
}
ambush_setup()
{
flag_wait( "takeover_briefing_done" );
level notify( "putout_fires" );
thread maps\_utility::set_ambient("exterior_norain");
ent = getent( "player_outofsight", "targetname" );
level.player setorigin ( ent.origin );
level.player setplayerangles ( ent.angles );
flag_set( "takeover_fade_clear" );
wait 0.1;
node = getnode( "startnodeprice_ambush", "targetname" );
level.price notify( "killanimscript" );
level.price teleport ( node.origin, node.angles );
level.price setthreatbiasgroup( "oblivious" );
level.price set_force_color( "o" );
node = getnode( "startnodemark_ambush", "targetname" );
level.mark notify( "killanimscript" );
level.mark teleport ( node.origin, node.angles );
level.mark setthreatbiasgroup( "oblivious" );
level.steve stop_magic_bullet_shield();
level.steve delete();
level.steve = scripted_spawn( "ambush_steve", "targetname", true );
level.steve thread magic_bullet_shield();
level.steve.animname = "steve";
level.steve.name = "Gaz";
level.steve thread squad_init();
level.steve setthreatbiasgroup( "oblivious" );
level.steve.pacifist = true;
level.steve.a.lastshoottime = gettime();
level.steve.team = "allies";
level.steve.voice = "british";
level.steve set_battlechatter( false );
level.steve.ignoreme = true;
level.steve.maxSightDistSqrd = 4;
level.steve.no_ir_beacon = true;
node = getnode( "startnodesteve_ambush", "targetname" );
level.steve notify( "killanimscript" );
level.steve teleport ( node.origin, node.angles );
level.steve setthreatbiasgroup( "oblivious" );
ambush_setup_enemy_allies();
node = getnode( "startnodeplayer_ambush", "targetname" );
level.player setorigin ( node.origin );
level.player setplayerangles ( node.angles + (13,0,0) );
level.player setthreatbiasgroup( "oblivious" );
activate_trigger_with_targetname( "ambush_setup_color_init" );
if ( level.player HasWeapon( "remington700" ) )
{
level.player takeweapon( "remington700" );
level.player giveweapon( "rpd" );
level.player switchToWeapon( "rpd" );
}
level.player setViewmodel( "viewhands_op_force" );
level.player disableweapons();
delete_dropped_weapons();
clearallcorpses();
getent( "gate_open", "targetname" ) show();
getent( "gate_closed", "targetname" ) hide();
setExpFog(2000, 5500, .462618, .478346, .455313, 0);
set_vision_set( "ambush", 0 );
ResetSunLight();
setsaveddvar( "r_specularcolorscale", "1" );
setsaveddvar( "sm_sunsamplesizenear", 0.45 );
flag_wait( "takeover_fade_done" );
level.player enableweapons();
}
ambush_setup_enemy_allies()
{
level.names_copies = [];
generic = get_generic_allies();
for ( i=0; i < generic.size; i++ )
{
level.names_copies[ level.names_copies.size ] = generic[i].name;
generic[i] disable_replace_on_death();
generic[i] delete();
}
// need this here so that deleted ai get removed from level.squad
waittillframeend;
array_thread( getentarray( "ambush_allied_axis", "targetname" ), ::add_spawn_function, ::ambush_allied_axis_spawnfunc );
scripted_array_spawn( "ambush_allied_axis", "targetname", true );
array_thread( getentarray( "ambush_allied", "targetname" ), ::add_spawn_function, ::ambush_allied_spawnfunc );
scripted_array_spawn( "ambush_allied", "targetname", true );
}
ambush_allied_axis_spawnfunc()
{
self setthreatbiasgroup( "oblivious" );
self.pacifist = true;
self.a.lastshoottime = gettime();
self.team = "allies";
self.voice = "russian";
self set_battlechatter( false );
self.ignoreme = true;
self.maxSightDistSqrd = 4;
self.no_ir_beacon = true;
self thread magic_bullet_shield();
if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "delay_guy" )
self thread ambush_delay();
if ( level.names_copies.size > 0 )
{
self.name = level.names_copies[ level.names_copies.size - 1 ];
level.names_copies = array_remove( level.names_copies, self.name );
}
else
self maps\_names::get_name();
self thread generic_allied();
flag_wait( "ambush_rocket" );
flag_wait_or_timeout( "ambush_start", 2 );
if ( !isdefined( self.script_aigroup ) || self.script_aigroup != "rocket_man" )
self stop_magic_bullet_shield();
self.pacifist = false;
self.ignoreme = false;
self.maxSightDistSqrd = 8192*8192;
if ( self.script_aigroup == "ground_man_upper" )
{
self setthreatbiasgroup( "allies" );
self set_force_color( "r" );
}
if ( self.script_aigroup == "ground_man_lower" )
{
self setthreatbiasgroup( "allies" );
self set_force_color( "c" );
}
}
ambush_steve()
{
level endon( "ambush_early_start" );
level thread ambush_steve_fight();
level.steve set_goalnode( getnode( "steve_ambush_node", "targetname" ) );
old_grenadeawareness = level.steve.grenadeawareness;
level.steve.grenadeawareness = 0;
flag_wait( "ambush_vehicles_inplace" );
level.steve thread maps\_patrol::patrol( "caravan_walkby" );
ent = getent( "badguy_spotted", "script_noteworthy" );
ent waittill( "trigger" );
level.steve.grenadeawareness = old_grenadeawareness;
level.steve anim_single_queue( level.steve, "ambush_gaz_visualtarget" );
flag_set( "ambush_badguy_spotted" );
}
ambush_steve_fight()
{
flag_wait( "ambush_rocket" );
level.steve notify( "end_patrol" );
level.steve set_force_color( "c" );
wait 4;
level.steve setthreatbiasgroup( "allies" );
flag_wait( "ambush_rear_bmp_destroyed" );
wait 3;
level.steve anim_single_queue( level.steve, "ambush_gaz_gotcompany" );
}
ambush_delay()
{
self endon( "death" );
vnode = getvehiclenode( "delay_node", "script_noteworthy" );
vnode waittill( "trigger" );
wait 0.5;
self maps\_patrol::patrol( "delay_path" );
flag_wait( "ambush_vehicles_inplace" );
flag_wait( "ambush_rocket" );
wait 1;
ent = getent( "delay_fire_target", "targetname" );
self setentitytarget( ent );
self.maxSightDistSqrd = 8192*8192;
wait 1;
self clearenemy();
self set_force_color( "c" );
wait 5;
self setthreatbiasgroup( "allies" );
}
ambush_delay_dialogue()
{
russian = level.middle_bm21.riders[0];
if ( !isalive( russian ) )
return;
level endon( "ambush_start" );
russian endon( "death" );
self endon( "death" );
russian.animname = "russian";
self.animname = "loyalist";
self anim_single_queue( self, "ambush_ru2_papersplease" );
wait 0.5;
russian anim_single_queue( russian, "ambush_ru1_paperswhatpapers" );
russian anim_single_queue( russian, "ambush_ru1_fatpolitician" );
wait 0.5;
russian anim_single_queue( russian, "ambush_ru1_whatareyouwaitingfor" );
wait 0.5;
self anim_single_queue( self, "ambush_ru2_illdothatrightnow" );
}
ambush_allied_spawnfunc()
{
self endon( "death" );
self thread generic_allied();
self setthreatbiasgroup( "oblivious" );
flag_wait( "ambush_rocket" );
self setthreatbiasgroup( "allies" );
}
ambush_tower_fall()
{
guard_tower_blocker = getent( "guard_tower_blocker", "script_noteworthy" );
guard_tower_blocker notsolid();
guard_tower = getent( "guard_tower", "targetname" );
parts = getentarray( "guard_tower_part", "targetname" );
for( i = 0 ; i < parts.size ; i ++ )
{
parts[i] linkto( guard_tower );
}
guard_tower_d = getentarray( "guard_tower_d", "targetname" );
array_thread( guard_tower_d, ::ambush_tower_swap );
flag_wait( "takeover_fade_clear" );
guard_tower_blocker solid();
flag_wait( "takeover_fade_done" );
vnode = getvehiclenode( "collision_imminent", "script_noteworthy" );
vnode waittill( "trigger", vehicle );
vehicle playsound( "ambush_jeep_skid" );
flag_set( "ambush_truck_hit" );
vnode = getvehiclenode( "tower_collision", "script_noteworthy" );
vnode waittill( "trigger", vehicle );
vehicle playsound( "ambush_car_crash" );
guard_tower playsound( "ambush_tower_crash" );
level.mark linkto( guard_tower );
flag_set( "ambush_tower_fall" );
earthquake( 0.1, 0.5, level.player.origin, 400 );
guard_tower rotateto( ( 5,0,0 ), 0.5, 0, 0.5 );
wait 0.5;
guard_tower rotateto( ( 2,0,5 ), 1, 0.7, 0.3 );
wait 1;
guard_tower rotateto( ( 0,0,-2 ), 0.7, 0.5, 0.2 );
wait 0.7;
guard_tower rotateto( ( 0,20,90 ), 1.7, 1.7, 0 );
wait 1.65;
level.mark unlink();
flag_set( "player_tower_hits_ground" );
level thread ambush_tower_blackout();
wait 1;
for( i = 0 ; i < parts.size ; i ++ )
{
parts[i] unlink();
parts[i] delete();
}
guard_tower delete();
sandbags = getentarray( "guard_tower_sandbags", "targetname" );
for( i = 0 ; i < sandbags.size ; i ++ )
sandbags[i] delete();
flag_set( "ambush_switch_tower" );
}
ambush_tower_swap()
{
self hide();
if ( self.classname == "script_brushmodel" )
{
self connectpaths();
self notsolid();
}
flag_wait( "ambush_switch_tower" );
if ( self.classname == "script_brushmodel" )
{
self solid();
self disconnectpaths();
}
self show();
}
ambush_tower_blackout()
{
level.player setthreatbiasgroup( "oblivious" );
black = create_overlay_element( "black", 1 );
level.player shellshock( "default", 20 );
ent = getent( "player_outofsight", "targetname" );
level.player setorigin ( ent.origin );
level.player setplayerangles ( ent.angles );
level.player EnableInvulnerability();
wait 1;
node = getnode( "startnodemark_village", "targetname" );
level.mark notify( "killanimscript" );
level.mark teleport( node.origin, node.angles );
player_origin = ( -439, -197, 9 );
player_angles = ( -25, 40, 0 );
level.player setorigin( player_origin );
level.player setplayerangles( player_angles );
// teleport player and lock him to a view. Same as in aftermath. Even do the view movement.
level.player setstance( "prone" );
level.player disableweapons();
level.player allowstand( false );
level.player allowcrouch( false );
level.player freezeControls( true );
wait 1;
setsaveddvar( "sm_sunsamplesizenear", level.sm_sunsamplesizenear );
black fadeovertime( 3 );
black.alpha = 0;
thread ambush_recover();
wait 2;
level.badguy_jeep notify( "unload", "all" );
exploder(1);
wait 7;
level.badguy_jeep uaz_vehicle_anims_clear();
level.badguy_jeep notify( "death" );
flag_set( "son_of_zakhaev_money_shot" );
wait 10;
black destroy();
level.player freezeControls( false );
level.player allowstand( true );
level.player allowcrouch( true );
flag_set( "ambush_recovered" );
wait 2;
level.player enableweapons();
level.player DisableInvulnerability();
level.player setthreatbiasgroup( "player" );
}
ambush_recover()
{
ground_ref_ent = spawn( "script_model", (0,0,0) );
level.player playerSetGroundReferenceEnt( ground_ref_ent );
motion = [];
motion[0]["angles"] = ( 10, -40, -10 );
motion[0]["time"] = ( 0, 0, 0 );
motion[1]["angles"] = ( 0, 25, 0 );
motion[1]["time"] = ( 3.3, 3.3, 0 );
motion[2]["angles"] = ( -5, 30, 3 );
motion[2]["time"] = ( 1, 0, 1 );
motion[3]["angles"] = ( -1, 30, -3 );
motion[3]["time"] = ( 3, 3, 0 );
motion[4]["angles"] = ( 0, 30, -4 );
motion[4]["time"] = ( 1, 0, 1 );
motion[5]["angles"] = ( -3, 28, -2 );
motion[5]["time"] = ( 0.65, 0.65, 0 );
// explosion
motion[6]["angles"] = ( 20, -10, 15 );
motion[6]["time"] = ( 0.7, 0, .4 );
motion[7]["angles"] = ( 0, -16, 0 );
motion[7]["time"] = ( 4, 2, 2 );
// running
motion[8]["angles"] = ( 10, -70, 0 );
motion[8]["time"] = ( 3.5, 2, 1.5 );
motion[9]["angles"] = ( 0, -20, 0 );
motion[9]["time"] = ( 2, 1, 0 );
for( i = 0 ; i < motion.size ; i ++ )
{
angles = adjust_angles_to_player( motion[i]["angles"] );
time = motion[i]["time"][0];
acc = motion[i]["time"][1];
dec = motion[i]["time"][2];
if ( time == 0)
ground_ref_ent.angles = angles;
else
{
ground_ref_ent rotateto( angles, time, acc, dec );
ground_ref_ent waittill( "rotatedone" );
}
}
ground_ref_ent rotateto( (0,0,0), 1, 0.5, 0.5 );
ground_ref_ent waittill( "rotatedone" );
level.player playerSetGroundReferenceEnt( undefined );
}
main_objective()
{
objective_trigger = getent( "main_objective", "targetname" );
objective_add( 4, "active", &"AMBUSH_OBJ_CAPTURE_TARGET", objective_trigger.origin);
objective_current( 4 );
while ( isdefined( objective_trigger.target) )
{
objective_trigger waittill( "trigger" );
if ( isdefined( objective_trigger.script_flag_wait ) )
flag_wait( objective_trigger.script_flag_wait );
objective_trigger = getent( objective_trigger.target, "targetname" );
objective_position( 4, objective_trigger.origin);
objective_Ring( 4 );
level notify( "main_objective_updated" );
}
flag_wait( "obj_flexicuff" );
objective_string( 4, &"AMBUSH_OBJ_FLEXICUFF" );
flag_wait( "apartment_suicide_done" );
// objective_state( 4, "failed" );
}
aarea_village_init()
{
flag_set( "aa_hunt" );
setculldist( 0 );
level thread village_nag( "village_gasstation", undefined, "ambush_mhp_wrongway", true);
// turn village triggers on.
array_thread( getentarray( "village_trigger", "script_noteworthy" ) , ::trigger_on );
getent( "badguy_village", "script_noteworthy" ) add_spawn_function( ::badguy_spawn_function );
getent( "badguy_village", "script_noteworthy" ) add_spawn_function( ::village_badguy );
autosave_by_name( "village" );
arcademode_checkpoint( 4, 2 );
level thread village_friendlies();
level thread village_enemies();
level thread main_objective();
level thread village_helicopter();
level thread village_price();
level thread village_mark();
level thread failed_to_pursue();
level thread village_cleanup();
flag_wait_either( "village_alley", "morpheus_quick_start" );
flag_clear( "aa_village" );
level thread aarea_morpheus_init();
}
village_friendlies()
{
flag_wait( "junkyard_exit" );
maps\_spawner::kill_spawnerNum( 1 );
array_delete( getaiarray( "axis" ) );
generic = get_generic_allies();
for( i = 0 ; i < generic.size ; i ++ )
{
generic[i] delete();
}
ai = scripted_array_spawn( "village_friendlies", "targetname" );
array_thread( ai, ::generic_allied );
level.price notify( "killanimscript" );
level.price teleport( getnode( "village_price_teleport", "targetname").origin );
level.price set_force_color( "r" );
level.steve stop_magic_bullet_shield();
level.steve delete();
// need this here so that deleted ai get removed from level.squad
waittillframeend;
spawner = getent( "steve", "targetname" );
spawner.count = 1;
level.steve = scripted_spawn( "steve", "targetname", true );
level.steve thread magic_bullet_shield();
level.steve.animname = "steve";
level.steve.name = "Gaz";
level.steve thread squad_init();
level.steve notify( "killanimscript" );
level.steve teleport( getnode( "village_steve_teleport", "targetname").origin );
level.steve set_force_color( "r" );
array_thread( get_generic_allies(), ::replace_on_death );
array_thread( level.squad, ::enable_careful );
level endon( "morpheus_quick_start" );
level thread village_friendlies_six();
flag_wait( "village_badguy_escape" );
wait 5;
level radio_dialogue_queue( "ambush_mhp_sidealley" );
wait 3;
flag_set( "village_alley" );
level.price anim_single_queue( level.price, "ambush_pri_goafterhim" );
level.mark anim_single_queue( level.mark, "ambush_grg_soapgoalley" );
level.mark thread village_nag( undefined, 25, "ambush_grg_thisway" );
level thread village_nag( undefined, 12, "ambush_mhp_cuthrualley", true );
level thread village_nag( "village_wrong_way", undefined, "ambush_mhp_wrongway", true );
level thread village_nag( "village_past_alley", undefined, "ambush_mhp_passedalley", true, "village_wrong_way" );
}
village_nag( flag_str, delay, nag, radio, ender )
{
level endon( "morpheus_quick_start" );
if ( isdefined( ender ) )
level endon( ender );
if ( isdefined( flag_str ) )
flag_wait( flag_str );
if ( isdefined( delay ) )
wait delay;
if ( isdefined( radio ) )
level radio_dialogue_queue( nag );
else
self anim_single_queue( self, nag );
}
village_friendlies_six()
{
level endon( "village_badguy_escape" );
trigger = getent( "friendlies_arriving", "targetname" );
while ( true )
{
trigger waittill( "trigger", ent );
if ( ent != level.mark )
break;
}
level.mark anim_single_queue( level.mark, "ambush_grg_friendliessixoclock" );
}
village_enemies()
{
array_thread( getentarray( "village_force", "script_noteworthy" ), ::add_spawn_function, ::village_enemies_spawn_function );
level thread village_bmp();
flag_wait( "village_defend" );
activate_trigger_with_targetname( "village_defend_color_init" );
flag_wait( "village_retreat" );
wait 3;
activate_trigger_with_targetname( "village_retreat_1_color_init" );
while( !flag( "village_force_escape" ) && get_ai_group_count( "village_force" ) > 4 )
wait 0.05;
i = 0;
while ( !flag( "village_force_escape" ) && enemies_close( 512 ) && i > 10 )
{
wait 1;
i++;
}
flag_set( "village_badguy_escape" );
activate_trigger_with_targetname( "village_retreat_2_color_init" );
triggers = getentarray( "village_second_force", "script_noteworthy" );
array_thread( triggers, ::activate_trigger );
}
enemies_close( dist )
{
ai = getaiarray( "axis" );
for( i = 0 ; i < ai.size ; i ++ )
{
if ( distance2d( level.player.origin, ai[i].origin ) < dist )
return true;
}
return false;
}
village_bmp()
{
bmp = maps\_vehicle::waittill_vehiclespawn( "village_bmp" );
bmp waittill( "reached_end_node" );
bmp thread vehicle_turret_think();
}
village_enemies_spawn_function()
{
self endon( "death" );
self thread village_enemies_allert();
self setthreatbiasgroup( "oblivious" );
flag_wait( "village_defend" );
self setthreatbiasgroup( "axis" );
}
village_enemies_allert()
{
level endon( "village_approach" );
self waittill( "damage" );
flag_set( "village_approach" );
}
village_badguy()
{
self set_generic_run_anim( "sprint" );
self.moveplaybackrate = 1.2;
setignoremegroup( "allies", "badguy" ); // badguy ignore allies;
setignoremegroup( "player", "badguy" ); // badguy ignore player;
flag_wait( "village_approach" );
// stat_flags
flag_clear( "aa_hunt" );
flag_set( "aa_village" );
flag_set( "village_defend" );
wait 3;
self thread badguy_health_shield();
setthreatbias( "player", "badguy", 0 ); // badguy nolonger ignore player;
setthreatbias( "allies", "badguy", 0 ); // badguy nolonger ignore allies;
node = getnode( "badguy_village_retreat_node", "targetname" );
self set_goalnode( node );
flag_wait( "village_badguy_escape" );
node = getnode( "badguy_village_delete_node", "targetname" );
self set_goalnode( node );
self waittill( "goal" );
self notify( "stop_death_fail" );
self delete();
}
badguy_health_shield()
{
health_buffer = 1000000;
self.health += health_buffer;
self endon( "stop_death_fail" );
while( true )
{
self waittill( "damage", a, b, c, d, e, f );
if ( b == level.player )
if ( self.health < health_buffer )
break;
}
self.health = 150;
}
village_mark()
{
activate_trigger_with_targetname( "village_color_init" );
waittill_aigroupcleared( "junkyard_dog" );
activate_trigger_with_targetname( "dog_dead_color_init" );
wait 1.5;
level.mark thread anim_single_queue( level.mark, "ambush_grg_downboy" );
flag_wait( "village_defend" );
level.mark clear_run_anim();
}
village_helicopter()
{
flag_wait( "village_helicopter_greeting" );
wait 1;
level thread radio_dialogue_queue( "ambush_mhp_jmovesfast" );
wait 5;
level thread radio_dialogue_queue( "ambush_mhp_junkyard" );
flag_wait( "junkyard_exit" );
level radio_dialogue_queue( "ambush_mhp_cityoutskirts" );
flag_wait( "village_road" );
level radio_dialogue_queue( "ambush_mhp_hostileforces" );
flag_wait( "village_retreat" );
level radio_dialogue_queue( "ambush_mhp_checkyourfire" );
}
village_price()
{
level endon( "morpheus_quick_start" );
level.price anim_single_queue( level.price, "ambush_pri_runforit" );
level.price anim_single_queue( level.price, "ambush_pri_chasehim" );
flag_set( "village_helicopter_greeting" );
}
village_cleanup()
{
flag_wait( "morpheus_rpg" );
level.price stop_magic_bullet_shield();
level.price disable_replace_on_death();
allies = getaiarray( "allies" );
for( i = 0 ; i < allies.size ; i ++ )
{
if ( allies[i] == level.mark || allies[i] == level.steve )
continue;
allies[i] disable_replace_on_death();
allies[i] delete();
}
axis = get_ai_group_ai( "village_force" );
axis = array_merge( axis, get_ai_group_ai( "village_enemy" ) );
axis = array_merge( axis, get_ai_group_ai( "village_dog" ) );
array_delete( axis );
}
aarea_morpheus_init()
{
autosave_or_timeout( "morpheus", 10 );
flag_set( "aa_morpheus" );
flag_set( "village_alley" );
level thread fall_death();
generic = get_generic_allies();
for ( i=0; i < generic.size; i++ )
{
generic[i] disable_replace_on_death();
}
level.steve set_force_color( "g" );
activate_trigger_with_targetname( "morpheus_color_init" );
level.steve thread morpheus_allies();
level.mark thread morpheus_allies();
setsaveddvar("ai_friendlyFireBlockDuration", 0 );
morpheus_sets();
flag_wait( "morpheus_dumpster" );
setsaveddvar("ai_friendlyFireBlockDuration", level.ai_friendlyFireBlockDuration );
flag_wait( "apartment_start" );
setsaveddvar("ai_friendlyFireBlockDuration", 500 );
flag_clear( "aa_morpheus" );
level thread aarea_apartment_init();
}
morpheus_allies()
{
self set_ignoreSuppression( true );
self.a.disablePain = true;
self setthreatbiasgroup( "oblivious" );
flag_wait( "morpheus_dumpster" );
self set_ignoreSuppression( false );
self.a.disablePain = false;
self setthreatbiasgroup( "allies" );
}
morpheus_sets()
{
array_thread( getentarray( "iron_fence_guy", "script_noteworthy" ), ::add_spawn_function, ::morpheus_iron_fence_spawn_function );
// level thread morpheus_dumpster();
level thread morpheus_iron_fence();
level thread morpheus_flanker();
level thread morpheus_rpg();
level thread morpheus_2nd_floor();
level thread morpheus_single();
// level thread morpheus_target();
level thread morpheus_alley();
}
morpheus_completion( completion_notify, dialogue )
{
level endon( "new_morpheus_set" );
level waittill( completion_notify );
level thread radio_dialogue_queue( dialogue );
}
morpheus_dumpster()
{
flag_wait( "morpheus_dumpster" );
level notify( "new_morpheus_set" );
level thread morpheus_completion( "morpheus_dumpster_complete", "ambush_mhp_gotem" );
waittill_aigroupcleared( "dumpster_front_guy" );
if ( flag( "morpheus_green_car" ) )
return;
level thread radio_dialogue_queue( "ambush_mhp_dumpster" );
ai = get_ai_group_ai( "dumpster_guy" );
for( i = 0 ; i < ai.size ; i ++ )
{
ai[i] setthreatbiasgroup( "axis" );
}
level thread morpheus_dumpster_clear( "morpheus_dumpster_complete" );
level endon( "morpheus_dumpster_clear" );
waittill_aigroupcleared( "dumpster_guy" );
level notify( "morpheus_dumpster_complete" );
}
morpheus_dumpster_clear( completion_notify )
{
level endon( completion_notify );
flag_wait( "morpheus_iron_fence" );
array_thread( get_ai_group_ai( "dumpster_guy" ), ::self_delete );
level notify( "morpheus_dumpster_clear" );
}
morpheus_iron_fence()
{
flag_wait( "morpheus_iron_fence" );
level notify( "new_morpheus_set" );
// autosave_by_name( "iron_fence" );
level thread morpheus_completion( "morpheus_iron_fence_complete", "ambush_mhp_goodkill" );
level thread radio_dialogue_queue( "ambush_mhp_ironfence" );
level thread morpheus_iron_fence_fight();
flag_wait( "morpheus_iron_fence_fight" );
activate_trigger_with_targetname( "iron_fence_color_init" );
}
morpheus_iron_fence_fight()
{
level endon( "morpheus_iron_fence_fight" );
level thread set_flag_on_player_action( "morpheus_iron_fence_fight", true, true);
trigger = getent( "fight_timeout_trigger", "targetname" );
trigger waittill( "trigger" );
trigger = getent( "fight_trigger", "targetname" );
trigger wait_for_trigger_or_timeout( 2.5 );
flag_set( "morpheus_iron_fence_fight" );
}
morpheus_iron_fence_spawn_function()
{
if ( flag( "morpheus_iron_fence_fight" ) )
return;
self setthreatbiasgroup( "oblivious" );
self.fixednode = true;
self endon( "death" );
flag_wait( "morpheus_iron_fence_fight" );
randomfloatrange( 0.5, 1.5 );
self setthreatbiasgroup( "axis" );
self.fixednode = false;
}
morpheus_flanker()
{
flag_wait( "morpheus_flanker" );
level notify( "new_morpheus_set" );
if ( !get_ai_group_count( "flanker" ) )
return;
flag_wait( "morpheus_iron_fence_fight" );
level thread morpheus_completion( "morpheus_flanker_complete", "ambush_mhp_gotem" );
level thread radio_dialogue_queue( "ambush_mhp_rightflank" );
level thread morpheus_flanker_clear( "morpheus_flanker_complete" );
level endon( "morpheus_flanker_clear" );
wait 1;
activate_trigger_with_targetname( "morpheus_flanker_color_init" );
waittill_aigroupcleared( "flanker" );
level notify( "morpheus_flanker_complete" );
}
morpheus_flanker_clear( completion_notify )
{
level endon( completion_notify );
wait 10;
level notify( "morpheus_flanker_clear" );
}
morpheus_rpg()
{
flag_wait( "morpheus_rpg" );
level notify( "new_morpheus_set" );
level thread morpheus_completion( "morpheus_rpg_complete", "ambush_mhp_niceone" );
level thread morpheus_rpg_dialogue();
level thread morpheus_rpg_clear( "morpheus_rpg_complete" );
level endon( "morpheus_rpg_clear" );
waittill_aigroupcleared( "roof_guy" );
level notify( "morpheus_rpg_complete" );
}
morpheus_rpg_dialogue()
{
level radio_dialogue_queue( "ambush_mhp_rooftops" );
level.mark anim_single_queue( level.mark, "ambush_grg_movementroof" );
}
morpheus_rpg_clear( completion_notify )
{
level endon( completion_notify );
trigger = getent( "morpheus_rpg_clear", "targetname" );
trigger waittill( "trigger" );
array_thread( get_ai_group_ai( "roof_guy" ), ::self_delete );
level notify( "morpheus_rpg_clear" );
}
morpheus_2nd_floor()
{
flag_wait( "morpheus_2nd_floor" );
level notify( "new_morpheus_set" );
activate_trigger_with_targetname( "roof_guy_spawn_trigger" );
level thread morpheus_completion( "morpheus_2nd_floor_complete", "ambush_mhp_gotem" );
level thread radio_dialogue_queue( "ambush_mhp_secondfloor" );
level thread morpheus_2nd_floor_clear( "morpheus_2nd_floor_complete" );
level endon( "morpheus_2nd_floor_clear" );
waittill_aigroupcleared( "floor_guy" );
level notify( "morpheus_2nd_floor_complete" );
}
morpheus_2nd_floor_clear( completion_notify )
{
level endon( completion_notify );
trigger = getent( "morpheus_rpg_clear", "targetname" );
trigger waittill( "trigger" );
array_thread( get_ai_group_ai( "floor_guy" ), ::self_delete );
level notify( "morpheus_2nd_floor_clear" );
}
morpheus_single()
{
flag_wait( "morpheus_single" );
// autosave_by_name( "morpheus_single" );
level notify( "new_morpheus_set" );
level thread morpheus_single_dialogue();
level thread morpheus_single_clear( "morpheus_single_complete" );
level endon( "morpheus_single_clear" );
waittill_aigroupcleared( "single_guy" );
level notify( "morpheus_single_complete" );
}
morpheus_single_dialogue()
{
level radio_dialogue_queue( "ambush_mhp_overturneddump" );
level.mark anim_single_queue( level.mark, "ambush_grg_bydumpster" );
}
morpheus_single_clear( completion_notify )
{
level endon( completion_notify );
trigger = getent( "morpheus_single_clear", "targetname" );
trigger waittill( "trigger" );
array_thread( get_ai_group_ai( "single_guy" ), ::self_delete );
level notify( "morpheus_single_clear" );
}
morpheus_target()
{
flag_wait( "morpheus_target" );
level notify( "new_morpheus_set" );
waittill_aigroupcleared( "single_guy" );
flag_wait( "morpheus_target_moving" );
level thread radio_dialogue_queue( "ambush_mhp_deadahead" );
setignoremegroup( "allies", "badguy" ); // badguy ignore allies;
setignoremegroup( "player", "badguy" ); // badguy ignore player;
badguy = scripted_spawn( "badguy_runby", "targetname" );
badguy badguy_spawn_function();
badguy.moveplaybackrate = 0.64;
badguy waittill( "goal" );
badguy notify( "stop_death_fail" );
badguy delete();
}
morpheus_alley()
{
flag_wait( "morpheus_alley" );
level notify( "new_morpheus_set" );
level thread morpheus_completion( "morpheus_alley_complete", "ambush_mhp_allclear" );
level thread radio_dialogue_queue( "ambush_mhp_alleyleft" );
level thread morpheus_alley_clear( "morpheus_alley_complete" );
level endon( "morpheus_alley_clear" );
flag_wait( "morpheus_green_car" );
level thread radio_dialogue_queue( "ambush_mhp_greencar" );
waittill_aigroupcleared( "alley_guy" );
level notify( "morpheus_alley_complete" );
}
morpheus_alley_clear( completion_notify )
{
level endon( completion_notify );
trigger = getent( "morpheus_alley_clear", "targetname" );
trigger waittill( "trigger" );
array_thread( get_ai_group_ai( "alley_guy" ), ::self_delete );
level notify( "morpheus_alley_clear" );
}
detonate_car_setup()
{
cars = getentarray( "destructible", "targetname" );
array_thread( getentarray( "detonate_car", "targetname" ), ::detonate_car, cars );
}
detonate_car( cars )
{
level endon( "apartment_mg_destroyed" );
org = getent( self.target, "targetname" );
car = getclosest( org.origin, cars );
self waittill( "trigger" );
car maps\_destructible::force_explosion();
}
aarea_apartment_init()
{
flag_set( "aa_apartment" );
autosave_by_name( "apartment_start" );
arcademode_checkpoint( 4, 4 );
axis = getaiarray( "axis" );
for( i = 0 ; i < axis.size ; i ++ )
{
if ( isdefined( axis[i].script_aigroup ) && axis[i].script_aigroup == "alley_guy" )
continue;
axis[i] delete();
}
level thread apartment_dialogue();
level thread apartment_slowdown();
level thread apartment_badguy();
level thread apartment_friendlies();
level thread apartment_mg_nest();
level thread apartment_helicopter();
level thread apartment_mg_nest_2();
level thread apartment_suicide();
flag_wait( "apartment_inside" );
autosave_by_name( "inside" );
flag_wait( "apartment_badguy_3rd_flr" );
wait 4;
autosave_by_name( "stairs" );
flag_wait( "apartment_roof" );
autosave_by_name( "roof" );
flag_wait( "mission_done" );
flag_clear( "aa_apartment" );
nextmission();
}
apartment_slowdown()
{
flag_wait( "apartment_roof_friendlies" );
level.player thread set_playerspeed( 130, 6 );
flag_wait( "apartment_roof" );
wait 1.5;
ai = getaiarray( "allies" );
for( i = 0 ; i < ai.size ; i ++ )
{
if ( is_in_array( level.squad, ai[i] ) )
continue;
ai[i] enable_cqbwalk();
}
}
apartment_helicopter()
{
flag_wait( "apartment_heli_attack" );
maps\_spawner::kill_spawnerNum( 6 );
aim_path_start = getent( "heli_mg_nest_aim_point", "targetname" );
level.helicopter thread apartment_helicopter_turret( aim_path_start, undefined, 300 );
struct = getstruct( "helicopter_fire", "script_noteworthy" );
struct waittill( "trigger" );
flag_set( "apartment_heli_firing" );
ent = getent( "mg_destroyed", "script_noteworthy" );
ent waittill( "trigger" );
wait 1;
flag_set( "apartment_mg_destroyed" );
flag_wait( "apartment_inside" );
aim_path_start = getent( "heli_ambient_targets", "targetname" );
level.helicopter thread apartment_helicopter_ambient_turret( aim_path_start, 100 );
wait_ambient_turret_end();
level notify( "ambient_turret_end" );
flag_clear( "apartment_heli_firing" );
flag_wait( "apartment_mg_4th_flr" );
aim_path_start = getent( "heli_mg_nest_aim_point_2", "targetname" );
level.helicopter thread apartment_helicopter_turret( aim_path_start, true, 100 );
wait 4;
flag_set( "apartment_heli_firing" );
maps\_spawner::kill_spawnerNum( 7 );
ent = getent( "mg_destroyed_2", "script_noteworthy" );
ent waittill( "trigger" );
wait 1;
flag_set( "apartment_mg_destroyed_2" );
waittill_aigroupcleared( "fourthfloor_guy" );
flag_set( "apartment_clear" );
level radio_dialogue_queue( "ambush_mhp_goodtogo" );
}
apartment_helicopter_turret_guy()
{
drone = spawn( "script_model", (0,0,0) );
drone character\character_sp_opforce_geoff::main();
drone.animname = "generic";
drone UseAnimTree( #animtree );
drone linkto( self, "tag_origin", ( 0,-32,-25 ), ( 0,90,0 ) );
level.scr_anim[ "generic" ][ "crouch_shoot" ] = %crouch_shoot_straight;
self anim_generic_first_frame( drone, "crouch_shoot" );
self waittill( "death" );
drone delete();
}
wait_ambient_turret_end()
{
level endon( "apartment_badguy_3rd_flr" );
waittill_aigroupcleared( "apartment_main_force" );
}
apartment_helicopter_ambient_turret( aim_path_start, ups )
{
level notify( "remove_old_turret" );
turret = spawnturret( "misc_turret", (0,0,0), "heli_minigun_noai" );
turret setmodel( "cod3mg42" );
turret.team = "allies";
turret linkto( level.helicopter, "tag_detach", ( 0, 120, 10 ), ( 0, 0, 0 ) );
turret thread apartment_helicopter_turret_guy();
turret maketurretunusable();
turret setmode( "manual" ); //"auto_ai", "manual", "manual_ai" and "auto_nonai"
turret setturretteam( "allies" );
aim_point = aim_path_start;
aim_ent = spawn( "script_origin", aim_point.origin );
turret settargetentity( aim_ent );
turret.target_ent = aim_ent;
wait 2;
turret thread manual_mg_fire( 6, 0.5, 3 );
turret startfiring();
turret apartment_helicopter_ambient_turret_track( aim_point, aim_ent, ups);
turret notify( "stop_firing" );
turret stopfiring();
level waittill( "remove_old_turret" );
turret delete();
}
apartment_helicopter_ambient_turret_track( aim_point, aim_ent, ups )
{
level endon( "ambient_turret_end" );
while ( isdefined( aim_point.target) )
{
aim_point = getent( aim_point.target, "targetname" );
dist = distance( aim_point.origin, aim_ent.origin );
move_time = dist/ups;
aim_ent moveto( aim_point.origin, move_time );
aim_ent waittill( "movedone" );
aim_point notify( "trigger" );
aim_point script_delay();
}
}
apartment_helicopter_turret( aim_path_start, otherside, ups )
{
level notify( "remove_old_turret" );
turret = spawnturret( "misc_turret", (0,0,0), "heli_minigun_noai" );
turret setmodel( "cod3mg42" );
turret.team = "allies";
if ( isdefined( otherside ) )
turret linkto( level.helicopter, "tag_detach", ( 0, 120, 10 ), ( 0, 0, 0 ) );
else
turret linkto( level.helicopter, "tag_detach", ( 0, 12, 10 ), ( 0, 180, 0 ) );
turret thread apartment_helicopter_turret_guy();
turret maketurretunusable();
turret setmode( "manual" ); //"auto_ai", "manual", "manual_ai" and "auto_nonai"
turret setturretteam( "allies" );
aim_point = aim_path_start;
aim_ent = spawn( "script_origin", aim_point.origin );
turret settargetentity( aim_ent );
turret.target_ent = aim_ent;
flag_wait( "apartment_heli_firing" );
turret thread manual_mg_fire( 6, 0.5, 3 );
turret startfiring();
turret apartment_helicopter_turret_mg_nest( aim_point, aim_ent, ups );
turret notify( "stop_firing" );
turret stopfiring();
level waittill( "remove_old_turret" );
turret delete();
}
apartment_helicopter_turret_mg_nest( aim_point, aim_ent, ups )
{
while ( isdefined( aim_point.target) )
{
aim_point = getent( aim_point.target, "targetname" );
dist = distance( aim_point.origin, aim_ent.origin );
move_time = dist/ups;
aim_ent moveto( aim_point.origin, move_time );
aim_ent waittill( "movedone" );
aim_point notify( "trigger" );
aim_point script_delay();
}
if ( !flag( "apartment_inside" ) )
aigroup = "fifthfloor_guy";
else
aigroup = "fourthfloor_guy";
axis = get_ai_group_ai( aigroup );
while ( isdefined( axis ) && axis.size )
{
self settargetentity( axis[0] );
axis[0] waittill( "death" );
axis = get_ai_group_ai( aigroup );
}
}
apartment_friendlies()
{
flag_wait( "apartment_mg_destroyed" );
activate_trigger_with_targetname( "apartment_entry_color_init" );
}
apartment_badguy()
{
flag_wait( "apartment_start" );
flag_wait_or_timeout( "apartment_badguy_run", 5 );
flag_set( "apartment_badguy_run" );
activate_trigger_with_noteworthy( "spawn_mg_nest_ai" );
flag_set( "apartment_fire");
badguy = scripted_spawn( "badguy_apartment", "targetname", true );
level.badguy = badguy;
badguy badguy_spawn_function();
badguy notify( "stop_proximity_kill" );
setignoremegroup( "allies", "badguy" ); // badguy ignore allies;
setignoremegroup( "player", "badguy" ); // badguy ignore player;
flag_wait( "apartment_mg_destroyed" );
badguy set_goalnode( getnode( "badguy_attack_node", "targetname" ) );
flag_wait( "apartment_badguy_attack" );
setthreatbias( "player", "badguy", 0 ); // badguy nolonger ignore player;
setthreatbias( "allies", "badguy", 0 ); // badguy nolonger ignore allies;
wait 1;
setignoremegroup( "allies", "badguy" ); // badguy ignore allies;
setignoremegroup( "player", "badguy" ); // badguy ignore player;
badguy set_goalnode( getnode( "badguy_third_floor_node", "targetname" ) );
flag_wait( "apartment_badguy_3rd_flr" );
badguy set_goalnode( getnode( "badguy_4th_floor_node", "targetname" ) );
flag_wait( "apartment_roof" );
badguy set_goalnode( getnode( "badguy_roof_node", "targetname" ) );
}
apartment_dialogue()
{
level radio_dialogue_queue( "ambush_mhp_fivestory" );
// level.mark anim_single_queue( level.mark, "ambush_grg_acrosslot" );
flag_wait( "apartment_fire" );
flag_set( "apartment_heli_attack" );
level.steve anim_single_queue( level.steve, "ambush_gaz_heavyfire" );
level radio_dialogue_queue( "ambush_mhp_firstonefree" );
flag_wait( "apartment_mg_destroyed" );
wait 2;
level radio_dialogue_queue( "ambush_mhp_goodtogo" );
level radio_dialogue_queue( "ambush_mhp_visual" );
level.steve anim_single_queue( level.steve, "ambush_gaz_fivestory" );
flag_wait( "apartment_badguy_attack" );
wait 6;
level radio_dialogue_queue( "ambush_mhp_northeast" );
flag_wait( "apartment_badguy_3rd_flr" );
level radio_dialogue_queue( "ambush_mhp_staircase" );
flag_wait( "apartment_mg_4th_flr" );
level radio_dialogue_queue( "ambush_mhp_deeperinto" );
level radio_dialogue_queue( "ambush_mhp_holdon" );
flag_wait( "apartment_mg_destroyed_2" );
level.mark disable_cqbwalk();
level.steve disable_cqbwalk();
flag_wait( "apartment_roof" );
level thread radio_dialogue_queue( "ambush_mhp_movementroof" );
wait 3;
level radio_dialogue_queue( "ambush_mhp_onroof" );
}
apartment_mg_nest()
{
mg = getent( "apartment_manual_mg", "targetname" );
mg.team = "axis";
kill_trigger = getent( "mg_player_kill", "targetname" );
zone_trigger = getent( "mg_player_target", "targetname" );
mg thread apartment_mg_killzone( kill_trigger, zone_trigger, "apartment_mg_destroyed" );
damage_trigger = getent( "mg_nest_damage_trigger", "targetname" );
level thread apartment_mg_nest_player_damage( "apartment_mg_destroyed", damage_trigger, 600 );
sandbags = getentarray( "sandbag", "targetname" );
array_thread( sandbags, ::apartment_mg_nest_sandbag );
flag_wait( "apartment_fire");
mg thread manual_mg_fire( 3, 1 );
mg thread apartment_mg_nest_heli();
flag_wait( "apartment_mg_destroyed" );
mg notify( "stop_targeting" );
mg notify( "stop_firing" );
fake_mg = spawn( "script_model", mg.origin );
fake_mg.angles = mg.angles;
fake_mg setmodel( mg.model );
mg hide();
wait 0.9;
fake_mg physicslaunch( fake_mg.origin + ( 0,-50,0 ), (0,600,0) );
flag_wait( "apartment_inside" );
ai = get_ai_group_ai( "fifthfloor_guy" );
array_thread( ai, ::self_delete );
}
apartment_mg_nest_heli()
{
level endon( "apartment_mg_destroyed" );
flag_wait( "apartment_heli_firing" );
wait 2;
self notify( "stop_targeting" );
self settargetentity( level.helicopter );
}
apartment_mg_nest_player_damage( flag_to_set, trigger, health )
{
while( true )
{
trigger waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName );
if ( attacker != level.player )
continue;
if ( damage < 150 )
damage = 10;
else
damage = 150;
health -= damage;
if ( health < 0 )
break;
}
flag_set( flag_to_set );
}
apartment_mg_nest_sandbag()
{
flag_wait( "apartment_mg_destroyed" );
self script_delay();
self physicslaunch( self.origin + ( 0,-10,0 ), (0,1500,200) );
}
apartment_mg_nest_2()
{
mg = getent( "apartment_manual_mg_2", "targetname" );
mg.team = "axis";
kill_trigger = getent( "mg_player_kill_2", "targetname" );
zone_trigger = getent( "mg_player_target_2", "targetname" );
mg thread apartment_mg_killzone( kill_trigger, zone_trigger, "apartment_mg_destroyed_2" );
damage_trigger = getent( "mg_nest_damage_trigger_2", "targetname" );
level thread apartment_mg_nest_player_damage( "apartment_mg_destroyed_2", damage_trigger, 450 );
getent( "nest_2_clip", "targetname" ) delete();
explosion_origin = getent( "mg_nest_2_explosion", "targetname" );
nest_2 = getentarray( "nest_2", "targetname" );
array_thread( nest_2, ::apartment_mg_nest_2_explosion, explosion_origin.origin );
flag_wait( "apartment_mg_4th_flr");
mg thread manual_mg_fire( 1, 1 );
flag_wait( "apartment_mg_destroyed_2" );
playfx( level._effect["mg_nest_expl"], explosion_origin.origin );
mg notify( "stop_targeting" );
mg notify( "stop_firing" );
wait 0.5;
mg delete();
}
apartment_mg_nest_2_explosion( explosion_origin )
{
flag_wait( "apartment_mg_destroyed_2" );
vector = self.origin - explosion_origin;
force = vector * 800;
if ( IsSubStr( self.model, "metal" ) )
force = force/10;
self physicslaunch( explosion_origin, force );
}
apartment_mg_killzone( kill_trigger, zone_trigger, ender )
{
level endon( ender );
level endon( "mg_player_kill" );
kill_trigger thread apartment_mg_kill( self, ender );
while ( true )
{
self shoot_mg_targets();
zone_trigger waittill( "trigger" );
self notify( "stop_targeting" );
self settargetentity( level.player );
while ( level.player istouching( zone_trigger ) )
wait 0.5;
}
}
apartment_mg_kill( mg, ender )
{
level endon( ender );
level.player endon( "death" );
self waittill( "trigger" );
level notify( "mg_player_kill" );
level.player EnableHealthShield( false );
damagemultiplier = getdvarfloat( "player_damagemultiplier" );
damage = 25 / damagemultiplier;
while ( true )
{
level.player dodamage( damage , mg.origin );
wait 0.05;
}
}
apartment_suicide()
{
flag_wait( "apartment_roof_friendlies" );
scripted_array_spawn( "roof_runners", "targetname", true );
flag_wait( "apartment_stairs" );
clearallcorpses();
level thread apartment_suicide_badguy();
level thread apartment_suicide_price();
level thread apartment_suicide_dialogue();
}
apartment_suicide_price()
{
level endon( "missionfailed" );
level.price = scripted_spawn( "roof_price", "targetname", true );
level.price thread magic_bullet_shield();
level.price.animname = "price";
level.price thread squad_init();
level.price.name = "Captain Price";
node = getnode( "price_roof_end", "targetname" );
ent = getent( "price_roof_ent", "targetname" );
level.price.goalradius = 64;
level.price setgoalnode( node );
ent thread anim_loop_solo( level.price, "roof_idle", undefined, "stop_idle" );
flag_wait_either( "stage3", "timed_suicide" );
ent notify( "stop_idle" );
if ( !flag( "timed_suicide" ) )
{
level.price anim_single_solo( level.price, "roof_move" );
level.price thread anim_loop_solo( level.price, "roof_idle", undefined, "stop_idle" );
}
flag_wait_either( "forced_suicide", "timed_suicide" );
wait 0.2;
level.price notify( "stop_idle" );
}
apartment_suicide_badguy()
{
level endon( "missionfailed" );
level endon( "suicide_badguy_interrupt" );
level.badguy animscripts\shared::placeWeaponOn( level.badguy.secondaryweapon, "right" );
level.badguy.allowdeath = true;
level.badguy.dropweapon = false;
level.badguy.grenadeAmmo = 0;
level.badguy.health = 10;
anim_ent = getent( "roof_anim_ent_3", "targetname" );
anim_ent anim_first_frame_solo( level.badguy, "jump" );
flag_wait( "apartment_suicide" );
level.badguy thread apartment_suicide_badguy_fx();
level thread apartment_suicide_badguy_interrupt();
level thread apartment_suicide_badguy_timed();
level endon( "forced_suicide" );
anim_ent anim_single_solo( level.badguy, "jump" );
if ( !isalive( level.badguy ) )
return;
level.badguy notify( "stop_death_fail" );
level.badguy.a.nodeath = true;
level.badguy.allowdeath = true;
level.badguy dodamage( 10000, (0,0,0) );
level notify( "slowdown_done" );
flag_set( "apartment_suicide_done" );
}
apartment_suicide_badguy_timed()
{
level endon( "missionfailed" );
level endon( "forced_suicide" );
time = getanimlength( level.scr_anim[ "badguy" ][ "jump" ] );
wait ( time * 0.83 );
flag_set( "timed_suicide" );
wait 0.5;
level.badguy.allowdeath = false;
level thread slowdown();
}
apartment_suicide_badguy_fx()
{
self waittillmatch( "single anim", "fire" );
origin = self gettagorigin( "tag_flash" );
angles = self gettagangles( "tag_flash" );
vector = AnglesToForward( angles );
origin = origin + vector_multiply( vector, 8 );
thread play_sound_in_space( "ambush_soz_shot", origin );
PlayFX( level._effect["head_fatal"], origin, AnglesToForward( angles ), AnglesToUp( angles ) );
wait 1.5;
angles = ( 270, 0, 0 );
origin = ( -4688, -9280, 659.5 );
PlayFX( level._effect["bloodpool"], origin, AnglesToForward( angles ), AnglesToUp( angles ) );
}
apartment_suicide_badguy_interrupt()
{
level endon( "missionfailed" );
level endon( "timed_suicide" );
trigger = getent( "force_suicide", "targetname" );
trigger waittill( "trigger" );
flag_set( "forced_suicide" );
if ( !isalive( level.badguy ) )
return;
level.player disableweapons();
level thread slowdown();
level.player thread set_playerspeed( 60, 0.25 );
level.badguy stopanimscripted();
level.badguy notify( "single anim", "end" );
level.badguy.allowdeath = false;
anim_ent = getent( "roof_anim_ent_3", "targetname" );
anim_ent anim_single_solo( level.badguy, "quick_jump" );
if ( !isalive( level.badguy ) )
return;
level.badguy notify( "stop_death_fail" );
level.badguy.a.nodeath = true;
level.badguy.allowdeath = true;
level.badguy dodamage( 10000, (0,0,0) );
level notify( "slowdown_done" );
level.player thread set_playerspeed( 140, 2 );
flag_set( "apartment_suicide_done" );
}
slowdown()
{
slowmo_start();
slowmo_setspeed_slow( .3 );
slowmo_setlerptime_in( .6 );
slowmo_lerp_in();
level waittill( "slowdown_done" );
slowmo_setlerptime_out( 1.2 );
slowmo_lerp_out();
slowmo_end();
}
apartment_suicide_dialogue()
{
// level.badguy anim_single_queue( level.badguy, "ambush_soz_stopthebloodshed" );
// wait 2;
level endon( "missionfailed" );
flag_set( "gaz_shouts_at_zakhaev" );
level.steve anim_single_queue( level.steve, "ambush_gaz_dropgun" );
wait 1;
level.mark anim_single_queue( level.mark, "ambush_grg_inhisleg" );
level.price thread anim_single_queue( level.price, "ambush_pri_cantriskit" );
level.price thread restrain_dialogue();
level.mark thread dropgun_dialogue();
flag_set( "obj_flexicuff" );
flag_wait_either( "forced_suicide", "timed_suicide" );
level.steve anim_single_queue( level.steve, "ambush_gaz_no" );
// level.badguy anim_single_queue( level.badguy, "ambush_soz_deadsoonanyway" );
// level.badguy anim_single_queue( level.badguy, "ambush_soz_gofyourself" );
flag_wait( "apartment_suicide_done" );
wait 1.5;
arcadeMode_stop_timer();
level.mark anim_single_queue( level.mark, "ambush_grg_kidissues" );
// todo: switch once new dialogue is in. - done
level.price anim_single_queue( level.price, "ambush_pri_sonisdead" );
// level.price anim_single_queue( level.price, "ambush_pri_2isdead" );
wait 2;
level.steve anim_single_queue( level.steve, "ambush_gaz_onlylead" );
level.price anim_single_queue( level.price, "ambush_pri_knowtheman" );
flag_set( "mission_done" );
}
dropgun_dialogue()
{
level endon( "missionfailed" );
level endon( "forced_suicide" );
level endon( "timed_suicide" );
wait 5;
level.steve anim_single_queue( level.steve, "ambush_gaz_dropit" );
wait 1;
level.steve anim_single_queue( level.steve, "ambush_gaz_dropitnow" );
}
restrain_dialogue()
{
level endon( "missionfailed" );
level endon( "forced_suicide" );
level endon( "timed_suicide" );
level.price anim_single_queue( level.price, "ambush_pri_restrainhim" );
wait 3;
level.price anim_single_queue( level.price, "ambush_pri_restrainnow" );
}
/**********/
failed_to_pursue()
{
array_thread( getentarray( "failed_to_pursue", "targetname" ), ::failed_to_pursue_trigger );
level thread failed_to_pursue_timer( 35 );
flag_wait( "junkyard_exit" );
level notify( "made the time" );
level thread failed_to_pursue_timer( 15, "ambush_mhp_guyshaulin" );
flag_wait( "village_road" );
level notify( "made the time" );
autosave_or_timeout( "village_road", 10 );
flag_wait( "village_alley" );
autosave_or_timeout( "village_alley", 5 );
level thread failed_to_pursue_timer( 35, "ambush_mhp_getaway" );
flag_wait( "morpheus_dumpster" );
level notify( "made the time" );
autosave_or_timeout( "morpheus_dumpster", 5 );
level thread failed_to_pursue_timer( 30, "ambush_mhp_guyshaulin" );
flag_wait( "morpheus_iron_fence" );
level notify( "made the time" );
autosave_or_timeout( "morpheus_iron_fence", 20 );
arcademode_checkpoint( 7, 3 );
level thread failed_to_pursue_timer( 120, "ambush_mhp_betterhurry" );
flag_wait( "morpheus_target_moving" );
level notify( "made the time" );
autosave_or_timeout( "morpheus_target_moving", 8 );
level thread failed_to_pursue_timer( 50, "ambush_mhp_gonnalose" );
flag_wait( "apartment_start" );
level notify( "made the time" );
}
failed_to_pursue_timer( failtime_sec, nag )
{
level endon( "made the time" );
failtime = gettime() + ( failtime_sec * 1000 );
if ( isdefined( nag ) )
{
// Nags after 75% of the allotted time
nagtime = gettime() + ( int( failtime_sec * 0.65 ) * 1000 );
while( nagtime > gettime() )
wait 1;
level thread radio_dialogue_queue( nag );
}
while( failtime > gettime() )
wait 1;
if ( IsSaveRecentlyLoaded() )
wait 10;
thread failed();
}
failed()
{
i = randomint( 4 );
level thread radio_dialogue_queue( "ambush_mhp_losthim_" + i );
wait 1.5;
setdvar( "ui_deadquote", "@AMBUSH_MISSIONFAIL_ESCAPED" );
maps\_utility::missionFailedWrapper();
}
failed_to_pursue_trigger()
{
self waittill( "trigger" );
level notify( "made the time" );
thread failed();
}
/**** badguy generic functions ****/
badguy_spawn_function()
{
self.name = "V. Zakhaev";
self.animname = "badguy";
self set_battlechatter( false );
self setthreatbiasgroup( "badguy" );
self.fixednode = true;
self thread badguy_died();
self thread badguy_proximity_kill();
self set_ignoreSuppression( true );
self.a.disablePain = true;
self.grenadeawareness = 1;
self setFlashbangImmunity( true );
self.script_immunetoflash = true;
}
badguy_died( health_multiplier )
{
if ( !isdefined( health_multiplier ) )
health_multiplier = 3;
self endon( "stop_death_fail" );
self.health = self.health * health_multiplier;
self waittill( "death" );
setdvar( "ui_deadquote", "@AMBUSH_MISSIONFAIL_KILLED_TARGET" );
maps\_utility::missionFailedWrapper();
}
badguy_proximity_kill()
{
// will try to kill the player if he gets to close.
self endon( "stop_proximity_kill" );
level.player endon( "death" );
self endon( "death" );
old_accuracy = self.baseAccuracy;
while( true )
{
while( distance2d( level.player.origin, self.origin ) > 350 )
wait 0.1;
self.baseAccuracy = self.baseAccuracy * 10;
// make badguy hate player
setthreatbias( "player", "badguy", 100000 );
while( distance2d( level.player.origin, self.origin ) < 400 )
wait 0.1;
self.baseAccuracy = old_accuracy;
// make group1 hate group2
setthreatbias( "player", "badguy", 0 );
}
}
/******* start points *******/
start_default()
{
aarea_takeover_init();
}
start_ambush()
{
// turn old triggers off.
array_thread( getentarray( "takeover_trigger", "script_noteworthy" ) , ::trigger_off );
// turn village triggers off.
array_thread( getentarray( "village_trigger", "script_noteworthy" ) , ::trigger_off );
setup_friendlies( 3 );
start_teleport_squad( "ambush" );
blocker = getent( "takeout_path_blocker", "targetname" );
blocker connectpaths();
blocker delete();
getent( "gate_open", "targetname" ) hide();
getent( "rear_blocker_open", "targetname" ) hide();
level thread guardtower_dead_enemies();
flag_set( "takeover_fade_clear" );
flag_set( "takeover_fade_done" );
flag_set( "takeover_briefing_done" );
aarea_ambush_init();
}
start_village()
{
setup_friendlies( 3 );
start_teleport_squad( "village" );
flag_set( "takeover_done" );
ResetSunLight();
setsaveddvar( "r_specularcolorscale", "1" );
level.player setthreatbiasgroup( "player" );
activate_trigger_with_targetname( "ambush_attack_color_init" );
// turn old triggers off.
array_thread( getentarray( "takeover_trigger", "script_noteworthy" ) , ::trigger_off );
// turn village triggers off.
array_thread( getentarray( "village_trigger", "script_noteworthy" ) , ::trigger_off );
blocker = getent( "takeout_path_blocker", "targetname" );
blocker connectpaths();
blocker delete();
blocker = getent( "rear_blocker", "targetname" );
blocker connectpaths();
blocker delete();
guard_tower = getent( "guard_tower", "targetname" );
parts = getentarray( "guard_tower_part", "targetname" );
for( i = 0 ; i < parts.size ; i ++ )
parts[i] delete();
guard_tower delete();
sandbags = getentarray( "guard_tower_sandbags", "targetname" );
for( i = 0 ; i < sandbags.size ; i ++ )
sandbags[i] delete();
level.helicopter = maps\_vehicle::spawn_vehicle_from_targetname( "blackhawk" );
struct = getstruct( "village_heli_start", "targetname" );
level.helicopter thread heli_path_speed( struct );
aarea_village_init();
}
start_morpheus()
{
setup_friendlies( 0 );
start_teleport_squad( "morpheus" );
ResetSunLight();
setsaveddvar( "r_specularcolorscale", "1" );
level.player setthreatbiasgroup( "player" );
activate_trigger_with_targetname( "village_retreat_2_color_init" );
level.helicopter = maps\_vehicle::spawn_vehicle_from_targetname( "blackhawk" );
struct = getstruct( "apartment_heli_start", "targetname" );
level.helicopter thread heli_path_speed( struct );
aarea_morpheus_init();
}
start_apartment()
{
setup_friendlies( 0 );
start_teleport_squad( "apartment" );
ResetSunLight();
setsaveddvar( "r_specularcolorscale", "1" );
level.player setthreatbiasgroup( "player" );
level.steve set_force_color( "g" );
activate_trigger_with_targetname( "apartment_color_init" );
level.helicopter = maps\_vehicle::spawn_vehicle_from_targetname( "blackhawk" );
struct = getstruct( "apartment_heli_start", "targetname" );
level.helicopter thread heli_path_speed( struct );
flag_wait( "apartment_start" );
aarea_apartment_init();
}
/********* setup and utilities *********/
setup_friendlies( extras )
{
if ( !isdefined( extras ) )
extras = 0;
level.squad = [];
level.price = scripted_spawn( "price", "targetname", true );
level.price thread magic_bullet_shield();
level.price.animname = "price";
level.price thread squad_init();
level.price.name = "Captain Price";
level.mark = scripted_spawn( "mark", "targetname", true );
level.mark.script_bcdialog = false;
level.mark thread magic_bullet_shield();
level.mark.animname = "mark";
level.mark thread squad_init();
level.mark.battlechatter = false;
level.mark.name = "SSgt. Griggs";
level.steve = scripted_spawn( "steve", "targetname", true );
level.steve thread magic_bullet_shield();
level.steve.animname = "steve";
level.steve.name = "Gaz";
level.steve thread squad_init();
getent( "kamarov", "script_noteworthy" ) add_spawn_function( ::kamarov );
allied_spawner = getentarray( "allies", "targetname" );
for ( i=0; i<extras; i++ )
{
ai = scripted_spawn( undefined, undefined, true, allied_spawner[i] );
ai generic_allied();
}
array_thread( getentarray( "color_spawner", "targetname" ), ::add_spawn_function, ::generic_allied );
}
kamarov()
{
self endon( "death" );
level.kamarov = self;
self.name = "Sgt. Kamarov";
self thread magic_bullet_shield();
flag_wait( "takeover_fade_clear" );
self stop_magic_bullet_shield();
}
squad_init()
{
level.squad[ level.squad.size ] = self;
self waittill( "death" );
level.squad = array_remove( level.squad, self );
}
generic_allied()
{
self.animname = "generic";
self thread squad_init();
}
get_generic_allies()
{
ai = [];
for( i = 0 ; i < level.squad.size ; i ++ )
{
if ( level.squad[i].animname == "generic" )
ai[ ai.size ] = level.squad[i];
}
return ai;
}
scripted_spawn( value, key, stalingrad, spawner )
{
if ( !isdefined( spawner ) )
spawner = getent( value, key );
if ( isdefined( stalingrad ) )
ai = spawner stalingradSpawn();
else
ai = spawner dospawn();
spawn_failed( ai );
assert( isDefined( ai ) );
return ai;
}
scripted_array_spawn( value, key, stalingrad )
{
spawner = getentarray( value, key );
ai = [];
for ( i=0; i<spawner.size; i++ )
ai[i] = scripted_spawn( value, key, stalingrad, spawner[i] );
return ai;
}
start_teleport_squad( startname )
{
node = getnode( "startnodeplayer_"+ startname, "targetname" );
level.player setorigin ( node.origin );
level.player setplayerangles ( node.angles );
for ( i=0; i<level.squad.size; i++ )
{
level.squad[i] notify( "stop_going_to_node" );
nodename = "startnode" + level.squad[i].animname + "_" + startname;
node = getnodearray( nodename, "targetname" );
level.squad[i] start_teleport( node );
}
}
start_teleport( node )
{
if ( node.size > 1 )
{
for ( i=0; i<node.size; i++ )
{
if ( isdefined( node[i].teleport_used ) )
continue;
node = node[i];
break;
}
}
else
node = node[0];
node.teleport_used = true;
self teleport ( node.origin, node.angles );
self setgoalpos ( self.origin );
self.goalradius = node.radius;
self setgoalnode ( node );
}
delete_dropped_weapons()
{
wc = [];
wc = array_add( wc, "weapon_ak47" );
wc = array_add( wc, "weapon_beretta" );
wc = array_add( wc, "weapon_g36c" );
wc = array_add( wc, "weapon_m14" );
wc = array_add( wc, "weapon_m16" );
wc = array_add( wc, "weapon_m203" );
wc = array_add( wc, "weapon_rpg" );
wc = array_add( wc, "weapon_saw" );
wc = array_add( wc, "weapon_m4" );
wc = array_add( wc, "weapon_m40a3" );
wc = array_add( wc, "weapon_mp5" );
wc = array_add( wc, "weapon_mp5sd" );
wc = array_add( wc, "weapon_usp" );
wc = array_add( wc, "weapon_at4" );
wc = array_add( wc, "weapon_dragunov" );
wc = array_add( wc, "weapon_g3" );
wc = array_add( wc, "weapon_uzi" );
for( i = 0 ; i < wc.size ; i ++ )
{
weapons = getentarray( wc[i], "classname" );
for( n = 0 ; n < weapons.size ; n ++ )
{
if ( isdefined( weapons[n].targetname ) )
continue;
weapons[n] delete();
}
}
}
shoot_mg_targets()
{
self endon( "stop_targeting" );
self setmode( "manual" );
self setbottomarc( 60 );
self setleftarc( 60 );
self setrightarc( 60 );
all_targets = getentarray( self.target, "targetname" );
all_targets = array_add( all_targets, level.player );
target = undefined;
while ( true )
{
if ( isdefined( target ) )
excl[0] = target;
else
excl = undefined;
targets = get_array_of_closest( level.player.origin, all_targets, excl, 3);
target = random( targets );
self settargetentity( target );
wait( randomfloatrange( 1, 3 ) );
}
}
manual_mg_fire( burst, cooldown, extra_bullets )
{
self endon( "stop_firing" );
self.turret_fires = true;
if ( !isdefined( extra_bullets ) )
extra_bullets = 0;
for ( ;; )
{
timer = randomfloatrange( 0.8, 1.5 ) * burst * 20;
if ( self.turret_fires )
{
for ( i = 0; i < timer; i++ )
{
self shootturret();
wait( 0.05 );
}
}
if ( self.team != "allies" && randomint(2) )
{
while ( !BulletTracePassed( self gettagorigin( "tag_flash" ), level.player geteye(), false, self ) )
wait 0.05;
}
wait randomfloatrange( 0.6, 1.2 ) * cooldown;
}
}
random_offest( offset )
{
return( offset - randomfloat( offset*2 ), offset - randomfloat( offset*2 ), offset - randomfloat( offset*2 ) );
}
set_playerspeed( player_speed, transition_time )
{
base_speed = 190;
if ( !isdefined( level.player.MoveSpeedScale ) )
level.player.MoveSpeedScale = 1;
if ( !isdefined(transition_time) )
transition_time = 0;
steps = abs( int( transition_time*4 ) );
targetMoveSpeedScale = player_speed / base_speed;
difference = level.player.MoveSpeedScale - targetMoveSpeedScale;
for( i=0; i<steps; i++ )
{
level.player.MoveSpeedScale -= difference/steps;
level.player setMoveSpeedScale( level.player.MoveSpeedScale );
wait 0.5;
}
level.player.MoveSpeedScale = targetMoveSpeedScale;
level.player setMoveSpeedScale( level.player.MoveSpeedScale );
}
grenade_notifies()
{
while ( true )
{
level.player waittill("grenade_fire", grenade, weapname);
grenade thread notify_on_detonation( weapname );
}
}
notify_on_detonation( weapname )
{
while ( isdefined( self ) )
wait 0.1;
level.player notify( weapname );
}
set_flag_on_player_action( flag_str, flash, grenade )
{
level notify( "kill_action_flag" );
level endon( "kill_action_flag" );
level endon( flag_str );
if ( flag( flag_str ) )
return;
while ( true )
{
msg = level.player waittill_any_return( "weapon_fired", "fraggrenade", "flash_grenade" );
if ( !isdefined(msg) )
break;
if ( msg == "weapon_fired" )
break;
if ( msg == "fraggrenade" && isdefined( grenade ) )
break;
if ( msg == "flash_grenade" && isdefined( flash ) )
break;
}
flag_set( flag_str );
}
kill_ai( mindelay, maxdelay )
{
self endon( "death" );
randomfloat( mindelay, maxdelay );
self dodamage( self.health * 1.5, level.player.origin );
}
create_overlay_element( shader_name, start_alpha )
{
overlay = newHudElem();
overlay.x = 0;
overlay.y = 0;
overlay setshader ( shader_name, 640, 480);
overlay.alignX = "left";
overlay.alignY = "top";
overlay.horzAlign = "fullscreen";
overlay.vertAlign = "fullscreen";
overlay.alpha = start_alpha;
overlay.foreground = true;
overlay.sort = 2;
return overlay;
}
hud_hide( state )
{
wait 0.05;
if ( isdefined( state ) && !state )
{
setdvar( "ui_hud_showstanceicon", "1" );
SetSavedDvar( "compass", "1" );
SetSavedDvar( "ammoCounterHide", "0" );
}
else
{
setdvar( "ui_hud_showstanceicon", "0" );
SetSavedDvar( "compass", "0" );
SetSavedDvar( "ammoCounterHide", "1" );
}
}
setup_vehicle_pause_node()
{
array_thread( getvehiclenodearray( "pause_node", "script_noteworthy" ), ::vehicle_pause_node );
}
vehicle_pause_node()
{
self waittill( "trigger", vehicle );
vehicle setspeed( 0, 60 );
wait self.script_delay;
vehicle resumespeed( 20 );
}
adjust_angles_to_player( stumble_angles )
{
pa = stumble_angles[0];
ra = stumble_angles[2];
rv = anglestoright( level.player.angles );
fv = anglestoforward( level.player.angles );
rva = ( rv[0], 0, rv[1]*-1 );
fva = ( fv[0], 0, fv[1]*-1 );
angles = vector_multiply( rva, pa );
angles = angles + vector_multiply( fva, ra );
return angles + ( 0, stumble_angles[1], 0 );
}
set_goalnode( node )
{
self setgoalnode( node );
if ( isdefined( node.radius ) )
self.goalradius = node.radius;
}
delete_on_goal()
{
self endon( "death" );
self waittill( "goal" );
while ( self cansee( level.player ) )
wait 1;
self delete();
}
kill_guy( origin )
{
if ( isalive( self ) )
self dodamage( self.health * 2, origin );
}
heli_path_speed( struct )
{
if( isdefined( struct ) && isdefined( struct.speed ) )
{
accel = 25;
decel = undefined;
if( isdefined( struct.script_decel ) )
{
decel = struct.script_decel;
}
speed = struct.speed;
if( isdefined( struct.script_accel ) )
{
accel = struct.script_accel;
}
else
{
max_accel = speed / 4;
if( accel > max_accel )
{
accel = max_accel;
}
}
if ( isdefined( decel ) )
{
self setSpeed( speed, accel, decel );
}
else
{
self setSpeed( speed, accel );
}
}
maps\_vehicle::vehicle_paths( struct );
}
fixednode_trigger_setup()
{
array_thread( getentarray( "fixednode_set", "targetname" ), ::fixednode_set );
array_thread( getentarray( "fixednode_unset", "targetname" ), ::fixednode_unset );
}
fixednode_set()
{
while( true )
{
self waittill( "trigger", ai );
if ( !ai.fixednode )
ai.fixednode = true;
}
}
fixednode_unset()
{
while( true )
{
self waittill( "trigger", ai );
if ( ai.fixednode )
ai.fixednode = false;
}
}
fall_death()
{
trigger = getent( "fall_death", "targetname" );
while( true )
{
trigger waittill( "trigger", ai );
if ( ai isragdoll() )
continue;
if ( getdvarint( "ragdoll_enable" ) )
{
ai.skipdeathanim = true;
ai die();
}
else
ai die();
}
}
// from launchfacility_a, minor changes.
vehicle_turret_think()
{
self endon ("death");
self endon ( "c4_detonation" );
self thread maps\_vehicle::mgoff();
self.turretFiring = false;
eTarget = undefined;
currentTargetLoc = undefined;
while (true)
{
wait (0.05);
/*-----------------------
TRY TO GET THE PLAYER AS A TARGET FIRST
-------------------------*/
if ( !isdefined(eTarget) )
eTarget = self vehicle_get_target_player_only();
else if ( ( isdefined(eTarget) ) && ( eTarget != level.player ) )
eTarget = self vehicle_get_target_player_only();
/*-----------------------
IF CURRENT IS PLAYER, DO SIGHT TRACE
-------------------------*/
if ( (isdefined(eTarget)) && (eTarget == level.player) )
{
sightTracePassed = false;
sightTracePassed = sighttracepassed( self.origin, level.player.origin + ( 0, 0, 150 ), false, self );
/*-----------------------
IF CURRENT IS PLAYER BUT CAN'T SEE HIM, GET ANOTHER TARGET
-------------------------*/
if ( !sightTracePassed )
{
//self clearTurretTarget();
eTarget = self vehicle_get_target(level.bmpExcluders);
}
}
/*-----------------------
IF PLAYER ISN'T CURRENT TARGET, GET ANOTHER
-------------------------*/
else
eTarget = self vehicle_get_target(level.bmpExcluders);
/*-----------------------
ROTATE TURRET TO CURRENT TARGET
-------------------------*/
if ( (isdefined(eTarget)) && (isalive(eTarget)) )
{
targetLoc = eTarget.origin + (0, 0, 32);
self setTurretTargetVec(targetLoc);
if (getdvar("debug_bmp") == "1")
thread draw_line_until_notify(self.origin + (0, 0, 32), targetLoc, 1, 0, 0, self, "stop_drawing_line");
fRand = ( randomfloatrange(2, 3));
self waittill_notify_or_timeout( "turret_rotate_stopped", fRand );
/*-----------------------
FIRE MAIN CANNON OR MG
-------------------------*/
if ( (isdefined(eTarget)) && (isalive(eTarget)) )
{
if ( distancesquared(eTarget.origin,self.origin) <= level.bmpMGrangeSquared)
{
if (!self.mgturret[0] isfiringturret())
self thread maps\_vehicle::mgon();
wait(.5);
if (!self.mgturret[0] isfiringturret())
{
self thread maps\_vehicle::mgoff();
if (!self.turretFiring)
self thread vehicle_fire_main_cannon();
}
}
else
{
self thread maps\_vehicle::mgoff();
if (!self.turretFiring)
self thread vehicle_fire_main_cannon();
}
}
}
//wait( randomfloatrange(2, 5));
if (getdvar( "debug_bmp") == "1")
self notify( "stop_drawing_line" );
}
}
vehicle_fire_main_cannon()
{
self endon ("death");
self endon ( "c4_detonation" );
//self notify ("firing_cannon");
//self endon ("firing_cannon");
iFireTime = weaponfiretime("bmp_turret");
assert(isdefined(iFireTime));
iBurstNumber = randomintrange(3, 8);
self.turretFiring = true;
i = 0;
while (i < iBurstNumber)
{
i++;
wait(iFireTime);
self fireWeapon();
}
self.turretFiring = false;
}
vehicle_get_target(aExcluders)
{
// getEnemyTarget( fRadius, iFOVcos, getAITargets, doSightTrace, getVehicleTargets, randomizeTargetArray, aExcluders )
eTarget = maps\_helicopter_globals::getEnemyTarget( level.bmpCannonRange, level.cosine[ "180" ], true, true, false, true, aExcluders);
return eTarget;
}
vehicle_get_target_player_only()
{
aExcluders = level.squad;
// getEnemyTarget( fRadius, iFOVcos, getAITargets, doSightTrace, getVehicleTargets, randomizeTargetArray, aExcluders )
eTarget = maps\_helicopter_globals::getEnemyTarget( level.bmpCannonRange, level.cosine[ "180" ], false, true, false, false, aExcluders);
return eTarget;
}
music_control()
{
//ambush_somber_music ( 120 s )
//ambush_trucks_music ( 117 s)
//ambush_chase_music ( 136 s )
//ambush_standoff_music ( stop at 24 s )
wait( 1 );
thread music_playback( "ambush_somber_music", 120, true, 1 );
flag_wait( "takeover_fade" );
level notify ( "next_music_track" );
musicstop( 6 );
flag_wait( "caravan_on_the_move" );
wait 3;
thread music_playback( "ambush_trucks_music", 117 );
flag_wait( "player_tower_hits_ground" );
level notify ( "next_music_track" );
musicstop();
wait 1;
flag_wait( "son_of_zakhaev_money_shot" );
wait 4;
thread music_playback( "ambush_chase_music", 136, true, 1 );
flag_wait( "apartment_roof" );
level notify ( "next_music_track" );
musicstop( 6 );
wait 6.5;
flag_wait( "gaz_shouts_at_zakhaev" );
thread music_playback( "ambush_standoff_music", 211 );
while( 1 )
{
if( flag( "forced_suicide" ) || flag( "apartment_suicide_done" ) )
{
level notify ( "next_music_track" );
musicstop();
break;
}
wait 0.05;
}
flag_wait( "apartment_suicide_done" );
level notify ( "next_music_track" );
musicstop( 3 );
wait 3.1;
thread music_playback( "ambush_somber_music", 120 );
}
music_playback( cuename, cuelength, repeating, repeatgap )
{
level endon( "next_music_track" );
assertEX( isdefined( cuename ), "specify an alias to play" );
assertEX( isdefined( cuelength ), "specify the length of the music cue in seconds" );
if ( !isdefined( repeating ) )
repeating = false;
if ( !isdefined( repeatgap ) )
repeatgap = 1;
if ( repeating )
{
while ( 1 )
{
MusicPlayWrapper( cuename );
wait cuelength;
musicstop();
wait repeatgap;
}
}
else
{
MusicPlayWrapper( cuename );
}
}