IW4-Dump-Files/maps/trainer.gsc

6466 lines
191 KiB
Plaintext
Raw Permalink Blame History

#include maps\_utility;
#include maps\_vehicle;
#include maps\_anim;
#include maps\_hud_util;
#include common_scripts\utility;
main()
{
set_console_status();
if ( level.console )
level.hint_text_size = 1.6;
else
level.hint_text_size = 1.2;
setDvarIfUninitialized( "trainer_debug", "0" );
level.objectiveRegroup = 0; //used to determine if the string for the course objective is "regroup upstairs" or "run the course blah blah"
level.endingThreadStarted = false;
level.tryagain = false;
level.translatordelay = 1.5;
level.droneCallbackThread = ::AI_drone_think;
level.spawnerCallbackThread = ::AI_think;
level.oldObjectiveAlpha = getDvar( "objectiveAlpha" );
level.skippingTimedADS = false; //may skip if player is elite and has turned autoaim off in the options menu
setsaveddvar( "r_lightGridEnableTweaks", 1 );
setsaveddvar( "r_lightGridIntensity", 1.2 );
setsaveddvar( "r_lightGridContrast", 0 );
/*-----------------------
PIT SCORING/TIMING
-------------------------*/
level.targets_hit_with_melee = 0;
level.patrolDudes = [];
level.recommendedDifficulty = undefined;
level.bestPitTime = 29.05; //IW best time
level.timeFail = 240; //anything higher than this will fail
level.timeEasy = 75; //anything above this number will choose "easy"
level.timeRegular = 43; //anything above this number but less than timeEast will choose "regular"
level.timeHard = 35; //anything above this number but less than timeRegular will choose "hard"
//veteran time..... //anything below "timeHard" will choose "veteran"
level.maximumfriendliesalloweddead = 5; //if you kill more than 5 friendlies, you will fail
level.minimumenemiestokill = 18; //you have to kill at leat 18 enemies to pass
level.timepenaltyForMissedEnemies = 2; //in seconds
level.timepenaltyForKilledCivvies = 2; //in seconds
level.timelimitMax = 160;
level.timelimitMin = 80;
level.courseFriendlies = [];
level.courseEnemies = [];
level.color[ "white" ] = ( 1, 1, 1 );
level.color[ "red" ] = ( 1, 0, 0 );
level.color[ "blue" ] = ( .1, .3, 1 );
/*-----------------------
STARTS
-------------------------*/
add_start( "timed_ads", ::start_timed_ads, "timed_ads" );
add_start( "bullet_penetration", ::start_bullet_penetration, "bullet_penetration" );
add_start( "frag", ::start_frag_training, "frag" );
add_start( "pit", ::start_pit, "pit" );
add_start( "course", ::start_course, "course" );
add_start( "end", ::start_ending, "end" );
if ( is_specialop() )
{
add_start( "so_killspree_trainer_start_map", level.so_trainer_start );
default_start( level.so_trainer_start );
}
else
{
// Delete the special ops gate
array_call( GetEntArray( "so_gate", "targetname" ), ::Delete );
default_start( ::start_default );
pit = getent( "pit", "targetname" );
}
init_precache();
maps\createart\trainer_fog::main();
maps\trainer_precache::main();
maps\createfx\trainer_audio::main();
maps\trainer_fx::main();
maps\_drone_ai::init();
maps\_load::main();
maps\_compass::setupMiniMap("compass_map_trainer");
thread maps\trainer_amb::main();
maps\trainer_anim::main();
//misc
flag_init( "never" );
flag_init( "can_talk" );
flag_set( "can_talk" );
flag_init( "start_anims" );
flag_init( "no_more_course_nags" );
//firing range
flag_init( "firing_range_initialized" );
flag_init( "player_picked_up_rifle" );
//hip fire and ads
flag_init( "player_facing_targets_for_hip_fire" );
flag_init( "foley_turns_for_hip_demo" );
flag_init( "hip_fire_done" );
flag_init( "firing_range_hip_and_ads_done" );
flag_init( "foley_turns_for_ads_demo" );
flag_init( "foley_done_talking_from_hip_ads_training" );
//timed ads
flag_init( "aa_timed_shooting_training" );
flag_init( "foley_done_talking_from_timed_ads_training" );
flag_init( "foley_turns_for_adstimed_demo" );
//penetration
flag_init( "foley_turns_for_penetration_demo" );
flag_init( "firing_range_timed_ads_done" );
flag_init( "firing_range_penetration_done" );
flag_init( "foley_done_talking_from_penetration_training" );
//frags
flag_init( "player_just_threw_a_frag" );
flag_init( "foley_turns_for_frag_demo" );
flag_init( "frags_have_been_spawned" );
flag_init( "player_picked_up_frags" );
flag_init( "targets_hit_with_grenades" );
flag_init( "player_has_thrown_frag_into_target" );
flag_init( "firing_range_frags_done" );
flag_init( "foley_done_talking_from_frag_training" );
//objective training
flag_init( "obj_go_to_the_pit_given" );
flag_init( "obj_go_to_the_pit_done" );
//sidearm training
flag_init( "dunn_dialogue_welcome_01" );
flag_init( "dunn_dialogue_welcome_02" );
flag_init( "dunn_finished_welcome_anim" );
flag_init( "sidearm_complete" );
flag_init( "case_flip_01" );
flag_init( "case_flip_02" );
flag_init( "button_press" );
//course/pit
flag_init( "dunn_finished_with_open_case_dialogue" );
flag_init( "melee_target_hit" );
flag_init( "course_end_targets_dead" );
flag_init( "sprinted" );
flag_init( "pit_dialogue_starting" );
flag_init( "course_start_targets_dead" );
flag_init( "course_first_floor_targets_dead" );
flag_init( "course_second_floor_targets_dead" );
flag_init( "course_end_targets_dead" );
flag_init( "dunn_finished_with_difficulty_selection_dialogue" );
//ending
flag_init( "player_done_with_course" );
flag_init( "end_sequence_starting" );
/*-----------------------
POP-UP TARGETS
-------------------------*/
level.penetration_targets = [];
level.grenade_targets = [];
level.hip_targets = [];
level.pit_enemies = [];
level.plywood = getent( "plywood", "script_noteworthy" );
level.plywood rotateRoll( -90, 0.25, 0.1, 0.1 );
level.lastTimePlywoodWasHit = gettime();
level.target_rail_start_points = getentarray( "target_rail_start_point", "targetname" );
target_triggers = getentarray( "target_trigger", "targetname" );
array_thread( target_triggers,::target_triggers_think );
targets_enemy = getentarray( "target_enemy", "script_noteworthy" );
targets_friendly = getentarray( "target_friendly", "script_noteworthy" );
array_thread( targets_friendly,::target_think, "friendly" );
array_thread( targets_enemy,::target_think, "enemy" );
level.targets_hit = 0;
level.friendlies_hit = 0;
target_enemy = getentarray( "target_enemy", "script_noteworthy" );
target_friendly = getentarray( "target_friendly", "script_noteworthy" );
level.targets = array_merge( target_enemy, target_friendly );
level.speakers = getentarray( "speakers", "targetname" );
/*-----------------------
WEAPONS
-------------------------*/
level.fragsGlowing = false;
level.gunPrimary = "m4_grunt";
level.gunPrimaryClipAmmo = 30;
level.gunSidearm = "deserteagle";
//array_thread( getEntArray( "pickup_rifle", "targetname" ), ::ammoRespawnThink, "spawn_rifles", level.gunPrimary );
//array_thread( getEntArray( "pickup_sidearm", "targetname" ), ::ammoRespawnThink, "spawn_sidearms", level.gunSidearm );
pit_weapons = getentarray( "pit_weapons", "targetname" );
array_thread( pit_weapons,::weapons_hide );
level.cosine = [];
level.cosine[ "45" ] = cos( 45 );
level.cosine[ "90" ] = cos( 90 );
/*-----------------------
SPAWNER THREADS
-------------------------*/
aVehicleSpawners = maps\_vehicle::_getvehiclespawnerarray();
array_thread( aVehicleSpawners, ::add_spawn_function, ::vehicle_think );
array_thread( getentarray( "ai_ambient", "script_noteworthy" ), ::add_spawn_function, ::ai_ambient_noprop_think );
array_spawn_function_noteworthy( "patrol", ::AI_patrol_think );
array_spawn_function_noteworthy( "runners", ::AI_runners_think );
/*-----------------------
KEY FRIENDLIES
-------------------------*/
level.foley = spawn_targetname( "foley", true );
level.foley.animname = "foley";
level.foley.animnode = getent( "node_foley", "targetname" );
level.foley forceUseWeapon( "m4_grunt", "primary" );
level.traineeanimnode = spawn( "script_origin", ( 0, 0, 0 ) );
level.traineeanimnode.origin = level.foley.animnode.origin;
level.traineeanimnode.angles = level.foley.animnode.angles;
level.translatoranimnode = spawn( "script_origin", ( 0, 0, 0 ) );
level.translatoranimnode.origin = level.foley.animnode.origin;
level.translatoranimnode.angles = level.foley.animnode.angles;
spawn_pitguy();
level.pit_case_01 = getent( "pit_case_01", "targetname" );
level.pit_case_02 = getent( "pit_case_02", "targetname" );
level.pit_case_01.animname = "training_case_01";
level.pit_case_02.animname = "training_case_02";
level.pit_case_01 assign_animtree();
level.pit_case_02 assign_animtree();
level.pitcases = [];
level.pitcases[ 0 ] = level.pit_case_01;
level.pitcases[ 1 ] = level.pit_case_02;
level.trainees = array_spawn( getentarray( "trainees", "targetname" ), true );
level.translator = spawn_script_noteworthy( "translator", true );
level.translator gun_remove();
level.translator.animname = "translator";
level.trainee_01 = spawn_script_noteworthy( "trainee_01", true );
level.trainee_01.animname = "trainee_01";
level.translatoranimnode thread anim_loop_solo( level.translator, "training_intro_begining", "stop_idle" ); //loop forever
level.traineeanimnode thread anim_loop_solo( level.trainee_01, "training_intro_begining", "stop_idle" ); //loop forever
level.foley.animnode thread anim_first_frame_solo( level.foley, "training_intro_begining" );
battlechatter_off( "allies" );
battlechatter_off( "axis" );
level.curObjective = 1;
level.objectives = [];
registerActions();
level.aRangeActors = [];
level.aRangeActors[ 0 ] = level.foley;
level.aRangeActors[ 1 ] = level.translator;
level.aRangeActors[ 2 ] = level.trainee_01;
level.aRangeActors = array_merge( level.aRangeActors, level.trainees );
level.gate_cqb_enter = make_door_from_prefab( "gate_cqb_enter" );
level.gate_cqb_exit = make_door_from_prefab( "gate_cqb_exit" );
level.gate_cqb_enter_main = make_door_from_prefab( "gate_cqb_enter_main" );
level.gate_cqb_enter_main.openangles = -170;
level.gate_cqb_enter_main.closeangles = 170;
level.gate_cqb_exit.openangles = -95;
level.gate_cqb_exit.closeangles = 95;
if ( !is_specialop() )
{
level.gate_cqb_enter_main thread door_open();
level.player takeAllWeapons();
}
/*-----------------------
AMBIENT AI
-------------------------*/
if ( !is_specialop() )
{
level.ambientai = array_spawn( getentarray( "friendlies_ambient", "targetname" ), true );
thread bridge_layer_think();
level.basketball_guys = array_spawn( getentarray( "friendlies_basketball", "targetname" ), true );
thread AI_runner_group_think( "runner_group_01" );
thread AI_runner_group_think( "runner_group_02" );
thread ambient_vehicles();
}
thread music();
hummer_end_main = getent( "hummer_end_main", "targetname" );
hummer_end_01 = getent( "hummer_end_01", "targetname" );
hummer_end_main hide();
hummer_end_01 hide();
end_blockers = getent( "end_blockers", "targetname" );
end_blockers hide_entity();
dummies = getentarray( "dummies", "targetname" );
array_call( dummies,::delete );
level.firing_range_area = getent( "firing_range_area", "targetname" );
thread vars_for_after_main();
thread weaponfire_failure();
thread player_camp_disable_weapons();
thread basketball_nag();
level.player thread never_run_out_of_ammo();
}
never_run_out_of_ammo()
{
level endon ( "button_press" );
while( true )
{
level.player waittill( "reload_start" );
if ( flag( "player_inside_course" ) )
break;
weaponName = self GetCurrentWeapon();
if ( level.player GetWeaponAmmoStock( weaponName ) < 100 )
{
level.player SetWeaponAmmoStock( weaponName, 9999 );
}
}
}
vars_for_after_main()
{
wait( .5 );
/*-----------------------
PUT TOTAL PIT ENEMIES/CIVVIES IN A VARIABLE
-------------------------*/
level.totalPitEnemies = level.courseEnemies.size;
level.totalPitCivvies = level.courseFriendlies.size;
}
/****************************************************************************
START FUNCTIONS
****************************************************************************/
start_default()
{
thread AA_range_start_init();
}
start_debug()
{
}
start_timed_ads()
{
firing_range_anims_foley_trainee_and_translator_start_points();
thread firing_range_init();
flag_set( "firing_range_hip_and_ads_done" );
flag_set( "foley_done_talking_from_hip_ads_training" );
thread AA_timed_ADS_init();
}
start_bullet_penetration()
{
firing_range_anims_foley_trainee_and_translator_start_points();
thread firing_range_init();
flag_set( "firing_range_timed_ads_done" );
flag_set( "foley_done_talking_from_timed_ads_training" );
thread AA_penetration_init();
}
start_frag_training()
{
firing_range_anims_foley_trainee_and_translator_start_points();
thread firing_range_init();
flag_set( "firing_range_penetration_done" );
flag_set( "foley_done_talking_from_penetration_training" );
thread AA_frags_init();
}
start_pit()
{
flag_set( "foley_done_talking_from_frag_training" );
flag_set( "firing_range_frags_done" );
level.player giveWeapon( level.gunPrimary );
level.player switchToWeapon( level.gunPrimary );
org = getent( "pit_start", "targetname" );
level.player SetOrigin( org.origin );
level.player SetPlayerAngles( org.angles );
thread AA_find_pit_init();
}
start_course()
{
flag_set( "dunn_finished_welcome_anim" );
level.player giveWeapon( level.gunSidearm );
level.player giveWeapon( level.gunPrimary );
level.player switchToWeapon( level.gunPrimary );
org = getent( "course_start_pit", "targetname" );
level.player SetOrigin( org.origin );
level.player SetPlayerAngles( org.angles );
thread AA_pit_init();
maps\_utility::vision_set_fog_changes( "trainer_pit", 0 );
}
start_ending()
{
level.player giveWeapon( level.gunSidearm );
level.player giveWeapon( level.gunPrimary );
level.player switchToWeapon( level.gunPrimary );
org = getent( "course_leave", "targetname" );
level.player SetOrigin( org.origin );
level.player SetPlayerAngles( org.angles );
registerObjective( "obj_course", &"TRAINER_OBJ_EXIT_THE_PIT", getent( "course_start", "targetname" ) );
setObjectiveState( "obj_course", "current" );
thread AA_ending_init();
maps\_utility::vision_set_fog_changes( "trainer_pit", 0 );
}
music()
{
radio_org = getent( "radio_org", "targetname" );
while( true )
{
radio_org playsound( "training_radio_music_01", "done" );
radio_org waittill( "done" );
wait( 1 );
radio_org playsound( "training_radio_music_02", "done" );
radio_org waittill( "done" );
wait( 1 );
radio_org playsound( "training_radio_music_03", "done" );
radio_org waittill( "done" );
wait( 1 );
radio_org playsound( "training_radio_music_04", "done" );
radio_org waittill( "done" );
wait( 1 );
}
}
ambient_vehicles()
{
thread spawn_vehicles_from_targetname_and_drive( "heli_group_01" );
pavelows = spawn_vehicles_from_targetname_and_drive( "pavelow_group_01" );
array_call( pavelows,::Vehicle_TurnEngineOff );
//thread spawn_vehicles_from_targetname_and_drive( "f15_takeoff_01" );
flag_wait( "player_leaving_range" );
thread spawn_vehicles_from_targetname_and_drive( "f15_flyby_01" );
}
/****************************************************************************
FIRING RANGE START - BASIC FIRING AND ADS
****************************************************************************/
AA_range_start_init()
{
thread firing_range_init();
flag_wait( "start_anims" );
thread firing_range_hip_and_ads();
flag_wait( "firing_range_hip_and_ads_done" );
thread AA_timed_ADS_init();
}
firing_range_init()
{
setsaveddvar( "g_friendlyNameDist", 196 );
setSavedDvar( "objectiveAlpha", 0.4 );
level.player takeallweapons();
player_start_range = getent( "player_start_range", "targetname" );
level.player SetOrigin( player_start_range.origin );
level.player SetPlayerAngles( player_start_range.angles );
ads_target_trigger_middle = getent( "ads_target_trigger_middle", "targetname" );
ads_target_trigger_front = getent( "ads_target_trigger_front", "targetname" );
ads_target_trigger_rear = getent( "ads_target_trigger_rear", "targetname" );
timed_ads_target_trigger = getent( "timed_ads_target_trigger", "targetname" );
ads_target_trigger_middle thread target_triggers_think();
ads_target_trigger_front thread target_triggers_think();
ads_target_trigger_rear thread target_triggers_think();
timed_ads_target_trigger thread target_triggers_think();
level.targetsFront = ads_target_trigger_front.targets;
level.targetsMiddle = ads_target_trigger_middle.targets;
level.targetsRear = timed_ads_target_trigger.targets;
level.firingRangeTimedTargets = timed_ads_target_trigger.targets;
flag_set( "firing_range_initialized" );
flag_wait( "obj_go_to_the_pit_given" );
setsaveddvar( "g_friendlyNameDist", 15000 );
}
firing_range_anims()
{
/*-----------------------
FOLEY AND TRAINEES DO INTRO ANIMS
-------------------------*/
level.foley.animnode anim_single_solo( level.foley, "training_intro_begining" ); //specific one-off anim
/*-----------------------
FOLEY GOES INTO IDLE (TRAINEE AND TRANS ALREADY IDLING)
-------------------------*/
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
/*-----------------------
FOLEY TURNS
-------------------------*/
flag_wait( "foley_turns_for_hip_demo" );
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_turnaround_1" );
/*-----------------------
FOLEY GOES INTO IDLE
-------------------------*/
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
/*-----------------------
FOLEY TALKS A BIT
-------------------------*/
flag_wait( "hip_fire_done" );
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_idle_talk_1" );
/*-----------------------
FOLEY TURNS AROUND
-------------------------*/
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_turnaround_2" );
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
flag_wait( "firing_range_hip_and_ads_done" );
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_idle_talk_2" );
flag_set( "foley_done_talking_from_hip_ads_training" );
}
firing_range_anims_foley_trainee_and_translator_start_points()
{
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
wait( 0.05 );
}
firing_range_hip_and_ads()
{
flag_wait( "firing_range_initialized" );
player_needs_to_pickup_primary_weapon = true;
thread firing_range_anims();
/*-----------------------
FOLEY INTRO DIALOGUE
-------------------------*/
//Sgt. Foley Welcome to pull-the-trigger 101.
flag_wait( "ps_train_fly_welcome" );
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_welcome" );
//level.foley dialogue_execute( "train_fly_welcome" );
//Sgt. Foley Pvt. Allen here is going to do a quick weapons demonstration to show you locals how its done.
flag_wait( "ps_train_fly_demonstration" );
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_demonstration" );
//level.foley dialogue_execute( "train_fly_demonstration" );
//Sgt. Foley No offense, but I see a lot of you guys firing from the hip and spraying bullets all over the range.
flag_wait( "ps_train_fly_nooffense" );
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_nooffense" );
//level.foley dialogue_execute( "train_fly_nooffense" );
//Sgt. Foley You don't end up hitting a damn thing and it makes you look like an ass.
flag_wait( "ps_train_fly_makesyoulook" );
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_makesyoulook" );
//level.foley dialogue_execute( "train_fly_makesyoulook" );
//Sgt. Foley Private Allen, show 'em what I'm talking about.
flag_wait( "foley_anim_pickup_weapon" );
//level.foley dialogue_execute( "train_fly_showem" );
flag_set( "foley_turns_for_hip_demo" );
/*-----------------------
PICK UP THE WEAPON
-------------------------*/
if ( !player_has_primary_weapon() )
{
registerObjective( "obj_rifle", &"TRAINER_PICK_UP_A_RIFLE_FROM", getEnt( "range_rifle", "script_noteworthy" ) );
setObjectiveState( "obj_rifle", "current" );
pickup_rifle = getent( "pickup_rifle", "targetname" );
if ( isdefined( pickup_rifle ) )
{
pickup_rifle glow();
pickup_rifle HidePart( "TAG_THERMAL_SCOPE" );
//pickup_rifle HidePart( "TAG_FOREGRIP" );
//pickup_rifle HidePart( "TAG_WEAPON"
pickup_rifle HidePart( "TAG_ACOG_2" );
pickup_rifle HidePart( "TAG_EOTECH" );
pickup_rifle HidePart( "TAG_HEARTBEAT" );
pickup_rifle HidePart( "TAG_M203" );
pickup_rifle HidePart( "TAG_RED_DOT" );
pickup_rifle HidePart( "TAG_SHOTGUN" );
pickup_rifle HidePart( "TAG_SILENCER" );
//pickup_rifle HidePart( "TAG_BRASS" );
//pickup_rifle HidePart( "TAG_CLIP" );
//pickup_rifle HidePart( "TAG_FLASH" );
//pickup_rifle HidePart( "TAG_LASER" );
//pickup_rifle HidePart( "TAG_SIGHT_OFF" );
//pickup_rifle HidePart( "TAG_SIGHT_ON" );
//pickup_rifle HidePart( "TAG_FLASH_SILENCED" );
}
//Sgt. Foley Grab that weapon off the table and fire at some targets downrange.
level.foley dialogue_execute( "train_fly_fireattargets" );
level.foley thread nag_till_flag_set( "nag_rifle_pickup_0", 2, "player_picked_up_rifle" );
}
else
{
player_needs_to_pickup_primary_weapon = false;
}
while( !player_has_primary_weapon() )
{
wait .05;
}
flag_set( "player_picked_up_rifle" );
/*-----------------------
FIRE FROM THE HIP
-------------------------*/
//Shoot each target while firing from the hip.
if ( player_needs_to_pickup_primary_weapon == false )
{
registerObjective( "obj_rifle", &"TRAINER_SHOOT_EACH_TARGET_WHILE1", getEnt( "firing_range", "targetname" ) );
setObjectiveState( "obj_rifle", "current" );
}
else
{
setObjectiveString( "obj_rifle", &"TRAINER_SHOOT_EACH_TARGET_WHILE1" );
setObjectiveLocation( "obj_rifle", getEnt( "firing_range", "targetname" ) );
}
/*-----------------------
FACE THE TARGETS HINT
-------------------------*/
if ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
{
//Sgt. Foley Turn around and fire at the targets.
level.foley thread dialogue_execute( "train_fly_turnaround" );
}
thread delaythread( 8,::turnaround_hint_if_flag_not_set, "player_facing_targets_for_hip_fire" );
/*-----------------------
FIRE FROM THE HIP TARGETS POP UP
-------------------------*/
while ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
{
wait 0.05;
}
flag_set( "player_facing_targets_for_hip_fire" );
/*-----------------------
FIRE FROM THE HIP HINT
-------------------------*/
clear_hints();
level.foley thread nag_on_notify_till_flag_set( "nag_hip_fire_0", 2, "player_needs_to_fire_from_the_hip", "hip_fire_done" );
if ( level.Xenon )
thread keyHint( "hip_attack", undefined, true );
else
thread keyHint( "pc_hip_attack", undefined, true );// PC and PS3 are both press
numberOfTagretsToHit = 2;
mustADS = false;
//cycle_targets_till_hit( targets, numberOfTagretsToHit, mustADS, mustCrouch, mustShootThroughPlywood, bInOrder )
cycle_targets_till_hit( level.hip_targets, numberOfTagretsToHit, mustADS, undefined, undefined, true );
level.player notify( "did_action_stop_ads" );
clear_hints();
playerIsInverted = undefined;
/*-----------------------
INVERT CONTROLS?
-------------------------*/
setDvar( "ui_start_inverted", 0 );
if ( level.Console )
{
if ( isdefined( level.player GetLocalPlayerProfileData( "invertedPitch" ) ) && level.player GetLocalPlayerProfileData( "invertedPitch" ) )
setDvar( "ui_start_inverted", 1 );
}
else// PC
{
if ( isdefined( getdvar( "ui_mousepitch" ) ) && getdvar( "ui_mousepitch" ) == "1" )
setDvar( "ui_start_inverted", 1 );
}
wait .1;// make sure dvar is set
setDvar( "ui_invert_string", "@TRAINER_AXIS_OPTION_MENU1_ALL" );
if ( level.console )
level.player openpopupMenu( "invert_axis" );
else
level.player openpopupMenu( "invert_axis_pc" );
level.player freezecontrols( true );
setblur( 2, .1 );
level.player waittill( "menuresponse", menu, response );
setblur( 0, .2 );
level.player freezecontrols( false );
playerIsInvertedAfterFirstMenu = false;
if ( level.Console )
{
if ( isdefined( level.player GetLocalPlayerProfileData( "invertedPitch" ) ) && level.player GetLocalPlayerProfileData( "invertedPitch" ) )
playerIsInvertedAfterFirstMenu = true;
}
else// PC
{
if ( isdefined( getdvar( "ui_mousepitch" ) ) && getdvar( "ui_mousepitch" ) == "1" )
playerIsInvertedAfterFirstMenu = true;
}
/*-----------------------
DO A FEW MORE TARGETS IF PLAYER CHOSE TO INVERT
-------------------------*/
if ( response == "try_invert" )
{
//Foley: Let's try a few more.
level.foley thread dialogue_execute( "train_fly_tryafew" );
/*-----------------------
FIRE FROM THE HIP HINT
-------------------------*/
if ( level.Xenon )
thread keyHint( "hip_attack" );
else
thread keyHint( "pc_hip_attack" );// PC and PS3 are both press
/*-----------------------
FIRE FROM THE HIP TARGETS POP UP
-------------------------*/
while ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
wait 0.05;
numberOfTagretsToHit = 2;
mustADS = false;
//cycle_targets_till_hit( targets, numberOfTagretsToHit, mustADS, mustCrouch, mustShootThroughPlywood, bInOrder )
cycle_targets_till_hit( level.hip_targets, numberOfTagretsToHit, mustADS, undefined, undefined, true );
level.player notify( "did_action_stop_ads" );
clear_hints();
/*-----------------------
DID THE PLAYER SWAP INVERSION FROM THE MAIN MENU DURING EXCERCISE?
-------------------------*/
playerIsInvertedAfterTryingAgain = false;
if ( level.Console )
{
if ( isdefined( level.player GetLocalPlayerProfileData( "invertedPitch" ) ) && level.player GetLocalPlayerProfileData( "invertedPitch" ) )
playerIsInvertedAfterTryingAgain = true;
}
else// PC
{
if ( isdefined( getdvar( "ui_mousepitch" ) ) && getdvar( "ui_mousepitch" ) == "1" )
playerIsInvertedAfterTryingAgain = true;
}
/*-----------------------
ONLY SHOW THE MENU TO KEEP CONTROLS IF PLAYER HASN'T SCREWED WITH MAIN MENU
-------------------------*/
if ( playerIsInvertedAfterFirstMenu == playerIsInvertedAfterTryingAgain )
{
setDvar( "ui_invert_string", "@TRAINER_AXIS_OPTION_MENU2_ALL" );
if ( level.console )
level.player openpopupMenu( "invert_axis" );
else
level.player openpopupMenu( "invert_axis_pc" );
level.player freezecontrols( true );
setblur( 2, .1 );
level.player waittill( "menuresponse", menu, response );
setblur( 0, .2 );
level.player freezecontrols( false );
}
}
setObjectiveState( "obj_rifle", "done" );
/*-----------------------
CROSSHAIR SPREAD HINT
-------------------------*/
// Notice that your crosshair expands as you fire.\nThe bigger the crosshairs, the less accurate you are.
//double_line = true;
//thread killhouse_hint( &"TRAINER_HINT_CROSSHAIR_CHANGES", 6, double_line );
/*-----------------------
ADS TRAINING
-------------------------*/
flag_set( "hip_fire_done" );
//Sgt. Foley See what I mean? He sprayed bullets all over the damn place.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_sprayedbullets" );
level.foley dialogue_execute( "train_fly_sprayedbullets" );
//Sgt. Foley You've got to pick your targets by aiming deliberately down your sights from a stable stance.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_pickyourtargets" );
level.foley dialogue_execute( "train_fly_pickyourtargets" );
thread autosave_by_name( "ads_training" );
//Sgt. Foley Private Allen, show our friends here how the Rangers take down a target.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_howtherangers" );
level.foley dialogue_execute( "train_fly_howtherangers" );
//Sgt. Foley Crouch first, and then aim down your sight at the targets.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_crouchfirst" );
level.foley dialogue_execute( "train_fly_crouchfirst" );
// Shoot three targets while aiming down your sights.
thread setObjectiveString( "obj_rifle", &"TRAINER_SHOOT_EACH_TARGET_WHILE" );
setObjectiveState( "obj_rifle", "current" );
numberOfTagretsToHit = 3;
mustADS = true;
mustCrouch = true;
if ( level.player GetStance() != "crouch" )
{
thread keyHint( "crouch" );
}
level.foley thread nag_on_notify_till_flag_set( "nag_ads_fire_0", 2, "player_needs_to_ADS", "firing_range_hip_and_ads_done" );
level.foley thread nag_on_notify_till_flag_set( "nag_crouch_fire_0", 2, "player_needs_to_crouch", "firing_range_hip_and_ads_done" );
cycle_targets_till_hit( level.targetsFront, numberOfTagretsToHit, mustADS, mustCrouch );
level.player notify( "did_action_crouch" );
level.player notify( "did_action_ads_360" );
level.player notify( "did_action_ads" );
clear_hints();
setObjectiveState( "obj_rifle", "done" );
flag_set( "firing_range_hip_and_ads_done" );
if ( level.player GetStance() != "stand" )
{
thread keyHint( "stand" );
}
//Sgt. Foley That's all there is to it. You want your target to go down? You gotta aim down your sights.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_gottaaim" );
level.foley dialogue_execute( "train_fly_gottaaim" );
}
turnaround_hint_if_flag_not_set( sFlag )
{
level endon( sFlag );
if ( !flag( sFlag ) )
{
//double_line = true;
thread killhouse_hint( &"TRAINER_HINT_TURN_AROUND" );
}
}
nag_till_flag_set( sNagLine, iNumberOfLines, sFlagToStop )
{
thread nag_reset_can_talk_flag( sFlagToStop ); //reset can_talk flag in case this function ends mid-dialogue
level endon( sFlagToStop );
while( !flag( sFlagToStop ) )
{
wait( randomfloatrange( 25, 35 ) );
i = 1;
if ( flag( "can_talk" ) )
{
flag_clear( "can_talk" );
self dialogue_execute( sNagLine + i );
flag_set( "can_talk" );
i++;
if ( i > iNumberOfLines )
{
i = 1;
}
}
}
}
nag_on_notify_till_flag_set( sNagLine, iNumberOfLines, sNotify, sFlagToStop )
{
thread nag_reset_can_talk_flag( sFlagToStop ); //reset can_talk flag in case this function ends mid-dialogue
level endon( sFlagToStop );
i = 1;
while( !flag( sFlagToStop ) )
{
level waittill( sNotify );
if ( flag( "can_talk" ) )
{
flag_clear( "can_talk" );
self dialogue_execute( sNagLine + i );
flag_set( "can_talk" );
i++;
if ( i > iNumberOfLines )
{
i = 1;
}
}
}
}
nag_reset_can_talk_flag( sFlagToWaitFor )
{
flag_wait( sFlagToWaitFor );
wait( 0.05 );
flag_set( "can_talk" );
}
cycle_targets_till_hit( targets, numberOfTagretsToHit, mustADS, mustCrouch, mustShootThroughPlywood, bInOrder )
{
numberOfTagretsHit = 0;
/*-----------------------
IF NEED TO DO IN A CERTAIN ORDER, USE SCRIPT_GROUP NUMBER
-------------------------*/
if ( isdefined( bInOrder ) )
{
newArray = [];
while ( newArray.size < targets.size )
{
wait( 0.05 );
foreach( target in targets )
{
if ( target.script_group == newArray.size )
newArray[ newArray.size ] = target;
}
}
targets = newArray;
}
/*-----------------------
LOOP THROUGH TARGETS TILL KILLED ENOUGH
-------------------------*/
while( true )
{
wait( 0.05 );
//have we already killed enough?
if ( numberOfTagretsHit >= numberOfTagretsToHit )
break;
foreach( target in targets )
{
//have we already killed enough?
if ( numberOfTagretsHit >= numberOfTagretsToHit )
break;
target notify( "pop_up" );
target waittill ( "hit" );
/*-----------------------
DO WE NEED TO CROUCH?
-------------------------*/
if ( isdefined( mustCrouch ) )
{
if ( level.player GetStance() == "crouch" )
{
level.player notify( "did_action_crouch" );
}
else
{
thread keyHint( "crouch" );
level notify( "player_needs_to_crouch" );
continue;
}
}
/*-----------------------
DO WE NEED TO ADS OR FIRE FROM THE HIP?
-------------------------*/
if ( isdefined( mustADS ) )
{
if ( mustADS == false )
{
if ( !level.player isADS() )
{
numberOfTagretsHit++;
level.player notify( "did_action_stop_ads" );
}
else
{
thread keyHint( "stop_ads", undefined, true );
level notify( "player_needs_to_fire_from_the_hip" );
}
}
if ( mustADS == true )
{
if ( level.player isADS() )
{
numberOfTagretsHit++;
level.player notify( "did_action_ads" );
level.player notify( "did_action_ads_360" );
}
else
{
if ( level.Xenon )
thread keyHint( "ads_360" );
else
thread keyHint( "ads" );// PC and PS3 are both press
level notify( "player_needs_to_ADS" );
}
}
}
/*-----------------------
DO WE NEED TO SHOOT THROUGH PLYWOOD?
-------------------------*/
if ( isdefined( mustShootThroughPlywood ) )
{
waittillframeend;
time = gettime();
if ( level.lastTimePlywoodWasHit == time )
{
numberOfTagretsHit++;
clear_hints();
}
else
{
clear_hints();
//thread killhouse_hint( &"TRAINER_SHOOT_THE_TARGET_THROUGH", 6 );
level notify( "player_needs_to_shoot_through_plywood" );
continue;
}
}
}
}
/*-----------------------
ENOUGH KILLED...RESET ALL TARGETS
-------------------------*/
array_thread( targets,::target_reset_manual );
}
/****************************************************************************
FIRING RANGE START - TIMED ADS
****************************************************************************/
AA_timed_ADS_init()
{
hasAutoAim = ( level.player GetLocalPlayerProfileData( "autoAim" ) );
if ( ( !hasAutoAim ) || ( !level.console ) )
{
level.skippingTimedADS = true;
//Skip timed ADS training if autoaim is turned off or if we are on a PC
flag_set( "firing_range_timed_ads_done" );
flag_set( "foley_done_talking_from_timed_ads_training" );
thread AA_penetration_init();
}
else
{
//Do full training...player has not mucked with autoaim in options menu
thread firing_range_timed_ads();
flag_wait( "firing_range_timed_ads_done" );
thread AA_penetration_init();
}
}
timed_ads_anims()
{
flag_wait( "foley_done_talking_from_hip_ads_training" );
/*-----------------------
FOLEY GOES INTO IDLE
-------------------------*/
level.foley.animnode notify( "stop_idle" );
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
flag_wait( "aa_timed_shooting_training" );
/*-----------------------
FOLEY TURNS AROUND
-------------------------*/
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_turnaround_1" );
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
flag_wait( "firing_range_timed_ads_done" );
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_idle_talk_1" );
flag_set( "foley_done_talking_from_timed_ads_training" );
}
firing_range_timed_ads()
{
flag_wait( "firing_range_hip_and_ads_done" );
thread timed_ads_anims();
/*-----------------------
ADS TARGET SWITCHING - TIMED
-------------------------*/
thread autosave_by_name( "timed_ads" );
//Sgt. Foley Aiming down your sights also works for switching quickly between targets.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_switching" );
level.foley dialogue_execute( "train_fly_switching" );
//Sgt. Foley Aim down your sights, then pop in and out to acquire new targets.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_popinandout" );
level.foley dialogue_execute( "train_fly_popinandout" );
//Sgt. Foley Show 'em Private.
level.foley dialogue_execute( "train_fly_showemprivate" );
// Shoot each target as quickly as possible.
registerObjective( "obj_timed_rifle", &"TRAINER_SHOOT_EACH_TARGET_AS", getEnt( "firing_range", "targetname" ) );
setObjectiveState( "obj_timed_rifle", "current" );
//(HINT: RELEASE AND PULL LT TO AUTOMATICALLY SNAP TO A NEARBY TARGET)
//Foley: If your target is close to where you are aiming, you can snap to it quickly by quickly aiming down your sight.
//OBJECTIVE: Shoot each target as quickly as possible.
flag_set( "aa_timed_shooting_training" );
//Now I'm going make the targets pop up one at a time.
//level.waters execDialog( "targetspop" );
//wait .5;
//Hit all of them as fast as you can.
//level.waters execDialog( "hitall" );
//Sgt. Foley If your target is close to where you are aiming, you can snap to it quickly by quickly aiming down your sights.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_iftargetclose" );
level.foley dialogue_execute( "train_fly_iftargetclose" );
// if ( auto_aim() )
// {
// //ps3_flipped = is_ps3_flipped();
//
// //if ( ( level.xenon ) || ( ps3_flipped ) )
// if ( level.xenon )
// actionBind = getActionBind( "ads_switch" );
// else
// actionBind = getActionBind( "ads_switch_shoulder" );
// double_line = true;
// thread killhouse_hint( actionBind.hint, 6, double_line );
// }
if ( ( level.player GetWeaponAmmoClip( level.gunPrimary ) ) < level.gunPrimaryClipAmmo )
{
keyHint( "reload" );
wait( 2.0 );
}
numRepeats = 0;
dialogueLine = 0;
level.foley thread nag_on_notify_till_flag_set( "nag_ads_snap_0", 4, "player_needs_to_ADS", "firing_range_timed_ads_done" );
while ( 1 )
{
//lowerTargetDummies( "rifle" );
if ( auto_aim() && numRepeats != 0 )
{
if ( level.xenon )
actionBind = getActionBind( "ads_switch" );
else
actionBind = getActionBind( "ads_switch_shoulder" );
double_line = true;
thread killhouse_hint( actionBind.hint, 10, double_line );
wait 4;
}
level.num_hit = 0;
level.num_hit_with_ads = 0;
level.num_hit_without_ads = 0;
thread timedTargets();
level waittill( "a timed target has been hit" );
/*-----------------------
WAIT FOR 10 SECONDS OR UNTIL TOO MANY HIT FROM THE HIP
-------------------------*/
level waittill_notify_or_timeout( "player_has_hit_too_many_from_hip", 10 );
level notify( "times_up" );
if ( level.num_hit > 6 )
{
if ( level.num_hit_with_ads > 4 )
{
//PASS: Player hit more than 6 targets in the alotted time,
//at least 5 of which were in ADS
break;
}
}
wait 1;
numRepeats++;
array_thread( level.firingRangeTimedTargets,::target_reset_manual );
/*-----------------------
FAILED - TOO SLOW OR NOT ENOUGH IN ADS
-------------------------*/
if ( level.num_hit_with_ads < 4 )
{
//Sgt. Foley Do it again. You can snap to new targets by quickly engaging and releasing your aim.
//Sgt. Foley Private Allen, you're not snapping to your targets. You need to quickly engage and release aiming down the sight to snap to new targets.
//Sgt. Foley Private Allen, you're doing it wrong. Quickly engage and release aiming down the sight to snap to new targets.
level.foley dialogue_execute( "timed_ads_not_snapping_0" + dialogueLine );
}
else
{
//Sgt. Foley That was too slow. You need engage and release your aim quickly to snap to new targets
//Sgt. Foley Too slow. Private Allen, you need to quickly pop in and out of aiming down your sights to snap to new targets.
//Sgt. Foley Do it again and speed it up. Show these men how to snap to new targets by quickly popping in and out of aiming down your sights.
level.foley dialogue_execute( "timed_ads_too_slow_0" + dialogueLine );
}
dialogueLine++;
if ( dialogueLine > 2 )
{
dialogueLine = 0;
}
wait 1;
if ( ( level.player GetWeaponAmmoClip( level.gunPrimary ) ) < level.gunPrimaryClipAmmo )
{
thread keyHint( "reload" );
while ( ( level.player GetWeaponAmmoClip( level.gunPrimary ) ) < level.gunPrimaryClipAmmo )
wait .1;
clear_hints();
wait 1;
}
}
/*-----------------------
PASSED TIMED ADS
-------------------------*/
wait 1;
setObjectiveState( "obj_timed_rifle", "done" );
array_thread( level.firingRangeTimedTargets,::target_reset_manual );
/*-----------------------
ADS TARGET SWITCHING - COMPLETE
-------------------------*/
wait 0.5;
flag_clear( "aa_timed_shooting_training" );
//Sgt. Foley Now that's how you do it. You want to take down your targets quickly and with control.
level.foley dialogue_execute( "train_fly_howyoudoit" );
flag_set( "firing_range_timed_ads_done" );
}
timedTargets()
{
level endon( "times_up" );
targets = level.firingRangeTimedTargets;
last_selection = -1;
while ( 1 )
{
while ( 1 )
{
//randomly pop up a target
wait( 0.05 );
selected_target = randomint( targets.size );
if ( selected_target != last_selection )
break;
}
last_selection = selected_target;
targets[ selected_target ] notify( "pop_up" );
//wait for target to be hit
targets[ selected_target ] waittill( "hit" );
level notify( "a timed target has been hit" );
if ( level.player isADS() )
{
level.num_hit_with_ads++;
level.player notify( "did_action_ads" );
level.player notify( "did_action_ads_360" );
}
else
{
level.num_hit_without_ads++;
if ( level.num_hit_without_ads > 2 )
{
level notify( "player_has_hit_too_many_from_hip" );
break;
}
if ( level.Xenon )
thread keyHint( "ads_360" );
else
thread keyHint( "ads" );// PC and PS3 are both press
level notify( "player_needs_to_ADS" );
}
level.num_hit++;
wait .1;
}
}
/****************************************************************************
FIRING RANGE - BULLET PENETRATION
****************************************************************************/
AA_penetration_init()
{
thread firing_range_penetration();
flag_wait( "firing_range_penetration_done" );
thread AA_frags_init();
}
penetration_anims()
{
if ( level.skippingTimedADS == true )
{
flag_wait( "foley_done_talking_from_hip_ads_training" );
}
flag_wait( "foley_done_talking_from_timed_ads_training" );
/*-----------------------
FOLEY GOES INTO IDLE
-------------------------*/
level.foley.animnode notify( "stop_idle" );
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
flag_wait( "foley_turns_for_penetration_demo" );
/*-----------------------
FOLEY TURNS AROUND
-------------------------*/
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_turnaround_1" );
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
flag_set( "foley_done_talking_from_penetration_training" );
}
firing_range_penetration()
{
thread penetration_anims();
thread autosave_by_name( "penetration" );
//Sgt. Foley Now if your target is behind light cover, remember that certain weapons can penetrate and hit your target.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_lightcover" );
level.foley dialogue_execute( "train_fly_lightcover" );
flag_set( "foley_turns_for_penetration_demo" );
//Sgt. Foley The Private here will demonstrate.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_theprivatehere" );
level.foley dialogue_execute( "train_fly_theprivatehere" );
registerObjective( "obj_penetration", &"TRAINER_SHOOT_A_TARGET_THROUGH", getEnt( "firing_range", "targetname" ) );
setObjectiveState( "obj_penetration", "current" );
while ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
wait 0.05;
level.foley thread nag_on_notify_till_flag_set( "nag_penetration_fire_0", 2, "player_needs_to_shoot_through_plywood", "firing_range_penetration_done" );
thread raisePlywoodWalls();
numberOfTagretsToHit = 1;
mustADS = undefined;
mustCrouch = undefined;
mustShootThroughPlywood = true;
cycle_targets_till_hit( level.penetration_targets, numberOfTagretsToHit, mustADS, mustCrouch, mustShootThroughPlywood );
thread spawn_frags();
setObjectiveState( "obj_penetration", "done" );
delaythread( 3,:: lowerPlywoodWalls );
clear_hints();
flag_set( "firing_range_penetration_done" );
}
raisePlywoodWalls()
{
level.plywood rotateRoll( 90, 0.25, 0.1, 0.1 );
level.plywood playSound( "trainer_target_up_wood" );
level.plywood.up = true;
level.plywood endon( "plywood_going_down" );
level.plywood solid();
level.plywood setCanDamage( true );
wait .25;
while( level.plywood.up == true )
{
level.plywood waittill ( "damage", amount, attacker, direction_vec, point, type );
if ( !isdefined( attacker ) )
continue;
if ( !isdefined( type ) )
continue;
if ( isplayer( attacker ) )
{
level.lastTimePlywoodWasHit = gettime();
}
}
}
lowerPlywoodWalls()
{
level.plywood rotateRoll( -90, 0.25, 0.1, 0.1 );
level.plywood playSound( "trainer_target_up_wood" );
level.plywood notify( "plywood_going_down" );
level.plywood.up = false;
}
/****************************************************************************
FIRING RANGE - FRAGS
****************************************************************************/
AA_frags_init()
{
thread firing_range_frags();
flag_wait( "firing_range_frags_done" );
thread AA_find_pit_init();
}
frags_anims()
{
flag_wait( "foley_done_talking_from_penetration_training" );
level.foley.animnode notify( "stop_idle" );
if ( !flag( "foley_turns_for_frag_demo" ) )
{
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_idle_talk_2" );
/*-----------------------
FOLEY GOES INTO IDLE
-------------------------*/
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
}
flag_wait( "foley_turns_for_frag_demo" );
/*-----------------------
FOLEY TURNS AROUND
-------------------------*/
if ( !flag( "firing_range_frags_done" ) )
{
level.foley.animnode notify( "stop_idle" );
level.foley.animnode anim_single_solo( level.foley, "training_intro_foley_turnaround_2" );
}
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_idle", "stop_idle" );
wait( 0.05 );
flag_set( "foley_done_talking_from_frag_training" );
}
firing_range_frags()
{
if ( !flag( "frags_have_been_spawned" ) )
thread spawn_frags();
thread autosave_by_name( "frags" );
thread frags_anims();
/*-----------------------
PICKUP SOME FRAGS
-------------------------*/
wait( 1 );
//Sgt. Foley Last but not least, you need to know how to toss a frag grenade.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_tossafrag" );
level.foley dialogue_execute( "train_fly_tossafrag" );
alreadyHadFrags = false;
if ( !flag( "player_picked_up_frags" ) )
{
thread frags_glow();
//Sgt. Foley Private Allen, pick up some frag grenades from the table.
level.foley thread dialogue_execute( "train_fly_pickupfrag" );
registerObjective( "obj_frags", &"TRAINER_PICK_UP_THE_FRAG_GRENADES", getEnt( "frag_trigger", "script_noteworthy" ) );
setObjectiveState( "obj_frags", "current" );
}
else
{
alreadyHadFrags = true;
}
while ( level.player GetWeaponAmmoStock( "fraggrenade" ) < 3 )
wait ( 0.05 );
/*-----------------------
THROW A FRAG INTO THE SPOT...
-------------------------*/
if ( alreadyHadFrags )
{
registerObjective( "obj_frags", &"TRAINER_THROW_A_GRENADE_INTO", getEnt( "firing_range", "targetname" ) );
setObjectiveState( "obj_frags", "current" );
setObjectiveLocation( "obj_frags", getent( "firing_range", "targetname" ) );
}
else
{
thread setObjectiveString( "obj_frags", &"TRAINER_THROW_A_GRENADE_INTO" );
setObjectiveState( "obj_frags", "current" );
setObjectiveLocation( "obj_frags", getent( "firing_range", "targetname" ) );
}
flag_set( "foley_turns_for_frag_demo" );
thread frag_nags();
/*-----------------------
WAITTILL FRAG SUCCESS
-------------------------*/
numberOfTagretsToHit = 1;
mustADS = undefined;
mustCrouch = undefined;
mustShootThroughPlywood = true;
while ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
wait 0.05;
//Pop translator into new idle while player not looking
level.translatoranimnode notify( "stop_idle" );
level.translatoranimnode thread anim_loop_solo( level.translator, "training_intro_idle", "stop_idle" );
level.traineeanimnode notify( "stop_idle" );
level.traineeanimnode thread anim_loop_solo( level.trainee_01, "training_intro_idle", "stop_idle" );
array_thread( level.grenade_targets,::target_pop_up_continuously, "targets_hit_with_grenades" );
array_thread( level.grenade_targets,::set_flag_when_hit_by_grenade, "targets_hit_with_grenades" );
thread keyHint( "frag", undefined, true );
flag_wait( "targets_hit_with_grenades" );
flag_set( "firing_range_frags_done" );
clear_hints();
wait( 1 );
setObjectiveState( "obj_frags", "done" );
if ( ( level.player GetWeaponAmmoStock( "fraggrenade" ) ) > 0 )
{
level.player SetWeaponAmmoStock( "fraggrenade", 0 );
}
array_thread( level.grenade_targets,::target_reset_manual );
}
frag_nags()
{
nagNumber = 0;
//Sgt. Foley Toss a grenade down range to take out several targets at once.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_grenadedownrange" );
level.foley dialogue_execute( "train_fly_grenadedownrange" );
level endon( "targets_hit_with_grenades" );
thread player_frag_usage_monitor();
while( !flag( "targets_hit_with_grenades" ) )
{
wait( 6 );
if ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
{
thread killhouse_hint( &"TRAINER_HINT_TURN_AROUND" );
while ( !within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
wait 0.05;
clear_hints();
}
else if ( !flag( "player_just_threw_a_frag" ) )
{
//Sgt. Foley training Private, throw a grenade and take out those targets.
//Sgt. Foley training Private, let's go. Throw a grenade at the targets!
//Sgt. Foley training Toss a grenade down range to take out several targets at once.
level.foley dialogue_execute( "frag_nag_0" + nagNumber );
nagNumber++;
if ( nagNumber > 2 )
nagNumber = 0;
}
}
}
player_frag_usage_monitor()
{
level endon( "targets_hit_with_grenades" );
while( true )
{
level.player waittill_either( "grenade_pullback", "did_action_frag" );
flag_set( "player_just_threw_a_frag" );
wait( 5 );
flag_clear( "player_just_threw_a_frag" );
}
}
set_flag_when_hit_by_grenade( sFlagToSet )
{
level endon( sFlagToSet );
while( true )
{
self waittill ( "hit_with_grenade" );
if (!flag( sFlagToSet ) )
flag_set( sFlagToSet );
}
}
target_pop_up_continuously( sFlagToStop )
{
level endon( sFlagToStop );
while ( true )
{
self notify( "pop_up" );
self waittill ( "hit" );
wait( 1 );
}
}
//firing_range_frags_old()
//{
// if ( !flag( "frags_have_been_spawned" ) )
// thread spawn_frags();
//
// thread autosave_now( "frag_training" );
//
// /*-----------------------
// PICKUP SOME FRAGS
// -------------------------*/
// level.foley dialogue_execute( "Last but not least, you need to know how to toss a frag." );
//
// alreadyHadFrags = false;
//
// if ( !level.player GetWeaponAmmoStock( "fraggrenade" ) )
// {
// frags_glow();
// level.foley thread dialogue_execute( "Ramirez, pick up some frag grenades from the table." );
// registerObjective( "obj_frags", &"TRAINER_PICK_UP_THE_FRAG_GRENADES", getEnt( "frag_trigger", "script_noteworthy" ) );
// setObjectiveState( "obj_frags", "current" );
// }
// else
// {
// alreadyHadFrags = true;
// }
//
// while ( level.player GetWeaponAmmoStock( "fraggrenade" ) < 3 )
// wait ( 0.05 );
//
//
// /*-----------------------
// THROW A FRAG INTO THE SPOT...
// -------------------------*/
// level.foley thread dialogue_execute( "Toss a grenade into one of those mortar craters." );
// if ( alreadyHadFrags )
// {
// registerObjective( "obj_frags", &"TRAINER_THROW_A_GRENADE_INTO", getEnt( "firing_range", "targetname" ) );
// setObjectiveState( "obj_frags", "current" );
// }
// else
// {
// thread setObjectiveString( "obj_frags", &"TRAINER_THROW_A_GRENADE_INTO" );
// setObjectiveState( "obj_frags", "current" );
// }
//
// /*-----------------------
// WAITTILL FRAG SUCCESS
// -------------------------*/
//
// grenade_damage_triggers = getentarray( "grenade_damage_trigger", "targetname" );
// array_thread( grenade_damage_triggers,::frag_triggers_think, "player_has_thrown_frag_into_target" );
//
// thread keyHint( "frag", undefined, true );
// flag_wait( "player_has_thrown_frag_into_target" );
//
// clear_hints();
// setObjectiveState( "obj_frags", "done" );
// level.foley dialogue_execute( "Good." );
// flag_set( "firing_range_frags_done" );
//
//}
//nags_frag()
//{
// level endon( "player_has_thrown_frag_into_target" );
// while( !flag( "player_has_thrown_frag_into_target" ) )
// {
// clear_hints();
// thread keyHint( "frag", undefined, true );
// wait( 5 );
// }
//}
frag_triggers_think( sFlagToSetWhenComplete )
{
//self ==> the damage trigger
self enablegrenadetouchdamage();
while( true )
{
self waittill( "trigger" );
if ( !flag( sFlagToSetWhenComplete ) )
flag_set( sFlagToSetWhenComplete );
break;
}
}
frags_glow()
{
frags = getentarray( "frags", "script_noteworthy" );
array_thread( frags,::glow );
flag_wait( "player_picked_up_frags" );
array_thread( frags,::stopglow );
}
frags_glow_stop()
{
frags = getentarray( "frags", "script_noteworthy" );
array_thread( frags,::stopglow );
}
spawn_frags()
{
flag_set( "frags_have_been_spawned" );
frag_trigger = getent( "frag_trigger", "script_noteworthy" );
grenade_box = getent( "grenade_box", "targetname" );
grenade_box setmodel( "mil_grenade_box_opened" );
level.frags = getentarray( "frags", "script_noteworthy" );
level.fragsPickups = getentarray( "frags_pickup", "targetname" );
maxFrags = 4;
level endon( "firing_range_frags_done" );
while( true )
{
wait( .1 );
frag_trigger waittill( "trigger" );
if ( !level.player WorldPointInReticle_Circle( grenade_box.origin, 45, 400 ) )
continue;
if ( level.player GetWeaponAmmoStock( "fraggrenade" ) > 3 )
continue;
if ( !flag( "player_picked_up_frags" ) )
{
flag_set( "player_picked_up_frags" );
level.player giveWeapon( "fraggrenade" );
level.player SetWeaponAmmoStock( "fraggrenade", 0 );
frags_glow_stop();
}
currentPlayerFrags = level.player GetWeaponAmmoStock( "fraggrenade" );
fragsToHide = maxFrags - currentPlayerFrags;
if ( fragsToHide > 0 )
{
hide_frags_till_player_not_looking( fragsToHide );
level.player GiveMaxAmmo( "fraggrenade" );
level.player playsound( "grenade_pickup" );
}
}
}
hide_frags_till_player_not_looking( fragsToHide )
{
level endon( "firing_range_frags_done" );
validFragsToHide = [];
foreach( frag in level.fragsPickups )
{
if ( !isdefined( frag.hidden ) )
validFragsToHide[ validFragsToHide.size ] = frag;
}
//if we are already hiding all the frags, return;
if ( validFragsToHide.size == 0 )
return;
i = 0;
fragToHide = undefined;
hiddenFrags = [];
while( i < fragsToHide )
{
wait( 0.05 );
fragToHide = getclosest( level.player.origin, validFragsToHide );
if ( !isdefined( fragToHide ) )
continue;
validFragsToHide = array_remove( validFragsToHide, fragToHide );
fragToHide hide();
fragToHide.hidden = true;
hiddenFrags[ hiddenFrags.size ] = fragToHide;
i++;
}
thread show_me_when_player_not_looking_or_timeout( hiddenFrags, 3 );
}
show_me_when_player_not_looking_or_timeout( hiddenFrags, timeout )
{
level endon( "firing_range_frags_done" );
wait( .5 );
//don't bother until player on his last frag
while ( level.player GetWeaponAmmoStock( "fraggrenade" ) > 0 )
wait ( 0.05 );
start_time = gettime();
while( true )
{
wait( .5 );
if ( within_fov( level.player.origin, level.player getplayerangles(), level.firing_range_area.origin, level.cosine[ "45" ] ) )
break;
if ( gettime() >= start_time + timeout * 1000 )
break;
}
array_call( hiddenFrags,::show );
foreach( frag in hiddenFrags )
frag.hidden = undefined;
}
/****************************************************************************
OBJECTIVE TO THE PIT START
****************************************************************************/
AA_find_pit_init()
{
thread AA_find_the_pit_sequence();
flag_wait( "sidearm_complete" );
thread AA_pit_init();
}
go_to_pit_anims()
{
flag_wait( "firing_range_frags_done" );
flag_wait( "foley_done_talking_from_frag_training" );
level.foley.animnode notify( "stop_idle" );
level.traineeanimnode notify( "stop_idle" );
level.translatoranimnode notify( "stop_idle" );
//foley and crew regroup
level.foley.animnode thread anim_single_solo( level.foley, "training_intro_end" );
level.traineeanimnode thread anim_single_solo( level.trainee_01, "training_intro_end" );
level.translatoranimnode anim_single_solo( level.translator, "training_intro_end" );
//idle forever doing weapon demo
level.foley.animnode thread anim_loop_solo( level.foley, "training_intro_end_idle", "stop_idle" );
level.translatoranimnode thread anim_loop_solo( level.translator, "training_intro_end_idle", "stop_idle" );
level.traineeanimnode anim_loop_solo( level.trainee_01, "training_intro_end_idle", "stop_idle" );
}
AA_find_the_pit_sequence()
{
/*-----------------------
SIDEARM TRAINING SETUP
-------------------------*/
level.pitguy.isidling = true;
level.pitguygun show();
level.pitguy.animnode anim_first_frame( level.pitActors, "training_pit_sitting_welcome" );
level.pitguy.animnode anim_first_frame( level.pitcases, "training_pit_open_case" );
level.pitguy.animnode thread anim_loop( level.pitActors, "training_pit_sitting_idle", "stop_idle" );
//Sgt. Foley Good.
level.foley dialogue_execute( "train_fly_good" );
//Sgt. Foley Note that frags tend to roll on sloped surfaces. So think twice before tossing one up hill.
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_fragstendtoroll" );
level.foley dialogue_execute( "train_fly_fragstendtoroll" );
/*-----------------------
FOLEY STEPS AWAY
-------------------------*/
blocker_range = getent( "blocker_range", "targetname" );
blocker_range hide_entity();
thread go_to_pit_anims();
thread autosave_by_name( "find_the_pit" );
//Sgt. Foley Thanks for the help, Private Allen. Now get over to The Pit...Colonel Shepherd wants to see you run the course.
flag_wait( "notetrack_dialogue_foley_thanks_for_help" );
level.foley play_sound_on_entity( "train_fly_thanksforhelp" );
thread dialogue_ambient();
setSavedDvar( "objectiveAlpha", 1 );
registerObjective( "obj_course_locate", &"TRAINER_OBJ_GO_TO_THE_PIT", getEnt( "origin_sidearm_table_babystep_1", "targetname" ) );
setObjectiveState( "obj_course_locate", "current" );
flag_set( "obj_go_to_the_pit_given" );
delaythread ( 4, ::objective_hints, "obj_go_to_the_pit_done" );
//Sgt. Foley All right, who here wants to go first? Show me what you've learned so far.
flag_wait( "notetrack_dialogue_foley_who_go_first" );
level.translator delaythread( level.translatordelay,::dialogue_execute, "train_fly_gofirst" );
level.foley play_sound_on_entity( "train_fly_gofirst" );
flag_wait( "player_passing_barracks" );
flag_wait( "player_at_pit_stairs" );
setObjectiveLocation( "obj_course_locate", getent( "origin_sidearm_table", "targetname" ) );
/*-----------------------
SIDEARM TRAINING
-------------------------*/
flag_wait( "player_entering_course" );
flag_set( "obj_go_to_the_pit_done" );
wait( 0.05 );
clear_hints();
setObjectiveState( "obj_course_locate", "done" );
thread sideArm_Training();
}
pitguy_anims()
{
level.pitguy.animnode notify( "stop_idle" );
level.pitguy.animnode anim_single( level.pitActors, "training_pit_sitting_welcome" );
level.pitguy.animnode notify( "stop_idle" );
level.pitguy.animnode thread anim_loop( level.pitActors, "training_pit_sitting_idle", "stop_idle" );
flag_set( "dunn_finished_welcome_anim" );
}
sideArm_Training()
{
setSavedDvar( "objectiveAlpha", level.oldObjectiveAlpha );
thread autosave_by_name( "sidearm" );
thread pitguy_anims();
flag_wait( "dunn_dialogue_welcome_01" );
//Cpl. Dunn Hey Private. Welcome back to The Pit.
level.pitguy play_sound_on_entity( "train_cpd_welcomeback" );
flag_wait( "dunn_dialogue_welcome_02" );
//Cpl. Dunn I hear Colonel Shepherd wants to pull a shooter from our unit for some special op - he's up there in observation.
level.pitguy play_sound_on_entity( "train_cpd_specialop" );
alreadyHadPistol = true;
if ( !level.player HasWeapon( level.gunSidearm ) )
{
alreadyHadPistol = false;
registerObjective( "obj_sidearm", &"TRAINER_GET_A_PISTOL_FROM_THE", getEnt( "origin_sidearm_table", "targetname" ) );
setObjectiveState( "obj_sidearm", "current" );
//Cpl. Dunn Go ahead and grab a pistol.
level.pitguy dialogue_execute( "train_cpd_grabapistol" );
pickup_sidearm = getent( "pickup_sidearm", "targetname" );
if ( isdefined( pickup_sidearm ) )
pickup_sidearm glow();
}
while ( ! level.player HasWeapon( level.gunSidearm ) )
{
//NAG_HINT: Approach the table and hold [USE_BUTTON] to pick up a pistol.
wait .05;
}
if ( alreadyHadPistol == true )
{
registerObjective( "obj_sidearm", &"TRAINER_GET_A_PISTOL_FROM_THE", getEnt( "origin_course_01", "targetname" ) );
setObjectiveState( "obj_sidearm", "current" );
//Cpl. Dunn OK. So you already have your side arm.
//level.pitguy dialogue_execute( "train_cpd_alreadyhave" );
}
else
{
wait( 1 );
}
setObjectiveLocation( "obj_sidearm", getent( "origin_course_01", "targetname" ) );
setObjectiveString( "obj_sidearm", &"TRAINER_SWITCH_TO_YOUR_RIFLE" );
currentWeapon = level.player getCurrentWeapon();
if ( currentWeapon == level.gunSidearm )
{
//Cpl. Dunn Alright, try switching to your rifle
level.pitguy dialogue_execute( "train_cpd_switchtorifle" );
currentWeapon = level.player getCurrentWeapon();
if ( currentWeapon != level.gunPrimary )
thread keyHint( "primary" );
while ( level.player getCurrentWeapon() != level.gunPrimary )
{
thread keyHint( "primary" );
wait .05;
}
clear_hints();
//Cpl. Dunn Good. Switch to your sidearm again.
level.pitguy dialogue_execute( "train_cpd_switchtosidearm" );
if ( level.player getCurrentWeapon() != level.gunSidearm )
{
//NAG_HINT: Press [WEAPON_SWITCH] to switch to your pistol.
thread keyHint( "sidearm" );
//wait .05;
}
while ( level.player getCurrentWeapon() != level.gunSidearm )
{
wait .05;
clear_hints();
thread keyHint( "sidearm" );
}
clear_hints();
}
else
{
//Cpl. Dunn Do me a favor and try switching to your sidearm.
level.pitguy dialogue_execute( "train_cpd_tryswitching" );
if ( level.player getCurrentWeapon() != level.gunSidearm )
{
//NAG_HINT: Press [WEAPON_SWITCH] to switch to your pistol.
thread keyHint( "sidearm" );
//wait .05;
}
while ( level.player getCurrentWeapon() != level.gunSidearm )
{
clear_hints();
thread keyHint( "sidearm" );
wait .05;
}
clear_hints();
}
//Cpl. Dunn You see how switching to your pistol is always faster than reloading?
level.pitguy dialogue_execute( "train_cpd_alwaysfaster" );
setObjectiveState( "obj_sidearm", "done" );
flag_set ( "sidearm_complete" );
level notify ( "sideArmTraining_end" );
}
/****************************************************************************
CQB PIT COURSE START
****************************************************************************/
AA_pit_init()
{
thread AA_pit_sequence();
thread pit_cases_and_door();
}
AA_pit_sequence()
{
if ( !isdefined( level.pitguy.isidling ) )
{
level.pitguygun show();
level.pitguy.animnode anim_first_frame( level.pitActors, "training_pit_sitting_welcome" );
level.pitguy.animnode thread anim_loop( level.pitActors, "training_pit_sitting_idle", "stop_idle" );
wait( 3 );
}
/*-----------------------
PIT GUY OPENS CASE AND SHOWS MORE WEAPONRY
-------------------------*/
//Cpl. Dunn Smile for the cameras and don't miss.. Shepard and the rest of the brass are scouting for a shooter for some special op.
thread dunn_open_case_dialogue();
thread course_loop_think();
thread AI_delete_when_out_of_sight( level.patrolDudes, 256 );
flag_wait( "dunn_finished_welcome_anim" );
level.pitguy.animnode notify( "stop_idle" );
level.pitguy.animnode thread anim_single( level.pitcases, "training_pit_open_case" );
level.pitguy.animnode anim_single( level.pitActors, "training_pit_open_case" );
level.pitguy.animnode thread anim_loop( level.pitActors, "training_pit_stand_idle", "stop_idle" );
/*-----------------------
TELEPORT PIT GUY WHILE PLAYER IS RUNNING COURSE
-------------------------*/
flag_wait( "player_course_stairs2" );
level.pitguy.animnode notify( "stop_idle" );
level.pitguy.animnode = getent( "node_dunn_training_exit", "targetname" );
level.pitguy.animnode thread anim_loop( level.pitActors, "training_pit_stand_idle", "stop_idle" );
// level.pitguygun delete();
}
dunn_open_case_dialogue()
{
flag_wait( "dunn_notetrack_open_case_dialogue" );
//Cpl. Dunn Smile for the cameras and don't miss.. Shepard and the rest of the brass are scouting for a shooter for some special op.
level.pitguy play_sound_on_entity( "train_cpd_smileforcameras" );
flag_set( "dunn_finished_with_open_case_dialogue" );
}
spawn_pitguy()
{
level.pitguy = spawn_targetname( "pitguy", true );
level.pitguy gun_remove();
level.pitguy.animname = "dunn";
level.pitguygun = spawn( "script_model", ( 0, 0, 0 ) );
level.pitguygun setmodel( "viewmodel_desert_eagle" );
level.pitguygun.origin = level.pitguy.origin;
level.pitguygun hide();
level.pitguygun.animname = "pit_gun";
level.pitguygun assign_animtree();
level.pitguy.animnode = getent( "node_dunn_training", "targetname" );
level.pitActors = [];
level.pitActors[ 0 ] = level.pitguy;
level.pitActors[ 1 ] = level.pitguygun;
}
pit_cases_and_door()
{
/*-----------------------
PIT GUY OPENS CASE AND SHOWS MORE WEAPONRY
-------------------------*/
flag_wait( "case_flip_01" );
level.pit_case_01 playsound( "scn_trainer_case_open1" );
pit_weapons_case_01 = getentarray( "pit_weapons_case_01", "script_noteworthy" );
array_thread( pit_weapons_case_01,::weapons_show );
flag_wait( "case_flip_02" );
level.pit_case_02 playsound( "scn_trainer_case_open2" );
pit_weapons_case_02 = getentarray( "pit_weapons_case_02", "script_noteworthy" );
array_thread( pit_weapons_case_02,::weapons_show );
flag_wait( "button_press" );
thread autosave_by_name( "pit_course_start" );
level.gate_cqb_enter thread door_open();
flag_wait( "player_course_stairs2" );
/*-----------------------
MORE WEAPONRY ON TABLE BY THE TIME THE PLAYER GETS BACK
-------------------------*/
pit_weapons_table = getentarray( "pit_weapons_table", "script_noteworthy" );
array_thread( pit_weapons_table,::weapons_show );
}
course_loop_think()
{
level endon( "clear_course" );
level endon( "mission failed" );
numTimesPlayed = 0;
setdvar( "killhouse_too_slow", "0" );
level.first_time = true;
previous_time = 0;
previous_selection = "none";
clear_hints();
numberOfTimesRun = 0;
/*-----------------------
COURSE LOOPS
-------------------------*/
while( true )
{
if ( level.first_time )
{
// if ( ( !( level.player getCurrentWeapon() == "mp5" ) ) || ( level.player GetWeaponAmmoStock( "flash_grenade" ) < 4 ) )
// {
// //"Pick up that MP5 and four flashbangs." );
// level.price thread execDialog( "pickupmp5" );
// // Equip the MP5 and pick up 4 flashbangs.
// setObjectiveString( "obj_price", &"KILLHOUSE_EQUIP_THE_MP5_AND_PICK" );
// setObjectiveLocation( "obj_price", getent( "obj_flashes", "targetname" ) );
// }
}
else
{
// jump_off_trigger thread jumpoff_monitor();
//
// //"Replace any flash bangs you used."
// level.price execDialog( "replaceflash" );
// if ( !( level.player getCurrentWeapon() == "mp5" ) )
// {
// //"Equip your MP5."
// level.price execDialog( "equipmp5" );
// }
}
/*-----------------------
WAIT UNTILL PLAYER HAS FULL AMMO
-------------------------*/
//TODO
/*-----------------------
SPECIFIC DIALOGUE FOR FIRST-TIMERS
-------------------------*/
if ( level.first_time )
{
//level.price execDialog( "ropedeck" ); // On my go, I want you to rope down to the deck and rush to position 1.
//level.price execDialog( "stormstairs" ); // After that you will storm down the stairs to position 2.
//level.price execDialog( "hit3and4" ); // Then hit position 3 and 4 following my precise instructions at each position.
}
thread dialogue_nag_start_course( level.first_time );
/*-----------------------
COURSE OBJECTIVE
-------------------------*/
if( level.first_time )
{
level.objectiveRegroup = 0;
registerObjective( "obj_course", &"TRAINER_OBJ_COURSE", getEnt( "origin_course_01", "targetname" ) );
setObjectiveState( "obj_course", "current" );
}
/*-----------------------
RESET CQB COURSE AND OPEN DOOR
-------------------------*/
course_triggers_01 = getentarray( "course_triggers_01", "script_noteworthy" );
array_notify( course_triggers_01, "activate" );
/*-----------------------
COURSE START
-------------------------*/
flag_wait( "player_has_started_course" );
flag_clear( "dunn_finished_with_difficulty_selection_dialogue" );
setObjectiveLocation( "obj_course", getent( "origin_course_01", "targetname" ) );
if ( level.objectiveRegroup != 0 )
setObjectiveString( "obj_course", &"TRAINER_OBJ_COURSE" );
flag_clear( "melee_target_hit" );
level.targets_hit_with_melee = 0;
thread target_flag_management();
if( level.first_time )
{
thread dialogue_course_civilian_killed();
delaythread ( 3,::dialogue_ambient_pit_course );
}
level.recommendedDifficulty = undefined;
thread dialogue_course();
conversation_orgs_pit = getentarray( "conversation_orgs_pit", "targetname" );
org = getclosest( level.player.origin, conversation_orgs_pit );
if ( cointoss() )
{
//Ranger 3 Come on. Get some, Allen!
org delaythread( 3,::play_sound_in_space, "train_ar3_getsome" );
}
else if ( cointoss() )
{
//Ranger 4 Bring it, bitch!
org delaythread( 3,::play_sound_in_space, "train_ar4_bringit" );
}
else
{
//Ranger 5 Come on! Get some!
org delaythread( 3,::play_sound_in_space, "train_ar5_comeon" );
}
/*-----------------------
TOP OFF PLAYER WEAPONS
-------------------------*/
playerPrimaryWeapons = level.player GetWeaponsListPrimaries();
if ( playerPrimaryWeapons.size > 0 )
{
foreach ( weapon in playerPrimaryWeapons )
level.player givemaxammo( weapon );
}
level.targets_hit = 0;
level.friendlies_hit = 0;
if ( getdvarint( "killhouse_too_slow" ) >= 1 )
thread startTimer( level.timelimitMax );
else
thread startTimer( level.timelimitMin );
thread accuracy_bonus();
if ( isdefined( level.IW_deck ) )
level.IW_deck destroy();
setObjectiveLocation( "obj_course", getEnt( "origin_course_02", "targetname" ) );
flag_wait( "player_course_03a" );
setObjectiveLocation( "obj_course", getEnt( "origin_course_03", "targetname" ) );
/*-----------------------
MELEE TARGET
-------------------------*/
flag_wait( "player_course_stairs2" );
thread key_hint_till_flag_set( "melee", "melee_target_hit" );
flag_wait( "player_course_upstairs" );
level.gate_cqb_enter thread door_close();
level.gate_cqb_exit thread door_open();
flag_clear( "player_inside_course" );
course_end_blocker = getent( "course_end_blocker", "targetname" );
course_end_blocker hide_entity();
setObjectiveLocation( "obj_course", getEnt( "origin_course_03a", "targetname" ) );
flag_wait( "player_course_jumping_down" );
setObjectiveLocation( "obj_course", getEnt( "origin_course_05", "targetname" ) );
/*-----------------------
SPRINT TO FINISH
-------------------------*/
flag_wait_either( "player_course_end_02", "course_end_targets_dead" );
flag_wait( "player_course_end_03" );
flag_clear( "player_has_started_course" );
/*-----------------------
SPRINT LOGIC LOOP - MUST SPRINT TO EXIT
-------------------------*/
first_sprint_try = true;
iNag_didnt_sprint_number = 0;
iNag_sprint_number = 0;
while( true )
{
flag_wait( "player_standing_on_sprint_marker" );
flag_clear( "sprinted" );
thread player_sprint_monitor();
clear_hints();
/*-----------------------
SETUP SPRINT DETECTORS
-------------------------*/
notify_on_sprint();
thread flag_on_notify( "sprinted" );
//player must sprint
if ( level.xenon )// ghetto but PS3 requires "Press X" and 360 requires "Click X"
thread key_hint_till_flag_set( "sprint", "player_course_end" );
else
thread key_hint_till_flag_set( "sprint_pc", "player_course_end" );
if ( first_sprint_try )
{
//Cpl. Dunn Sprint to the exit! Clock's ticking!
thread radio_dialogue( "train_cpd_sprint" );
first_sprint_try = false;
}
else
{
setObjectiveLocation( "obj_course", getEnt( "origin_course_05", "targetname" ) );
level.gate_cqb_exit thread door_open( undefined, true );
thread exit_light_off();
//Cpl. Dunn Go! Sprint to the exit!
//Cpl. Dunn Move! Sprint, Private!
//Cpl. Dunn Sprint, Allen! Go! Go! Go!
//Cpl. Dunn Now sprint to the exit! Move! Move! Move!
thread radio_dialogue( "nag_sprint_0" + iNag_sprint_number );
iNag_sprint_number++;
if ( iNag_sprint_number > 3 )
iNag_sprint_number = 0;
}
flag_wait( "player_sprint_door_close" );
if ( !flag( "sprinted" ) )
{
/*-----------------------
PLAYER DIDN'T SPRINT
-------------------------*/
setObjectiveLocation( "obj_course", getEnt( "origin_course_sprint", "targetname" ) );
level.gate_cqb_exit thread door_close( undefined, true );
level.gate_cqb_exit thread play_sound_on_entity( "door_close_buzzer" );
thread exit_light_on();
//Cpl. Dunn You need to sprint to complete the course. Go back to the red circle and try again
//Cpl. Dunn You didn't sprint, Private. Go back to the red circle and sprint to the exit.
//Cpl. Dunn You need to sprint, Private. Go back to the red circle and sprint to the end.
//Cpl. Dunn You can't finish till you sprint, Allen. Go back to the red circle and sprint to the end.
thread radio_dialogue( "nag_didnt_sprint_0" + iNag_didnt_sprint_number );
thread killhouse_hint( &"TRAINER_TRY_SPRINT_AGAIN", undefined, true );
iNag_didnt_sprint_number++;
if ( iNag_didnt_sprint_number > 3 )
iNag_didnt_sprint_number = 0;
}
else
{
break;
}
}
//if ( !flag( "player_course_end" ) )
//thread second_sprint_hint();
/*-----------------------
COURSE END
-------------------------*/
flag_wait( "player_course_end" );
course_end_blocker = getent( "course_end_blocker", "targetname" );
course_end_blocker show_entity();
numberOfTimesRun++;
clear_hints();
thread reset_course_targets();
level.gate_cqb_exit thread door_close( "player_course_end_close_gate" );
//level notify ( "kill_sprint_hint" );
clear_hints();
flag_clear( "sprinted" );
level notify ( "test_cleared" );
final_time = killTimer( level.bestPitTime, false );
while( !isdefined( level.recommendedDifficulty ) )
wait( .1 );
selection = dialog_end_of_course( numberOfTimesRun );
if ( level.recommendedDifficulty == 1000 )
{
selection = undefined;
if ( level.targets_hit_with_melee > 10 )
{
//Cpl. Dunn You took out too many targets with your knife. Try again, this time, with bullets.
selection = "train_cpd_targetswithknife";
}
else if ( level.toomanycivilianskilled && level.basetimetooklongerthanminimum )
{
//Cpl. Dunn training Not good enough, Allen. You took too long and killed too many civilians. Try it again.
selection = "train_cpd_longandcivilians";
}
else if ( level.toomanytargetsmissed && level.basetimetooklongerthanminimum )
{
//Cpl. Dunn training Not good enough, Allen. You took too long and missed too many targets. Try it again.
selection = "train_cpd_longandtargets";
}
else if ( level.toomanytargetsmissed )
{
//Cpl. Dunn training Not good enough, Allen. You missed too many targets. Try it again.
selection = "train_cpd_targets";
}
else if ( level.toomanycivilianskilled )
{
//Cpl. Dunn training Not good enough, Allen. You killed too many civilians. Try it again.
selection = "train_cpd_civilians";
}
else
{
//Cpl. Dunn Too damn slow. You need to run it again, Private.
selection = "train_cpd_needtorunagain";
}
}
else
{
//player passed....upload score
level.player UploadTime( "LB_KILLHOUSE", final_time );
thread try_again();
}
level.pitguy dialogue_execute( selection );
previous_selection = selection;
previous_time = final_time;
level.gate_cqb_enter thread door_open();
/*-----------------------
DO IT AGAIN, OR EXIT?
-------------------------*/
if ( level.recommendedDifficulty != 1000 )
{
if ( !flag( "player_has_started_course" ) )
{
//player passed....give the option of trying again....or not
//Cpl. Dunn You can run the course again or regroup with the others by the main gate.
level.pitguy thread dialogue_execute( "train_cpd_runagain", "dunn_finished_with_difficulty_selection_dialogue" );
setObjectiveLocation( "obj_course", getent( "course_start", "targetname" ) );
setObjectiveString( "obj_course", &"TRAINER_OBJ_EXIT_THE_PIT" );
level.objectiveRegroup = 1;
}
}
else
{
setObjectiveLocation( "obj_course", getent( "origin_course_01", "targetname" ) );
}
flag_wait_either( "player_inside_course", "player_done_with_course" );
if( flag( "player_done_with_course" ) )
break;
level.first_time = false;
}
}
player_sprint_monitor()
{
level notify( "starting sprint monitor" );
level endon( "starting sprint monitor" );
level endon( "sprinted" );
level endon( "player_course_end" );
sprint_volume = getent( "sprint_volume", "targetname" );
while( true )
{
wait( 0.05 );
vel = level.player GetVelocity();
// figure out the length of the vector to get the speed (distance from world center = length)
velocity = Distance( ( vel[ 0 ], vel[ 1 ], 0 ), ( 0, 0, 0 ) ); // don't care about Z velocity
if ( ( isdefined( velocity ) ) && ( velocity > 250 ) && ( level.player istouching( sprint_volume ) ) )
{
flag_set( "sprinted" );
}
}
}
exit_light_on()
{
redlight_fx_org = GetStruct( "light_exit", "targetname" );
level.exitDoorLightEffect = PlayLoopedFX( getfx( "redlight_fx" ), 50, redlight_fx_org.origin, 2500 );
level.exitDoorLightEffect.dummy = spawn_tag_origin();
level.exitDoorLightEffect.dummy.origin = redlight_fx_org.origin;
playfxontag( getfx( "dlight_red" ), level.exitDoorLightEffect.dummy, "tag_origin" );
}
exit_light_off()
{
if ( isdefined( level.exitDoorLightEffect ) )
{
level.exitDoorLightEffect Delete();
level.exitDoorLightEffect.dummy delete();
}
}
get_global_fx( name )
{
fxName = level.global_fx[ name ];
return level._effect[ fxName ];
}
try_again()
{
level endon( "player_has_started_course" );
level notify( "try_again_thread" );
level endon( "try_again_thread" );
/*-----------------------
MENU POPUP FOR DIFFICULTY SELECTION
-------------------------*/
flag_wait_either( "player_entering_course", "player_course_looking_down_hall_to_exit" );
level.player freezecontrols( true );
setblur( 2, .1 );
wait( 1 );
// <menu popup> selects difficulty, the difficulty selected is the difficulty this level will be completed in.
level.player openpopupMenu( "select_difficulty" );
while ( true )
{
level.player waittill( "menuresponse", menu, response );
if ( response == "continue" || response == "tryagain" )
break;
level.player openpopupMenu( "select_difficulty" );
}
assertex( response == "continue" || response == "tryagain", "Menu response from Training difficulty selection is incorrect!" );
setblur( 0, .2 );
level.player freezecontrols( false );
//level notify( "okay_if_friendlies_in_line_of_fire" );
if ( response == "tryagain" )
{
//Cpl. Dunn Alright. Head back in and give it another go.
level.pitguy thread dialogue_execute( "train_cpd_anothergo" );
setObjectiveLocation( "obj_course", getent( "origin_course_01", "targetname" ) );
setObjectiveString( "obj_course", &"TRAINER_OBJ_COURSE" );
level.objectiveRegroup = 0;
}
else
{
flag_set( "player_done_with_course" );
//setObjectiveLocation( "obj_course", getent( "course_start", "targetname" ) );
//setObjectiveString( "obj_course", &"TRAINER_OBJ_EXIT_THE_PIT" );
//setObjectiveState( "obj_course", "current" );
if ( !level.endingThreadStarted )
{
level.endingThreadStarted = true;
thread AA_ending_init();
}
level.gate_cqb_enter thread door_close();
if ( flag( "dunn_finished_with_difficulty_selection_dialogue" ) )
{
//Cpl. Dunn Alright. Head upstairs and regroup with the others
level.pitguy dialogue_execute( "train_cpd_headupstairs" );
}
clear_timer_elems();
clear_hints();
level notify( "kill_timer" );
level notify( "clear_course" );
}
}
key_hint_till_flag_set( hintString, sFlagToEndOn )
{
thread keyHint( hintString, undefined, undefined, true );
thread clear_hints_on_flag( sFlagToEndOn );
}
reset_course_targets()
{
foreach ( target in level.targets )
{
target target_reset_manual();
if ( isdefined( target.lateralStartPosition ) )
{
target thread target_lateral_reset_random();
}
}
}
target_flag_management()
{
waittill_targets_killed_and_flag_is_set_or_timeout_on_flag( 10, "course_start_targets_dead", "player_course_03a" );
flag_wait( "player_course_03a" );
waittill_targets_killed_and_flag_is_set_or_timeout_on_flag( 3, "course_first_floor_targets_dead", "player_course_stairs" );
flag_wait( "player_course_stairs" );
waittill_targets_killed_and_flag_is_set_or_timeout_on_flag( 5, "course_second_floor_targets_dead", "player_course_jumped_down" );
flag_wait( "player_course_jumped_down" );
waittill_targets_killed_and_flag_is_set_or_timeout_on_flag( 6, "course_end_targets_dead", "player_course_end_03" );
flag_clear( "course_start_targets_dead" );
flag_clear( "course_first_floor_targets_dead" );
flag_clear( "course_second_floor_targets_dead" );
flag_clear( "course_end_targets_dead" );
}
waittill_targets_killed_and_flag_is_set_or_timeout_on_flag( iNumberOfTargets, sFlagToSetWhenKilled, sFlagToTimeOutOn )
{
level endon( sFlagToTimeOutOn );
iTargetsKilled = 0;
while( iTargetsKilled < iNumberOfTargets )
{
level waittill ( "target_killed" );
iTargetsKilled++;
}
flag_set( sFlagToSetWhenKilled );
}
player_alt_weapon_has_ammo()
{
currentWeapon = level.player getcurrentweapon();
heldweapons = level.player GetWeaponsListPrimaries();
foreach( weapon in heldweapons )
{
if ( weapon == currentWeapon )
continue;
altWeaponAmmo = level.player GetWeaponAmmoClip( weapon );
if ( altWeaponAmmo > 5 )
return true;
else
return false;
}
return false;
}
dialogue_course()
{
flag_wait( "player_has_started_course" );
flag_clear( "no_more_course_nags" );
thread dialogue_course_reload_nag();
thread dialogue_course_hurry_up();
thread dialogue_course_ADS_nag();
/*-----------------------
COURSE START
-------------------------*/
level.pitguy stopsounds();
if ( flag( "can_talk" ) )
{
//Cpl. Dunn Clear the first area. Go! Go! Go!
flag_clear( "can_talk" );
radio_dialogue( "train_cpd_clearfirstgogogo" );
flag_set( "can_talk" );
}
/*-----------------------
FIRST AREA CLEARED/PASSED BY
-------------------------*/
flag_wait_either( "player_course_03a", "course_start_targets_dead" );
if ( flag( "course_start_targets_dead" ) )
{
if ( flag( "can_talk" ) )
{
//Cpl. Dunn Area cleared! Move into the building!
flag_clear( "can_talk" );
radio_dialogue( "train_cpd_areacleared" );
flag_set( "can_talk" );
}
}
else
{
if ( flag( "can_talk" ) )
{
flag_clear( "can_talk" );
//Cpl. Dunn You missed some targets, just keep moving
radio_dialogue( "train_cpd_missedsome" );
flag_set( "can_talk" );
}
}
/*-----------------------
SECOND AREA CLEARED/PASSED BY
-------------------------*/
flag_wait_either( "player_course_stairs2", "course_first_floor_targets_dead" );
if ( flag( "course_first_floor_targets_dead" ) )
{
if ( flag( "can_talk" ) )
{
//Cpl. Dunn Up the stairs!
flag_clear( "can_talk" );
radio_dialogue( "train_cpd_upthestairs" );
flag_set( "can_talk" );
}
}
/*-----------------------
UP THE STAIRS
-------------------------*/
flag_wait( "player_course_stairs2" );
thread melee_nag();
/*-----------------------
SECOND FLOOR CLEARED/PASSED BY
-------------------------*/
flag_wait_either( "player_course_jumped_down", "course_second_floor_targets_dead" );
if ( flag( "course_second_floor_targets_dead" ) )
{
if ( flag( "can_talk" ) )
{
//Cpl. Dunn Area cleared! Jump down!
flag_clear( "can_talk" );
radio_dialogue( "train_cpd_jumpdown" );
flag_set( "can_talk" );
}
}
/*-----------------------
LAST AREA
-------------------------*/
flag_wait( "player_course_jumped_down" );
flag_set( "no_more_course_nags" );
if ( ( flag( "can_talk" ) ) && ( !flag( "course_end_targets_dead" ) ) )
{
//Cpl. Dunn Last area! Move! Move!
flag_clear( "can_talk" );
radio_dialogue( "train_cpd_lastareamove" );
flag_set( "can_talk" );
}
/*-----------------------
SPRINT TO FINISH
-------------------------*/
flag_wait( "player_course_end_03" );
}
melee_nag()
{
nagFrequency = 3;
melee_nag_number = 0;
while( true )
{
if ( flag( "melee_target_hit" ) )
break;
if ( ( flag( "can_talk" ) ) && ( !flag ( "melee_target_hit" ) ) )
{
if ( !flag( "player_near_melee_target" ) )
{
wait( .5 );
continue;
}
flag_clear( "can_talk" );
//Cpl. Dunn Melee with your knife!
radio_dialogue( "melee_nag_0" + melee_nag_number );
flag_set( "can_talk" );
melee_nag_number++;
if ( melee_nag_number > 4 )
melee_nag_number = 0;
flag_wait_or_timeout( "melee_target_hit", nagFrequency );
}
else
{
wait( .5 );
}
}
}
dialogue_course_civilian_killed()
{
level notify( "starting_civilian_nags" );
level endon( "starting_civilian_nags" );
dialogue = [];
dialogue[ 0 ] = "train_cpd_watchout"; //Cpl. Dunn Watch out for civilians.
dialogue[ 1 ] = "train_cpd_awwkilled"; //Cpl. Dunn Aww you killed a civvie. Come on, Allen!
dialogue[ 2 ] = "train_cpd_acivilian"; //Cpl. Dunn That was a civilian, Private.
iLine = 0;
while( !flag( "player_course_jumped_down" ) )
{
level waittill( "civilian_killed" );
if ( flag( "player_course_jumped_down" ) )
break;
if( !flag( "player_inside_course" ) )
break;
if ( flag( "no_more_course_nags" ) )
break;
if ( flag( "can_talk" ) )
{
flag_clear( "can_talk" );
radio_dialogue( dialogue[ iLine ] );
flag_set( "can_talk" );
iLine++;
if ( iLine > 2 )
iLine = 0;
flag_wait_or_timeout( "player_course_jumped_down", 5 );
}
}
}
dialogue_course_hurry_up()
{
level notify( "starting_hurry_nags" );
level endon( "starting_hurry_nags" );
thread track_player_kill_frequency();
iLine = 0;
while( !flag( "player_course_jumped_down" ) )
{
level waittill( "player_not_killing_targets_at_a_good_rate" );
if( !flag( "player_inside_course" ) )
break;
if ( flag( "no_more_course_nags" ) )
break;
if ( flag( "can_talk" ) )
{
flag_clear( "can_talk" );
radio_dialogue( "nag_hurry_0" + iLine );
flag_set( "can_talk" );
iLine++;
if ( iLine > 4 )
iLine = 0;
flag_wait_or_timeout( "player_course_jumped_down", 5 );
}
}
}
track_player_kill_frequency()
{
level notify( "track_player_kill_frequency" );
level endon( "track_player_kill_frequency" );
level endon( "player_course_jumped_down" );
while( !flag( "player_course_jumped_down" ) )
{
targetsHit = level.targets_hit;
level waittill_notify_or_timeout( "target_killed", 8 );
if ( targetsHit == level.targets_hit )
{
//if these values are equal, we timed out waiting for the slow-ass player to hit a target
level notify( "player_not_killing_targets_at_a_good_rate" );
}
wait( 2 );
}
}
dialogue_course_reload_nag()
{
level notify( "starting_reload_nags" );
level endon( "starting_reload_nags" );
while( true )
{
level.player waittill( "reload_start" );
if( flag( "player_course_jumped_down" ) )
break;
if( !flag( "player_inside_course" ) )
break;
if ( flag( "no_more_course_nags" ) )
break;
if ( ( flag( "can_talk" ) ) && ( player_alt_weapon_has_ammo() ) )
{
//Cpl. Dunn Just switch to your other weapon! It's faster than reloading!
flag_clear( "can_talk" );
radio_dialogue( "train_cpd_justswitch" );
flag_set( "can_talk" );
break;
}
}
}
dialogue_course_ADS_nag()
{
level notify( "starting_ADS_nags" );
level endon( "starting_ADS_nags" );
iNagnumber = 0;
while( true )
{
level waittill( "pit_target_hit_without_ADS" );
if( flag( "player_course_jumped_down" ) )
break;
if( !flag( "player_inside_course" ) )
break;
if ( flag( "no_more_course_nags" ) )
break;
if ( flag( "can_talk" ) )
{
//Cpl. Dunn Stop firing from the hip! Aim down your sights!
//Cpl. Dunn Aim down your sights, Private!
//Cpl. Dunn You need to aim down your sights, Allen!
flag_clear( "can_talk" );
radio_dialogue( "pit_ads_nag_0" + iNagnumber );
flag_set( "can_talk" );
iNagnumber++;
if ( iNagnumber > 2 )
break;
}
}
}
dialogue_nag_start_course( firstTimeThroughCourse )
{
level endon( "player_has_started_course" );
level endon( "player_inside_course" );
if ( !firstTimeThroughCourse )
{
firstLoop = false;
}
else
{
firstLoop = true;
}
wait( 1 );
flag_wait( "dunn_finished_with_open_case_dialogue" );
while( !flag( "player_inside_course" ) )
{
if ( flag( "player_inside_course" ) )
break;
//Cpl. Dunn Ok, head on in. Timer starts as soon as the first target pops.
level.pitguy dialogue_execute( "train_cpd_timerstarts" );
if ( firstLoop )
{
wait( 3 );
//Cpl. Dunn I don't know why they won't put us in first, Allen.
level.pitguy dialogue_execute( "train_cpd_putusin" );
//Cpl. Dunn There ain't much the Rangers can't do that SF and Delta can...but...(snorts) whatever man. That's SOCOM brass for ya.
level.pitguy dialogue_execute( "train_cpd_socombrass" );
wait( 2 );
//Cpl. Dunn And all those frickin' blocking positions. When are we gonna see some real action instead of babysitting Seals and D-boys, huah?
level.pitguy dialogue_execute( "train_cpd_realaction" );
//Cpl. Dunn <sigh, sentiment is 'same shit different day/what else is new >
level.pitguy play_sound_on_entity( "train_cpd_sigh" );
firstLoop = false;
wait( 15 );
}
else
{
if ( flag( "player_inside_course" ) )
break;
wait( 30 );
}
if ( flag( "player_inside_course" ) )
break;
//Cpl. Dunn Private Allen, we don't have all day. Get in The Pit.
level.pitguy dialogue_execute( "train_cpd_donthaveallday" );
if ( flag( "player_inside_course" ) )
break;
wait( 15 );
if ( flag( "player_inside_course" ) )
break;
//Cpl. Dunn You're gonna get us both in trouble with the Colonel man. Get in The Pit and run the course.
level.pitguy dialogue_execute( "train_cpd_bothintrouble" );
if ( flag( "player_inside_course" ) )
break;
wait( 60 );
}
}
door_open( sFlagToWaitFor, bFast )
{
if ( isdefined( self.moving ) )
{
while( isdefined( self.moving ) )
wait( 0.05 );
}
self.moving = true;
angles = 90;
if ( isdefined( self.openangles ) )
angles = self.openangles;
//wait for flag if there
if ( isdefined( sFlagToWaitFor ) )
flag_wait( sFlagToWaitFor );
iTime = 4;
if ( isdefined( bFast ) )
{
iTime = 1.5;
self rotateto( self.angles + ( 0, angles, 0 ), 1.5, .25, .25 );
}
else
{
self rotateto( self.angles + ( 0, angles, 0 ), 4, 1.5, 1.5 );
}
if( isdefined( self.blocker ) )
self.blocker hide_entity();
self thread play_sound_on_entity( "scn_training_fence_open" );
array_call( self.brushes,::notsolid );
wait( iTime );
self.moving = undefined;
}
door_close( sFlagToWaitFor, bFast )
{
if ( isdefined( self.moving ) )
{
while( isdefined( self.moving ) )
wait( 0.05 );
}
self.moving = true;
angles = -90;
if ( isdefined( self.closeangles ) )
angles = self.closeangles;
//wait for flag if there
if ( isdefined( sFlagToWaitFor ) )
flag_wait( sFlagToWaitFor );
iTime = 2;
if ( isdefined( bFast ) )
{
iTime = 1;
self rotateto( self.angles + ( 0, angles, 0 ), 1, .25, .25 );
}
else
{
self rotateto( self.angles + ( 0, angles, 0 ), 2, .5, .5 );
}
if( isdefined( self.blocker ) )
self.blocker show_entity();
self thread play_sound_on_entity( "scn_training_fence_close" );
array_call( self.brushes,::solid );
wait( iTime );
self.moving = undefined;
}
/****************************************************************************
CQB PIT COURSE START
****************************************************************************/
AA_ending_init()
{
thread end_sequence();
}
end_sequence()
{
// Regroup with your team
/*-----------------------
SETUP ACTORS
-------------------------*/
array = getaiarray();
guys_to_delete = [];
foreach ( dude in array )
{
if ( !isdefined( dude.script_parameters ) )
guys_to_delete[ guys_to_delete.size ] = dude;
}
drones_to_delete = array_merge( level.drones[ "allies" ].array, level.drones[ "axis" ].array );
drones_to_delete = array_merge( drones_to_delete, level.drones[ "neutral" ].array );
foreach( dude in drones_to_delete )
{
if ( isdefined( dude.script_parameters ) )
drones_to_delete = array_remove( drones_to_delete, dude );
}
//array_notify( level.aRangeActors, "stop_idle" );
//array_thread( level.aRangeActors,::anim_stopanimscripted );
//array_thread( level.aRangeActors,::AI_delete );
array_thread( guys_to_delete,::AI_delete );
basketball = getent( "basketball", "targetname" );
basketball delete();
array_thread( drones_to_delete,::AI_delete );
//spawners = getentarray( "friendlies_end_carrying_guys", "targetname" );
//friendlies_end_carrying_guys = array_spawn( getentarray( "friendlies_end_carrying_guys", "targetname" ), true );
//friendlies_end_carrying_guys[ 0 ].animname = "carrier";
//friendlies_end_carrying_guys[ 1 ].animname = "carried";
//friendlies_end_carrying_guys[ 0 ].dontDoNotetracks = true;
//friendlies_end_carrying_guys[ 1 ].dontDoNotetracks = true;
//friendlies_end_carrying_guys[ 0 ].script_looping = 0;
//friendlies_end_carrying_guys[ 1 ].script_looping = 0;
//friendlies_end_carrying_guys_anim_ent = spawners[ 0 ];
//friendlies_end_carrying_guys_anim_ent anim_first_frame( friendlies_end_carrying_guys, "wounded_pickup" );
//thread friendlies_end_carrying_guys_think( friendlies_end_carrying_guys, friendlies_end_carrying_guys_anim_ent);
friendlies_end_sequence = array_spawn( getentarray( "friendlies_end_sequence", "targetname" ), true );
//main_gate_blocker = getent( "main_gate_blocker", "targetname" );
//main_gate_blocker hide_entity();
gate_left = getent( "gate_left", "targetname" );
gate_right = getent( "gate_right", "targetname" );
gate_left rotateYaw( 90, 0.5 );
gate_right rotateYaw( -90, 0.5 );
gate_left02 = getent( "gate_left02", "targetname" );
gate_right02 = getent( "gate_right02", "targetname" );
gate_left02 rotateYaw( 90, 0.5 );
gate_right02 rotateYaw( -90, 0.5 );
hummer_end_01 = getent( "hummer_end_01", "targetname" );
hummer_end_main = getent( "hummer_end_main", "targetname" );
hummer_actors_main = array_spawn( getentarray( "hummer_actors_main", "targetname" ), true );
if ( hummer_actors_main[ 0 ].animation == "training_humvee_wounded" )
{
hummer_actors_main[ 0 ].animname = "soldier_wounded";
hummer_actors_main[ 1 ].animname = "soldier_door";
}
else
{
hummer_actors_main[ 1 ].animname = "soldier_wounded";
hummer_actors_main[ 0 ].animname = "soldier_door";
}
hummer_actors_main[ 0 ] gun_remove();
hummer_actors_main[ 1 ] gun_remove();
hummer_end_main.animname = "hummer";
hummer_end_main assign_animtree();
hummer_actors_main[ 2 ] = hummer_end_main;
hummer_actors_main_anim_ent = spawn( "script_origin", ( 0, 0, 0 ) );
hummer_actors_main_anim_ent.origin = hummer_end_main.origin;
hummer_actors_main_anim_ent.angles = hummer_end_main.angles;
hummer_actors_main_anim_ent anim_first_frame( hummer_actors_main, "hummer_sequence" );
array_call( hummer_actors_main,::hide );
/*-----------------------
PLAYER LEAVING COURSE
-------------------------*/
flag_wait( "player_exiting_course_00" );
//thread autosave_now( true );
level.player enableinvulnerability( true );
level.gate_cqb_enter_main thread door_close();
thread sirens();
thread radio_end();
heli_group_pre_end = spawn_vehicles_from_targetname_and_drive( "heli_group_pre_end" );
flag_wait( "player_exiting_course" );
flag_set( "end_sequence_starting" );
hummer_end_01 show();
end_blockers = getent( "end_blockers", "targetname" );
end_blockers show_entity();
//thread fail_if_friendlies_in_line_of_fire();
clear_timer_elems();
clear_hints();
level notify( "kill_timer" );
level notify( "clear_course" );
/*-----------------------
END SEQUENCE
-------------------------*/
thread spawn_vehicles_from_targetname_and_drive( "heli_group_01" );
flag_wait( "player_exiting_course_02" );
thread lerp_player_moverate( 0.1, 1 );
level.player allowsprint( false );
setObjectiveState( "obj_course", "done" );
heli_group_end = spawn_vehicles_from_targetname_and_drive( "heli_group_end" );
hummer_gate = spawn_vehicle_from_targetname_and_drive( "hummer_gate" );
hummer_gate2 = spawn_vehicle_from_targetname_and_drive( "hummer_gate2" );
hummer_gate3 = spawn_vehicle_from_targetname_and_drive( "hummer_gate3" );
array_call( hummer_actors_main,::show );
hummer_end_01 show_entity();
hummer_end_main delaythread( 1,::play_sound_in_space, "scn_trainer_humvee_skid1" );
hummer_end_01 delaythread( 2,::play_sound_in_space, "scn_trainer_humvee_skid2" );
hummer_gate3 delaythread( 5,::play_sound_in_space, "scn_trainer_humvee_skid3" );
hummer_actors_main_anim_ent thread anim_single( hummer_actors_main, "hummer_sequence" );
thread maps\trainer_fx::hummer_steam();
wait( 10 );
/*-----------------------
FADE OUT
-------------------------*/
black_overlay = create_client_overlay( "black", 0, level.player );
black_overlay fadeOverTime( 1 );
black_overlay.alpha = 1;
wait 2;
nextmission();
}
lerp_player_moverate( desiredRate, transitionTime )
{
currentMoveRate = 1;
incrementToDecrease = desiredRate / ( transitionTime / 0.05 );
time = 0;
while ( time < transitionTime )
{
currentMoveRate -= incrementToDecrease;
if ( currentMoveRate < 0 )
break;
level.player SetMoveSpeedScale( currentMoveRate );
time += .05;
wait( .05 );
}
}
sirens()
{
siren_orgs = getentarray( "siren_org", "targetname" );
while ( true )
{
foreach( siren in siren_orgs )
{
wait( .5 );
siren playsound ( "emt_alarm_trainer_alert" );
}
wait( 3 );
}
}
radio_end()
{
radio_orgs = getentarray( "radio_org_end", "targetname" );
flag_wait_or_timeout( "player_exiting_course", 1 );
//Overlord (HQ Radio) training All Hunter units, get to your victors. We're headed out.
thread radio_dialogue( "train_hqr_headedout" );
flag_wait( "player_exiting_course" );
org = getfarthest( level.player.origin, radio_orgs );
//Ranger 2 They blew the damn bridge! We gotta move!
org thread play_sound_in_space( "train_ar2_blewthebridge" );
flag_wait( "player_exiting_course_02" );
//Ranger 1 BCT One is trapped across the river in the red zone! We've lost contact!
level.player play_sound_on_entity( "train_ar1_trapped" );
//Sgt. Foley Everyone get to your vehicles! We're moving out!
level.player play_sound_on_entity( "train_fly_movingout" );
org = getfarthest( level.player.origin, radio_orgs );
//Ranger 2 Get a medic over here! train_ar2_getamedic
org play_sound_in_space( "train_ar2_getamedic" );
}
friendlies_end_carrying_guys_think( guys, anim_ent )
{
flag_wait( "player_exiting_course_02" );
anim_ent anim_single( guys, "wounded_pickup" );
while( true )
{
guys[ 0 ] thread anim_single_solo( guys[ 0 ], "wounded_carry" );
guys[ 1 ] anim_single_solo( guys[ 1 ], "wounded_carry" );
}
}
/****************************************************************************
TARGET LOGIC AND SCORING
****************************************************************************/
target_triggers_think()
{
//self ==> the trigger that makes the targets pop up
//linkedTargets = getentarray( self.script_LinkTo, "script_Linkname" );
linkedTargets = self get_linked_ents();
self.targets = [];
self.targetsFriendly = [];
self.targetsEnemy = [];
foreach( ent in linkedTargets )
{
if ( !isdefined( ent.script_noteworthy ) )
continue;
if ( ( isdefined( ent.code_classname ) ) && ( ent.code_classname == "script_brushmodel" ) )
{
//add this target to the trigger's target array
self.targets[ self.targets.size ] = ent;
//diffentiate between enemy and civvie targets
if ( ent.script_noteworthy == "target_enemy" )
{
self.targetsEnemy[ self.targetsEnemy.size ] = ent;
}
else if ( ent.script_noteworthy == "target_friendly" )
{
self.targetsFriendly[ self.targetsFriendly.size ] = ent;
}
else
{
assertmsg( "Target at " + ent.origin + " needs a script_noteworthy with either target_enemy or target_friendly." );
}
continue;
}
}
/*-----------------------
ADD TO TOTAL COURSE TARGETS, IF THERE ARE ANY
-------------------------*/
if ( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "course_triggers_01" ) )
{
level.courseFriendlies = array_merge( level.courseFriendlies, self.targetsFriendly );
level.courseEnemies = array_merge( level.courseEnemies, self.targetsEnemy );
}
while ( true )
{
self trigger_off();
self waittill( "activate" );
self trigger_on();
self waittill( "trigger" );
array_notify( self.targets, "pop_up" );
}
}
target_think( targetType )
{
//self ==> the script brushmodel target
if ( getdvar( "trainer_debug" ) == "1" )
{
self.orgEnt = getEnt( self.target, "targetname" );
aim_assist_target = getEnt( self.orgEnt.target, "targetname" );
aim_assist_target hide();
return;
}
/*-----------------------
SETUP BRUSHMODEL TARGET AND ALL ENTITIES
-------------------------*/
self.meleeonly = undefined;
self.orgEnt = getEnt( self.target, "targetname" );
//thread debug_message( "orgEnt", undefined, 9999, self.orgEnt );
assert( isdefined( self.orgEnt ) );
self linkto ( self.orgEnt );
aim_assist_target = getEnt( self.orgEnt.target, "targetname" );
//aim_assist_target linkTo( self );
aim_assist_target hide();
aim_assist_target notsolid();
//thread debug_message( "X", undefined, 9999, aim_assist_target );
if ( ! isdefined ( self.orgEnt.script_noteworthy ) )
self.orgEnt.script_noteworthy = "standard";
if (self.orgEnt.script_noteworthy == "reverse" )
self.orgEnt rotatePitch( 90, 0.25 );
else if (self.orgEnt.script_noteworthy == "sideways" )
self.orgEnt rotateYaw( -180, 0.5 );
else
self.orgEnt rotatePitch( -90, 0.25 );
self.lateralMovementOrgs = undefined;
self.lateralStartPosition = undefined;
self.lateralEndPosition = undefined;
self.restMoveTime = undefined;
self.lateralMoveTime = undefined;
if ( ( isdefined( self.script_parameters ) ) && ( self.script_parameters == "penetration_targets" ) )
{
level.penetration_targets[ level.penetration_targets.size ] = self;
}
if ( ( isdefined( self.script_parameters ) ) && ( self.script_parameters == "grenade_targets" ) )
{
level.grenade_targets[ level.grenade_targets.size ] = self;
}
if ( ( isdefined( self.script_parameters ) ) && ( self.script_parameters == "hip_targets" ) )
{
level.hip_targets[ level.hip_targets.size ] = self;
}
/*-----------------------
SETUP LATERALLY MOVING TARGETS
-------------------------*/
if ( ( isdefined( self.script_parameters ) ) && ( self.script_parameters == "use_rail" ) )
{
aim_assist_target linkTo( self );
self.lateralStartPosition = getclosest( self.orgEnt.origin, level.target_rail_start_points, 10 );
assertex( isdefined( self.lateralStartPosition ), "Pop up target at " + self.origin + " has its script_parameters set to 'use_rail' but there is no valid rail start org within 10 units ");
self.lateralEndPosition = getent( self.lateralStartPosition.target, "targetname" );
assertex( isdefined( self.lateralEndPosition ), "Pop up target at " + self.origin + " has a rail start position that is not targeting an end rail position" );
//thread debug_message( "End", undefined, 9999, self.lateralEndPosition );
//thread debug_message( "Start", undefined, 9999, self.lateralStartPosition );
self.lateralMovementOrgs = [];
self.lateralMovementOrgs[ 0 ] = self.lateralStartPosition;
self.lateralMovementOrgs[ 1 ] = self.lateralEndPosition;
dist = distance( self.lateralMovementOrgs[ 0 ].origin, self.lateralMovementOrgs[ 1 ].origin );
self.restMoveTime = ( dist / 30 );
self.restMoveTime = roundDecimalPlaces( self.restMoveTime, 0 );
self.lateralMoveTime = ( dist / 22 );
self.lateralMoveTime = roundDecimalPlaces( self.lateralMoveTime, 0 );
foreach( org in self.lateralMovementOrgs )
{
assertex( org.code_classname == "script_origin", "Pop up targets that move laterally need to be targeting 2 script_origins" );
}
self target_lateral_reset_random();
}
while ( true )
{
/*-----------------------
TARGET POPS UP WHEN TRIGGERED
-------------------------*/
self waittill ( "pop_up" );
so_player_tooclose_wait();
if ( ( isdefined( self.script_parameters ) ) && ( self.script_parameters == "melee" ) )
{
self.meleeonly = true;
melee_clip = getent( "melee_clip", "targetname" );
melee_clip show_entity();
}
if ( isdefined( self.script_flag ) )
self thread target_go_back_down_when_flag_is_set( self.script_flag );
wait randomfloatrange ( 0, .2 );
self solid();
self playSound( "target_up_metal" );
self setCanDamage( true );
if ( targetType != "friendly" )
aim_assist_target enableAimAssist();
if ( self.orgEnt.script_noteworthy == "reverse" )
self.orgEnt rotatePitch( -90, 0.25 );
else if ( self.orgEnt.script_noteworthy == "sideways" )
self.orgEnt rotateYaw( 180, 0.5 );
else
self.orgEnt rotatePitch( 90, 0.25 );
wait .25;
if ( isdefined( self.lateralStartPosition ) )
{
self thread target_lateral_movement();
}
/*-----------------------
TARGET IS DAMAGED, OR TOLD TO GO BACK DOWN VIA SCRIPT/FLAGS
-------------------------*/
while ( true )
{
self waittill ( "damage", amount, attacker, direction_vec, point, type );
if ( !isdefined( attacker ) )
continue;
if ( !isdefined( type ) )
continue;
if( type == "MOD_IMPACT" )
continue;
if ( type == "scripted_target_drop" )
{
//self playSound( "target_up_metal" );
// if ( is_specialop() )
// {
// if ( targetType != "friendly" )
// {
// level.missed_targets++;
// speaker = getclosest( level.player.origin, level.speakers );
// speaker playSound( "target_mistake_buzzer" );
// maps\_specialops::info_hud_decrement_timer( level.so_missed_target_deduction );
// }
// }
break;
}
if ( type == "timed_target_drop" )
{
// if the targets get proped by timeout in specialops
speaker = getclosest( level.player.origin, level.speakers );
speaker playSound( "target_mistake_buzzer" );
// if ( is_specialop() )
// {
// if ( targetType != "friendly" )
// {
// level.missed_targets++;
// maps\_specialops::info_hud_decrement_timer( level.so_missed_target_deduction );
// }
// }
break;
}
if ( isplayer( attacker ) )
{
if ( isdefined( self.meleeonly ) )
{
if ( type != "MOD_MELEE" )
continue;
}
// makes targets take more hits to put down.
// MikeD 7/10: It's not intuitive to the enduser to keep this
// if ( is_specialop() && level.gameSkill == 3 )
// {
// assert( isdefined( level.target_fall_health ) );
// if ( self.health > level.target_fall_health )
// continue;
// }
self playSound( "target_metal_hit" );
if ( targetType == "friendly" )
{
speaker = getclosest( level.player.origin, level.speakers );
speaker playSound( "target_mistake_buzzer" );
if ( isdefined( attacker.friendlies_hit ) )
{
attacker.friendlies_hit++;
}
level.friendlies_hit++;
if ( !is_specialop() )
{
if ( isdefined( level.HUDcivviesKilled ) )
{
level.HUDcivviesKilled setValue ( level.friendlies_hit );
level.HUDcivviesKilled.color = level.color[ "red" ];
}
}
level notify( "civilian_killed" );
}
else
{
attacker maps\_player_stats::register_kill( self, type );
if ( isdefined( attacker.targets_hit ) )
{
attacker.targets_hit++;
}
level.targets_hit++;
if ( type == "MOD_MELEE" )
{
level.targets_hit_with_melee++;
}
level notify( "target_killed" );
if ( !is_specialop() )
{
if ( isdefined( level.HUDenemiesKilled ) )
{
level.HUDenemiesKilled setValue ( level.targets_hit );
}
}
}
if ( type == "MOD_GRENADE_SPLASH" )
{
self notify( "hit_with_grenade" );
}
break;
}
}
/*-----------------------
TARGET OUT OF PLAY TILL TOLD TO POP UP AGAIN
-------------------------*/
if ( isdefined( self.meleeonly ) )
{
self.meleeonly = true;
melee_clip = getent( "melee_clip", "targetname" );
melee_clip thread hide_entity();
flag_set( "melee_target_hit" );
}
else if ( ( targetType != "friendly" ) && ( !level.player isADS() ) )
{
if ( ( isdefined( type ) ) && ( type != "MOD_MELEE" ) && ( type != "scripted_target_drop" ) )
level notify( "pit_target_hit_without_ADS" );
}
self notify ( "hit" );
self notify ( "target_going_back_down" );
self.health = 1000;
aim_assist_target disableAimAssist();
self notsolid();
//wait( 0.05 );
if (self.orgEnt.script_noteworthy == "reverse" )
self.orgEnt rotatePitch( 90, 0.25 );
else if (self.orgEnt.script_noteworthy == "sideways" )
self.orgEnt rotateYaw( -180, 0.5 );
else
self.orgEnt rotatePitch( -90, 0.25 );
self setCanDamage( false );
wait .25;
}
}
so_player_tooclose_wait()
{
if ( !is_specialop() )
{
return;
}
origin = self.origin;
y_check = undefined;
if ( IsDefined( self.script_parameters ) && self.script_parameters == "melee" )
{
origin = ( -5723, 2547, -49 ); // Just under the melee target
y_check = 2520;
}
while ( 1 )
{
close = false;
foreach ( player in level.players )
{
dist_test = 56 * 56;
if ( Length( player GetVelocity() ) > 200 )
{
dist_test = 128 * 128;
}
if ( DistanceSquared( player.origin, origin ) < dist_test )
{
close = true;
if ( IsDefined( y_check ) && player.origin[ 1 ] < y_check )
{
close = false;
}
}
}
if ( !close )
{
return;
}
wait( 0.05 );
}
}
target_lateral_movement()
{
dummy = spawn( "script_origin", ( 0, 0, 0 ) );
dummy.angles = self.orgEnt.angles;
dummy.origin = self.orgEnt.origin;
self.orgEnt thread lateral_dummy_move( dummy );
dummy endon( "deleted_because_player_was_too_close" );
dummy endon( "death" );
foreach( player in level.players )
{
dummy thread delete_when_player_too_close( player );
}
self thread dummy_delete_when_target_goes_back_down( dummy );
while ( true )
{
dummy moveTo( self.lateralEndPosition.origin, self.lateralMoveTime );
wait( self.lateralMoveTime );
dummy moveTo( self.lateralStartPosition.origin, self.lateralMoveTime );
wait( self.lateralMoveTime );
}
}
dummy_delete_when_target_goes_back_down( dummy )
{
dummy endon( "death" );
//self --> the target
self waittill( "target_going_back_down" );
dummy delete();
}
delete_when_player_too_close( player )
{
//want to stop lateral movement if player is too close to avoid getting stuck
self endon( "death" );
dist = 128;
distSquared = dist * dist;
while( true )
{
wait( .05 );
if ( distancesquared( player.origin, self.origin ) < distSquared )
break;
}
self notify( "deleted_because_player_was_too_close" );
self delete();
}
lateral_dummy_move( dummy )
{
dummy endon( "death" );
while( true )
{
wait( 0.05 );
self.origin = dummy.origin;
}
}
target_lateral_reset_random()
{
if ( cointoss() )
{
self.lateralStartPosition = self.lateralMovementOrgs[ 0 ];
self.lateralEndPosition = self.lateralMovementOrgs[ 1 ];
}
else
{
self.lateralStartPosition = self.lateralMovementOrgs[ 1 ];
self.lateralEndPosition = self.lateralMovementOrgs[ 0 ];
}
self.orgEnt moveTo( self.lateralStartPosition.origin, .1 );
}
target_go_back_down_when_flag_is_set( sFlag )
{
if ( is_specialop() )
{
return;
}
/*-----------------------
TARGET GOES BACK DOWN PREMATURELY IF FLAG IS SET
-------------------------*/
self endon ( "target_going_back_down" );
flag_wait( sFlag );
self target_reset_manual();
}
target_reset_manual()
{
self notify( "damage", 1000, "worldspawn", undefined, undefined, "scripted_target_drop" );
}
/****************************************************************************
UTILITY
****************************************************************************/
roundDecimalPlaces( value, places, style )
{
if ( !isdefined( style ) )
style = "nearest";
modifier = 1;
for ( i = 0; i < places; i++ )
modifier *= 10;
newValue = value * modifier;
if ( style == "up" )
roundedValue = ceil( newValue );
else if ( style == "down" )
roundedValue = floor( newValue );
else
roundedValue = newvalue + 0.5;
newvalue = Int( roundedValue );
newvalue = newvalue / modifier;
return newvalue;
}
//ammoRespawnThink( flag, type, obj_flag )
//{
// wait .2; //timing
// weapon = self;
// ammoItemClass = weapon.classname;
// ammoItemOrigin = ( weapon.origin + (0,0,8) ); //wont spawn if inside something
// ammoItemAngles = weapon.angles;
// weapon set_ammo();
//
// if ( type == "flash_grenade" )
// ammo_fraction_required = 1;
// else
// ammo_fraction_required = .2;
//
// if ( isdefined ( flag ) )
// {
// //self delete();
// weapon.origin = weapon.origin + (0, 0, -10000);
//
// flag_wait ( flag );
//
// weapon.origin = weapon.origin + (0, 0, 10000);
// weapon glow();
// weapon set_ammo();
// }
//
// weapon waittill ( "trigger" );
//
// //weapon stopGlow();
//
// while ( 1 )
// {
// wait 1;
//
// if ( ( level.player GetFractionMaxAmmo( type ) ) < ammo_fraction_required )
// {
// while ( distance( level.player.origin, ammoItemOrigin ) < 160 )
// wait 1;
//
// //if ( level.player pointInFov( ammoItemOrigin ) )
// // continue;
//
// weapon = spawn ( ammoItemClass, ammoItemOrigin, 1 ); //suspended bit flag
// //weapon = spawn ( "weapon_mp5", ammoItemOrigin );
// weapon.angles = ammoItemAngles;
// weapon set_ammo();
// wait .2;
// weapon.origin = ( ammoItemOrigin + (0,0,-8) );
// //weapon.angles = ammoItemAngles;
//
// //weapon waittill ( "trigger" );
// while ( isdefined ( weapon ) )
// wait 1;
// }
// }
//}
set_ammo()
{
if ( (self.classname == "weapon_fraggrenade") || (self.classname == "weapon_flash_grenade") )
self ItemWeaponSetAmmo( 1, 0 );
else
self ItemWeaponSetAmmo( 999, 999 );
}
init_precache()
{
precacheModel( "weapon_binocular" );
precachemodel( "mil_grenade_box_opened" );
precachemodel( "adrenaline_syringe_animated" );
precachemodel( "clotting_powder_animated" );
precacheModel( "com_bottle2" );
precacheModel( "viewmodel_desert_eagle" );
precacheshader( "black" );
precacheModel( "weapon_m67_grenade_obj" );
precacheModel( "prop_price_cigar" );
PreCacheModel( "electronics_pda" );
precacheModel( "weapon_m4" );
precacheModel( "weapon_m4_clip" );
precacheModel( "characters_accessories_pencil" );
precacheModel( "mil_mre_chocolate01" );
precacheModel( "weapon_desert_eagle_tactical_obj" );
precacheModel( "weapon_m4_obj" );
//precacheModel( "weapon_m4_obj" );
precacheShader( "objective" );
precacheShader( "hud_icon_c4" );
precacheShader( "hud_dpad" );
precacheShader( "hud_arrow_right" );
precacheShader( "hud_arrow_down" );
precacheShader( "hud_icon_40mm_grenade" );
precacheshader( "popmenu_bg" );
precacheString( &"TRAINER_OBJ_GET_RIFLE_AMMO" );
precacheString( &"TRAINER_KILLED_CIVVIES_PENALTY" );
precacheString( &"TRAINER_TRY_SPRINT_AGAIN" );
precacheString( &"TRAINER_KILLED_CIVVIES_NONE" );
precacheString( &"TRAINER_ACCURACY_LABEL" );
precacheString( &"TRAINER_MISSION_FAIL_FIRE_IN_CAMP" );
precacheString( &"TRAINER_SHOOT_THE_TARGET_THROUGH" );
// Press ^3[{weaponslot primaryb}]^7 to switch to your sidearm.
precacheString( &"TRAINER_HINT_SIDEARM" );
// The Objective Indicator is on the \nbottom of your screen in the middle.
precacheString( &"TRAINER_HINT_OBJECTIVE_MARKER" );
// When the yellow circle is in the middle of\nthe compass, you are facing your objective.
precacheString( &"TRAINER_HINT_OBJECTIVE_REMINDER" );
// Turn until the yellow circle in your compass tape\nlines up with the white ticks and head in that direction\nto locate your current objective.
precacheString( &"TRAINER_HINT_OBJECTIVE_REMINDER2" );
// You don't have to hold ^3[{+sprint}]^7 to continue sprinting.
precacheString( &"TRAINER_HINT_HOLDING_SPRINT" );
// Reverse your controls for looking up and down?
precacheString( &"TRAINER_AXIS_OPTION_MENU1_ALL" );
// Keep your controls like this?
precacheString( &"TRAINER_AXIS_OPTION_MENU2_ALL" );
if ( level.console )
precacheMenu( "invert_axis" );
else
precacheMenu( "invert_axis_pc" );
precacheMenu( "select_difficulty" );
// The Objective Indicator is on the \nbottom of your screen in the middle.
precachestring( &"TRAINER_HINT_OBJECTIVE_MARKER" );
// Press ^3[{pause}]^7 to check your objectives.
precachestring( &"TRAINER_HINT_CHECK_OBJECTIVES_PAUSED" );
// Press ^3[{+scores}]^7 to check your objectives.
precachestring( &"TRAINER_HINT_CHECK_OBJECTIVES_SCORES" );
// Press the START button to check your objectives.
precachestring( &"TRAINER_HINT_CHECK_OBJECTIVES_SCORES_PS3" );
// The Objective Indicator is on the \nbottom of your screen in the middle.
precachestring( &"TRAINER_HINT_OBJECTIVE_MARKER" );
// When the yellow circle is in the middle of\nthe compass, you are facing your objective.
precachestring( &"TRAINER_HINT_OBJECTIVE_REMINDER" );
// Turn until the yellow circle in your compass tape\nlines up with the white ticks and head in that direction\nto locate your current objective.
precachestring( &"TRAINER_HINT_OBJECTIVE_REMINDER2" );
// Press ^3[{+attack}]^7 to fire your weapon.
precachestring( &"TRAINER_HINT_ATTACK_PC" );
// Pull ^3[{+attack}]^7 to fire your weapon.
precachestring( &"TRAINER_HINT_ATTACK" );
// Press ^3[{+attack}]^7 to fire from the hip.
precachestring( &"TRAINER_HINT_HIP_ATTACK_PC" );
// Pull ^3[{+attack}]^7 to fire from the hip.
precachestring( &"TRAINER_HINT_HIP_ATTACK" );
// Pull and hold ^3[{+speed}]^7 to aim down the sights of your weapon.
precachestring( &"TRAINER_HINT_ADS_360" );
// Press and hold ^3[{+speed}]^7 to aim down the sights of your weapon.
precachestring( &"TRAINER_HINT_ADS" );
// Press ^3[{toggleads}]^7 to aim down the sight.
precachestring( &"TRAINER_HINT_ADS_TOGGLE" );
// Pull and hold ^3[{+speed_throw}]^7 to aim down the sights of your weapon.
precachestring( &"TRAINER_HINT_ADS_THROW_360" );
// Press and hold ^3[{+speed_throw}]^7 to aim down the sights of your weapon.
precachestring( &"TRAINER_HINT_ADS_THROW" );
// Press ^3[{+toggleads_throw}]^7 to aim down the sights of your weapon.
precachestring( &"TRAINER_HINT_ADS_TOGGLE_THROW" );
// Hit the targets while firing from the hip.\nRelease ^3[{+speed}]^7 to stop aiming down your sight.
precachestring( &"TRAINER_HINT_STOP_ADS" );
// Hit the targets while firing from the hip.\nPress ^3[{toggleads}]^7 to stop aiming down your sight.
precachestring( &"TRAINER_HINT_STOP_ADS_TOGGLE" );
// Hit the targets while firing from the hip.\nRelease ^3[{+speed_throw}]^7 to stop aiming down your sight.
precachestring( &"TRAINER_HINT_STOP_ADS_THROW" );
// Hit the targets while firing from the hip.\nPress ^3[{+toggleads_throw}]^7 to stop aiming down your sight.
precachestring( &"TRAINER_HINT_STOP_ADS_TOGGLE_THROW" );
// Press and hold ^3[{+melee_breath}]^7 to steady your breathing.
precachestring( &"TRAINER_HINT_BREATH_MELEE" );
// Press and hold ^3[{+breath_sprint}]^7 to steady your breathing.
precachestring( &"TRAINER_HINT_BREATH_SPRINT" );
// Press and hold ^3[{+breath_binoculars}]^7 to steady your breathing.
precachestring( &"TRAINER_HINT_BREATH_BINOCULARS" );
// Press ^3[{+breath_binoculars}]^7 near the melon to strike it with your weapon.
precachestring( &"TRAINER_HINT_MELEE_BREATH" );
// Press ^3[{+melee}]^7 near the melon to strike it with your weapon.
precachestring( &"TRAINER_HINT_MELEE" );
// Click ^3[{+breath_binoculars}]^7 near the melon to strike it with your weapon.
precachestring( &"TRAINER_HINT_MELEE_BREATH_CLICK" );
// Click ^3[{+melee}]^7 near the melon to strike it with your weapon.
precachestring( &"TRAINER_HINT_MELEE_CLICK" );
// Press ^3[{goprone}]^7 to go prone.
precachestring( &"TRAINER_HINT_PRONE" );
// Press and hold ^3[{+prone}]^7 to go prone.
precachestring( &"TRAINER_HINT_PRONE_HOLD" );
// Press ^3[{toggleprone}]^7 to go prone.
precachestring( &"TRAINER_HINT_PRONE_TOGGLE" );
// Press and hold down ^3[{+stance}]^7 to go prone.
precachestring( &"TRAINER_HINT_PRONE_STANCE" );
// Double tap ^3[{lowerstacnce}]^7 to go prone.
precachestring( &"TRAINER_HINT_PRONE_DOUBLE" );
// Press ^3[{+stance}]^7 to crouch.
precachestring( &"TRAINER_HINT_CROUCH_STANCE" );
// Press ^3[{gocrouch}]^7 to crouch.
precachestring( &"TRAINER_HINT_CROUCH_HOLD" );
precachestring( &"TRAINER_HINT_CROUCH" );
// Press ^3[{togglecrouch}]^7 to crouch.
precachestring( &"TRAINER_HINT_CROUCH_TOGGLE" );
// Press ^3[{+gostand}]^7 to stand up.
precachestring( &"TRAINER_HINT_STAND" );
// Press ^3[{+stance}]^7 to stand up.
precachestring( &"TRAINER_HINT_STAND_STANCE" );
// While standing, press ^3[{+gostand}]^7 to jump.
precachestring( &"TRAINER_HINT_JUMP_STAND" );
// While standing, press ^3[{+moveup}]^7 to jump.
precachestring( &"TRAINER_HINT_JUMP" );
// Press ^3[{+sprint}]^7 while moving forward to sprint.
precachestring( &"TRAINER_HINT_SPRINT_PC" );
// Click ^3[{+sprint}]^7 while moving forward to sprint.
precachestring( &"TRAINER_HINT_SPRINT" );
// Press ^3[{+breath_sprint}]^7 while moving forward to sprint.
precachestring( &"TRAINER_HINT_SPRINT_BREATH_PC" );
// Click ^3[{+breath_sprint}]^7 while moving forward to sprint.
precachestring( &"TRAINER_HINT_SPRINT_BREATH" );
// You don't have to hold ^3[{+sprint}]^7 to continue sprinting.
precachestring( &"TRAINER_HINT_HOLDING_SPRINT" );
// You don't have to hold ^3[{+breath_sprint}]^7 to continue sprinting.
precachestring( &"TRAINER_HINT_HOLDING_SPRINT_BREATH" );
// Press ^3[{+usereload}]^7 to reload your weapon.
precachestring( &"TRAINER_HINT_RELOAD_USE" );
// Press ^3[{+reload}]^7 to reload your weapon.
precachestring( &"TRAINER_HINT_RELOAD" );
// Touch the obstacle and press ^3[{+gostand}]^7 to mantle over it.
precachestring( &"TRAINER_HINT_MANTLE" );
// Release and pull ^3[{+speed}]^7 to automatically\nswitch to a nearby target.
precachestring( &"TRAINER_HINT_ADS_SWITCH" );
// Release then press and hold ^3[{+speed}]^7 to\nquickly switch to a nearby target.
precachestring( &"TRAINER_HINT_ADS_SWITCH_SHOULDER" );
// Release and pull ^3[{+speed_throw}]^7 to automatically\nswitch to a nearby target.
precachestring( &"TRAINER_HINT_ADS_SWITCH_THROW" );
// Release then press and hold ^3[{+speed_throw}]^7 to\nquickly switch to a nearby target.
precachestring( &"TRAINER_HINT_ADS_SWITCH_THROW_SHOULDER" );
// Press ^3[{weapnext}]^7 to switch to your sidearm.
precachestring( &"TRAINER_HINT_SIDEARM_SWAP" );
// Press ^3[{weapnext}]^7 to switch to your primary weapon.
precachestring( &"TRAINER_HINT_PRIMARY_SWAP" );
// Press ^3[{weaponslot primaryb}]^7 to switch to your sidearm.
precachestring( &"TRAINER_HINT_SIDEARM" );
// Press ^3[{+reload}]^7 to load your sidearm.
precachestring( &"TRAINER_HINT_SIDEARM_RELOAD" );
// Press ^3[{+usereload}]^7 to load your sidearm.
precachestring( &"TRAINER_HINT_SIDEARM_RELOAD_USE" );
// Press ^3[{+frag}]^7 to throw a frag grenade.
precachestring( &"TRAINER_HINT_FRAG" );
// Notice that your crosshair expands as you fire.\nThe bigger the crosshairs, the less accurate you are.
precachestring( &"TRAINER_HINT_CROSSHAIR_CHANGES" );
precachestring( &"TRAINER_HINT_TURN_AROUND" );
// Firing from the hip is never as\naccurate as aiming down your sight.
precachestring( &"TRAINER_HINT_ADS_ACCURACY" );
// You were too slow.
precachestring( &"TRAINER_SHIP_TOO_SLOW" );
precachestring( &"TRAINER_CIVVIES_KILLED" );
precachestring( &"TRAINER_ENEMIES_KILLED" );
precachestring( &"TRAINER_YOUR_TIME_IN_SECONDS" );
// Your time:
precachestring( &"TRAINER_YOUR_TIME" );
// Your final time:
precachestring( &"TRAINER_YOUR_FINAL_TIME" );
// IW best time:
precachestring( &"TRAINER_IW_BEST_TIME" );
// Your deck time:
precachestring( &"TRAINER_YOUR_DECK_TIME" );
// IW deck time:
precachestring( &"TRAINER_IW_DECK_TIME" );
// You don't have enough flashes to finish.
precachestring( &"TRAINER_SHIP_OUT_OF_FLASH" );
// You jumped too early.
precachestring( &"TRAINER_SHIP_JUMPED_TOO_EARLY" );
// You hit a friendly target.
precachestring( &"TRAINER_HIT_FRIENDLY" );
// Press ^3[{+smoke}]^7 to throw a flash bang.
precachestring( &"TRAINER_HINT_FLASH" );
precachestring( &"TRAINER_MISSED_ENEMY_PENALTY_NONE" );
precachestring( &"TRAINER_MISSED_ENEMY_PENALTY" );
// Accuracy bonus:+
precachestring( &"TRAINER_ACCURACY_BONUS" );
// Cargoship Bridge
precachestring( &"TRAINER_SHIP_LABEL" );
// Cargoship Deck
precachestring( &"TRAINER_DECK_LABEL" );
precachestring( &"TRAINER_ACCURACY_NA" );
// Accuracy bonus:+0.0
precachestring( &"TRAINER_ACCURACY_BONUS_ZERO" );
// You must aim above your target with grenades.
precachestring( &"TRAINER_HINT_GRENADE_TOO_LOW" );
// You must aim above your target with grenade launchers.
precachestring( &"TRAINER_HINT_GL_TOO_LOW" );
// Reverse your controls
precachestring( &"TRAINER_AXIS_OPTION_MENU1" );
// Switch your controls
precachestring( &"TRAINER_AXIS_OPTION_MENU2" );
// for looking up and down?
precachestring( &"TRAINER_AXIS_OPTION_MENU1B" );
// back to how they were?
precachestring( &"TRAINER_AXIS_OPTION_MENU2B" );
//
precachestring( &"TRAINER_AXIS_OPTION_YES" );
//
precachestring( &"TRAINER_AXIS_OPTION_NO" );
// Reverse your controls for looking up and down?
precachestring( &"TRAINER_AXIS_OPTION_MENU1_ALL" );
// Keep your controls like this?
precachestring( &"TRAINER_AXIS_OPTION_MENU2_ALL" );
// Look up.
precachestring( &"TRAINER_LOOK_UP" );
// Look down.
precachestring( &"TRAINER_LOOK_DOWN" );
// Notice you now have an icon of a grenade launcher on your display.
precachestring( &"TRAINER_HINT_LAUNCHER_ICON" );
// You endangered a team mate.
precachestring( &"TRAINER_FIRED_NEAR_FRIENDLY" );
// Use your Objective Indicator to find the firing range.
precachestring( &"TRAINER_USE_YOUR_OBJECTIVE_INDICATOR" );
// Pick up a rifle from the table.
precachestring( &"TRAINER_PICK_UP_A_RIFLE_FROM" );
// Get a pistol from the same place you got the rifle.
precachestring( &"TRAINER_GET_A_PISTOL_FROM_THE" );
// Melee the watermelon with your knife.
precachestring( &"TRAINER_MELEE_THE_WATERMELON" );
// Go outside and report to Sgt. Newcastle.
precachestring( &"TRAINER_GO_OUTSIDE_AND_REPORT" );
// Pick up the rifle with the grenade launcher attachment.
precachestring( &"TRAINER_PICK_UP_THE_RIFLE_WITH" );
// Pick up the C4 explosive.
precachestring( &"TRAINER_PICK_UP_THE_C4_EXPLOSIVE" );
// Run the obstacle course.
precachestring( &"TRAINER_RUN_THE_OBSTACLE_COURSE" );
// Use your objective indicator to locate The Pit.
precachestring( &"OBJ_GO_TO_THE_PIT" );
// Climb the ladder.
precachestring( &"TRAINER_CLIMB_THE_LADDER" );
precachestring( &"TRAINER_OBJ_EXIT_THE_PIT" );
// Debrief with Captain Price.
precachestring( &"TRAINER_DEBRIEF_WITH_CPT_PRICE" );
// Enter station number 1 and aim down your sights.
precachestring( &"TRAINER_ENTER_STATION_NUMBER" );
// Shoot each target while aiming down your sights.
precachestring( &"TRAINER_SHOOT_EACH_TARGET_WHILE" );
// Shoot each target while firing from the hip.
precachestring( &"TRAINER_SHOOT_EACH_TARGET_WHILE1" );
// Shoot each target as quickly as possible.
precachestring( &"TRAINER_SHOOT_EACH_TARGET_AS" );
// Equip the MP5 and pick up 4 flashbangs.
precachestring( &"TRAINER_EQUIP_THE_MP5_AND_PICK" );
// Clear the cargoship bridge mock-up.
precachestring( &"TRAINER_CLEAR_THE_CARGOSHIP_BRIDGE" );
// Switch to your rifle and then back to your pistol.
precachestring( &"TRAINER_SWITCH_TO_YOUR_RIFLE" );
// Pick up the frag grenades.
precachestring( &"TRAINER_PICK_UP_THE_FRAG_GRENADES" );
// Enter the safety pit.
precachestring( &"TRAINER_ENTER_THE_SAFETY_PIT" );
// Throw a grenade into windows two, three and four.
precachestring( &"TRAINER_THROW_A_GRENADE_INTO" );
// Return to the safety pit and equip the grenade launcher.
precachestring( &"TRAINER_RETURN_TO_THE_SAFETY" );
// Fire at the wall with the number one on it.
precachestring( &"TRAINER_FIRE_AT_THE_WALL_WITH" );
// Plant the C4 explosive at the glowing spot.
precachestring( &"TRAINER_PLANT_THE_C4_EXPLOSIVE" );
// Fire your grenade launcher into windows five, six and seven.
precachestring( &"TRAINER_FIRE_YOUR_GRENADE_LAUNCHER" );
// Climb the ladder.
precachestring( &"TRAINER_CLIMB_THE_LADDER1" );
// Shoot a target through the wood.
precachestring( &"TRAINER_SHOOT_A_TARGET_THROUGH" );
// Slide down the rope.\n
precachestring( &"TRAINER_SLIDE_DOWN_THE_ROPE" );
// Complete the deck mock-up.
precachestring( &"TRAINER_COMPLETE_THE_DECK_MOCKUP" );
// Recommended
precachestring( &"TRAINER_RECOMMENDED_LABEL" );
// difficulty:
precachestring( &"TRAINER_RECOMMENDED_LABEL2" );
// Recruit
precachestring( &"TRAINER_RECOMMENDED_EASY" );
// Regular
precachestring( &"TRAINER_RECOMMENDED_NORMAL" );
// Hardened
precachestring( &"TRAINER_RECOMMENDED_HARD" );
// Veteran
precachestring( &"TRAINER_RECOMMENDED_VETERAN" );
precachestring( &"TRAINER_RECOMMENDED_TRY_AGAIN" );
}
dialogue_execute( sLineToExecute, sFlagToSetWhenDone )
{
if ( !isdefined( self ) )
return;
self endon( "death" );
self dialogue_queue( sLineToExecute );
if ( isdefined( sFlagToSetWhenDone ) )
flag_set( sFlagToSetWhenDone );
}
hint_temp( string, timeOut )
{
hintfade = 0.5;
level endon( "clearing_hints" );
if ( isDefined( level.tempHint ) )
level.tempHint destroyElem();
level.tempHint = createFontString( "default", 1.5 );
level.tempHint setPoint( "BOTTOM", undefined, 0, -60 );
level.tempHint.color = ( 1, 1, 1 );
level.tempHint setText( string );
level.tempHint.alpha = 0;
level.tempHint fadeOverTime( 0.5 );
level.tempHint.alpha = 1;
level.tempHint.sort = 1;
wait( 0.5 );
level.tempHint endon( "death" );
if ( isDefined( timeOut ) )
wait( timeOut );
else
return;
level.tempHint fadeOverTime( hintfade );
level.tempHint.alpha = 0;
wait( hintfade );
level.tempHint destroyElem();
}
registerObjective( objName, objText, objEntity )
{
flag_init( objName );
objID = level.objectives.size;
newObjective = spawnStruct();
newObjective.name = objName;
newObjective.id = objID;
newObjective.state = "invisible";
newObjective.text = objText;
newObjective.entity = objEntity;
newObjective.added = false;
level.objectives[objName] = newObjective;
return newObjective;
}
setObjectiveState( objName, objState )
{
assert( isDefined( level.objectives[objName] ) );
objective = level.objectives[objName];
objective.state = objState;
if ( !objective.added )
{
objective_add( objective.id, objective.state, objective.text, objective.entity.origin );
objective.added = true;
}
else
{
objective_state( objective.id, objective.State );
}
if ( objective.state == "done" )
flag_set( objName );
}
setObjectiveString( objName, objString )
{
objective = level.objectives[objName];
objective.text = objString;
objective_string( objective.id, objString );
}
setObjectiveLocation( objName, objLoc )
{
objective = level.objectives[objName];
objective.loc = objLoc;
objective_position( objective.id, objective.loc.origin );
}
setObjectiveRemaining( objName, objString, objRemaining )
{
assert( isDefined( level.objectives[objName] ) );
objective = level.objectives[objName];
if ( !objRemaining )
objective_string( objective.id, objString );
else
objective_string( objective.id, objString, objRemaining );
}
keyHint( actionName, timeOut, doubleline, alwaysDisplay )
{
clear_hints();
level endon ( "clearing_hints" );
if ( isdefined ( doubleline ) )
add_hint_background( doubleline );
else
add_hint_background();
level.hintElem = createFontString( "objective", level.hint_text_size );
level.hintElem.hidewheninmenu = true;
level.hintElem setPoint( "TOP", undefined, 0, 110 );
level.hintElem.sort = 0.5;
actionBind = getActionBind( actionName );
if ( ( actionName == "melee" ) && ( level.xenon ) && ( actionBind.key == "BUTTON_RSTICK" ) )
level.hintElem setText( &"TRAINER_HINT_MELEE_CLICK" );
else
level.hintElem setText( actionBind.hint );
//level.hintElem endon ( "death" );
if ( !isdefined( alwaysDisplay ) )
{
notifyName = "did_action_" + actionName;
for ( index = 0; index < level.actionBinds[actionName].size; index++ )
{
actionBind = level.actionBinds[actionName][index];
notifyOnCommand( notifyName, actionBind.binding );
}
if ( isDefined( timeOut ) )
level.player thread notifyOnTimeout( notifyName, timeOut );
level.player waittill( notifyName );
level.hintElem fadeOverTime( 0.5 );
level.hintElem.alpha = 0;
wait ( 0.5 );
clear_hints();
}
}
clear_hints_on_flag( msg )
{
level endon ( "clearing_hints" );
flag_wait ( msg );
clear_hints();
}
generic_compass_hint_reminder( msg, time )
{
thread clear_hints_on_flag( msg );
level endon ( msg );
wait time;
compass_hint();
wait 2;
timePassed = 6;
for ( ;; )
{
if ( timePassed > 20.0 )
{
thread compass_reminder();
RefreshHudCompass();
timePassed = 0;
}
timePassed += 0.05;
wait ( 0.05 );
}
}
objective_hints( completion_flag )
{
level endon ( "mission failed" );
level endon ( "navigationTraining_end" );
level endon ( "obj_go_to_the_pit_done" );
//wait( 2 );
//compass_hint();
wait ( 20 );
if ( level.Console )
{
if ( level.Xenon )
keyHint( "objectives", 6.0);
else
killhouse_hint( &"TRAINER_HINT_CHECK_OBJECTIVES_SCORES_PS3", 6 );
}
else
{
keyHint( "objectives_pc", 6.0);
}
//level.marine1.lastNagTime = getTime();
timePassed = 0;
for ( ;; )
{
//if( distance( level.player.origin, level.marine1.origin ) < 512 )
// level.marine1 nagPlayer( "squadwaiting", 15.0 );
if ( !flag( completion_flag ) && timePassed > 20.0 )
{
//killhouse_hint( &"TRAINER_HINT_OBJECTIVE_REMINDER", 6.0 );
thread compass_reminder();
RefreshHudCompass();
//wait( 0.5 );
//thread killhouse_hint( &"TRAINER_HINT_OBJECTIVE_REMINDER2", 10.0 );
timePassed = 0;
}
timePassed += 0.05;
wait ( 0.05 );
}
}
add_hint_background( double_line )
{
if ( isdefined ( double_line ) )
level.hintbackground = createIcon( "popmenu_bg", 650, 50 );
else
level.hintbackground = createIcon( "popmenu_bg", 650, 30 );
level.hintbackground.hidewheninmenu = true;
level.hintbackground setPoint( "TOP", undefined, 0, 105 );
level.hintbackground.alpha = .5;
level.hintbackground.sort = 0;
}
//compass_hint_old( text, timeOut )
//{
// clear_hints();
// level endon ( "clearing_hints" );
//
// double_line = true;
// add_hint_background( double_line );
// level.hintElem = createFontString( "objective", level.hint_text_size );
// level.hintElem.hidewheninmenu = true;
// level.hintElem setPoint( "TOP", undefined, 0, 110 );
// level.hintElem.sort = 0.5;
//
// level.hintElem setText( &"TRAINER_HINT_OBJECTIVE_MARKER" );
//
// level.iconElem = createIcon( "objective", 32, 32 );
// level.iconElem.hidewheninmenu = true;
// //level.iconElem setPoint( "CENTER", "CENTER", 0, -60 );
// level.iconElem setPoint( "TOP", undefined, 0, 155 );
//
// wait 5;
//
// level.iconElem setPoint( "CENTER", "BOTTOM", 0, -20, 1.0 );
//
// level.iconElem scaleovertime(1, 20, 20);
//
// wait .85;
// level.iconElem fadeovertime(.15);
// level.iconElem.alpha = 0;
//
// wait .5;
// level.hintElem fadeovertime(.5);
// level.hintElem.alpha = 0;
//
// clear_hints();
//}
//compass_reminder_old()
//{
// clear_hints();
// level endon ( "clearing_hints" );
//
// double_line = true;
// add_hint_background( double_line );
// level.hintElem = createFontString( "objective", level.hint_text_size );
// level.hintElem.hidewheninmenu = true;
// level.hintElem setPoint( "TOP", undefined, 0, 110 );
// level.hintElem.sort = 0.5;
//
// level.hintElem setText( &"TRAINER_HINT_OBJECTIVE_REMINDER" );
//
//
// level.iconElem = createIcon( "objective", 32, 32 );
// level.iconElem.hidewheninmenu = true;
// //level.iconElem setPoint( "CENTER", "CENTER", 0, -60 );
// level.iconElem setPoint( "TOP", undefined, 0, 155 );
//
// wait 5;
// //setObjectiveLocation( "obj_enter_range", getEnt( "rifle_range_obj", "targetname" ) );
//
// level.iconElem setPoint( "CENTER", "BOTTOM", 0, -20, 1.0 );
//
// level.iconElem scaleovertime(1, 20, 20);
//
// wait .85;
// level.iconElem fadeovertime(.15);
// level.iconElem.alpha = 0;
//
// wait 2;
// level.hintElem fadeovertime(.5);
// level.hintElem.alpha = 0;
//
// clear_hints();
//}
compass_hint( text, timeOut )
{
clear_hints();
level endon ( "clearing_hints" );
double_line = true;
add_hint_background( double_line );
level.hintElem = createFontString( "objective", level.hint_text_size );
level.hintElem.hidewheninmenu = true;
level.hintElem setPoint( "TOP", undefined, 0, 110 );
level.hintElem.sort = 0.5;
level.hintElem setText( &"TRAINER_HINT_OBJECTIVE_MARKER" );
// level.iconElem = createIcon( "objective", 32, 32 );
// level.iconElem.hidewheninmenu = true;
// //level.iconElem setPoint( "CENTER", "CENTER", 0, -60 );
// level.iconElem setPoint( "TOP", undefined, 0, 155 );
wait 5;
// level.iconElem setPoint( "CENTER", "BOTTOM", 0, -20, 1.0 );
//
// level.iconElem scaleovertime(1, 20, 20);
//
// wait .85;
// level.iconElem fadeovertime(.15);
// level.iconElem.alpha = 0;
wait .5;
level.hintElem fadeovertime(.5);
level.hintElem.alpha = 0;
clear_hints();
}
compass_reminder()
{
level endon ( "mission failed" );
level endon ( "navigationTraining_end" );
level endon ( "obj_go_to_the_pit_done" );
clear_hints();
level endon ( "clearing_hints" );
double_line = true;
add_hint_background( double_line );
level.hintElem = createFontString( "objective", level.hint_text_size );
level.hintElem.hidewheninmenu = true;
level.hintElem setPoint( "TOP", undefined, 0, 110 );
level.hintElem.sort = 0.5;
level.hintElem setText( &"TRAINER_HINT_OBJECTIVE_REMINDER" );
// level.iconElem = createIcon( "objective", 32, 32 );
// level.iconElem.hidewheninmenu = true;
// //level.iconElem setPoint( "CENTER", "CENTER", 0, -60 );
// level.iconElem setPoint( "TOP", undefined, 0, 155 );
wait 5;
//setObjectiveLocation( "obj_enter_range", getEnt( "rifle_range_obj", "targetname" ) );
// level.iconElem setPoint( "CENTER", "BOTTOM", 0, -20, 1.0 );
//
// level.iconElem scaleovertime(1, 20, 20);
//
// wait .85;
// level.iconElem fadeovertime(.15);
// level.iconElem.alpha = 0;
wait 2;
level.hintElem fadeovertime(.5);
level.hintElem.alpha = 0;
clear_hints();
}
clear_hints()
{
if ( isDefined( level.hintElem ) )
level.hintElem destroyElem();
if ( isDefined( level.iconElem ) )
level.iconElem destroyElem();
if ( isDefined( level.iconElem2 ) )
level.iconElem2 destroyElem();
if ( isDefined( level.iconElem3 ) )
level.iconElem3 destroyElem();
if ( isDefined( level.hintbackground ) )
level.hintbackground destroyElem();
level notify ( "clearing_hints" );
}
killhouse_hint( text, timeOut, double_line )
{
clear_hints();
level endon ( "clearing_hints" );
add_hint_background( double_line );
level.hintElem = createFontString( "objective", level.hint_text_size );
level.hintElem.hidewheninmenu = true;
level.hintElem setPoint( "TOP", undefined, 0, 110 );
level.hintElem.sort = 0.5;
level.hintElem setText( text );
//level.hintElem endon ( "death" );
if ( isDefined( timeOut ) )
wait ( timeOut );
else
return;
level.hintElem fadeOverTime( 0.5 );
level.hintElem.alpha = 0;
wait ( 0.5 );
clear_hints();
}
notifyOnTimeout( finishedNotify, timeOut )
{
self endon( finishedNotify );
wait timeOut;
self notify( finishedNotify );
}
delete_if_obj_complete( obj_flag )
{
self endon ( "death" );
flag_wait ( obj_flag );
self delete();
}
registerActions()
{
level.actionBinds = [];
registerActionBinding( "objectives", "pause", &"TRAINER_HINT_CHECK_OBJECTIVES_PAUSED" );
registerActionBinding( "objectives_pc", "+scores", &"TRAINER_HINT_CHECK_OBJECTIVES_SCORES" );
registerActionBinding( "pc_attack", "+attack", &"TRAINER_HINT_ATTACK_PC" );
registerActionBinding( "pc_hip_attack", "+attack", &"TRAINER_HINT_HIP_ATTACK_PC" );
registerActionBinding( "hip_attack", "+attack", &"TRAINER_HINT_HIP_ATTACK" );
registerActionBinding( "attack", "+attack", &"TRAINER_HINT_ATTACK" );
registerActionBinding( "stop_ads", "+speed_throw", &"TRAINER_HINT_STOP_ADS_THROW" );
registerActionBinding( "stop_ads", "+speed", &"TRAINER_HINT_STOP_ADS" );
registerActionBinding( "stop_ads", "+toggleads_throw", &"TRAINER_HINT_STOP_ADS_TOGGLE_THROW" );
registerActionBinding( "stop_ads", "toggleads", &"TRAINER_HINT_STOP_ADS_TOGGLE" );
registerActionBinding( "ads_360", "+speed_throw", &"TRAINER_HINT_ADS_THROW_360" );
registerActionBinding( "ads_360", "+speed", &"TRAINER_HINT_ADS_360" );
registerActionBinding( "ads", "+speed_throw", &"TRAINER_HINT_ADS_THROW" );
registerActionBinding( "ads", "+speed", &"TRAINER_HINT_ADS" );
registerActionBinding( "ads", "+toggleads_throw", &"TRAINER_HINT_ADS_TOGGLE_THROW" );
registerActionBinding( "ads", "toggleads", &"TRAINER_HINT_ADS_TOGGLE" );
registerActionBinding( "ads_switch", "+speed_throw", &"TRAINER_HINT_ADS_SWITCH_THROW" );
registerActionBinding( "ads_switch", "+speed", &"TRAINER_HINT_ADS_SWITCH" );
registerActionBinding( "ads_switch_shoulder", "+speed_throw", &"TRAINER_HINT_ADS_SWITCH_THROW_SHOULDER" );
registerActionBinding( "ads_switch_shoulder", "+speed", &"TRAINER_HINT_ADS_SWITCH_SHOULDER" );
registerActionBinding( "breath", "+melee_breath", &"TRAINER_HINT_BREATH_MELEE" );
registerActionBinding( "breath", "+breath_sprint", &"TRAINER_HINT_BREATH_SPRINT" );
registerActionBinding( "breath", "+holdbreath", &"TRAINER_HINT_BREATH" );
registerActionBinding( "melee", "+melee", &"TRAINER_HINT_MELEE" );
registerActionBinding( "melee", "+melee_breath", &"TRAINER_HINT_MELEE_BREATH" );
registerActionBinding( "prone", "goprone", &"TRAINER_HINT_PRONE" );
registerActionBinding( "prone", "+stance", &"TRAINER_HINT_PRONE_STANCE" );
registerActionBinding( "prone", "toggleprone", &"TRAINER_HINT_PRONE_TOGGLE" );
registerActionBinding( "prone", "+prone", &"TRAINER_HINT_PRONE_HOLD" );
registerActionBinding( "prone", "lowerstance", &"TRAINER_HINT_PRONE_DOUBLE" );
// registerActionBinding( "prone", "+movedown", &"" );
registerActionBinding( "crouch", "gocrouch", &"TRAINER_HINT_CROUCH" );
registerActionBinding( "crouch", "+stance", &"TRAINER_HINT_CROUCH_STANCE" );
registerActionBinding( "crouch", "togglecrouch", &"TRAINER_HINT_CROUCH_TOGGLE" );
// registerActionBinding( "crouch", "lowerstance", &"TRAINER_HINT_CROUCH_DOU" );
registerActionBinding( "crouch", "+movedown", &"TRAINER_HINT_CROUCH_HOLD" );
registerActionBinding( "stand", "+gostand", &"TRAINER_HINT_STAND" );
registerActionBinding( "stand", "+stance", &"TRAINER_HINT_STAND_STANCE" );
registerActionBinding( "stand", "+moveup", &"TRAINER_HINT_STAND_UP" );
registerActionBinding( "jump", "+gostand", &"TRAINER_HINT_JUMP_STAND" );
registerActionBinding( "jump", "+moveup", &"TRAINER_HINT_JUMP" );
registerActionBinding( "sprint", "+breath_sprint", &"TRAINER_HINT_SPRINT_BREATH" );
registerActionBinding( "sprint", "+sprint", &"TRAINER_HINT_SPRINT" );
registerActionBinding( "sprint_pc", "+breath_sprint", &"TRAINER_HINT_SPRINT_BREATH_PC" );
registerActionBinding( "sprint_pc", "+sprint", &"TRAINER_HINT_SPRINT_PC" );
registerActionBinding( "sprint2", "+breath_sprint", &"TRAINER_HINT_HOLDING_SPRINT_BREATH" );
registerActionBinding( "sprint2", "+sprint", &"TRAINER_HINT_HOLDING_SPRINT" );
registerActionBinding( "reload", "+reload", &"TRAINER_HINT_RELOAD" );
registerActionBinding( "reload", "+usereload", &"TRAINER_HINT_RELOAD_USE" );
registerActionBinding( "mantle", "+gostand", &"TRAINER_HINT_MANTLE" );
registerActionBinding( "sidearm", "weapnext", &"TRAINER_HINT_SIDEARM_SWAP" );
registerActionBinding( "primary", "weapnext", &"TRAINER_HINT_PRIMARY_SWAP" );
registerActionBinding( "frag", "+frag", &"TRAINER_HINT_FRAG" );
registerActionBinding( "flash", "+smoke", &"TRAINER_HINT_FLASH" );
registerActionBinding( "swap_launcher", "+activate", &"TRAINER_HINT_SWAP" );
registerActionBinding( "swap_launcher", "+usereload", &"TRAINER_HINT_SWAP_RELOAD" );
registerActionBinding( "firemode", "+actionslot 2", &"TRAINER_HINT_FIREMODE" );
registerActionBinding( "attack_launcher", "+attack", &"TRAINER_HINT_LAUNCHER_ATTACK" );
registerActionBinding( "swap_explosives", "+activate", &"TRAINER_HINT_EXPLOSIVES" );
registerActionBinding( "swap_explosives", "+usereload", &"TRAINER_HINT_EXPLOSIVES_RELOAD" );
registerActionBinding( "plant_explosives", "+activate", &"TRAINER_HINT_EXPLOSIVES_PLANT" );
registerActionBinding( "plant_explosives", "+usereload", &"TRAINER_HINT_EXPLOSIVES_PLANT_RELOAD" );
registerActionBinding( "equip_C4", "+actionslot 4", &"TRAINER_HINT_EQUIP_C4" );
registerActionBinding( "throw_C4", "+toggleads_throw", &"TRAINER_HINT_THROW_C4_TOGGLE" );
registerActionBinding( "throw_C4", "+speed_throw", &"TRAINER_HINT_THROW_C4_SPEED" );
registerActionBinding( "throw_C4", "+throw", &"TRAINER_HINT_THROW_C4" );
registerActionBinding( "detonate_C4", "+attack", &"TRAINER_DETONATE_C4" );
initKeys();
updateKeysForBindings();
}
registerActionBinding( action, binding, hint )
{
if ( !isDefined( level.actionBinds[action] ) )
level.actionBinds[action] = [];
actionBind = spawnStruct();
actionBind.binding = binding;
actionBind.hint = hint;
actionBind.keyText = undefined;
actionBind.hintText = undefined;
precacheString( hint );
level.actionBinds[action][level.actionBinds[action].size] = actionBind;
}
getActionBind( action )
{
for ( index = 0; index < level.actionBinds[action].size; index++ )
{
actionBind = level.actionBinds[action][index];
binding = getKeyBinding( actionBind.binding );
if ( !binding["count"] )
continue;
return level.actionBinds[action][index];
}
return level.actionBinds[action][0];//unbound
}
updateKeysForBindings()
{
if ( level.console )
{
setKeyForBinding( getCommandFromKey( "BUTTON_START" ), "BUTTON_START" );
setKeyForBinding( getCommandFromKey( "BUTTON_A" ), "BUTTON_A" );
setKeyForBinding( getCommandFromKey( "BUTTON_B" ), "BUTTON_B" );
setKeyForBinding( getCommandFromKey( "BUTTON_X" ), "BUTTON_X" );
setKeyForBinding( getCommandFromKey( "BUTTON_Y" ), "BUTTON_Y" );
setKeyForBinding( getCommandFromKey( "BUTTON_LSTICK" ), "BUTTON_LSTICK" );
setKeyForBinding( getCommandFromKey( "BUTTON_RSTICK" ), "BUTTON_RSTICK" );
setKeyForBinding( getCommandFromKey( "BUTTON_LSHLDR" ), "BUTTON_LSHLDR" );
setKeyForBinding( getCommandFromKey( "BUTTON_RSHLDR" ), "BUTTON_RSHLDR" );
setKeyForBinding( getCommandFromKey( "BUTTON_LTRIG" ), "BUTTON_LTRIG" );
setKeyForBinding( getCommandFromKey( "BUTTON_RTRIG" ), "BUTTON_RTRIG" );
}
else
{
//level.kbKeys = "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./";
//level.specialKeys = [];
for ( index = 0; index < level.kbKeys.size; index++ )
{
setKeyForBinding( getCommandFromKey( level.kbKeys[index] ), level.kbKeys[index] );
}
for ( index = 0; index < level.specialKeys.size; index++ )
{
setKeyForBinding( getCommandFromKey( level.specialKeys[index] ), level.specialKeys[index] );
}
}
}
getActionForBinding( binding )
{
arrayKeys = getArrayKeys( level.actionBinds );
for ( index = 0; index < arrayKeys; index++ )
{
bindArray = level.actionBinds[arrayKeys[index]];
for ( bindIndex = 0; bindIndex < bindArray.size; bindIndex++ )
{
if ( bindArray[bindIndex].binding != binding )
continue;
return arrayKeys[index];
}
}
}
setKeyForBinding( binding, key )
{
if ( binding == "" )
return;
arrayKeys = getArrayKeys( level.actionBinds );
for ( index = 0; index < arrayKeys.size; index++ )
{
bindArray = level.actionBinds[arrayKeys[index]];
for ( bindIndex = 0; bindIndex < bindArray.size; bindIndex++ )
{
if ( bindArray[bindIndex].binding != binding )
continue;
bindArray[bindIndex].key = key;
}
}
}
initKeys()
{
level.kbKeys = "1234567890-=qwertyuiop[]asdfghjkl;'zxcvbnm,./";
level.specialKeys = [];
level.specialKeys[level.specialKeys.size] = "TAB";
level.specialKeys[level.specialKeys.size] = "ENTER";
level.specialKeys[level.specialKeys.size] = "ESCAPE";
level.specialKeys[level.specialKeys.size] = "SPACE";
level.specialKeys[level.specialKeys.size] = "BACKSPACE";
level.specialKeys[level.specialKeys.size] = "UPARROW";
level.specialKeys[level.specialKeys.size] = "DOWNARROW";
level.specialKeys[level.specialKeys.size] = "LEFTARROW";
level.specialKeys[level.specialKeys.size] = "RIGHTARROW";
level.specialKeys[level.specialKeys.size] = "ALT";
level.specialKeys[level.specialKeys.size] = "CTRL";
level.specialKeys[level.specialKeys.size] = "SHIFT";
level.specialKeys[level.specialKeys.size] = "CAPSLOCK";
level.specialKeys[level.specialKeys.size] = "F1";
level.specialKeys[level.specialKeys.size] = "F2";
level.specialKeys[level.specialKeys.size] = "F3";
level.specialKeys[level.specialKeys.size] = "F4";
level.specialKeys[level.specialKeys.size] = "F5";
level.specialKeys[level.specialKeys.size] = "F6";
level.specialKeys[level.specialKeys.size] = "F7";
level.specialKeys[level.specialKeys.size] = "F8";
level.specialKeys[level.specialKeys.size] = "F9";
level.specialKeys[level.specialKeys.size] = "F10";
level.specialKeys[level.specialKeys.size] = "F11";
level.specialKeys[level.specialKeys.size] = "F12";
level.specialKeys[level.specialKeys.size] = "INS";
level.specialKeys[level.specialKeys.size] = "DEL";
level.specialKeys[level.specialKeys.size] = "PGDN";
level.specialKeys[level.specialKeys.size] = "PGUP";
level.specialKeys[level.specialKeys.size] = "HOME";
level.specialKeys[level.specialKeys.size] = "END";
level.specialKeys[level.specialKeys.size] = "MOUSE1";
level.specialKeys[level.specialKeys.size] = "MOUSE2";
level.specialKeys[level.specialKeys.size] = "MOUSE3";
level.specialKeys[level.specialKeys.size] = "MOUSE4";
level.specialKeys[level.specialKeys.size] = "MOUSE5";
level.specialKeys[level.specialKeys.size] = "MWHEELUP";
level.specialKeys[level.specialKeys.size] = "MWHEELDOWN";
level.specialKeys[level.specialKeys.size] = "AUX1";
level.specialKeys[level.specialKeys.size] = "AUX2";
level.specialKeys[level.specialKeys.size] = "AUX3";
level.specialKeys[level.specialKeys.size] = "AUX4";
level.specialKeys[level.specialKeys.size] = "AUX5";
level.specialKeys[level.specialKeys.size] = "AUX6";
level.specialKeys[level.specialKeys.size] = "AUX7";
level.specialKeys[level.specialKeys.size] = "AUX8";
level.specialKeys[level.specialKeys.size] = "AUX9";
level.specialKeys[level.specialKeys.size] = "AUX10";
level.specialKeys[level.specialKeys.size] = "AUX11";
level.specialKeys[level.specialKeys.size] = "AUX12";
level.specialKeys[level.specialKeys.size] = "AUX13";
level.specialKeys[level.specialKeys.size] = "AUX14";
level.specialKeys[level.specialKeys.size] = "AUX15";
level.specialKeys[level.specialKeys.size] = "AUX16";
level.specialKeys[level.specialKeys.size] = "KP_HOME";
level.specialKeys[level.specialKeys.size] = "KP_UPARROW";
level.specialKeys[level.specialKeys.size] = "KP_PGUP";
level.specialKeys[level.specialKeys.size] = "KP_LEFTARROW";
level.specialKeys[level.specialKeys.size] = "KP_5";
level.specialKeys[level.specialKeys.size] = "KP_RIGHTARROW";
level.specialKeys[level.specialKeys.size] = "KP_END";
level.specialKeys[level.specialKeys.size] = "KP_DOWNARROW";
level.specialKeys[level.specialKeys.size] = "KP_PGDN";
level.specialKeys[level.specialKeys.size] = "KP_ENTER";
level.specialKeys[level.specialKeys.size] = "KP_INS";
level.specialKeys[level.specialKeys.size] = "KP_DEL";
level.specialKeys[level.specialKeys.size] = "KP_SLASH";
level.specialKeys[level.specialKeys.size] = "KP_MINUS";
level.specialKeys[level.specialKeys.size] = "KP_PLUS";
level.specialKeys[level.specialKeys.size] = "KP_NUMLOCK";
level.specialKeys[level.specialKeys.size] = "KP_STAR";
level.specialKeys[level.specialKeys.size] = "KP_EQUALS";
level.specialKeys[level.specialKeys.size] = "PAUSE";
level.specialKeys[level.specialKeys.size] = "SEMICOLON";
level.specialKeys[level.specialKeys.size] = "COMMAND";
level.specialKeys[level.specialKeys.size] = "181";
level.specialKeys[level.specialKeys.size] = "191";
level.specialKeys[level.specialKeys.size] = "223";
level.specialKeys[level.specialKeys.size] = "224";
level.specialKeys[level.specialKeys.size] = "225";
level.specialKeys[level.specialKeys.size] = "228";
level.specialKeys[level.specialKeys.size] = "229";
level.specialKeys[level.specialKeys.size] = "230";
level.specialKeys[level.specialKeys.size] = "231";
level.specialKeys[level.specialKeys.size] = "232";
level.specialKeys[level.specialKeys.size] = "233";
level.specialKeys[level.specialKeys.size] = "236";
level.specialKeys[level.specialKeys.size] = "241";
level.specialKeys[level.specialKeys.size] = "242";
level.specialKeys[level.specialKeys.size] = "243";
level.specialKeys[level.specialKeys.size] = "246";
level.specialKeys[level.specialKeys.size] = "248";
level.specialKeys[level.specialKeys.size] = "249";
level.specialKeys[level.specialKeys.size] = "250";
level.specialKeys[level.specialKeys.size] = "252";
}
make_door_from_prefab( sTargetname )
{
ents = getentarray( sTargetname, "targetname" );
door_org = undefined;
door_models = [];
door_brushes = [];
door_trigger = undefined;
door_blocker = undefined;
foreach( ent in ents )
{
if ( ent.code_classname == "script_brushmodel" )
{
door_brushes[ door_brushes.size ] = ent;
if ( ( isdefined( ent.script_noteworthy ) ) && ( ent.script_noteworthy == "blocker" ) )
door_blocker = ent;
continue;
}
if ( ent.code_classname == "script_origin" )
{
door_org = ent;
continue;
}
if ( ent.code_classname == "script_model" )
{
door_models[ door_models.size ] = ent;
continue;
}
if ( ent.code_classname == "trigger_radius" )
{
door_trigger = ent;
continue;
}
}
foreach( model in door_models )
model linkto( door_org );
foreach( brush in door_brushes )
brush linkto( door_org );
door = door_org;
door.brushes = door_brushes;
if ( isdefined( door_blocker ) )
{
door_blocker unlink();
door.blocker = door_blocker;
}
if ( isdefined( door_trigger ) )
door.trigger = door_trigger;
return door;
}
weapons_hide()
{
self.origin = self.origin + ( 0, 0, -1000 );
}
weapons_show()
{
self.origin = self.origin + ( 0, 0, 1000 );
}
vehicle_think()
{
switch( self.vehicletype )
{
case "humvee":
case "hummer_minigun":
case "hummer":
self thread vehicle_humvee_think();
break;
case "m1a1":
self thread vehicle_m1a1_think();
break;
case "cobra":
self thread vehicle_cobra_think();
break;
}
}
vehicle_humvee_think()
{
}
vehicle_m1a1_think()
{
}
vehicle_cobra_think()
{
}
AI_drone_think()
{
self endon( "death" );
self endon( "stop_default_drone_behavior" );
if ( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "ai_ambient" ) )
{
self.dontDoNotetracks = true; //allows using of ai _anim functons without getting errors
self.script_looping = 0; //will force drone to scip default idle behavior
}
if ( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "runners" ) )
{
self waittill( "goal" );
self delete();
}
}
ai_ambient_think( sAnim, sFailSafeFlag )
{
self endon( "death" );
self AI_ambient_ignored();
eGoal = undefined;
sAnimGo = undefined;
looping = false;
/*-----------------------
DOES AI HAVE A GOAL NODE?
-------------------------*/
if ( isdefined( self.target ) )
eGoal = getnode( self.target, "targetname" );
/*-----------------------
CLEANUP PROPS AND ANIMATION NODE WHEN DEAD
-------------------------*/
self thread ai_ambient_cleanup();
/*-----------------------
GO AHEAD AND PLAY LOOPING IDLE (IF ANIM IS LOOPING)
-------------------------*/
if ( isarray( level.scr_anim[ "generic" ][ sAnim ] ) )
{
looping = true;
if ( sAnim == "training_basketball_guy2" )
{
basketball = getent( "basketball", "targetname" );
basketball.animname = "basketball";
basketball assign_animtree();
self.eAnimEnt thread anim_loop_solo( basketball, "training_basketball_loop", "stop_idle" );
}
self.eAnimEnt thread anim_generic_loop( self, sAnim, "stop_idle" );
sAnimGo = sAnim + "_go"; //This will be the next animation to play after the loop (if defined)
if ( anim_exists( sAnimGo ) )
sAnim = sAnimGo;
else
sAnimGo = undefined;
}
/*-----------------------
FREEZE FRAME AT START OF ANIM (IF IT'S NOT A LOOP)
-------------------------*/
else
self.eAnimEnt anim_generic_first_frame( self, sAnim );
/*-----------------------
WAIT FOR A FLAG (IF DEFINED IN THE SPAWNER) THEN PLAY ANIM
-------------------------*/
if ( isdefined( self.script_flag ) )
{
if ( isdefined( sFailSafeFlag ) )
flag_wait_either( self.script_flag, sFailSafeFlag );
else
flag_wait( self.script_flag );
}
/*-----------------------
IF HEADED TO A GOAL NODE LATER....
-------------------------*/
if ( isdefined( eGoal ) )
{
self.disablearrivals = true;
self.disableexits = true;
}
if ( !looping )
self.eAnimEnt anim_generic( self, sAnim );
if ( isdefined( sAnimGo ) )
{
self.eAnimEnt notify( "stop_idle" );
self.eAnimEnt anim_generic( self, sAnimGo );
}
/*-----------------------
DO CUSTOM SHIT BASED ON ANIMNAME
-------------------------*/
switch( sAnim )
{
case "civilian_run_2_crawldeath":
self kill();
break;
}
/*-----------------------
FINISH ANIM THEN RUN TO A NODE
-------------------------*/
if ( isdefined( eGoal ) )
{
self setgoalnode( eGoal );
wait( 1 );
self.disablearrivals = false;
self.disableexits = false;
self waittill( "goal" );
if ( isdefined( self.cqbwalking ) && self.cqbwalking )
self cqb_walk( "off" );
}
/*-----------------------
FINISH ANIM THEN PLAY LOOPING IDLE
-------------------------*/
else if ( isdefined( level.scr_anim[ "generic" ][ sAnim + "_idle" ] ) )
self.eAnimEnt thread anim_generic_loop( self, sAnim + "_idle", "stop_idle" );
/*-----------------------
PLAY MORTAR REACTIONS IF AVAILABLE
-------------------------*/
if ( anim_exists( sAnim + "_react" ) )
{
if ( !looping )
sAnim = sAnim + "_idle";
sAnimReact = sAnim + "_react";
if ( anim_exists( sAnim + "_react2" ) )
sAnimReact2 = sAnim + "_react2";
else
sAnimReact2 = sAnimReact;
while( isdefined( self ) )
{
level waittill( "mortar_hit" );
self.eAnimEnt notify( "stop_idle" );
self notify ( "stop_idle" );
waittillframeend;
if ( RandomInt( 100 ) > 50 )
anim_generic( self, sAnimReact );
else
anim_generic( self, sAnimReact2 );
thread anim_generic_loop( self, sAnim, "stop_idle" );
}
}
}
ai_ambient_cleanup()
{
self waittill( "death" );
if ( ( isdefined( self.eAnimEnt ) ) && ( !isspawner( self.eAnimEnt ) ) )
self.eAnimEnt delete();
}
AI_patrol_think()
{
self endon( "death" );
self pushplayer( true );
self.walkdist = 1000;
self.disablearrivals = true;
wait( 0.1 );
self thread maps\_patrol::patrol();
level.patrolDudes[ level.patrolDudes.size ] = self;
}
ai_ambient_noprop_think()
{
/*-----------------------
GLOBAL SCRIPT TO HANDLE ALL AMMBIENT GUYS
-------------------------*/
self endon( "death" );
assert( isdefined( self.animation ) ); //must be defined in the spawner
sAnim = self.animation;
bSpecial = false;
if ( !isdefined( self.eAnimEnt ) )
self.eAnimEnt = self.spawner;
sFailSafeFlag = undefined;
/*-----------------------
SPECIAL CASES
-------------------------*/
switch( sAnim )
{
case "training_humvee_repair":
self thread mechanic_sound_loop();
self gun_remove();
break;
case "roadkill_humvee_map_sequence_quiet_idle":
self attach( "characters_accessories_pencil", "TAG_INHAND", 1 );
self gun_remove();
break;
case "training_locals_kneel":
//this particular guy needs his weapon attached to chest
self gun_remove();
self.m4 = spawn( "script_model", ( 0, 0, 0 ) );
self.m4 setmodel( "weapon_m4" );
self.m4 HidePart( "TAG_THERMAL_SCOPE" );
self.m4 HidePart( "TAG_FOREGRIP" );
self.m4 HidePart( "TAG_ACOG_2" );
self.m4 HidePart( "TAG_HEARTBEAT" );
self.m4 HidePart( "TAG_RED_DOT" );
self.m4 HidePart( "TAG_SHOTGUN" );
self.m4 HidePart( "TAG_SILENCER" );
self.m4.origin = self gettagorigin( "tag_inhand" );
self.m4.angles = self gettagangles( "tag_inhand" );
self.m4 linkto( self, "tag_inhand" );
self thread delete_on_death( self.m4 );
break;
case "training_locals_groupA_guy1":
case "training_locals_groupA_guy2":
case "training_locals_groupB_guy1":
case "training_locals_groupB_guy2":
case "training_locals_sit":
//leave weapons on these guys
break;
case "parabolic_leaning_guy_idle_training":
case "parabolic_leaning_guy_idle":
case "little_bird_casual_idle_guy1":
case "killhouse_sas_2_idle":
//leave weapons on these guys
break;
case "training_sleeping_in_chair":
self gun_remove();
self.eAnimEnt = getent( self.target, "targetname" ); //just use whatever model he is targeting
break;
case "death_explosion_run_F_v1":
case "civilian_run_2_crawldeath":
self gun_remove();
self.skipDeathAnim = true;
self.noragdoll = true;
break;
case "afgan_caves_sleeping_guard_idle":
self gun_remove();
self.eAnimEnt.origin = self.eAnimEnt.origin + ( 0, 0, 26 );
break;
case "bunker_toss_idle_guy1":
case "DC_Burning_artillery_reaction_v1_idle":
case "DC_Burning_artillery_reaction_v2_idle":
case "DC_Burning_bunker_stumble":
self gun_remove();
break;
case "unarmed_panickedrun_loop_V2":
self set_generic_run_anim( "unarmed_panickedrun_loop_V2" );
self gun_remove();
self.disablearrivals = true;
self.disableexits = true;
self.goalradius = 16;
self waittill( "goal" );
self clear_run_anim();
wait( 1 );
self gun_recall();
bSpecial = true;
return;
case "wounded_carry_fastwalk_carrier":
spawner = getent( self.target, "targetname" );
eBuddy = spawner spawn_ai();
self.eAnimEnt anim_generic_first_frame( self, sAnim );
self.eAnimEnt anim_generic_first_frame( eBuddy, "wounded_carry_fastwalk_wounded" );
self gun_remove();
eBuddy gun_remove();
bSpecial = true;
eEndOrg = getent( self.script_Linkto, "script_linkname" );
if ( isdefined( self.script_flag ) )
flag_wait( self.script_flag );
while ( distance( eEndOrg.origin, self.origin ) > 128 )
{
thread anim_generic( self, sAnim );
anim_generic( eBuddy, "wounded_carry_fastwalk_wounded" );
}
thread anim_generic( self, "wounded_carry_putdown_closet_carrier" );
anim_generic( eBuddy, "wounded_carry_putdown_closet_wounded" );
thread anim_generic_loop( eBuddy, "wounded_carry_closet_idle_wounded" );
thread anim_generic_loop( self, "wounded_carry_closet_idle_carrier" );
return;
case "sitting_guard_loadAK_idle":
self gun_remove();
self Attach( "weapon_m4_clip", "tag_inhand" );
break;
case "civilian_texting_standing":
case "civilian_texting_sitting":
self gun_remove();
self Attach( "electronics_pda", "tag_inhand" );
break;
case "civilian_reader_1":
case "civilian_reader_2":
self gun_remove();
self Attach( "open_book_static", "tag_inhand" );
break;
case "civilian_smoking_A":
case "oilrig_balcony_smoke_idle":
case "parabolic_leaning_guy_smoking_idle":
self thread maps\_props::attach_cig_self();
break;
case "cliffhanger_welder_wing":
self gun_remove();
self.eAnimEnt.origin = self.eAnimEnt.origin + ( 0, 0, -3 );
self Attach( "machinery_welder_handle", "tag_inhand" );
self thread flashing_welding();
self thread play_loop_sound_on_entity( "scn_trainer_welders_working_loop" );
//thread flashing_welding_death_handler( self );
break;
case "roadkill_cover_radio_soldier2":
break;
case "roadkill_cover_spotter_idle":
self attach( "weapon_binocular", "TAG_INHAND", 1 );
break;
case "roadkill_cover_radio_soldier3":
self attach( "mil_mre_chocolate01", "TAG_INHAND", 1 );
break;
case "training_basketball_rest":
self gun_remove();
self attach( "com_bottle2", "TAG_INHAND", 1 );
break;
case "favela_run_and_wave":
break;
default:
self gun_remove();
break;
}
self thread ai_ambient_think( sAnim, sFailSafeFlag );
}
AI_ambient_ignored()
{
self endon( "death" );
if ( !isdefined( self ) )
return;
if ( ( isdefined( self.code_classname ) ) && ( self.code_classname == "script_model" ) )
return;
self setFlashbangImmunity( true );
self.ignoreme = true;
self.ignoreall = true;
self.grenadeawareness = 0;
}
anim_exists( sAnim, animname )
{
if ( !isdefined( animname ) )
animname = "generic";
if ( isDefined( level.scr_anim[ animname ][ sAnim ] ) )
return true;
else
return false;
}
mechanic_sound_loop()
{
self endon( "death" );
while( true )
{
self waittillmatch( "looping anim", "end" );
self thread play_sound_in_space( "scn_trainer_mechanic" );
}
}
flashing_welding()
{
self endon( "death" );
self thread stop_sparks();
while( true )
{
self waittillmatch( "looping anim", "spark on" );
self thread start_sparks();
}
}
start_sparks()
{
self endon( "death" );
self notify( "starting sparks" );
self endon( "starting sparks" );
self endon( "spark off" );
while( true )
{
PlayFXOnTag( level._effect[ "welding_runner" ], self, "tag_tip_fx" );
self PlaySound( "elec_spark_welding_bursts" );
wait( randomfloatRange( .25, .5 ) );
}
}
stop_sparks()
{
self endon( "death" );
while( true )
{
self waittillmatch( "looping anim", "spark off" );
self notify( "spark off" );
}
}
flashing_welding_death_handler( welder )
{
//light = GetEnt( "welding_light", "targetname" );
welder waittill( "death" );
//light stop_loop_sound_on_entity( "scn_cliffhanger_welders_loop" );
//light SetLightIntensity( 0 );
}
AI_think( guy )
{
guy.ignoreme = true;
guy.ignoreall = true;
guy thread magic_bullet_shield();
guy disable_pain();
if ( guy.team == "axis" )
guy thread AI_axis_think();
if ( guy.team == "allies" )
guy thread AI_allies_think();
}
AI_allies_think()
{
}
AI_axis_think()
{
self forceUseWeapon( "m4_grunt", "primary" );
self.team = "allies";
}
player_has_primary_weapon()
{
if ( level.player HasWeapon( level.gunPrimary ) )
return true;
else
return false;
}
auto_aim()
{
if ( level.console )
{
if ( level.player GetLocalPlayerProfileData( "autoAim" ) )
return true;
}
return false;
}
bridge_layer_think()
{
bridge_layer = getent( "bridge_layer", "targetname" );
bridge_layer_bridge = getent( "bridge_layer_bridge", "targetname" );
bridge_layer.animname = "bridge_layer";
bridge_layer assign_animtree();
bridge_layer_bridge.animname = "bridge_layer_bridge";
bridge_layer_bridge assign_animtree();
animOrg = spawn( "script_origin", ( 0, 0, 0 ) );
animOrg.origin = bridge_layer.origin;
animOrg.angles = bridge_layer.angles;
animOrg thread anim_first_frame_solo( bridge_layer, "bridge_raise" );
animOrg anim_first_frame_solo( bridge_layer_bridge, "bridge_raise" );
bridge_layer playloopsound( "m1a1_abrams_idle_low" );
flag_wait( "player_passing_barracks" );
animOrg thread anim_single_solo( bridge_layer, "bridge_raise" );
animOrg anim_single_solo( bridge_layer_bridge, "bridge_raise" );
}
accuracy_bonus()
{
level.bonus_time = undefined;
level.pitaccuracy = undefined;
/*-----------------------
GET TOTAL PLAYER AMMO
-------------------------*/
level.guns = level.player GetWeaponsListPrimaries();
level.gun0 = level.player GetWeaponAmmoStock( level.guns[0] );
level.gun1 = level.player GetWeaponAmmoStock( level.guns[1] );
level.gunc0 = level.player GetWeaponAmmoClip( level.guns[0] );
level.gunc1 = level.player GetWeaponAmmoClip( level.guns[1] );
level.starting_ammo = level.gun0 + level.gun1 + level.gunc0 + level.gunc1;
//iprintlnbold ( "starting_ammo " + starting_ammo );
/*-----------------------
COURSE FINISHED
-------------------------*/
level waittill ( "test_cleared" );
/*-----------------------
FIGURE OUT BONUS
-------------------------*/
level.guns = level.player GetWeaponsListPrimaries();
level.gun0 = level.player GetWeaponAmmoStock( level.guns[0] );
level.gun1 = level.player GetWeaponAmmoStock( level.guns[1] );
level.gunc0 = level.player GetWeaponAmmoClip( level.guns[0] );
level.gunc1 = level.player GetWeaponAmmoClip( level.guns[1] );
level.ending_ammo = level.gun0 + level.gun1 + level.gunc0 + level.gunc1;
//iprintlnbold ( "ending_ammo " + ending_ammo );
/*-----------------------
HOW MUCH AMMO USED?
-------------------------*/
bullets_used_by_player = level.starting_ammo - level.ending_ammo;
//iprintlnbold ( "ammo used: " + bullets_used_by_player );
enemy_targets_killed = level.targets_hit;
//iprintlnbold ( "Enemy targets killed: " + enemy_targets_killed );
/*-----------------------
ACCURACY PERCENTAGE
-------------------------*/
if ( ( enemy_targets_killed == 0 ) || ( bullets_used_by_player == 0 ) )
{
level.pitaccuracy = 0;
}
else
{
level.pitaccuracy = ( enemy_targets_killed / bullets_used_by_player ) * 100;
level.pitaccuracy = roundDecimalPlaces( level.pitaccuracy, 0 );
}
/*-----------------------
ACCURACY BONUS TIME
-------------------------*/
if ( level.pitaccuracy == 0 )
{
level.bonus_time = 0;
}
else
{
if ( level.pitaccuracy > 200 )
{
level.pitaccuracy = 200;
}
level.bonus_time = ( level.pitaccuracy / 0.2 ) / 100;
level.bonus_time = roundDecimalPlaces( level.bonus_time, 1 );
}
level notify ( "accuracy_bonus" );
}
killTimer( best_time, deck )
{
//Your Time: 10:25
//Enemies Killed: 5/12
//Civilians Killed: 0/8
//------------------------------------
//Enemies missed penalty 10.00 sec
//Civilians killed penalty 20.00 sec
//Accuracy 37%
//Accuracy bonus 00.00 sec
//Final Time 1:09:00
//IW Best Time
//Recommended
//difficulty:
//Recruit
//reset global variables
level.toomanycivilianskilled = false;
level.toomanytargetsmissed = false;
level.basetimetooklongerthanminimum = false;
friendlies_hit = level.friendlies_hit;
enemies_hit = level.targets_hit;
level notify ( "kill_timer" );
clear_timer_elems();
/*-----------------------
PRINT BASE TIME
-------------------------*/
time = ( ( gettime() - level.start_time ) / 1000 );
time = roundDecimalPlaces( time, 2 );
level.HUDtimer = get_pit_hud();
level.HUDtimer.label = &"TRAINER_YOUR_TIME_IN_SECONDS";
level.HUDtimer.y = 55;
level.HUDtimer setValue ( time );
/*-----------------------
PRINT ENEMIES KILLED
-------------------------*/
level.HUDenemiesKilled = get_pit_hud();
level.HUDenemiesKilled.label = &"TRAINER_ENEMIES_KILLED";
level.HUDenemiesKilled setValue ( enemies_hit );
level.HUDenemiesKilled.y = 70;
/*-----------------------
PRINT CIVVIES KILLED
-------------------------*/
level.HUDcivviesKilled = get_pit_hud();
level.HUDcivviesKilled.label = &"TRAINER_CIVVIES_KILLED";
level.HUDcivviesKilled setValue ( friendlies_hit );
level.HUDcivviesKilled.y = 85;
level waittill ( "accuracy_bonus" );
/*-----------------------
PRINT ACCURACY AND BONUS TIME
-------------------------*/
level.HUDaccuracy = get_pit_hud();
level.HUDaccuracy.y = 115;
level.HUDaccuracy.label = &"TRAINER_ACCURACY_LABEL";
level.HUDaccuracy setValue ( level.pitaccuracy );
level.HUDaccuracybonus = get_pit_hud();
level.HUDaccuracybonus.y = 130;
if ( level.bonus_time <= 0 )
{
//"Accuracy bonus: 0.0"
level.HUDaccuracybonus.label = &"TRAINER_ACCURACY_BONUS_ZERO";
}
else
{
level.HUDaccuracybonus.label = &"TRAINER_ACCURACY_BONUS";
level.HUDaccuracybonus setValue ( level.bonus_time );
}
/*-----------------------
PRINT MISSED ENEMIES PENALTY
-------------------------*/
level.HUDmissedenemypenalty = get_pit_hud();
level.HUDmissedenemypenalty.y = 145;
if ( enemies_hit == level.totalPitEnemies )
{
level.HUDmissedenemypenalty.label = &"TRAINER_MISSED_ENEMY_PENALTY_NONE";
missed_enemies_penalty = 0;
}
else
{
missed_enemies = ( level.totalPitEnemies - enemies_hit );
level.HUDmissedenemypenalty.color = level.color[ "red" ];
level.HUDmissedenemypenalty.label = &"TRAINER_MISSED_ENEMY_PENALTY";
missed_enemies_penalty = ( missed_enemies * level.timepenaltyForMissedEnemies );
//timepenaltyForKilledCivvies
level.HUDmissedenemypenalty setValue ( missed_enemies_penalty );
}
/*-----------------------
PRINT KILLED FRIENDLIES PENALTY
-------------------------*/
level.HUDkilledcivviespenalty = get_pit_hud();
level.HUDkilledcivviespenalty.y = 160;
if ( friendlies_hit == 0 )
{
level.HUDkilledcivviespenalty.label = &"TRAINER_KILLED_CIVVIES_NONE";
killed_civvies_penalty = 0;
}
else
{
level.HUDkilledcivviespenalty.color = level.color[ "red" ];
level.HUDkilledcivviespenalty.label = &"TRAINER_KILLED_CIVVIES_PENALTY";
killed_civvies_penalty = ( friendlies_hit * level.timepenaltyForKilledCivvies );
level.HUDkilledcivviespenalty setValue ( killed_civvies_penalty );
}
/*-----------------------
PRINT FINAL TIME SCORE
-------------------------*/
level.HUDfinaltime = get_pit_hud();
level.HUDfinaltime.y = 190;
//subtract any accuracy bonus time
final_time = time - level.bonus_time;
//add any enemies missed penalty time
final_time = final_time + missed_enemies_penalty;
//add any civvies killed penalty time
final_time = final_time + killed_civvies_penalty;
level.HUDfinaltime.label = &"TRAINER_YOUR_FINAL_TIME";
level.HUDfinaltime setValue( final_time );
/*-----------------------
PRINT IW BEST TIME
-------------------------*/
// level.IW_best = get_pit_hud();
// level.IW_best.y = 115;
// level.IW_best.label = &"TRAINER_IW_BEST_TIME";
// level.IW_best setValue ( best_time );
/*-----------------------
PRINT RECOMMENDED DIFFICULTY
-------------------------*/
level.recommended_label = get_pit_hud();
level.recommended_label SetPulseFX( 30, 900000, 700 );// something, decay start, decay duration
level.recommended_label.label = &"TRAINER_RECOMMENDED_LABEL";
level.recommended_label.y = 220;
level.recommended_label2 = get_pit_hud();
level.recommended_label2 SetPulseFX( 30, 900000, 700 );// something, decay start, decay duration
level.recommended_label2.label = &"TRAINER_RECOMMENDED_LABEL2";
level.recommended_label2.y = 235;
level.recommended = get_pit_hud();
level.recommended.y = 260;
level.recommended SetPulseFX( 30, 900000, 700 );// something, decay start, decay duration
if ( time > level.timeFail )
{
level.basetimetooklongerthanminimum = true;
}
if ( enemies_hit < level.minimumenemiestokill )
{
level.toomanytargetsmissed = true;
}
if ( friendlies_hit > level.maximumfriendliesalloweddead )
{
level.toomanycivilianskilled = true;
}
if ( ( final_time > level.timeFail ) || ( level.targets_hit_with_melee > 10 ) || ( level.toomanytargetsmissed == true ) || ( level.toomanycivilianskilled == true ) )
{
level.recommended.label = &"TRAINER_RECOMMENDED_TRY_AGAIN";
level.recommendedDifficulty = 1000;
}
else if ( final_time > level.timeEasy )
{
setdvar ( "recommended_gameskill", "0" );
level.recommended.label = &"TRAINER_RECOMMENDED_EASY";
level.recommendedDifficulty = 0;
}
else if ( final_time > level.timeRegular )
{
setdvar ( "recommended_gameskill", "1" );
level.recommended.label = &"TRAINER_RECOMMENDED_NORMAL";
level.recommendedDifficulty = 1;
}
else if ( final_time > level.timeHard )
{
setdvar ( "recommended_gameskill", "2" );
level.recommended.label = &"TRAINER_RECOMMENDED_HARD";
level.recommendedDifficulty = 2;
}
else
{
setdvar ( "recommended_gameskill", "3" );
level.recommended.label = &"TRAINER_RECOMMENDED_VETERAN";
level.recommendedDifficulty = 3;
}
if( final_time < 30.0 )
maps\_utility::giveachievement_wrapper( "PIT_BOSS" );
return final_time;
}
flag_on_notify( msg )
{
level.player waittill( msg );
flag_set( msg );
}
notify_on_sprint()
{
NotifyOnCommand( "sprinted", "+breath_sprint" );
NotifyOnCommand( "sprinted", "+sprint" );
}
dialog_end_of_course( numberOfTimesRun )
{
dialogueLine = undefined;
switch( level.recommendedDifficulty )
{
case 1000:
dialogueLine = "end_of_course_try_again";
break;
case 0: //easy
//Cpl. Dunn training Not bad. Looks like you're getting a little sloppy though.
//Cpl. Dunn Alright I guess. You need some serious polish though.
//Cpl. Dunn Good enough, but you're getting a little sloppy.
iRand = randomintrange( 1, 4 );
dialogueLine = "end_of_course_easy_0" + iRand;
break;
case 1: //regular
//Cpl. Dunn training I've seen worse. You've got a few rough edges though.
//Cpl. Dunn That wasn't horrible, but it wasn't amazing either.
//Cpl. Dunn You look ok out there, but you still need some work.
iRand = randomintrange( 1, 4 );
dialogueLine = "end_of_course_reg_0" + iRand;
break;
case 2: //hardened
//Cpl. Dunn training Good, man, very good. You've still got it.
//Cpl. Dunn That was pretty damn good. Nice work, Allen.
//Cpl. Dunn Very nice. Run like a true professional.
iRand = randomintrange( 1, 4 );
dialogueLine = "end_of_course_hard_0" + iRand;
break;
case 3: //veteran
//Cpl. Dunn Very impressive, man! You made that course your bitch!
//Cpl. Dunn Amazing work. Now that's how you run The Pit.
iRand = randomintrange( 1, 3 );
dialogueLine = "end_of_course_vet_0" + iRand;
break;
}
return dialogueLine;
}
//dialog_end_of_course( level.first_time, final_time, previous_time, previous_selection )
//{
// if ( ! first_time )
// {
// if ( ( previous_time + 2 ) < final_time )
// {
// if ( ( randomint( 2 ) ) > 0 )
// {
// //Don't waste our time Soap. The idea is to take less time, not more.
// selection = ( "The idea is to take less time, not more." );
// return selection;
// }
// else
// {
// //You're getting' slower. Perhaps it was a mistake to let you skip the obstacle course.
// selection = ( "You're getting' slower" );
// return selection;
// }
// }
//
// if ( previous_time > ( final_time + 3 ) )
// {
// if ( ( randomint( 2 ) ) > 0 )
// {
// //That was an improvement, but it's not hard to improve on garbage. Try it again.
// selection = ( "Imprved, but not by much. Try it again" );
// return selection;
// }
// else
// {
// //That was better. Not great. But better.
// selection = ( "That was better. Not great. But better." );
// return selection;
// }
// }
//
// if ( ( level.bonus_time < 1.8 ) && ( previous_selection != "sloppy" ) )
// {
// //Fast, but sloppy. You need to work on your accuracy.
// selection = ( "Fast, but sloppy. You need to work on your accuracy. " );
// return selection;
// }
// }
//
// num = randomint( 2 );
// if ( num == 0 )
// {
// //All right Soap, that's enough. You'll do.
// selection = ( "All right, that's enough. You'll do." );
// return selection;
// }
// //else if ( num == 1 )
// //{
// //I've seen better, but that'll do.
// // selection = ( "seenbetter2" );
// // return selection;
// //}
// else
// {
// //"Pretty good, Soap. But I've seen better." );
// selection = "Pretty good, but I've seen better.";
// return selection;
// }
//}
clear_timer_elems()
{
if (isdefined (level.HUDtimer))
level.HUDtimer destroy();
if (isdefined (level.HUDaccuracybonus))
level.HUDaccuracybonus destroy();
if (isdefined (level.label))
level.label destroy();
if (isdefined (level.IW_best) )
level.IW_best destroy();
if (isdefined (level.recommended_label) )
level.recommended_label destroy();
if (isdefined (level.recommended_label2) )
level.recommended_label2 destroy();
if (isdefined (level.recommended) )
level.recommended destroy();
if (isdefined (level.HUDenemiesKilled) )
level.HUDenemiesKilled destroy();
if (isdefined (level.HUDcivviesKilled) )
level.HUDcivviesKilled destroy();
if (isdefined (level.HUDaccuracy) )
level.HUDaccuracy destroy();
if (isdefined (level.HUDmissedenemypenalty) )
level.HUDmissedenemypenalty destroy();
if (isdefined (level.HUDkilledcivviespenalty) )
level.HUDkilledcivviespenalty destroy();
if (isdefined (level.HUDfinaltime) )
level.HUDfinaltime destroy();
if (isdefined (level.recommended_label) )
level.recommended_label destroy();
}
second_sprint_hint()
{
level endon ( "kill_sprint_hint" );
//getEnt( "obstacleTraining_sprint", "targetname" ) waittill ( "trigger" );
wait .5;
actionBind = getActionBind( "sprint2" );
killhouse_hint( actionBind.hint, 5 );
}
startTimer( timelimit )
{
/*-----------------------
SETUP
-------------------------*/
clear_timer_elems();
// destroy timer and thread if objectives completed within limit
level endon ( "kill_timer" );
level.hudTimerIndex = 20; //what the hell is this for?
level.start_time = gettime();
/*-----------------------
YOUR TIME
-------------------------*/
// Timer size and positioning
level.HUDtimer = maps\_hud_util::get_countdown_hud();
level.HUDtimer.label = &"TRAINER_YOUR_TIME";
level.HUDtimer settenthstimerUp( .05 );
level.HUDtimer.y = 55;
/*-----------------------
PRINT ENEMIES KILLED
-------------------------*/
level.HUDenemiesKilled = maps\_hud_util::get_countdown_hud();
level.HUDenemiesKilled.label = &"TRAINER_ENEMIES_KILLED";
level.HUDenemiesKilled setValue ( level.targets_hit );
level.HUDenemiesKilled.y = 70;
/*-----------------------
PRINT CIVVIES KILLED
-------------------------*/
level.HUDcivviesKilled = maps\_hud_util::get_countdown_hud();
level.HUDcivviesKilled.label = &"TRAINER_CIVVIES_KILLED";
level.HUDcivviesKilled setValue ( level.friendlies_hit );
level.HUDcivviesKilled.y = 85;
/*-----------------------
TIMER EXPIRED
-------------------------*/
wait ( timelimit );
//flag_set ( "timer_expired" );
/*-----------------------
GET RID OF HUD ELEMENT AND FAIL THE MISSION
-------------------------*/
level.HUDtimer destroy();
level thread mission_failed_out_of_time();
}
mission_failed_out_of_time()
{
level.player endon ( "death" );
level endon ( "kill_timer" );
//dialog = [];
//dialog[ 0 ] = "startover"; //
//dialog[ 1 ] = "doitagain"; //
//dialog[ 2 ] = "tooslow"; //
//selection = dialog[ randomint( dialog.size ) ];
//level.pitguy thread dialogue_execute( selection );
failures = getdvarint( "killhouse_too_slow" );
setdvar( "killhouse_too_slow", ( failures + 1 ) );
level notify ( "mission failed" );
if( !flag( "player_course_end" ) )
setDvar( "ui_deadquote", &"TRAINER_SHIP_TOO_SLOW");
else
setDvar( "ui_deadquote", &"TRAINER_SHIP_DIDNT_SPRINT");
maps\_utility::missionFailedWrapper();
}
get_pit_hud( x, y, player )
{
xPos = undefined;
if ( !level.Console )
xPos = -250; //override x-position if this is PC or the timer will get cut off
else if ( !isdefined( x ) )
xPos = -225;
else
xPos = x;
if ( !isdefined( y ) )
yPos = 100;
else
yPos = y;
if ( isdefined( player ) )
hudelem = newClientHudElem( player );
else
hudelem = newHudElem();
hudelem.alignX = "left";
hudelem.alignY = "middle";
hudelem.horzAlign = "right";
hudelem.vertAlign = "top";
hudelem.x = xPos;
hudelem.y = yPos;
hudelem.fontScale = 1.3;
hudelem.color = ( 0.8, 1.0, 0.8 );
hudelem.font = "objective";
hudelem.glowColor = ( 0.3, 0.6, 0.3 );
hudelem.glowAlpha = 1;
hudelem.foreground = 1;
hudelem.hidewheninmenu = true;
hudelem.hidewhendead = true;
return hudelem;
}
dialogue_ambient_wait()
{
wait( randomfloatrange( 1.3, 2.8 ) );
}
dialogue_ambient()
{
level endon( "end_sequence_starting" );
level endon( "pit_dialogue_starting" );
conversation_orgs = getentarray( "conversation_orgs", "targetname" );
org = getclosest( level.player.origin, conversation_orgs );
conversation_array[ 0 ] = level.scr_sound[ "conversation_01" ];
conversation_array[ 1 ] = level.scr_sound[ "conversation_02" ];
conversation_array[ 2 ] = level.scr_sound[ "conversation_03" ];
if ( cointoss() )
{
conversation_array[ 0 ] = level.scr_sound[ "conversation_03" ];
conversation_array[ 1 ] = level.scr_sound[ "conversation_02" ];
conversation_array[ 2 ] = level.scr_sound[ "conversation_01" ];
}
iNumber = 0;
while( true )
{
dialogue_array = conversation_array[ iNumber ];
foreach( dialogue_line in dialogue_array )
{
org = getclosest( level.player.origin, conversation_orgs );
org play_sound_in_space( dialogue_line );
dialogue_ambient_wait();
}
iNumber++;
if ( iNumber > 2 )
iNumber = 0;
}
}
dialogue_pit_wait()
{
wait( randomfloatrange( .1, 1.2 ) );
}
dialogue_ambient_pit_course()
{
level endon( "end_sequence_starting" );
flag_set( "pit_dialogue_starting" );
conversation_orgs_pit = getentarray( "conversation_orgs_pit", "targetname" );
//Ranger 2 Whatever, I beat Mason's time by six seconds yesterday.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_masonstime" );
dialogue_pit_wait();
//Ranger 1 Yeah, I roll through this joint with the Desert Eagle.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar1_deserteagle" );
dialogue_pit_wait();
//Ranger 2 Yeah? I roll through this joint with yo mamma!
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_yomamma" );
dialogue_pit_wait();
//Ranger 1 Very funny dickwad. You thought of that one all by yourself huah?
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar1_veryfunny" );
dialogue_pit_wait();
//Ranger 2 You guys ever run the course with the movers on max speed?
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_maxspeed" );
dialogue_pit_wait();
//Ranger 3 Hell no. We don't get enough trigger time for that kind of accuracy man.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar3_triggertime" );
dialogue_pit_wait();
//Ranger 1 Yeah, who you kiddin'? Only Delta gets that kind of practice, huah?
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar1_onlydelta" );
dialogue_pit_wait();
//Ranger 2 Go home and take your girlfriend out. <laughs> Cuz you're here for four more months. I'll take care of her dude! I'll check in on her. Is that alright?
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_takecareofyourgf" );
dialogue_pit_wait();
//Ranger 2 Huah. Keating says he saw some D-boys take the course with the movers on max speed with double civvies.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_keatingsays" );
dialogue_pit_wait();
//Ranger 4 Yeah I was there - headshot, headshot, headshot. Those guys are badass man.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_headshot" );
dialogue_pit_wait();
//Ranger 4 Except one guy had a mohawk, spoke with a funny accent. British or somethin'.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_funnyaccent" );
dialogue_pit_wait();
//Ranger 1 SAS cross-trainin' with our Delta boys?
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar1_crosstraining" );
dialogue_pit_wait();
//Ranger 4 Maybe. That guy rolled the course in eight point two-six. Made our D-boys look like they were movin' in slow motion.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_slowmotion" );
dialogue_pit_wait();
//Ranger 3 Damn, man, that is goood.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar3_thatisgood" );
dialogue_pit_wait();
//Ranger 4 There was this other dude, guy with a ski mask with a skull painted on it. Eight point two-eight, usin' a 1911.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_skimask" );
dialogue_pit_wait();
//Ranger 4 I'm tellin' you...that guy was frickin' weird man<61>
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_weirdman" );
dialogue_pit_wait();
//Ranger 2 I dunnno man, marching off into the desert in a two man team like that, no support. . . .
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_twomanteam" );
dialogue_pit_wait();
//Ranger 2 Those dudes, they get killed, and like nobody even knows. . . Nobody knows: Nobody knows where they're going or where they're coming from. It's crazy. I can't even- I don't know. My wife would freak out. That's probably why most of them aren't even marrie
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar2_wifewouldfreak" );
dialogue_pit_wait();
//God how dumb are you guys?
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_howdumb" );
dialogue_pit_wait();
//Honestly<6C> I could fight anybody in this platoon.
org = getclosest( level.player.origin, conversation_orgs_pit );
org play_sound_in_space( "train_ar4_fightanybody" );
wait( 5 );
thread dialogue_ambient();
}
AI_runner_group_think( spawnerTargetname )
{
spawners = getentarray( spawnerTargetname, "targetname" );
runners = undefined;
while ( true )
{
runners = array_spawn( spawners, true );
waittill_dead( runners );
}
}
AI_runners_think()
{
self gun_remove();
self.runanim = level.scr_anim[ "generic" ][ self.animation ];
}
AI_delete( excluders )
{
self endon( "death" );
if ( !isdefined( self ))
return;
if ( ( isdefined( excluders ) ) && ( excluders.size > 0 ) )
{
if ( is_in_array( excluders, self ) )
return;
}
if ( isdefined( self.magic_bullet_shield ) )
self stop_magic_bullet_shield();
if ( !isSentient ( self) )
{
// self notify( "death" );
// waittillframeend;
}
self delete();
}
weaponfire_failure()
{
level endon( "mission failed" );
while( true )
{
flag_wait( "player_in_camp" );
while( flag( "player_in_camp" ) )
{
level.player waittill_either( "begin_firing", "player_not_in_camp" );
if ( flag( "player_in_camp" ) )
{
//mission fail
wait( .5 );
SetDvar( "ui_deadquote", &"TRAINER_MISSION_FAIL_FIRE_IN_CAMP" );
maps\_utility::missionFailedWrapper();
level notify( "mission failed" );
}
else
{
break;
}
}
}
}
player_camp_disable_weapons()
{
while( !flag( "player_has_started_course" ) )
{
flag_wait( "player_in_camp" );
level.player disableweapons();
while( flag( "player_in_camp" ) )
{
wait( 1 );
}
level.player enableweapons();
}
level.player enableweapons();
}
basketball_nag()
{
level endon( "mission failed" );
iDialogueLine = 0;
conversation_orgs = getentarray( "conversation_orgs", "targetname" );
while( true )
{
flag_wait( "player_on_bball_court" );
while( flag( "player_on_bball_court" ) )
{
wait( 2 );
if ( flag( "player_on_bball_court" ) )
{
//Ranger 2 Get off the court dude. train_ar2_getoffcourt
//Ranger 2 Come on man, wait your turn. train_ar2_waityourturn
//Ranger 2 Allen, what the hell? train_ar2_allenwhatthe
if ( iDialogueLine > 2 )
iDialogueLine = 0;
org = getclosest( level.player.origin, conversation_orgs );
org play_sound_in_space( level.scr_sound[ "court_nag_0" + iDialogueLine ] );
iDialogueLine++;
wait( randomfloatrange( 8, 12 ) );
}
else
{
break;
}
}
}
}