cod5-sdk/raw/maps/mak.gsc
2008-11-20 00:00:00 +00:00

9226 lines
219 KiB
Text
Raw Blame History

// GLOBAL
// - CLIP!
// Lower railing near the bunker at the end to match the traversals. The next rail down from the top should work
// Add foliage brush between feign death area and event2 beach
// Event1 //
// - Fix the timing for Saving Private Ryan, so he doesn't run by enemies, and make him ignored
// - Remove guns on guys who die on MG???
// - MG sometimes continues to fire even though no one is manning it
// Event2 Beach //
// - Japanese react to LMG when shot
// - Add sniper to tower
// - Add light spotter to tower
// - Have light change sniper targetting
// - Get Derrp to put in correct tower
// - Adjust clips on mg nests
// - Fix up pathing through goat path left/right/straight
// Event3 //
// - Have cover nodes for enemies
// - Squiggle path needs better ai/node placement
// - Put in double feign animations
// Event4 //
// - Put in interactive hands for truck scene
// - Clip fence at bottom of hill
// - Clip end state of fence at bottom of hill
// Event5
// - Sullivan dialogue timing when giving orders to plant charges
// - Take out railing in bunker
// Event6 //
// - Kill any left over Coop players( but no fail ) if near ending explosions
// - Have Roebuck/Redshirt ignoreall when going to bunker
// Sean Review Notes:
// - M.I.A. in parenthesis on introscreen
// - Mantle out of round hut window( near start )
// - Pickup Weapons in hut w/ Lozano
// - Flank MG route. Remove clip
// - Turn truck near LMG into destructible
// - Add Event2 Save
// - Ammo pickup on top of hill( preferably allied weapons )
// - Cover on top of hill, in event2 beach
// - More cover in event2 beach all around
// - Reset run speed at top of hill/event2 beach
// - Disable battlechatter before feign
// - Friendly left at beginning of map when at feign area??
// - Friendlies should move up when feign enemies are dead
// - More cover in feign area
// - Friendly went passed MG after feign
// - Endon melee truck reminder right when the player uses the truck
// - Not enough cover overall in the level
// - Contact distance seems too far??
// - Add Allied pickup weapons, on dead guys
//----------------OLD----------------------------------------
// - Create collmap for destructible vehicle truck
// - Friendly `n Player's hands after the intro
// - Clean up guys who are left behind in the village
// - Have 2nd Beach MG guys should live longer
// - Make sure all guys who need to join the player's squad, do so.
// - Blood FX on the LMG mowdown
// - Script the sun intensity to 0.9 when you get to the goat path, have to interpolate over 20 seconds.
// - Get the fullscreen FX at the start of Makin to be less intense and incorporate blur
// - Grenade guy American pops when vignette starts
//NEW - HIGH: Add offset on officer<65>s cigarette puff just before he puts it out in McCord<72>s eye so player can see his face lighting up
//NEW - HIGH: Slightly delay timing on guy 2 shed vignette
//NEW - HIGH: Make sure squad does not move ahead without player at the end of the village
//NEW - HIGH: Place enemy AI closer to LMG nest on the right for player to shoot
//MEDIUM: Trigger the vision set for under the hut
// - make it so guys do not shoot during reflection probes
// - Get stop/idles working on joggers
// - Put in Transitions to Feign-to-Death
// - Comment script
// --- NEW TODO ---
// - Put in animation for player stabbing barrel
// - Timing of event3 to event4 transition
// - Not all friendlies move up when fire trail is ignited, blue squad
// - Adjust any gameplay in compound area
// - Kill off bunkerdoor axis properly
// - Less drones, less paths
// - Put "look up" animations for Roebuck
// - Do we need a flinch for Roebuck?
// - May need to spawn a clip wall in that area, as well as "kill" anyone under it
// - If player dies at this
// - Support outtro for Coop... Sullivan is the gate keeper, once in position, the 1st player is the key master.
// - Get AI to get on boats smoothly( outtro )
// - Setup use button for players to enter 2nd boat and 1st boat.
// - As the player makes his way to the boats, we need to lighten the load of friendly AI.
// - Figure out how to make the gas fire trail start sooner, before the truck hits.
// - Adjust Drones
// - Need collision for destroyed destructible trucks
// - Put zippo in Sullivan's hands
// - Insert animation of truck looping while going down hill
// ---------------FEEDBACK----------------------
// - Fix fuel leak FX orientation
// - Hintstring for hitting use on the back of the truck
// - Explosion for when the fuel gets to the truck
// - Friendlies in compound seem to be in firing squad formation
// - Force flanking maneuver
// - Roebuck does not stay crouched after jumping out of the truck
// - Sullivan does not stay crouched during the truck scene
// - Objective Stars, a bit more leading?
// NOTES:
// - Truck LOD shows truck bed door snap back up( lods too aggressive over all? )
// - Need: Animation for truck hitting tower.
// - Tower LOD still jacked up
// - Fuel trail FX too big.
// Scripting Notes:
// -I'm using a lot of "script_flag" on triggers, which also automatically initializes the flag. If you modify any triggers, be sure to see if it has a script_flag
// and make any adjustments within script.
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_music;
#include maps\_busing;
#using_animtree( "generic_human" );
main()
{
battlechatter_off();
SetSavedDvar( "compassMaxRange", 2000 );
build_custom_vehicle( "rubber_raft" );
build_custom_vehicle( "type94" );
maps\_destructible_type94truckcamo::init();
precache_models();
precache_rumbles();
precache_shock();
precache_strings();
maps\_banzai::init();
// Sets up the onPlayerconnect/disconnect, etc
maps\mak_net::main();
//needs to be first for create fx
maps\mak_fx::main();
// threatbias group setups
CreateThreatBiasGroup( "players" );
CreateThreatBiasGroup( "heroes" );
CreateThreatBiasGroup( "none" );
CreateThreatBiasGroup( "rushers" );
// vehicle loading functions
maps\_flare::main( "tag_origin", undefined, "white" );
// Determines how frequent a random guy will charge the player
level.player_seek_timer = 7;
// Init drones
level.drone_weaponlist_axis = [];
level.drone_weaponlist_axis[0] = "type100_smg";
level.drone_weaponlist_axis[1] = "type99_rifle";
level.drone_spawnFunction["axis"] = ::drone_character_axis;
maps\_drones::init();
// Start Function calls
default_start( ::event1_start );
add_start( "event1_intro", ::event1_after_intro_start, &"STARTS_MAK_EVENT1_AFTER_INTRO" );
// VIGNETTE STARTS
add_start( "event1_v_under_hut", ::event1_vignette_start, &"STARTS_MAK_EVENT1_V_UNDER_HUT" );
add_start( "event1_v_guy2shed", ::event1_vignette_start, &"STARTS_MAK_EVENT1_V_GUY2SHED" );
add_start( "event1_v_pond_fight", ::event1_vignette_start, &"STARTS_MAK_EVENT1_V_POND_FIGHT" );
add_start( "event1_v_fire_beatdown", ::event1_vignette_start, &"STARTS_MAK_EVENT1_V_FIRE_BEATDOWN" );
add_start( "event1_v_tower_collapse", ::event1_vignette_start, &"STARTS_MAK_EVENT1_V_TOWER_COLLAPSE" );
add_start( "event1_v_showdown", ::event1_vignette_start, &"STARTS_MAK_EVENT1_V_SHOWDOWN" );
add_start( "event1_lmg", ::event1_vignette_start, &"STARTS_MAK_EVENT1_LMG" );
add_start( "event2", ::event2_start, &"STARTS_MAK_EVENT2" );
add_start( "event2_beach", ::event2_beach_start, &"STARTS_MAK_EVENT2_BEACH" );
add_start( "event3_feign", ::event3_feign_start, &"STARTS_MAK_EVENT3_FEIGN" );
add_start( "event4", ::event4_start, &"STARTS_MAK_EVENT4" );
add_start( "event5", ::event5_start, &"STARTS_MAK_EVENT5" );
add_start( "outtro", ::event6_outtro_start, &"STARTS_MAK_OUTTRO" );
// Custom Introscreen pointer
level.custom_introscreen = ::custom_introscreen;
// _load!
maps\_load::main();
// Initialize the fov variable
set_player_attrib( "fov", 65 );
level.callbackSaveRestored = ::onMakSaveGameRestored;
// All the level support scripts.
maps\mak_amb::main();
maps\mak_anim::main();
maps\_mgturret::init_mg_animent();
add_hint_string( "truck_hint", &"MAK_TRUCK_HINT", ::event4_hint_check );
// flag inits
init_flags();
init_threatbias_groups();
dof_enable( false );
init_spawn_functions();
init_lights();
init_hidden_objects();
init_script_brushmodels();
init_radio_destructibles();
// Friendly( hero ) setup
init_friendlies();
init_plant_charges();
filter_out_names();
level thread init_event4_truck();
level thread set_custom_approach();
// THIS MAY BE TEMP??
killspawner = 102;
spawners = GetspawnerArray();
for( i = 0 ; i < spawners.size ; i++ )
{
if( ( IsDefined( spawners[i].script_killspawner ) ) &&( killspawner == spawners[i].script_killspawner ) )
{
spawners[i] Delete();
}
}
/#
// TESTING
if( GetDvar( "nolink_player" ) == "" )
{
SetDvar( "nolink_player", "0" );
}
level thread debug_ai_prints();
// level thread speed_check();
// flag_wait( "all_players_connected" );
// wait( 1 );
// grenades = GetEntArray( "weapon_type97_frag", "classname" );
// for( i = 0; i < grenades.size; i++ )
// {
// grenades[i] SetModel( "grenade_bag" );
// grenades[i] Hide();
// wait( 0.05 );
// grenades[i] Show();
// level thread draw_line_ent_to_ent( grenades[i], get_host() );
// }
#/
}
set_custom_approach()
{
if( !IsDefined( anim.NotFirstTime ) )
{
wait( 0.1 );
}
add_custom_exposed_approach( 0, %ch_makinraid_creepywalk_stop_center2 );
add_custom_exposed_exit( 0, %ch_makinraid_creepywalk_start_center2 );
}
add_custom_exposed_approach( index, approach_anim )
{
type = "custom_exposed";
anim.coverTrans[type][index] = approach_anim;
anim.coverTransDist[type][index] = getMoveDelta ( anim.coverTrans[type][index], 0, 1 );
anim.coverTransAngles[type][index] = getAngleDelta( anim.coverTrans[type][index], 0, 1 );
}
add_custom_exposed_exit( index, approach_anim )
{
type = "custom_exposed";
anim.coverExit[type][index] = approach_anim;
anim.coverExitDist[type][index] = getMoveDelta ( anim.coverExit[type][index], 0, 1 );
anim.coverExitAngles[type][index] = getAngleDelta( anim.coverExit[type][index], 0, 1 );
}
precache_models()
{
PrecacheModel( "tag_origin" );
PrecacheModel( "tag_origin_animate" );
PrecacheModel( "viewmodel_usa_raider_player" );
PrecacheModel( "radio_jap_bro" );
// INTRO
PrecacheModel( "clutter_peleliu_us_helmet" );
//Event1
PrecacheModel( "weapon_jap_katana_short" );
PrecacheModel( "weapon_jap_katana_long" );
PrecacheModel( "weapon_jap_beating_stick" );
PrecacheModel( "static_makin_cigarette" );
PrecacheModel( "viewmodel_usa_kbar_knife" );
PrecacheModel( "clutter_makin_flashlight" );
PrecacheModel( "anim_makin_hutbeamcollapse" );
PrecacheModel( "anim_peleliu_fly2shed" );
PrecacheModel( "anim_intro_hut_explosion" );
PrecacheModel( "anim_makin_firehut_fall" );
// Event2
PrecacheModel( "lights_searchlight_guardtower_v2_off" );
// Event4
PrecacheModel( "anim_makin_radiotower_dest" );
PrecacheModel( "static_type94_bed_door_obj" );
PrecacheModel( "weapon_rus_zippo" );
PrecacheModel( "viewmodel_usa_kbar_knife" );
// Event5
PrecacheModel( "weapon_satchel_charge" );
}
precache_shock()
{
PrecacheShellshock( "mak_intro" );
PrecacheShellshock( "explosion");
PrecacheShellshock( "explosion_mak");
}
precache_rumbles()
{
PrecacheRumble( "explosion_generic" );
}
precache_strings()
{
PrecacheString( &"MAK_TRUCK_TRIGGER" );
}
init_flags()
{
flag_init( "intro_done" );
flag_init( "event1_detonate_hut4" );
flag_init( "event1_corner_hut_destroyed" );
flag_init( "beatdown_break_apart" );
flag_init( "event1_past_mg" );
flag_init( "event2_mg_target_ai" );
flag_init( "event2_before_shrine_dialogue" );
flag_init( "event2_after_shrine" );
flag_init( "event2_banzai_dead" );
flag_init( "event2_after_banzai_dialog" );
flag_init( "event2_flank_mg" );
flag_init( "event2_path_stop2" );
flag_init( "event2_barrel_exploded" );
flag_init( "event2_boat_on_shore" );
// Sumeet - Added event2_beach_clear to init in the script, removed it from the trigger in map
// Also added a flag for verifying that the guys are reached in goat path to, avoids a PB.
flag_init( "event2_beach_clear" );
// sumeet - spotlight flag
flag_init("spotlight_dead");
flag_init( "jog_enabled" );
flag_init( "event3_charge" );
flag_init( "event3_unblock" );
flag_init( "feign_can_be_interrupted" );
// Sumeet - added a early out feign flag
//flag_init("feign_interrupted");
flag_init( "event4_truck_go" );
flag_init( "event4_truck_hint" );
flag_init( "truck_dialogue_intro" );
flag_init( "roebuck_in_truck" );
flag_init( "event4_tower_collapse" );
flag_init( "event4_light_fuel" );
flag_init("roebuck_event5_planting_charges");
flag_init( "event5_player_charge_set" );
flag_init( "event5_charge_set" );
flag_init( "event5_bunker_door" );
flag_init( "event6_exit1" );
flag_init( "event6_exit2" );
flag_init( "event6_exit3" );
flag_init( "event6_exit4" );
flag_init( "event6_boat1_ready" );
flag_init( "event6_boat2_ready" );
// Sumeet - added boat in flag on sullivan, used for roebuck to start some dialogues.
flag_init("sullivan_boat_in");
flag_init("roebuck_dialogue_cmon_time");
flag_init( "sullivan_outtro_ready" );
flag_init( "sullivan_at_boat" );
flag_init( "roebuck_in_boat" );
flag_init( "random_player_seek" );
flag_set( "random_player_seek" );
flag_init("player_in_boat");
}
init_lights()
{
// candle_lights = GetEntArray( "event1_lantern_light", "targetname" );
// array_thread( candle_lights, ::candle_wiggle );
// Turn off certain lights until ready
lights = GetEntArray( "hut2_corner_light", "targetname" );
array_thread( lights, maps\_lights::turn_off );
lights = GetEntArray( "hut1_lights", "targetname" );
array_thread( lights, maps\_lights::turn_off );
}
init_hidden_objects()
{
d_gate1 = GetEnt( "compound_destroyed_gate1", "targetname" );
d_gate1 Hide();
d_gate2 = GetEnt( "compound_destroyed_gate2", "targetname" );
d_gate2 Hide();
trigger = GetEnt( "event4_truck_trigger", "targetname" );
trigger SetHintString( &"MAK_TRUCK_TRIGGER" );
trigger trigger_off();
}
init_script_brushmodels()
{
ent = GetEnt( "radio_tower_monsterclip", "targetname" );
ent ConnectPaths();
}
init_radio_destructibles()
{
ents = GetEntArray( "radio", "targetname" );
for( i = 0; i < ents.size; i++ )
{
ents[i] thread destructible_radio();
}
}
destructible_radio()
{
assert( IsDefined( self.script_sound ) );
self PlayLoopSound( self.script_sound );
self.health = 75;
self SetCanDamage( true );
self waittill( "death" );
self StopLoopSound();
self SetModel( "radio_jap_bro" );
for( i = 0; i < 7; i++ )
{
self PlaySound( "radio_destroyed" );
PlayFx( level._effect["radio_explode"], self.origin );
wait( 1 + RandomFloat( 2 ) );
}
}
destructible_radio_loop()
{
self endon( "death" );
while( 1 )
{
self PlaySound( self.script_sound, "sounddone" );
self waittill( "sounddone" );
}
}
init_friendlies()
{
guys = GetEntArray( "starting_allies", "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i] set_bullet_shield();
guys[i].ignoreme = true;
guys[i].ignoreall = true;
}
level.sullivan = GetEnt( "sullivan", "script_noteworthy" );
level.roebuck = GetEnt( "roebuck", "script_noteworthy" );
guys = get_force_color_guys( "allies", "g" );
level.sniper = guys[0];
CreateThreatBiasGroup( "sullivan" );
CreateThreatBiasGroup( "roebuck" );
CreateThreatBiasGroup( "sniper" );
level.sullivan SetThreatBiasGroup( "sullivan" );
level.roebuck SetThreatBiasGroup( "roebuck" );
level.sniper SetThreatBiasGroup( "sniper" );
level.sullivan.animname = "sullivan";
level.roebuck.animname = "roebuck";
level.sullivan.goalradius = 32;
level.roebuck.goalradius = 32;
level.heroes = [];
level.heroes[0] = level.sullivan;
level.heroes[1] = level.roebuck;
level.heroes[2] = level.sniper;
// level.sullivan set_generic_run_anim( "sullivan_run", true );
// level.roebuck set_generic_run_anim( "roebuck_run", true );
for( i = 0; i < level.heroes.size; i++ )
{
level.heroes[i] make_hero();
}
}
init_threatbias_groups()
{
CreateThreatBiasGroup( "event1_katana_run_axis" );
CreateThreatBiasGroup( "event1_katana_run_ally" );
CreateThreatBiasGroup( "event2_beach_allies" );
CreateThreatBiasGroup( "event2_beach_axis" );
SetThreatBias( "event2_beach_allies", "event2_beach_axis", 120 );
CreateThreatBiasGroup( "event5_bunker_allies" );
CreateThreatBiasGroup( "event5_bunker_axis" );
SetThreatBias( "event5_bunker_axis", "event5_bunker_allies", 2000000 );
}
init_spawn_functions()
{
// Sumeet - removed this cause we are spawning ryan as stalingradspawn now.
//create_spawner_function( "event1_ally_fire_beatdown", "script_noteworthy", ::set_targetname_to_noteworthy );
//create_spawner_function( "event1_ally_fire_beatdown", "script_noteworthy", ::set_bullet_shield );
// Event1
create_spawner_function( "event1_ally_held_down", "script_noteworthy", ::set_targetname_to_noteworthy );
create_spawner_function( "event1_boatsquad1", "script_noteworthy", ::set_targetname_to_noteworthy );
//create_spawner_function( "event1_guy_in_shed", "script_noteworthy", ::event1_banzai_spawner );
create_spawner_function( "event1_guys_behind_hut", "script_noteworthy", ::set_targetname_to_noteworthy );
create_spawner_function( "event1_lmg_backup", "script_noteworthy", ::set_targetname_to_noteworthy );
// Event2
create_spawner_function( "event2_boatsquad1", "targetname", ::set_targetname_to_noteworthy );
create_spawner_function( "event2_boatsquad2", "targetname", ::set_targetname_to_noteworthy );
create_spawner_function( "event2_axis_spawners", "targetname", ::event2_flood_spawner );
create_spawner_function( "event2_spawn_to_die", "targetname", ::spawn_to_die );
create_spawner_function( "event2_spot_lighter", "script_noteworthy", ::event2_spotter );
create_spawner_function( "event2_spot_lighter", "script_noteworthy", ::balcony_death );
create_spawner_function( "event2_spot_light_sniper", "script_noteworthy", ::balcony_death );
// Sumeet - Added a spawn function to avoid gibbing on the banzai guys near shrine.
create_spawner_function( "event2_banzai_spawners", "targetname", ::set_no_gib );
create_spawner_function("event1_hut_collapse_spawner","targetname", ::collapse_guy_gun_remove );
// event3
create_spawner_function( "event3_blocker_spawners", "targetname", ::event3_blocker );
// Event6
create_spawner_function( "event6_respawner2", "targetname", ::event6_reset_ignoreme );
spawners = GetspawnerArray();
for( i = 0; i < spawners.size; i++ )
{
if( IsDefined( spawners[i].script_playerseek ) && spawners[i].script_playerseek == 999 )
{
spawners[i].script_playerseek = undefined;
if( IsDefined( spawners[i].script_goalvolume ) )
{
continue;
}
spawners[i] add_spawn_function( ::random_player_seek );
}
}
}
init_plant_charges()
{
triggers = GetEntArray( "plant_charge", "targetname" );
for( i = 0; i < triggers.size; i++ )
{
triggers[i] thread plant_charge_think();
}
}
// Removes "scripted" names from the _names list
filter_out_names()
{
names = [];
names[names.size] = "Lozano";
names[names.size] = "Denny";
names[names.size] = "Cook";
names[names.size] = "Hutchinson";
names[names.size] = "Allen";
names[names.size] = "Gallagher";
names[names.size] = "Ryan";
names[names.size] = "Bunting";
names[names.size] = "McCawley";
names[names.size] = "Dwyer";
names[names.size] = "Rivera";
names[names.size] = "Anderson";
names[names.size] = "Luyties";
new_names = [];
// Go through all of the names and save out the names that are not being filtered out
// to a new array( new_names )
for( i = 0; i < level.names["american"].size; i++ )
{
add_name = true;
for( q = 0; q < names.size; q++ )
{
if( level.names["american"][i] == names[q] )
{
add_name = false;
break;
}
}
if( add_name )
{
new_names[new_names.size] = level.names["american"][i];
}
}
level.names["american"] = new_names;
}
init_event4_truck()
{
truck = GetEnt( "event4_truck", "targetname" );
truck ent_flag_init( "started_on_path" );
truck SetCanDamage( false );
truck.animname = "event4_truck";
template = GetEnt( "event4_truck_template", "targetname" );
barrels = GetEntArray( "event4_truck_barrels", "targetname" );
// truck SetFlaggedAnimKnobRestart( "fake", level.scr_anim[truck.animname]["init"], 1, 0.2, 1 );
truck thread maps\mak_anim::play_vehicle_anim( "init" );
tags[0] = "tag_passenger7";
tags[1] = "tag_passenger5";
tags[2] = "tag_passenger3";
tags[3] = "tag_passenger9";
for( i = 0; i < barrels.size; i++ )
{
// barrel_diff = barrels[i].origin - template.origin;
// barrels[i].angles = barrels[i].angles + truck.angles;
// barrels[i].origin = truck LocalToWorldCoords( barrel_diff );
// barrels[i] LinkTo( truck );
barrels[i] LinkTo( truck, tags[i], ( 0, 0, 0 ), ( 0, 0, 0 ) );
}
template Delete();
}
// Called when a Drone spawns in... Determines the character model the Drone will use
drone_character_axis()
{
if( RandomInt( 100 ) > 98 )
{
character\char_jap_off::main();
}
else
{
character\char_jap_makonly_rifle::main();
}
}
// Customized Introscreen, has blurs and what not
custom_introscreen( string1, string2, string3, string4, string5 )
{
/#
if( GetDvar( "introscreen" ) == "0" )
{
wait( 0.05 );
waittillframeend;
level notify( "finished final intro screen fadein" );
waittillframeend;
flag_set( "starting final intro screen fadeout" );
waittillframeend;
level notify( "controls_active" ); // Notify when player controls have been restored
waittillframeend;
flag_set( "introscreen_complete" ); // Do final notify when player controls have been restored
flag_set( "pullup_weapon" );
return;
}
if( level.start_point != "default" )
{
return;
}
#/
level.introblack = NewHudElem();
level.introblack.x = 0;
level.introblack.y = 0;
level.introblack.horzAlign = "fullscreen";
level.introblack.vertAlign = "fullscreen";
level.introblack.foreground = true;
level.introblack SetShader( "black", 640, 480 );
flag_wait( "all_players_connected" );
// SCRIPTER_MOD
// MikeD( 3/16/200 ): Freeze all of the players controls
// level.player FreezeControls( true );
freezecontrols_all( true );
// MikeD( 11/14/2007 ): Used for freezing controls on players who connect during the introscreen
level._introscreen = true;
wait( 0.05 );
level.introstring = [];
//Title of level
if( IsDefined( string1 ) )
{
maps\_introscreen::introscreen_create_line( string1, "lower_left", 1.75 );
}
wait( 2 );
level thread set_all_players_double_vision( 5, 0.05 );
level thread set_all_players_blur( 2, 0.05 );
if( IsDefined( string2 ) )
{
maps\_introscreen::introscreen_create_line( string2, "lower_left", 1.75 );
}
if( IsDefined( string3 ) )
{
maps\_introscreen::introscreen_create_line( string3, "lower_left", 1.75 );
}
level thread set_all_players_shock( "mak_intro", 6 );
if( IsDefined( string4 ) )
{
wait( 2 );
maps\_introscreen::introscreen_create_line( string4, "lower_left", 1.75 );
}
if( IsDefined( string5 ) )
{
wait( 2 );
maps\_introscreen::introscreen_create_line( string5, "lower_left", 1.75 );
}
level notify( "finished final intro screen fadein" );
wait( 2 );
// Fade out black
level.introblack FadeOverTime( 0.5 );
level.introblack.alpha = 0;
flag_set( "starting final intro screen fadeout" );
// Only restore controls if we have blood
if( is_mature() )
{
// Restore player controls part way through the fade in
freezecontrols_all( false );
}
level._introscreen = false;
level notify( "controls_active" ); // Notify when player controls have been restored
// Fade out text
level thread maps\_introscreen::introscreen_fadeOutText();
flag_set( "introscreen_complete" ); // Notify when complete
// Extra Blur stuff.
level thread set_all_players_double_vision( 0, 2 );
level thread set_all_players_blur( 0, 2 );
wait( 4.5 );
// Get dizzy again
level thread set_all_players_shock( "mak_intro", 3 );
level thread set_all_players_double_vision( 3, 2 );
level thread set_all_players_blur( 1, 2 );
wait( 2.25 );
// Ok, now focus
level thread set_all_players_double_vision( 0, 3 );
level thread set_all_players_blur( 0, 3.25 );
}
//----------------//
// Event1 Section //
//----------------//
event1_start()
{
// Set up any player attributes, used for when people connect
set_player_attrib( "ignoreme", true );
set_start_position( "event1_starts", true );
level thread event1_intro();
}
event1_after_intro_start()
{
set_start_position( "event1_starts", true );
patrollers = GetEntArray( "event1_patroller", "targetname" );
doc_guys = [];
for( i = 0; i < patrollers.size; i++ )
{
if( IsSubStr( patrollers[i].script_noteworthy, "secondary" ) )
{
patrollers[i].targetname = "doc_guy";
doc_guys[doc_guys.size] = patrollers[i];
}
}
event1_remove_start_ents();
for( i = 0; i < doc_guys.size; i++ )
{
doc_guys[i].targetname = "event1_patroller";
}
wait( 2 );
flag_set( "intro_done" );
event1_start_delayed_patrollers();
// Start the explosion
level thread event1_detonate_huts();
maps\mak_anim::anim_intro_shed_light();
// level thread maps\mak_anim::event1_rescuers( true );
pow2 = GetEnt( "pow2", "script_noteworthy" );
pow2 Delete();
}
// Handles all of the Starts for the Vignettes
event1_vignette_start()
{
// Remove all flood_spawners w/o crashing
triggers = GetEntArray( "flood_spawner", "targetname" );
for( i = 0; i < triggers.size; i++ )
{
spawners = GetEntArray( triggers[i].target, "targetname" );
for( q = 0; q < spawners.size; q++ )
{
spawners[q].count = 0;
}
}
event1_remove_start_ents( true );
if( level.start_point == "event1_v_under_hut" )
{
set_start_position( "event1_v_under_hut_starts", true );
exploder( 104 );
level thread maps\mak_amb::hut_4_exp();
flag_wait( "event1_under_hut4" );
level thread event1_under_hut();
}
else if( level.start_point == "event1_v_guy2shed" )
{
set_start_position( "event1_v_guy2shed_starts", true );
level thread event1_guy_2_shed();
}
else if( level.start_point == "event1_v_pond_fight" )
{
set_start_position( "event1_pond_fight_starts", true );
level thread event1_pond_fight();
flag_wait( "event1_hut3_corner_explosion" );
level thread event1_corner_explosion();
}
else if( level.start_point == "event1_v_fire_beatdown" )
{
set_start_position( "event1_fire_beatdown_starts", true );
spawner = GetEnt( "event1_ally_fire_beatdown", "script_noteworthy" );
guy = spawn_guy( spawner );
flag_wait( "event1_hut3_corner_explosion" );
level thread event1_corner_explosion();
level thread event1_fire_beatdown();
}
else if( level.start_point == "event1_v_showdown" )
{
set_start_position( "event1_showdown_starts", true );
flag_wait( "event1_showdown" );
level thread event1_showdown();
}
else if( level.start_point == "event1_lmg" )
{
// Remove the Orange team
scout1 = GetEnt( "scout1", "script_noteworthy" );
scout1 Delete();
scout2 = GetEnt( "scout2", "script_noteworthy" );
scout2 Delete();
set_start_position( "event1_boatsquad1_starts" );
ally_showdown_spawner = GetEnt( "ally_showdown", "script_noteworthy" );
ally_showdown_spawner.origin = ( -11598, -15118, 156 );
guy = spawn_guy( ally_showdown_spawner );
guy set_force_color( "y" );
guy thread replace_on_death();
trigger_color_trigger( 8 );
//trigger_color_trigger( 9 );
guys = GetEntArray( "starting_allies", "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i].ignoreall = false;
guys[i].ignoreme = false;
}
spawners = GetEntArray( "event1_boatsquad1", "script_noteworthy" );
spawn_guys( spawners );
flag_set( "event1_boatsquad1_moveup" );
level thread event1_boatsquad1();
}
else if( level.start_point == "event1_v_tower_collapse" )
{
set_start_position( "event1_tower_collapse_starts", true );
exploder( 101 );
level thread event1_hut1_fx();
wait( 2 );
flag_wait( "event1_hut1_collapse" );
level thread event1_hut_collapse();
}
}
// Removes all of the guys not needed after the intro
event1_remove_start_ents( all )
{
// Delete the Axis
axis = GetEntArray( "intro_axis_group", "targetname" );
axis2 = GetEntarray( "event1_patroller", "targetname" );
axis = array_combine( axis, axis2 );
for( i = 0; i < axis.size; i++ )
{
axis[i] Delete();
}
mitch = GetEnt( "mitch", "script_noteworthy" );
mitch Delete();
pow_group = get_event1_pow_group();
for( i = 0; i < pow_group.size; i++ )
{
if( pow_group[i].targetname == "event1_pow_beaters" )
{
pow_group[i] Delete();
}
}
if( IsDefined( all ) )
{
for( i = 0; i < pow_group.size; i++ )
{
if( IsDefined( pow_group[i] ) )
{
pow_group[i] Delete();
}
}
rescuers = GetEntArray( "event1_rescuers", "targetname" );
for( i = 0; i < rescuers.size; i++ )
{
rescuers[i] Delete();
}
trigger = GetEnt( "first_spawners", "script_noteworthy" );
trigger Delete();
}
}
// Plays out the intro cinematic
event1_intro()
{
// collectible
level thread collectible_corpse();
// TUEY Sets the music state to be INTRO
setmusicstate( "INTRO" );
set_player_attrib( "crouch", false );
set_player_attrib( "prone", false );
flag_wait( "all_players_connected" );
flag_wait( "all_players_spawned" );
// TEMP Lock player0 in place.
players = get_players();
for( i = 0; i < players.size; i++ )
{
player = players[i];
player SetClientDvar( "hud_showStance", "0" );
player SetClientDvar( "compass", "0" );
player SetClientDvar( "ammoCounterHide", "1" );
player setclientdvar("miniscoreboardhide","1");
}
share_screen( get_host(), true, true );
// Disable all player weapons
for( i = 0; i < players.size; i++ )
{
players[i] DisableWeapons();
}
level waittill( "finished final intro screen fadein" );
wait( 1.8 );
// Play the intro animation
node = GetNode( "intro", "targetname" );
// Get the POW and POW Beater guys
pow_group = get_event1_pow_group();
level thread anim_single( pow_group, "intro", undefined, node );
// Have the POWs play their looped animation after they are done with the intro
for( i = 0; i < pow_group.size; i++ )
{
if( pow_group[i].animname == "pow2" )
{
pow_group[i] thread maps\mak_anim::death_after_anim();
}
else if( pow_group[i].animname == "pow1" || pow_group[i].animname == "pow3" )
{
pow_group[i] thread maps\mak_anim::loop_after_anim( "loop", undefined, node, "stop_tied_up_loop" );
}
pow_group[i] thread maps\mak_anim::print_tag_pos( "tag_inhand" );
}
// Gets the appropiate intro guys to play the intro animation
officer = GetEnt( "intro_officer", "script_noteworthy" );
officer Attach( "static_makin_cigarette", "tag_inhand" );
officer thread maps\mak_anim::detach_after_anim( "static_makin_cigarette", "tag_inhand" );
// officer thread print_notetracks( "single anim" );
level thread maps\mak_fx::cig_smoke( officer );
officer init_intro_settings();
interogator = GetEnt( "interogator", "script_noteworthy" );
interogator init_intro_settings();
interogator Attach( "weapon_jap_beating_stick", "tag_weapon_right" );
mitch = GetEnt( "mitch", "script_noteworthy" );
mitch init_intro_settings();
mitch.weapon = "";
mitch.dropweapon = false;
// Put intro guys in an array
guys = [];
guys[0] = officer;
guys[1] = mitch;
guys[2] = interogator;
level thread event1_give_player_weapons();
hide_all_player_models();
level thread maps\mak_anim::all_players_play_viewhands( "intro", node, false, 0, 1, 20, 20, 10, 10, false, "intro_hands" );
level thread anim_single( guys, "intro", undefined, node );
mitch thread maps\mak_anim::death_after_anim();
interogator thread maps\mak_anim::death_after_anim();
// Sumeet - Block the player until explosions are done.
level thread event1_intro_player_blocker();
flag_wait( "intro_done" );
// Force an update to the breadcrumbs, fixes an issue where the player is underground on a savegame restore
players = get_players();
for( i = 0; i < players.size; i++ )
{
num = players[i] GetEntityNumber();
level._player_breadcrumbs[num][0].pos = players[i].origin;
level._player_breadcrumbs[num][0].ang = players[i].angles;
}
autosave_now( "after_intro" );
event1_start_delayed_patrollers();
}
// Sumeet - Added player blocker so that players dont rush ahead before the intro is done
event1_intro_player_blocker()
{
// waittill intro is done, and explosions are over
flag_wait("intro_done");
// let sullivan and others move ahead a little bit.
wait(0.5);
// delete the player blocker and let them move ahead.
blocker = GetEntArray( "intro_player_blocker", "targetname" );
for( i=0; i<blocker.size;i++ )
blocker[i] Delete();
}
// This may be temp
event1_redshirts_regroup()
{
redshirts = GetEntArray( "event1_redshirts", "script_noteworthy" );
nodes = GetNodeArray( "event1_redshirt_nodes", "targetname" );
for( i = 0; i < redshirts.size; i++ )
{
redshirts[i].goalradius = 64;
redshirts[i] SetGoalNode( nodes[i] );
}
}
// Enables the player's weapons and enables the hud stuff
event1_give_player_weapons()
{
level waittill( "intro_viewhands_anim_done" );
// Enable the players weapons
players = get_players();
for( i = 0; i < players.size; i++ )
{
player = players[i];
player EnableWeapons();
player SetClientDvar( "hud_showStance", "1" );
player SetClientDvar( "compass", "1" );
player SetClientDvar( "ammoCounterHide", "0" );
player setclientdvar("miniscoreboardhide","0");
}
set_player_attrib( "crouch", true );
set_player_attrib( "prone", true );
}
// Called mainly on the key members of the intro
init_intro_settings()
{
self.animname = self.script_noteworthy;
self.a.nodeath = true;
if( self.script_noteworthy != "scout1" && self.script_noteworthy != "scout2" )
{
self thread maps\mak_anim::goalpos_after_anim();
}
if( self.script_noteworthy == "pow_beater2" )
{
return;
}
self gun_remove();
}
// Normal gameplay, this is called from mak_anim.gsc from a notetrack.
event1_detonate_huts()
{
struct = GetStruct( "event1_response_light", "targetname" );
for( i = 0; i < 2; i++ )
{
light_ent = Spawn( "script_model", struct.origin );
light_ent SetModel( "tag_origin" );
light_ent.angles = VectorToAngles( level.roebuck.origin - light_ent.origin );
PlayFXOnTag( level._effect["flash_light"], light_ent, "tag_origin" );
wait( 0.35 );
light_ent Delete();
if( i == 0 )
{
wait( 0.2 );
}
}
level thread event1_patroller_reactions();
struct = GetStruct( "intro_hut1_rumble", "targetname" );
PlayRumbleOnPosition( "explosion_generic", struct.origin );
Earthquake( 0.2, 1, struct.origin, 2000 );
exploder( 101 );
playsoundatposition("exp_hut_1", (-10608, -16232, 8));
level thread event1_hut1_fx();
wait( 0.5 );
struct = GetStruct( "intro_hut2_rumble", "targetname" );
PlayRumbleOnPosition( "explosion_generic", struct.origin );
Earthquake( 0.3, 1, struct.origin, 3000 );
playsoundatposition("exp_hut_2", (-9720,-16504, 152));
exploder( 102 );
wait( 1 );
struct = GetStruct( "intro_hut3_rumble", "targetname" );
PlayRumbleOnPosition( "explosion_generic", struct.origin );
Earthquake( 0.4, 1.5, struct.origin, 3000 );
playsoundatposition("exp_hut_3", (-10568, -16776, 152));
exploder( 103 );
wait( 0.5 );
struct = GetStruct( "intro_hut4_rumble", "targetname" );
PlayRumbleOnPosition( "explosion_generic", struct.origin );
playsoundatposition("exp_hut_4", (-10136, -17560, 152));
Earthquake( 0.5, 3, struct.origin, 3000 );
exploder( 104 );
level thread maps\mak_anim::anim_hut4_pieces();
level thread maps\mak_amb::hut_4_exp();
flag_set( "event1_detonate_hut4" );
// When the player and squad get closer to the village, remove all of the ignore flags
level thread event1_open_fire();
// TUEY Sets the music state to be "VILLAGE"
setmusicstate( "VILLAGE" );
wait( 1 );
lights = GetEntArray( "hut1_lights", "targetname" );
array_thread( lights, maps\_lights::turn_on );
// Now get on the color nodes
level.sullivan disable_ai_color();
level thread event1_roebuck_after_intro_run();
level thread event1_sullivan_3_route();
wait( 3 );
trigger_color_trigger( 0 );
// Start the vignette thread
level thread event1_master_thread();
battlechatter_on();
}
event1_roebuck_after_intro_run()
{
// Temp adjustment for Roebuck so he doesn't get caught up on Sullivan
pos = level.roebuck.origin +( 0, 230, 0 );
trace = BulletTrace( pos +( 0, 0, 100 ), pos +( 0, 0, -1000 ), false, undefined );
level.roebuck.moveplaybackrate = 0.7;
level.roebuck disable_ai_color();
og_goalradius = level.roebuck.goalradius;
level.roebuck SetGoalPos( trace["position"] );
level.roebuck waittill( "goal" );
level.roebuck.goalradius = og_goalradius;
level.roebuck.moveplaybackrate = 1;
flag_wait( "intro_done" );
// wait( 0.5 );
level.roebuck enable_ai_color();
}
// Handles Sullivan's "3 route" vignette
event1_sullivan_3_route()
{
node = GetNode( "event1_sullivan_3_route", "targetname" );
anim_reach_solo( level.sullivan, "3_route", undefined, node );
level thread anim_single_solo( level.sullivan, "3_route", undefined, node );
level.sullivan enable_ai_color();
level.sullivan disable_arrivals( true, true, undefined, 4 );
}
// Sets up the FX on the first hut that blows up.
event1_hut1_fx()
{
pieces = GetEntArray( "hut1_pieces", "script_noteworthy" );
org = getstruct( "hut1_collapse_fx1", "targetname" );
parent = undefined;
fx_models = [];
if(NumRemoteClients())
{
max_lower_fx = 4;
}
else
{
max_lower_fx = 9;
}
pieces = array_randomize( pieces );
for( i = 0; i < pieces.size; i++ )
{
if( IsDefined( pieces[i].script_string ) && pieces[i].script_string == "parent" )
{
pieces[i].smoke_fx = Spawn( "script_model", org.origin );
pieces[i].smoke_fx SetModel( "tag_origin" );
pieces[i].smoke_fx.angles = ( -90, 0, 0 );
pieces[i].smoke_fx LinkTo( pieces[i] );
PlayFXOnTag( level._effect["hut1_smoke"], pieces[i].smoke_fx, "tag_origin" );
parent = pieces[i];
}
pieces[i].fx_models = [];
if( max_lower_fx > 0 && pieces[i].origin[2] > 0 && pieces[i].origin[2] < 300 )
{
fx_model = Spawn( "script_model", pieces[i].origin );
fx_model SetModel( "tag_origin" );
fx_model.angles = ( -90, 0, 0 );
fx_model LinkTo( pieces[i] );
fx = "hut1_fire_pole";
PlayFXOnTag( level._effect[fx], fx_model, "tag_origin" );
pieces[i].fx_models[pieces[i].fx_models.size] = fx_model;
max_lower_fx--;
}
else // upper pieces
{
structs = getstructarray( pieces[i].script_linkto, "script_noteworthy" );
pieces[i].upper = true;
for( q = 0; q < structs.size; q++ )
{
fx_model = 0;
if(!NumRemoteClients())
{
fx_model = Spawn( "script_model", structs[q].origin );
fx_model SetModel( "tag_origin" );
fx_model.angles = ( -90, 0, 0 );
fx_model LinkTo( pieces[i] );
}
fx = "hut1_fire_medium";
if( IsDefined( structs[q].script_string ) )
{
if( structs[q].script_noteworthy == "large" )
{
fx = "hut1_fire_large";
}
}
if(!NumRemoteClients())
{
PlayFXOnTag( level._effect[fx], fx_model, "tag_origin" );
pieces[i].fx_models[pieces[i].fx_models.size] = fx_model;
}
}
}
}
}
event1_start_delayed_patrollers()
{
patrollers = GetEntArray( "event1_patroller", "targetname" );
for( i = 0; i < patrollers.size; i++ )
{
if( IsDefined( patrollers[i].script_string ) )
{
patrollers[i] thread maps\_patrol::patrol( patrollers[i].script_string );
}
}
}
// When the explosions go off, grab all of the patrollers and have them react
event1_patroller_reactions()
{
patrollers = GetEntArray( "event1_patroller", "targetname" );
for( i = 0; i < patrollers.size; i++ )
{
patrollers[i] thread event1_patroller_reaction_internal();
}
}
// This actually tells the AI how to react to the explosions
event1_patroller_reaction_internal()
{
self endon( "death" );
// If we have a custom reaction anim, play it, then run.
if( IsDefined( self.script_animation ) )
{
self thread anim_single_solo( self, self.script_animation );
}
// Stop the patrol thread.
self notify( "end_patrol" );
// Make sure they Patrollers are not ignoring anyone:
self.ignoreall = false;
self.ignoreme = false;
delete_me = false;
self.goalradius = 256;
if( self.script_noteworthy == "event1_patroller_delete" )
{
delete_me = true;
self.goalradius = 32;
}
else if( self.script_noteworthy == "die" )
{
flag_wait( "event1_detonate_hut4" );
wait( 2 );
hut_origin = ( -10112, -17320, -500 );
angles = VectorToAngles( self.origin - hut_origin );
yaw = ( 0, angle_normalize_180( angles[1] - self.angles[1] ), 0 );
// temp = self.origin + vectorscale( AnglesToForward( self.angles ), 100 );
// level thread line_points( self.origin, temp, ( 1, 1, 0 ) );
// temp = self.origin + vectorscale( AnglesToForward( yaw ), 100 );
// level thread line_points( self.origin, temp );
self.deathanim = get_explosion_death( yaw[1] );
self set_random_gib();
self AnimMode( "nogravity" );
self DoDamage( self.health + 10, ( 0, 0, 0 ) );
return;
}
// All patrollers should have a script_noteworthy
node = GetNode( self.script_noteworthy, "targetname" );
self follow_nodes( node );
if( delete_me )
{
self Delete();
}
}
// Removes any ignore flags on the friendlies, happens when the player is close enough.
event1_open_fire()
{
// flag_wait( "event1_near_hut4" );
wait( 4 );
set_player_attrib( "ignoreme", false );
guys = GetEntArray( "starting_allies", "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i].ignoreall = false;
guys[i].ignoreme = false;
}
}
// Handles the triggering of vignettes
event1_master_thread()
{
flag_clear( "random_player_seek" );
array = [];
array[array.size] = "random_keep_up1";
array[array.size] = "random_keep_up2";
array[array.size] = "random_keep_up3";
array[array.size] = "random_keep_up4";
array[array.size] = "random_keep_up5";
array[array.size] = "random_keep_up6";
array[array.size] = "random_keep_up7";
array[array.size] = "random_keep_up8";
array[array.size] = "random_keep_up9";
array[array.size] = "random_keep_up10";
array[array.size] = "random_keep_up11";
array[array.size] = "random_keep_up12";
array[array.size] = "random_keep_up13";
array[array.size] = "random_keep_up14";
array[array.size] = "random_keep_up15";
array[array.size] = "random_keep_up16";
level.roebuck thread repeat_dialog_along_vec( array, ( 0, 90, 0 ), 300, 5, 5, "event1_showdown" );
flag_wait( "event1_near_hut4" );
level thread event1_pond_fight();
flag_wait( "event1_under_hut4" );
level thread event1_under_hut();
flag_wait( "event1_guy_2_shed" );
flag_set( "random_player_seek" );
level thread event1_guy_2_shed();
level thread event1_near_shed();
flag_wait( "event1_grenade_scene" );
level.special_autosavecondition = ::autosave_light_check;
autosave_by_name( "event1_grenade_scene" );
level thread event1_orange_team_death();
flag_wait( "event1_hut3_corner_explosion" );
level.special_autosavecondition = undefined;
level thread event1_corner_explosion();
// Sumeet _ moved this so that ryan spawns in earlier.
level thread event1_fire_beatdown();
flag_wait( "event1_save_ryan" );
level thread event1_kill_off_enemies();
level thread event1_boatsquad1_lookat();
level thread event1_after_beatdown_enemies();
flag_wait( "event1_boatsquad1_moveup" );
autosave_by_name( "after_beatdown" );
level thread event1_boatsquad1();
flag_wait( "event1_hut1_collapse" );
level thread event1_hut_collapse();
flag_wait( "event1_showdown" );
level thread event1_showdown();
}
event1_pond_fight()
{
// spawn_todo( "Pond Fight Vignette", ( -10560, -16168, 112 ), undefined, "event1_hut3_corner_explosion" );
spawners = GetEntArray( "event1_pond_fighter", "targetname" );
ally = undefined;
axis = undefined;
guys = [];
for( i = 0; i < spawners.size; i++ )
{
guys[i] = spawners[i] Stalingradspawn();
if( spawn_failed( guys[i] ) )
{
continue;
}
if( guys[i].script_noteworthy == "ally_pond_fighter" )
{
ally = guys[i];
}
else
{
axis = guys[i];
}
guys[i].animname = guys[i].script_noteworthy;
}
ally SetCanDamage( false );
ally.saved = false;
axis thread event1_pond_fighter_damage( ally );
node = GetNode( "event1_pond_fight", "targetname" );
level anim_loop( guys, "pond_fight_loop", undefined, "stop_pond_fight", node );
if( ally.saved )
{
if( IsDefined( axis ) && IsAlive( axis ) )
{
axis.allowdeath = true;
axis DoDamage( axis.health + 50, ( 0, 0, 0 ) );
}
ally anim_stopanimscripted();
ally SetCanDamage( true );
ally set_force_color( "y" );
}
else
{
level thread anim_single( guys, "pond_fight_out", undefined, node );
for( i = 0; i < guys.size; i++ )
{
guys[i] thread maps\mak_anim::death_after_anim( undefined, "ragdoll", "explosion" );
}
}
wait( 10 );
level thread event1_corner_explosion();
}
event1_pond_fighter_damage( ally )
{
level endon( "stop_pond_fight" );
count = 0;
for( ;; )
{
self waittill( "damage", dmg, attacker );
if( IsPlayer( attacker ) )
{
count++;
if( count > 1 )
{
break;
}
}
self.health = 50;
}
if( IsDefined( ally ) && IsAlive( ally ) )
{
ally.saved = true;
level notify( "stop_pond_fight" );
}
// flag_set( "event1_hut3_corner_explosion" );
}
event1_under_hut()
{
level.sullivan thread anim_single_solo( level.sullivan, "no_one_standing" );
spawner = GetEnt( "event1_hut_collapse_spawner", "targetname" );
spawner.animname = "axis_hut_collapse"; // Relying on Dospawn( code ) to copy this to the AI.
node = GetNode( "event1_gunner_collapse", "targetname" );
level thread maps\mak_anim::spawn_and_play_solo( spawner, "vignette", node, undefined, "death" );
}
// Sumeet - Gun does a odd behaviour so rather hide the gun
collapse_guy_gun_remove()
{
wait(3);
self gun_remove();
}
event1_guy_2_shed()
{
spawner = GetEnt( "event1_blown_shed_spawner", "targetname" );
guy = spawn_guy( spawner );
guy disable_arrivals( true, true );
guy SetCanDamage( false );
guy.animname = "guy_2_shed";
node = GetNode( "event1_fly2shed", "targetname" );
anim_reach_solo( guy, "vignette", undefined, node );
playsoundatposition("exp_hut_1_spc", (-9711, -16421, 147));
exploder( 111 );
level thread anim_single_solo( guy, "vignette", undefined, node );
guy thread maps\mak_anim::death_after_anim( undefined, "ragdoll" );
}
event1_near_shed()
{
flag_wait( "event1_near_shed" );
level.sullivan thread anim_single_solo( level.sullivan, "watch_flank" );
guy = GetEnt( "event1_guy_in_shed", "targetname" );
if( IsDefined( guy ) && IsAlive( guy ) )
{
guy SetGoalEntity( get_closest_player( guy.origin ) );
}
}
event1_orange_team_death()
{
guys = get_force_color_guys( "allies", "o" );
for( i = 0; i < guys.size; i++ )
{
guys[i].grenadeawareness = 0;
}
spawner = GetEnt( "event1_grenade_enemy", "targetname" );
enemy = spawn_guy( spawner );
enemy waittill( "reached_path_end" );
struct = getstruct( "event1_grenade_position", "targetname" );
enemy thread maps\_grenade_toss::force_grenade_toss( struct.origin, undefined, 2 );
// Was the grenade successful?
count = 0;
for( i = 0; i < guys.size; i++ )
{
if( IsDefined( guys[i] ) && IsAlive( guys[i] ) )
{
count++;
}
}
if( count > 0 )
{
trigger = GetEnt( "event1_orange_death", "targetname" );
while( 1 )
{
trigger waittill( "trigger" );
count = 0;
for( i = 0; i < guys.size; i++ )
{
if( guys[i] IsTouching( trigger ) )
{
count++;
}
}
if( count == 2 )
{
break;
}
wait( 0.2 );
}
for( i = 0; i < guys.size; i++ )
{
guys[i] stop_bullet_shield();
guys[i].health = 100;
}
playsoundatposition("exp_barrel_2d", (0,0,0));
exploder( 105 );
}
}
event1_corner_explosion()
{
if( flag( "event1_corner_hut_destroyed" ) )
{
return;
}
flag_set( "event1_corner_hut_destroyed" );
// spawn_todo( "Corner Explosion", ( -10392, -15800, 144 ), 3 );
playsoundatposition("exp_hut_corner", (-10392, -15800, 144 ));
exploder( 108 );
lights = GetEntArray( "hut2_corner_light", "targetname" );
array_thread( lights, maps\_lights::turn_on );
wait( 0.2 );
level notify( "stop_pond_fight" );
}
// Kills the guys off that are in the area where just behind the fire beatdown hut
event1_kill_off_enemies()
{
bloody_death_array( "event1_guys_behind_hut", "targetname", 1, 3 );
bloody_death_array( "event1_svp_enemies", "script_noteworthy", 2, 5 );
}
// Waits for both the beatdown to be just about done, and the player to hit a trigger leading up to the beatdown
// then spawns in the enemies.
event1_after_beatdown_enemies()
{
flag_wait( "event1_before_saving_ryan" );
flag_wait( "beatdown_break_apart" );
level.sullivan thread anim_single_solo( level.sullivan, "more_of_them" );
spawners = GetEntArray( "event1_after_beatdown_enemies", "targetname" );
if( IsDefined( spawners ) && spawners.size > 0 )
{
maps\_spawner::flood_spawner_scripted( spawners );
}
}
event1_fire_beatdown()
{
// Sumeet - modified so that ryan will always spawn in
flag_wait("event1_guy_2_shed");
//Sumeet - spawn ryan with stalingrad spawn so that he will be spawned in 100%
spawner = GetEnt( "event1_ally_fire_beatdown", "script_noteworthy" );
ally = spawner stalingradspawn();
ally set_bullet_shield();
// Save ryan in level variable so that we can refer him later to kill him
level.ryan = ally;
// Sumeet - waittill save ryan flag is set.
flag_wait( "event1_save_ryan" );
ally SetCanDamage( false );
node = GetNode( "fire_beatdown_spot1", "targetname" );
ally.animname = "ally_fire_beatdown";
ally.dontavoidplayer = true;
ally.goalradius = 32;
// Now do the Fire BeatDown.
node = GetNode( "event1_fire_beatdown_sync", "targetname" );
anim_reach_solo( ally, "vignette1", undefined, node );
// Sumeet - Changed this that ryan will ignore everyone once he reaches the node
ally.ignoreall = true;
ally.ignoreme = true;
spawner = GetEnt( "event1_fire_beater", "targetname" );
spawner.animname = "axis_fire_beatdown"; // Relying on Dospawn( code ) to copy this to the AI.
axis = spawner stalingradspawn();
axis.dropweapon = false;
axis thread torch_ai();
axis maps\mak_anim::remove_gun();
axis thread print_health();
axis.grenadeammo = 0;
axis.targetname = "event1_axis_fire_beatdown";
axis thread event1_axis_beatdown_death();
axis playsound ("japanese_yell_hut");
guys[0] = ally;
guys[1] = axis;
axis thread maps\mak_anim::death_after_anim( undefined, "ragdoll" );
level thread anim_single( guys, "vignette1", undefined, node );
ally set_force_color( "r" );
ally.ignoreme = false;
ally.ignoreall = false;
ally stop_bullet_shield();
ally SetCanDamage( true );
wait( 1 );
level.roebuck anim_single_solo( level.roebuck, "help_ryan" );
if( IsDefined( axis ) && axis.health > 1 )
{
wait( 1 );
level.roebuck anim_single_solo( level.roebuck, "save_ryan" );
}
flag_wait( "beatdown_break_apart" );
wait( 0.5 );
if( ally.health > 1 )
{
level.sullivan anim_single_solo( level.sullivan, "after_ryan_save" );
}
else
{
level.roebuck anim_single_solo( level.roebuck, "too_late" );
}
}
event1_axis_beatdown_death()
{
level endon( "beatdown_break_apart" );
end_time = GetTime() + 2500; // "break apart" notetrack is 3.5 seconds long
while( self.health > 1 )
{
self waittill( "damage", dmg, attacker, dir, point );
// Sumeet - Modified so that the blood effect happens only when the mature mode is on.
if ( is_mature() )
PlayFx( level._effect["flesh_hit"], point );
level.beatdown_attacker = attacker;
}
if( GetTime() > end_time )
{
return;
}
self maps\mak_anim::ragdoll_after_anim();
wait( 0.05 );
self anim_stopanimscripted();
}
event1_hut_collapse()
{
// spawn_todo( "Fishing Hut Collapse Vignette", ( -12256, -14936, 392 ), 3 );
pieces = GetEntArray( "hut1_pieces", "script_noteworthy" );
// Sumeet added a sound on splash
if ( isdefined( pieces[0] ) )
playsoundatposition( "tower_splash_lowpitch", pieces[0].origin );
parent = undefined;
for( i = 0; i < pieces.size; i++ )
{
if( IsDefined( pieces[i].script_string ) && pieces[i].script_string == "parent" )
{
parent = pieces[i];
}
if( IsDefined( pieces[i].fx_models ) )
{
for( q = 0; q < pieces[i].fx_models.size; q++ )
{
if( !IsDefined( pieces[i].fx_models[q] ) )
{
continue;
}
if( IsDefined( pieces[i].upper ) )
{
playsoundatposition("wood_pre_crack",pieces[i].origin);
if( pieces[i].script_linkto == "hutchunk2_jnt" )
{
pieces[i].fx_models[q] Delete();
}
}
}
}
}
level thread maps\_anim::anim_ents( pieces, "collapse", undefined, undefined, parent, "hut1" );
// Play the FX
org = getstruct( "hut1_collapse_fx1", "targetname" );
big_fx = Spawn( "script_model", org.origin );
big_fx SetModel( "tag_origin" );
big_fx.angles = org.angles;
big_fx LinkTo( parent );
// PlayFx( level._effect["hut1_collapse"], org.origin, AnglesToForward( org.angles ), AnglesToUp( org.angles ) );
PlayFxOnTag( level._effect["hut1_collapse"], big_fx, "tag_origin" );
parent.big_fx = big_fx;
// TEMP waits
// PlayFx( level._effect["hut1_splash"], parent.origin );
parent.targetname = "hut1_parent";
}
event1_boatsquad1_lookat()
{
flag_wait( "event1_before_saving_ryan" );
trigger = GetEnt( "event1_boatsquad1_lookat", "targetname" );
trigger waittill( "trigger" );
flag_set( "event1_boatsquad1_moveup" );
}
event1_showdown()
{
if( is_german_build() )
{
return;
}
// spawn_todo( "Show Down", ( -11493, -15062, 188 ), 3 );
spawners = GetEntArray( "event1_show_down_spawners", "targetname" );
for( i = 0; i < spawners.size; i++ )
{
// Relying on Dospawn( code ) to copy this to the AI.
spawners[i].animname = spawners[i].script_string;
spawners[i] add_spawn_function( ::set_targetname_to_noteworthy );
if( spawners[i].animname == "axis_showdown" )
{
spawners[i] add_spawn_function( maps\mak_anim::ragdoll_after_anim );
}
else
{
spawners[i] add_spawn_function( maps\mak_anim::remove_gun );
}
}
node = GetNode( "event1_show_down", "targetname" );
maps\mak_anim::spawn_and_play( spawners, "vignette", node );
// Now grab the ally and assign him to the Yellow Squad
ally = GetEnt( "ally_showdown", "targetname" );
ally set_force_color( "y" );
ally thread replace_on_death();
ally.ignoreme = false;
ally.ignoreall = false;
axis = GetEnt( "axis_showdown", "targetname" );
axis thread event1_showdown_damage( ally );
}
event1_showdown_damage( ally )
{
self endon( "stop_showdown_damage" );
count = 0;
for( ;; )
{
self waittill( "damage", dmg, attacker, dir, point, mod );
if( IsPlayer( attacker ) )
{
if ( is_mature() )
PlayFx( level._effect["flesh_hit"], point );
count += dmg;
if( count > 100 )
{
break;
}
}
self.health = 500;
}
if( IsDefined( ally ) && IsAlive( ally ) )
{
ally.saved = true;
ally thread event1_showdown_color_delay();
ally anim_stopanimscripted();
// Sumeet - added a detach gun call
ally Detach( GetWeaponModel( ally.og_weapon ), "tag_inhand" );
ally animscripts\shared::placeWeaponOn( ally.og_weapon, "right" );
}
self anim_stopanimscripted();
}
event1_showdown_color_delay()
{
self disable_ai_color();
wait( 1.5 );
self enable_ai_color();
}
event1_boatsquad1()
{
level thread event1_held_guy();
guys = GetEntArray( "event1_boatsquad1", "targetname" );
sorted_guys = [];
for( i = 0; i < guys.size; i++ )
{
guys[i] SetCanDamage( false );
guys[i].animname = guys[i].script_string;
// Put the guys in order for when they run to the mg
if( guys[i].animname == "boatsquad1_1" )
{
sorted_guys[3] = guys[i];
}
else if( guys[i].animname == "boatsquad1_2" )
{
sorted_guys[0] = guys[i];
}
else if( guys[i].animname == "boatsquad1_3" )
{
sorted_guys[1] = guys[i];
}
else if( guys[i].animname == "boatsquad1_4" )
{
sorted_guys[2] = guys[i];
}
}
assertEx( sorted_guys.size > 0, "YOU SHOULD NOT SEE THIS -- BUGZ!" );
//wait_for_group_notify( guys, "reached_path_end" );
flag_wait( "event1_mg_hut" );
autosave_by_name( "event1_mg" );
disable_grenades_for_team( "allies" );
spawner = GetEnt( "event1_lmg_spawner", "targetname" );
mger = spawn_guy( spawner );
mger SetCanDamage( false );
mger.targetname = "mg_dude";
level thread event1_mg_dialog();
level thread event1_mg_target( sorted_guys, mger );
level thread event1_mger_death( mger );
level thread event1_boatsquad1_rush_thread( sorted_guys );
mg = GetEnt( "event1_lmg", "script_noteworthy" );
tarp = GetEnt( "event1_lmg_curtains", "targetname" );
spawners = GetEntArray( "event1_lmg_backup", "script_noteworthy" );
maps\_spawner::flood_spawner_scripted( spawners );
trigger = GetEnt( "event2_color_trigger", "targetname" );
level thread event1_killoff_mg_guys( trigger );
// Checks to see if any of the lmg enemies are still alive and in the area
// if no one is alive, it will move on
check_trigger = GetEnt( "event1_check_axis", "targetname" );
trigger_waittill_dead( "event1_lmg_backup", "targetname", check_trigger );
flag_set( "event1_past_mg" );
trigger notify( "trigger" );
level thread event2();
}
// Handles the dialog to take out the MG
event1_mg_dialog()
{
level endon( "event1_past_mg" );
mg = GetEnt( "event1_lmg", "script_noteworthy" );
owner = mg GetTurretOwner();
while( !IsDefined( owner ) )
{
owner = mg GetTurretOwner();
wait( 0.05 );
}
owner KnockBack( false );
mg SetTurretIgnoreGoals( true );
wait( 0.25 );
level.sullivan thread anim_single_solo( level.sullivan, "take_out_mg" );
wait( 2 );
if( IsDefined( owner ) && IsAlive( owner ) )
{
level.sniper redshirt_dialog( "cant_get_clear_shot" );
level.sullivan thread anim_single_solo( level.sullivan, "shoot_through_wood" );
}
dialogs = [];
dialogs[dialogs.size] = "keep_on_mg";
dialogs[dialogs.size] = "hit_that_mg";
owner = undefined;
has_owner = false;
num = 0;
timer = GetTime() + 5000 + RandomInt( 3000 );
while( 1 )
{
wait( 0.1 );
while( !IsDefined( owner ) )
{
if( has_owner )
{
has_owner = false;
wait( 2 );
level.sullivan anim_single_solo( level.sullivan, "no_crew_on_mg" );
}
owner = mg GetTurretOwner();
wait( 0.05 );
}
has_owner = true;
if( GetTime() > timer )
{
timer = GetTime() + 5000 + RandomInt( 3000 );
if( num == dialogs.size )
{
num = 0;
}
level.sullivan anim_single_solo( level.sullivan, dialogs[num] );
num++;
}
}
}
event1_killoff_mg_guys( trigger )
{
trigger waittill( "trigger" );
// Kill the extra guys
extra_guys = GetEntArray( "extra_guys", "targetname" );
for( i = 0; i < extra_guys.size; i++ )
{
if( IsAlive( extra_guys[i] ) )
{
extra_guys[i] thread bloody_death( RandomFloat( 3 ) );
}
}
// guys = [];
// guys = GetEntArray( "event1_mg_guy", "targetname" );
//
// guys2 = GetEntArray( "event1_lmg_backup", "targetname" );
// guys = array_combine( guys, guys2 );
//
// for( i = 0; i < guys.size; i++ )
// {
// guys[i] thread bloody_death( RandomFloat( 2 ) );
// }
}
event1_boatsquad1_rush_thread( sorted_guys )
{
spawners = GetEntArray( "boatsquad1_extra_spawner", "targetname" );
extra_guys = [];
extra_guys = spawn_guys( spawners );
for( i = 0; i < extra_guys.size; i++ )
{
extra_guys[i].ignoreall = false;
extra_guys[i].ignoreme = false;
extra_guys[i].targetname = "event1_extra_guys";
extra_guys[i].health = 50;
}
node = GetNode( "event1_lmg_mowdown", "targetname" );
sorted_guys[0] thread event1_boatsquad1_rush( node );
wait( 1 );
sorted_guys[1] thread event1_boatsquad1_rush( node );
wait( 0.8 );
sorted_guys[2] thread event1_boatsquad1_rush( node );
wait( 0.3 );
sorted_guys[3] thread event1_boatsquad1_rush( node );
}
event1_boatsquad1_rush( node )
{
self endon( "death" );
level anim_reach_solo( self, "vignette", undefined, node );
level thread anim_single_solo( self, "vignette", undefined, node );
self thread maps\mak_anim::death_after_anim( undefined, "ragdoll" );
wait( 0.1 );
self SetCanDamage( true );
tags = [];
tags[0] = "j_hip_le";
tags[1] = "j_hip_ri";
tags[2] = "j_head";
tags[3] = "j_spine4";
tags[4] = "j_elbow_le";
tags[5] = "j_elbow_ri";
tags[6] = "j_clavicle_le";
tags[7] = "j_clavicle_ri";
wait( 1 + RandomFloat( 1 ) );
while( 1 )
{
PlayFxOnTag( level._effect["flesh_hit"], self, tags[RandomInt( tags.size )] );
wait( 0.1 + RandomFloat( 0.5 ) );
}
}
event1_mger_death( guy )
{
guy.threatbias = -500;
guy disable_long_death();
guy waittill( "death" );
wait( RandomFloatRange( 1, 3 ) );
mg = GetEnt( "event1_lmg", "script_noteworthy" );
backup = GetEntArray( "event1_lmg_backup", "targetname" );
new_mger = undefined;
if( backup.size > 0 )
{
backup = get_array_of_closest( mg.origin, backup );
backup = array_removeDead( backup );
if( backup.size > 3 )
{
num = RandomIntRange( 1, 4 );
new_mger = backup[num];
}
else
{
new_mger = backup[0];
}
}
if( IsDefined( new_mger ) )
{
new_mger thread event1_get_on_mg( mg );
level thread event1_mger_death( new_mger );
}
}
event1_get_on_mg( mg )
{
node = GetNode( mg.targetname, "target" );
self.goalradius = 16;
self SetGoalNode( node );
self waittill( "goal" );
self UseTurret( mg );
}
// Handes the manual targetting for the MG
event1_mg_target( guys, mger )
{
org = GetEnt( "event1_lmg_target", "script_noteworthy" );
// Debug
mg = GetEnt( "event1_lmg", "script_noteworthy" );
// level thread draw_line_ent_to_ent( mg, org );
for( i = 0; i < guys.size; i++ )
{
while( IsAlive( guys[i] ) && guys[i].origin[0] < -10500 )
{
org MoveTo( guys[i].origin +( 0, 0, 32 ), 0.1 );
wait( 0.1 );
}
}
mg = GetEnt( "event1_lmg", "script_noteworthy" );
mg notify( "stop_burst_fire_unmanned" );
mg.script_shooting = false;
mg SetMode( "auto_ai" );
mger SetCanDamage( true );
}
event1_held_guy()
{
if( is_german_build() )
{
return;
}
level endon( "stop_held_guy_vignette" );
level thread event1_held_guy_dialog();
flag_wait( "event1_held_guy" );
if( !is_mature() )
{
return;
}
spawners = GetEntArray( "event1_held_down_spawners", "targetname" );
for( i = 0; i < spawners.size; i++ )
{
// Relying on Dospawn( code ) to copy this to the AI.
spawners[i].animname = spawners[i].script_string;
if( spawners[i].animname == "ally_held_down" )
{
spawners[i] add_spawn_function( maps\mak_anim::death_after_anim );
spawners[i] add_spawn_function( maps\mak_anim::remove_gun );
}
else if( spawners[i].animname == "axis1_held_down" )
{
spawners[i] add_spawn_function( maps\mak_anim::remove_gun );
}
spawners[i] add_spawn_function( ::set_targetname_to_noteworthy );
}
node = GetNode( "event1_held_down", "targetname" );
maps\mak_anim::spawn_and_play( spawners, "vignette", node );
}
event1_held_guy_dialog()
{
level endon( "event1_held_guy" );
level endon( "stop_held_guy_vignette" );
flag_wait( "event1_held_guy_dialog" );
sounds = [];
delays = [];
// "Get your damn hands off me!"
sounds[sounds.size] = "Mak1_IGD_116A_PAYE";
delays[delays.size] = 0.5;
// "Sons of bitches!"
sounds[sounds.size] = "Mak1_IGD_117A_PAYE";
delays[delays.size] = 0;
// "You should not have come here."
sounds[sounds.size] = "Mak1_IGD_118A_JAS1";
delays[delays.size] = 2;
// // "Animals!"
// sounds[sounds.size] = "Mak1_IGD_117A_PAYE";
// delays[delays.size] = 0;
// "You hear that outside?... You should all surrender, now."
sounds[sounds.size] = "Mak1_IGD_119A_PAYE";
delays[delays.size] = 1;
// "We do not surrender."
sounds[sounds.size] = "Mak1_IGD_120A_JAS1";
delays[delays.size] = 0;
ent = GetEnt( "held_guy_ent", "targetname" );
for( i = 0; i < sounds.size; i++ )
{
ent PlaySound( sounds[i], "sounddone" );
ent waittill( "sounddone" );
if( delays[i] > 0 )
{
wait( delays[i] );
}
}
sounds = [];
delays = [];
// "Get your damn hands off me!"
sounds[sounds.size] = "Mak1_IGD_116A_PAYE";
delays[delays.size] = 0.5;
// "Sons of bitches!"
sounds[sounds.size] = "Mak1_IGD_117A_PAYE";
delays[delays.size] = 0;
// "You should not have come here."
sounds[sounds.size] = "Mak1_IGD_118A_JAS1";
delays[delays.size] = 2;
num_array = [];
for( i = 0; i < sounds.size; i++ )
{
num_array[num_array.size] = i;
}
while( 1 )
{
num_array = array_randomize( num_array );
for( i = 0; i < num_array.size; i++ )
{
wait( 5 + RandomFloat( 5 ) );
ent PlaySound( sounds[num_array[i]], "sounddone" );
ent waittill( "sounddone" );
}
}
}
/*
// The 1st banzai'er in the shed
event1_banzai_spawner()
{
self endon( "death" );
self.threatbias = -1000;
self.targetname = self.script_noteworthy;
flag_wait( "event1_near_shed" );
self.script_player_chance = 100;
self thread maps\_banzai::banzai_force();
// Sumeet - Added a forced banzai announcement, in case if player doesnt here it.
wait(1);
self thread maps\_banzai::start_banzai_announce();
}
*/
//----------------//
// Event2 Section //
//----------------//
event2_start()
{
event1_remove_start_ents( true );
event2_start_allies();
set_start_position( "event2_starts" );
trigger_color_trigger( 10 );
level thread event2();
}
event2_beach_start()
{
event1_remove_start_ents( true );
event2_start_allies();
set_start_position( "event2_lmg_starts" );
trigger_color_trigger( 14 );
level thread event2( true );
wait( 0.05 );
trigger = GetEnt( "event2_setup_lmg", "targetname" );
trigger notify( "trigger" );
}
event2_start_allies()
{
// Remove the Orange team
scout1 = GetEnt( "scout1", "script_noteworthy" );
scout1 disable_replace_on_death();
scout1 Delete();
scout2 = GetEnt( "scout2", "script_noteworthy" );
scout2 disable_replace_on_death();
scout2 Delete();
ally_showdown_spawner = GetEnt( "ally_showdown", "script_noteworthy" );
ally_showdown_spawner.origin = ( -11598, -15118, 156 );
guy = spawn_guy( ally_showdown_spawner );
guy add_extra_starting_guy();
guy set_force_color( "y" );
guy thread replace_on_death();
guys = GetEntArray( "starting_allies", "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i].ignoreall = false;
guys[i].ignoreme = false;
}
// Since this gets called in every START, randomly give me a japanese weapon
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( RandomInt( 2 ) == 0 )
{
players[i] GiveWeapon( "type100_smg" );
players[i] GiveMaxAmmo( "type100_smg" );
}
else
{
players[i] GiveWeapon( "type99_rifle" );
players[i] GiveMaxAmmo( "type99_rifle" );
}
}
}
event2( event2_beach_start )
{
battlechatter_off();
if( !IsDefined( event2_beach_start ) )
{
event2_beach_start = false;
}
if( !event2_beach_start )
{
autosave_by_name( "after_village_mg" );
level thread player_speed_within_coords( 110, "x", -9900, -6300, "event2_path_last_stop" );
set_objective( 1 );
level thread event2_dialog_thread();
}
// Spawns in the initial version of the rope for the snare trap
node = GetNode( "event2_snare", "targetname" );
branch = getstruct( "event2_snare_branch", "targetname" );
dist = Distance( node.origin, branch.origin );
level.snare_rope_id = CreateRope( branch.origin, node.origin, dist + 10 );
enable_grenades_for_team( "allies" );
// TUEY Sets the music state to be "PATH"
setmusicstate( "PATH" );
level thread event2_setup_mg();
level thread event2_beach();
level thread event2_barrels();
level thread event2_wait_for_sullivan();
flag_wait( "event2_beach" );
flag_wait_or_timeout( "event2_beach_advance", 10 );
spawners = GetEntArray( "event2_axis_spawners2", "targetname" );
maps\_spawner::flood_spawner_scripted( spawners );
level thread event2_spawn_event3_blockers();
level thread event2_mg_thread();
flag_wait_or_timeout( "event2_beach_clear", 15 );
// Increase the blue's goalradius so they can move around more
blue = get_force_color_guys( "allies", "b" );
for( i = 0; i < blue.size; i++ )
{
blue[i].goalradius = 384;
}
// Kill off the extra boat guys
guys = GetEntArray( "boatsquad2", "targetname" );
for( i = 0; i < guys.size; i++ )
{
if( IsAlive( guys[i] ) )
{
guys[i] thread bloody_death( RandomFloat( 5 ) );
}
}
maps\_spawner::kill_spawnerNum( 201 );
check_trigger = GetEnt( "event2_check_axis", "targetname" );
level thread trigger_waittill_dead( "axis", "team", check_trigger, "event2_beach_clear" );
flag_wait_either( "event2_beach_clear", "event3_start" );
boatsquad = GetEntArray( "boatsquad1", "targetname" );
guys = [];
for( i = 0; i < boatsquad.size; i++ )
{
if( IsAlive( boatsquad[i] ) )
{
boatsquad[i] stop_bullet_shield();
boatsquad[i] set_force_color( "b" );
boatsquad[i] thread replace_on_death();
guys[guys.size] = boatsquad[i];
}
}
if( !flag( "event3_start" ) )
{
trigger_color_trigger( 17 );
}
level thread event3();
}
event2_wait_for_sullivan()
{
// while( level.sullivan.origin[0] < -3000 || level.roebuck.origin[0] < -3000 )
// {
// wait( 0.1 );
// }
flag_wait( "event2_beach_clear" );
// Kill off remaining axis
bloody_death_array( "axis", "team", 5, 10, true );
check_trigger = GetEnt( "event2_check_axis", "targetname" );
trigger_waittill_dead( "axis", "team", check_trigger );
flag_set( "event3_unblock" );
wait( 0.05 );
blocker = GetEnt( "event3_blocker", "targetname" );
blocker Delete();
// Now get the guys who will play the animation and have them move through the goat path to the feign section.
guys = GetEntArray( "event2_allies_group2", "targetname" );
exclude = array_combine( guys, level.heroes );
closest_ally = get_closest( level.sullivan.origin, "allies", "team", exclude, true );
closest_ally thread event3_goat_path( "event3_redshirt_start" );
level.roebuck thread event3_goat_path( "event3_roebuck_start" );
level.sullivan thread event3_goat_path( "event3_sullivan_start" );
}
event3_goat_path( t_name )
{
self SetCanDamage( false );
self.ignoreall = true;
self.ignoreme = true;
self disable_ai_color();
node = GetNode( t_name, "targetname" );
self thread follow_nodes( node );
flag_wait( "event3_goat_stop3" );
self notify( "stop_follow_nodes" );
}
event2_mg_thread()
{
timer = GetTime() + 30000;
mgs = GetEntArray( "event2_lmg", "script_noteworthy" );
while( 1 )
{
count = 0;
for( i = 0; i < mgs.size; i++ )
{
owner = mgs[i] GetTurretOwner();
if( !IsDefined( owner ) || !IsAI( owner ) )
{
count++;
}
}
if( GetTime() > timer )
{
break;
}
if( count > 1 )
{
break;
}
wait( 0.25 );
}
flag_set( "event2_flank_mg" );
}
// Spawns in the enemy banzai attackers on the top of the hill
event2_banzai()
{
spawners = GetEntArray( "event2_banzai_spawners", "targetname" );
for( i = 0; i < spawners.size; i++ )
{
spawn_guy( spawners[i] );
// Sumeet - Changed the timing for banzai spawners for avoiding bumping into each other.
wait( RandomFloatRange( 1, 1.5 ) );
}
}
event2_dialog_thread()
{
level endon( "before_shrine" );
level thread event2_before_shrine();
level thread event2_after_shrine();
level thread event2_top_of_hill();
level.sullivan anim_single_solo( level.sullivan, "good_work_marines" );
level.sullivan anim_single_solo( level.sullivan, "goat_path_info2" );
wait(2);
// Sumeet - this place creeps
closest_ally = get_closest( level.sullivan.origin, "allies", "team", level.heroes, true );
closest_ally do_dialogue( "creeps_me_out" );
wait(1);
// Tojo's at home
level.sullivan do_dialogue("home_in_this");
wait(1);
// Eyes peeled
level.sullivan do_dialogue("eyes_peeled");
}
// Stop the held_guy vignette if the player is too far away from the scene
event2_stop_held_guy_vignette()
{
trigger = GetEnt( "before_shrine", "targetname" );
trigger waittill( "trigger" );
// Spawns in the guy next to a tree used for the snare trap
spawner = GetEnt( "snare_spawner", "targetname" );
guy = spawn_guy( spawner, "snare_guy" );
guy SetCanDamage( false );
level notify( "stop_held_guy_vignette" );
}
event2_before_shrine()
{
// trigger = GetEnt( "event2_jog", "targetname" );
// trigger waittill( "trigger" );
// flag_wait( "event2_jog_start" );
set_all_players_visionset( "mak_path", 20 );
// Make sure Saving Private Ryan is not part of any color group
if( IsDefined( level.ryan ) && IsAlive( level.ryan ) )
{
// in case the setcandamage is till on
level.ryan setcandamage(true);
level.ryan set_force_color("r");
level.ryan disable_ai_color();
level.ryan bloody_death(); // kill ryan right away
}
red = get_force_color_guys( "allies", "r" );
yellow = get_force_color_guys( "allies", "y" );
green = get_force_color_guys( "allies", "g" );
guys = array_combine( red, yellow );
guys = array_combine( guys, green );
/*
// Sumeet -Added some code to track down a PB
// This should hit if ryan becomes part of squad by mistake.
for( i = 0; i < guys.size; i++ )
{
if( guys[i] == ryan )
{
println("Ryan became part of the squad - Call Sumeet, its a bug !!!!");
if ( isdefined(level.sniper) && isalive( level.sniper ) )
println("Denny is still alive. - Call Sumeet, its a bug !!!!");
wait( 5 );
// condition to break into the script.
anything = undefined;
if ( anything < 2 )
println("PBBBB");
}
}
*/
level thread start_jog( guys, -9500, -5400, "event2_jog_path" );
level thread event2_stop_held_guy_vignette();
// Sumeet removed dialogue
//level thread event2_before_shrine_dialogue();
// Sumeet - Kills all enemies as shrine event along the goat path started
level thread event2_kill_enemyai_before_goatpath();
// Along the path to beach
// level.sullivan anim_single_solo( level.sullivan, "stay_on_toes" );
nodes = GetNodeArray( "before_shrine_nodes", "targetname" );
nodes = sort_nodes_by_script_int( nodes );
guys = get_array_of_closest( nodes[0].origin, guys );
path_guys = [];
exit_node = GetNode( "event1_exit", "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i].dontavoidplayer = true;
guys[i].goalradius = 32;
// guys[i] SetGoalNode( nodes[i] );
// guys[i].jogger_node = nodes[i];
if( IsDefined( nodes[i] ) )
{
if( IsDefined( nodes[i].script_string ) )
{
if( nodes[i].script_string == "right" )
{
guys[i].jog_anim = "jog_right";
}
else if( nodes[i].script_string == "left" )
{
guys[i].jog_anim = "jog_left";
}
}
path_guys[path_guys.size] = guys[i];
guys[i] thread event2_jogger_thread( nodes[i] );
}
}
// Tell any remaining allies to exit/die
all = GetAiArray( "allies" );
for( i = 0; i < all.size; i++ )
{
is_path_guy = false;
for( q = 0; q < path_guys.size; q++ )
{
if( all[i] == path_guys[q] )
{
is_path_guy = true;
break;
}
}
if( is_path_guy )
{
continue;
}
all[i] thread bloody_death( randomfloatrange( 0.5,1.5 ) );
//all[i].script_noteworthy = "die";
//all[i].goalradius = 32;
//all[i] thread follow_nodes( exit_node, 10 + RandomFloat( 10 ) );
}
level event2_before_shrine_waittill( guys );
// Sumeet - removed dialogue
//flag_wait( "event2_before_shrine_dialogue" );
// TUEY
PlaySoundatposition( "bush_rustle_00", ( -7502, -14802.5, 216 ) );
level notify( "before_shrine" );
// Dialogue
level.roebuck StopSounds();
//Chris_P -
//level.roebuck anim_single_solo( level.roebuck, "shhh" );
level.roebuck do_dialogue("shhh");
wait( 0.5 );
//level.sullivan anim_single_solo( level.sullivan, "hear_something" );
// Sumeet - modified for better banzai timing.
level thread event2_snare_trap();
wait(3.5);
blocker = GetEnt( "goat_path_blocker", "targetname" );
blocker Delete();
// Sumeet - Not waiting for banzai anymore to time the banzai event
//flag_wait( "event2_path_stop2" );
level thread event2_banzai();
}
// Sumeet - This will make sure that all the enemies are killed before the goat path started
event2_kill_enemyai_before_goatpath()
{
flag_wait("event2_jog_start");
bloody_death_array( "axis", "team", undefined, undefined, false, -9000.0 );
}
event2_snare_trap()
{
node = GetNode( "event2_snare", "targetname" );
guy = GetEnt( "snare_guy", "targetname" );
guy SetCanDamage( false );
guy.ignoreall = true;
guy.ignoreme = true;
guy.dontavoidplayer = true;
guy.nododgemove = true;
guy pushPlayer( true );
guy.ignoresuppression = 1;
guy.grenadeawareness = 0;
guy anim_generic( guy, "what_is_this" );
level.roebuck thread anim_single_solo( level.roebuck, "check_it_out" );
wait( 1 );
guy thread event2_snare_trap_temple_dialogue();
guy.goalradius = 32;
guy SetGoalNode( node );
// Stop the idle loop from event2_jogger_thread()
guy anim_stopanimscripted();
guy notify( "stop_jog_idle" );
guy waittill( "goal" );
guy.custom_approachType = undefined;
guy.custom_approachNumber = undefined;
guy.custom_exitType = undefined;
guy.custom_exitNumber = undefined;
// SUmeet - Changed this to work for the new timing of the snare trap.
// guy anim_generic( guy, "snare_trap" );
//guy thread anim_generic( guy, "new_snare_trap" );
//wait( 1 );
//guy animscripts\face::SaySpecificDialogue( undefined, level.scr_sound["generic"]["new_snare_trap_temple"], 1.0, "dialogue_done" );
//wait( 2 );
//guy anim_stopanimscripted();
// time = GetAnimLength( level.scr_anim["generic"]["new_snare_trap"] );
// wait( time - 1 );
level maps\mak_anim::event2_snare_trap( guy );
playsoundatposition("snare_trap_yell", guy.origin);
//TUEY Set Music State to BANZAI
setmusicstate("BANZAI");
}
event2_snare_trap_temple_dialogue()
{
// Wait for the AI to orientate to the node
wait( 0.5 );
self animscripts\face::SaySpecificDialogue( undefined, level.scr_sound["generic"]["new_snare_trap_temple"], 1.0, "dialogue_done" );
}
event2_jogger_thread( node )
{
self endon( "stop_event2_jogger_thread" );
self endon("death");
self disable_ai_color();
og_interval = self.interval;
self.interval = 20;
if( IsDefined( self.animname ) && self is_hero() )
{
jog_idle = level.scr_anim["generic"]["jog_idle"][0];
jog_stop = level.scr_anim["generic"]["jog_stop"];
jog_start = level.scr_anim["generic"]["jog_start"];
level.scr_anim[self.animname]["jog_idle"][0] = jog_idle;
level.scr_anim[self.animname]["jog_stop"] = jog_stop;
level.scr_anim[self.animname]["jog_start"] = jog_start;
}
else
{
self.animname = "generic";
}
self thread follow_nodes( node );
self waittill( "event2_before_shrine" );
wait( 0.05 ); // Little wait so follow_nodes assigns the node
og_jog_anim = self.jog_anim;
if( RandomInt( 100 ) > 50 )
{
self.jog_anim = "jog1";
}
else
{
self.jog_anim = "jog2";
}
self.jogger_node = self.node;
delay = undefined;
if( IsDefined( self.jogger_node.script_delay ) )
{
delay = self.jogger_node.script_delay;
}
self disable_arrivals( false, false );
self.custom_approachType = "custom_exposed";
self.custom_approachNumber = 0;
self.custom_exitType = "custom_exposed";
self.custom_exitNumber = 0;
self.custom_exposed_idle = level.scr_anim[self.animname]["jog_idle"][0];
self waittillmatch( "coverArrival", "end" );
self thread anim_loop_solo( self, "jog_idle", undefined, "stop_jog_idle" );
flag_wait( "event2_path_stop2" );
if( IsDefined( delay ) )
{
wait( delay );
}
// self thread print3d_on_ent( "GO!", "goat_path", undefined, ( 0, 0, 90 ) );
self.custom_stop_idle = undefined;
self anim_stopanimscripted();
self notify( "stop_jog_idle" );
while( self.origin[0] < -7100 )
{
wait( 0.1 );
}
self.custom_approachType = undefined;
self.custom_approachNumber = undefined;
self.custom_exitType = undefined;
self.custom_exitNumber = undefined;
self.jog_anim = og_jog_anim;
self.enable_arrivals_on_last_node = true;
self disable_arrivals( true, true );
self waittill( "follow_nodes_done" );
self.interval = og_interval;
self enable_ai_color();
}
delay_print_spot()
{
wait( 0.05 );
println( " **** start = ", self.origin );
}
//event2_jogger_start( node )
//{
// self notify( "stop_jog_idle" );
//
// if( self is_hero() )
// {
// jog_start = level.scr_anim["generic"]["jog_start"];
// level.scr_anim[self.animname]["jog_start"] = jog_start;
// }
//
// self enable_ai_color();
// self anim_single_solo( self, "jog_start", undefined, self.jogger_node );
//}
event2_before_shrine_dialogue()
{
level endon( "stop_shrine_dialogue" );
flag_wait( "event2_path_stop1" );
closest_ally = get_closest( level.sullivan.origin, "allies", "team", level.heroes, true );
guys[0] = level.sullivan;
guys[1] = level.roebuck;
guys[2] = closest_ally;
closest_ally2 = get_closest( closest_ally.origin, "allies", "team", guys, true );
//CHRIS_P
// closest_ally redshirt_dialog( "ever_seen_banzai" );
// closest_ally2 redshirt_dialog( "a_what" );
// closest_ally redshirt_dialog( "a_banzai" );
closest_ally do_dialogue("ever_seen_banzai");
closest_ally2 do_dialogue( "a_what" );
closest_ally do_dialogue( "a_banzai" );
wait( 0.75 );
//CHRIS_P
//closest_ally redshirt_dialog( "crazy_tactic" );
closest_ally do_dialogue( "crazy_tactic" );
flag_set( "event2_before_shrine_dialogue" );
}
event2_before_shrine_waittill( guys )
{
level endon( "stop_before_shrine_waittill" );
wait_for_group_notify( guys, "event2_before_shrine" );
}
event2_after_shrine()
{
trigger = GetEnt( "event2_after_shrine", "targetname" );
trigger waittill( "trigger" );
flag_wait( "event2_banzai_dead" );
wait( 1.5 );
trigger_color_trigger( 14 );
flag_set( "event2_after_shrine" );
flag_wait( "event2_after_banzai_dialog" );
wait( 3 );
level.roebuck anim_single_solo( level.roebuck, "second_team" );
}
event2_top_of_hill()
{
trigger = GetEnt( "event2_top_of_hill", "targetname" );
trigger waittill( "trigger" );
autosave_by_name( "top_of_hill" );
level.sullivan anim_single_solo( level.sullivan, "pickup_pace" );
flag_clear( "jog_enabled" );
}
event2_setup_mg()
{
trigger = GetEnt( "event2_setup_lmg", "targetname" );
trigger waittill( "trigger" );
//TUEY Sets the music for the hilltop section & fight afterwords.
setmusicstate( "BEACH_FIGHT" );
spawners = GetEntArray( "event2_lmg_spawner", "targetname" );
mgers = spawn_guys( spawners );
for( i = 0; i < mgers.size; i++ )
{
mgers[i].threadbias = 10;
mgers[i] disable_long_death();
}
mg_targets = GetEntArray( "event2_lmg_target", "script_noteworthy" );
for( i = 0; i < mg_targets.size; i++ )
{
level thread event2_mg_targets( mg_targets[i] );
}
}
event2_mg_targets( target )
{
mg = GetEnt( target.targetname, "target" );
owner = undefined;
while( !IsDefined( owner ) )
{
owner = mg GetTurretOwner();
wait( 0.1 );
}
mg thread event2_mg_owner_death( owner );
// level thread draw_line_ent_to_ent( mg, target );
target1 = getstruct( "event2_lmg_spray_target", "targetname" );
target2 = getstruct( target1.target, "targetname" );
diff = target2.origin - target1.origin;
for( ;; )
{
if( !IsDefined( mg GetTurretowner() ) || owner != mg GetTurretowner() )
{
break;
}
if( flag( "event2_mg_target_ai" ) )
{
wait( 0.1 );
targets = array_combine( GetEntArray( "boatsquad1", "targetname" ), GetEntArray( "boatsquad2", "targetname" ) );
targets = array_randomize( targets );
if( targets.size == 0 )
{
return;
}
for( i = 0; i < targets.size; i++ )
{
if( !IsDefined( targets[i] ) || !IsAlive( targets[i] ) )
{
continue;
}
origin = targets[i].origin;
burst_time = GetTime() +( 2000 + RandomInt( 3000 ) );
while( GetTime() < burst_time )
{
// base the z off of 32, around crouch height
base = 64;
base_neg = base * -1;
base_dub = base * 2;
offset = ( base_neg + RandomInt( base_dub ), base_neg + RandomInt( base_dub ), 32 +( base_neg + RandomInt( base_dub ) ) );
pos = origin + offset;
if( DistanceSquared( target.origin, origin ) < 64 * 64 )
{
// We assume we've "acquired" our target, so adjust faster
time = 0.1;
}
else
{
time = 0.5;
}
target MoveTo( pos, time + RandomFloat( time ) );
target waittill( "movedone" );
}
}
}
else
{
pos = target1.origin +( RandomFloat( diff[0] ), RandomFloat( diff[1] ), RandomFloat( diff[2] ) );
target MoveTo( pos, 1 + RandomFloat( 1 ), 0.5, 0.5 );
target waittill( "movedone" );
}
}
}
event2_mg_owner_death( owner )
{
while( IsDefined( self GetTurretowner() ) && owner == self GetTurretowner() )
{
wait( 0.1 );
}
self notify( "stop_burst_fire_unmanned" );
self ClearTargetEntity();
}
event2_beach()
{
flag_wait( "event2_beach" );
set_objective( 1.5 );
level thread event2_spotlight();
// Have a dead body in the water
spawner = GetEnt( "event2_spawn_to_die", "targetname" );
spawn_guy( spawner );
flag_clear( "jog_enabled" );
allies = GetAiArray( "allies" );
level thread ignore_all_timer( allies, 5 );
level thread event2_beach_dialogue();
// Little breather for snapshot
wait( 0.1 );
spawners = GetEntArray( "event2_axis_spawners", "targetname" );
maps\_spawner::flood_spawner_scripted( spawners );
event2_spawner_relocation();
spawners = GetEntArray( "event2_spot_light_spawners", "targetname" );
spawn_guys( spawners, undefined, true );
// Little breather for snapshot
wait( 0.1 );
spawners = GetEntArray( "event2_boatsquad1", "targetname" );
boatsquad1 = spawn_guys( spawners, "boatsquad1" );
for( i = 0; i < boatsquad1.size; i++ )
{
boatsquad1[i] set_bullet_shield();
}
level thread event2_beach_grenade( boatsquad1 );
// Little breather for snapshot
wait( 0.1 );
spawners = GetEntArray( "event2_boatsquad2", "targetname" );
boatsquad2 = spawn_guys( spawners, "boatsquad2" );
for( i = 0; i < boatsquad2.size; i++ )
{
boatsquad2[i].NoFriendlyfire = true;
}
flag_set( "event2_mg_target_ai" );
level thread event2_boatsquad2_raft( boatsquad2 );
}
event2_spotlight()
{
light = GetEnt( "event2_spot_light", "targetname" );
level thread event2_spot_light_damage( light );
light endon( "death" );
level endon( "event2_stop_spotlight" );
light.fx = PlayFXOnTag( level._effect["spot_light"], light, "tag_fx" );
light.spot_target = GetStruct( light.target, "targetname" );
light.angles = VectorToAngles( light.spot_target.origin - light.origin );
boat = GetEnt( "event2_boatsquad2_raft", "targetname" );
targets = GetStructArray( "spotlight_targets", "targetname" );
old_target = targets[0];
red = get_force_color_guys( "allies", "r" );
yellow = get_force_color_guys( "allies", "y" );
green = get_force_color_guys( "allies", "g" );
blue = get_force_color_guys( "allies", "b" );
guys = array_combine( red, yellow );
guys = array_combine( guys, green );
guys = array_combine( guys, blue );
for( ;; )
{
if( flag( "event2_flank_mg" ) )
{
time = 0.25;
players = get_players();
if( RandomInt( 100 ) > 40 -( 10 * ( players.size - 1 ) ) )
{
current_target = players[RandomInt( players.size )];
}
else
{
guys = array_removeundefined( guys );
guys = array_removedead( guys );
if( guys.size == 0 )
{
wait( 0.2 );
continue;
}
current_target = guys[RandomInt( guys.size )];
}
}
else
{
current_target = targets[RandomInt( targets.size )];
time = 0.25 + RandomFloat( 1 );
if( old_target != current_target )
{
old_target = current_target;
}
}
if( !IsDefined( current_target ) )
{
wait( 0.2 );
continue;
}
if( current_target.origin[0] < -4750 )
{
wait( 0.2 );
continue;
}
if( DistanceSquared( current_target.origin, light.origin ) < 1500 * 1500 )
{
wait( 0.2 );
continue;
}
if( !IsDefined( current_target ) )
{
wait( 0.2 );
continue;
}
if( flag( "event2_flank_mg" ) && IsAlive( current_target ) )
{
num = RandomIntRange( 8, 16 );
for( i = 0; i < num; i++ )
{
if( !IsDefined( current_target ) )
{
break;
}
pos = current_target.origin +( -20 + RandomInt( 40 ), -20 + RandomInt( 40 ), -20 + RandomInt( 40 ) );
light RotateTo( VectorToAngles( pos - light.origin ), time, time * 0.25, time * 0.25 );
wait( time );
}
}
else
{
pos = current_target.origin +( -50 + RandomInt( 100 ), -50 + RandomInt( 100 ), -50 + RandomInt( 100 ) );
light RotateTo( VectorToAngles( pos - light.origin ), time, time * 0.25, time * 0.25 );
wait( time );
}
}
}
// Stops the spotlight movement if the AI dies
event2_spotter()
{
level endon( "event2_stop_spotlight" );
self.targetname = "event2_spotter";
self waittill( "death" );
level notify( "event2_stop_spotlight" );
}
event2_spot_light_damage( light )
{
light SetCanDamage( true );
for( ;; )
{
light waittill( "damage", dmg, attacker );
if( IsPlayer( attacker ) )
{
// Arcade points for the spotlight
maps\_utility::arcademode_assignpoints( "arcademode_score_generic250", attacker );
break;
}
}
light notify( "event2_stop_spotlight" );
dmg_model = Spawn( "script_model", light.origin );
dmg_model.angles = light.angles;
dmg_model SetModel( "lights_searchlight_guardtower_v2_off" );
// Sumeet - Added a flag for avoiding the "take out the spotlight" after it has been shot down
flag_set("spotlight_dead");
// Since the spotter cannot use the light, put back his sight range.
spotter = GetEnt( "event2_spotter", "targetname" );
if( IsDefined( spotter ) )
{
spotter.maxSightDistSqrd = 4096 * 4096;
}
if( !flag( "event2_beach_clear" ) && !flag( "event3_start" ) )
{
level.roebuck thread anim_single_solo( level.roebuck, "good_shooting" );
}
light Delete();
dmg_model PlaySound( "spotlight_break" );
// Sumeet - playing a bigger effect of explosion first
PlayFx( level._effect["spot_light_death"], dmg_model.origin );
for( i = 0; i < 5; i++ )
{
PlayFx( level._effect["radio_explode"], dmg_model.origin );
wait( 1 + RandomFloat( 3 ) );
}
}
// Relocates the spawn location of the enemy spawners in the path leading up to the feign scene.
event2_spawner_relocation()
{
spawners = GetEntArray( "event2_axis_spawners2", "targetname" );
for( i = 0; i < spawners.size; i++ )
{
struct = getstruct( spawners[i].script_noteworthy, "targetname" );
spawners[i].origin = struct.origin;
}
}
// spawn Function
event2_flood_spawner()
{
self endon( "death" );
nodes = GetNodeArray( "event2_mg_flank_nodes", "targetname" );
node = nodes[RandomInt( nodes.size )];
if( flag( "event2_flank_mg" ) )
{
wait( 0.1 );
self.goalradius = node.radius;
self SetGoalNode( node );
}
else
{
flag_wait( "event2_flank_mg" );
wait( 0.25 + RandomFloat( 1 ) );
if( !IsDefined( level.mg_flankers ) )
{
level.mg_flankers = 0;
}
level.mg_flankers++;
self.goalradius = node.radius;
self SetGoalNode( node );
}
}
event2_beach_dialogue()
{
battlechatter_on();
level.roebuck anim_single_solo( level.roebuck, "theyve_been_spotted" );
wait( 2 );
level.sullivan anim_single_solo( level.sullivan, "hold_tight" );
level.roebuck anim_single_solo( level.roebuck, "aint_eyeballed" );
level.sullivan anim_single_solo( level.sullivan, "mg_on_right" );
level.sullivan anim_single_solo( level.sullivan, "go" );
wait( 2 );
// Sumeet - Check if the spotlight is already dead
if( !flag( "spotlight_dead" ) )
level.roebuck anim_single_solo( level.roebuck, "take_out_spotlight" );
}
event2_beach_grenade( squad )
{
wait( 3 );
if( !flag( "event2_barrel_exploded" ) )
{
struct1 = GetStruct( "event2_grenade_spawn", "targetname" );
struct2 = GetStruct( "event2_grenade_target", "targetname" );
squad[0] MagicGrenade( struct1.origin, struct2.origin );
}
}
event2_boatsquad2_raft( guys )
{
boat = GetEnt( "event2_boatsquad2_raft", "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i] LinkTo( boat, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
}
boat thread anim_loop( guys, "loop", undefined, "exit_boat", boat );
v_node = GetVehicleNode( "event2_boatpath1", "targetname" );
boat AttachPath( v_node );
boat StartPath();
boat waittill( "reached_end_node" );
boat notify( "exit_boat" );
for( i = 0; i < guys.size; i++ )
{
guys[i] Unlink();
}
anim_single( guys, "exit", undefined, boat );
flag_set( "event2_boat_on_shore" );
}
event2_barrels()
{
barrels = GetEntArray( "event2_barrels", "script_noteworthy" );
for( i = 0; i < barrels.size; i++ )
{
level thread event2_barrel_explode( barrels[i] );
}
flag_wait( "event2_barrel_exploded" );
net = GetEnt( "event2_mg_net1", "targetname" );
tags = [];
tags[tags.size] = "flap06_1";
tags[tags.size] = "flap02_1";
tags[tags.size] = "flap04_1";
tags[tags.size] = "flap11_1";
fx = [];
fx[fx.size] = "fire_debris_small";
fx[fx.size] = "fire_debris_med";
for( i = 0; i < tags.size; i++ )
{
PlayFXOnTag( level._effect[fx[RandomInt( fx.size )]], net, tags[i] );
}
wait( 3 );
net StartTanning();
}
event2_barrel_explode( barrel )
{
barrel waittill( "exploding" );
flag_set( "event2_barrel_exploded" );
}
event2_spawn_event3_blockers()
{
wait( 0.1 );
// Make sure there are only 2 yellows, that way the blockers can be added to the yellow group
yellow = get_force_color_guys( "allies", "y" );
if( yellow.size > 2 )
{
for( i = 0; i < yellow.size; i++ )
{
if( yellow[i] == level.roebuck )
{
continue;
}
if( IsSubStr( yellow[i].name, "Lozano" ) )
{
continue;
}
yellow[i] bloody_death( RandomFloat( 1 ) );
wait( 1 );
}
}
wait( 0.1 );
yellow = get_force_color_guys( "allies", "y" );
assertex( yellow.size < 3, "Too many yellow-group guys (shouldn't see this)" );
spawners = GetEntArray( "event3_blocker_spawners", "targetname" );
spawn_guys( spawners );
}
// Spawner function
event3_blocker()
{
self.ignoreme = true;
self.dontavoidplayer = true;
self set_bullet_shield();
// Sumeet
self.ignoresuppression = 1;
self.grenadeawareness = 0;
flag_wait( "event3_unblock" );
// Sumeet
self.ignoresuppression = 0;
self.grenadeawareness = 1;
self.dontavoidplayer = false;
self stop_bullet_shield();
self set_force_color( "y" );
}
//--------//
// Event3 //
//--------//
event3_start_allies()
{
event2_start_allies();
spawners = GetEntArray( "event2_boatsquad1", "targetname" );
boatsquad1 = spawn_guys( spawners, "boatsquad1" );
for( i = 0; i < boatsquad1.size; i++ )
{
boatsquad1[i] set_force_color( "b" );
boatsquad1[i] thread replace_on_death();
boatsquad1[i] add_extra_starting_guy();
}
}
event3_feign_start()
{
battlechatter_off();
event1_remove_start_ents( true );
event3_start_allies();
set_start_position( "event3_feign_starts" );
wait( 2 );
level thread event3();
wait( 0.05 );
guys = GetEntArray( "event2_allies_group2", "targetname" );
exclude = array_combine( guys, level.heroes );
closest_ally = get_closest( level.sullivan.origin, "allies", "team", exclude, true );
closest_ally thread event3_goat_path( "event3_redshirt_start" );
level.roebuck thread event3_goat_path( "event3_roebuck_start" );
level.sullivan thread event3_goat_path( "event3_sullivan_start" );
flag_set( "event3_goat_stop1" );
flag_set( "event3_goat_stop2" );
}
event3()
{
autosave_by_name( "second_beach" );
set_objective( 2 );
//TUEY Sets the music for the Creek section
maps\mak_amb::change_music_state( "CREEK" );
red = get_force_color_guys( "allies", "r" );
yellow = get_force_color_guys( "allies", "y" );
green = get_force_color_guys( "allies", "g" );
blue = get_force_color_guys( "allies", "b" );
guys = array_combine( red, yellow );
guys = array_combine( guys, green );
guys = array_combine( guys, blue );
battlechatter_off();
// Sumeet set players speed down so that it wont be easy to move ahead of ambush guys
level thread player_speed_within_coords( 110, "x", -2558, -1581, "event3_player_ahead" );
level thread start_jog( guys, -2800, -1500, "event3_jog_path", 200 );
level thread event3_player_ahead();
level thread event3_dialogue();
level thread event3_feign_death_scene();
level thread event4();
}
event3_player_ahead()
{
flag_wait( "event3_player_ahead" );
flag_clear( "jog_enabled" );
}
event3_dialogue()
{
if( level.start_point == "event3_feign" )
{
return;
}
flag_wait( "event3_start" );
level thread event2_kill_off_remaining();
autosave_by_name( "end_of_2nd_beach" );
guys = GetEntArray( "event2_light_guys", "targetname" );
for( i = 0; i < guys.size; i++ )
{
if( IsDefined( guys[i] ) && IsAlive( guys[i] ) )
{
guys[i] thread bloody_death( RandomFloatRange( 0.5, 3 ) );
}
}
// Stop this if the player goes too far ahead.
level endon( "event3_player_ahead" );
//CHRIS_P - replaced all the anim_single_Solo calls with do_dialogue
level.sullivan do_dialogue("listen_up");
wait(0.5);
level.sullivan do_dialogue("quick_clean1");
wait( 0.5 );
level.sullivan do_dialogue("quick_clean2");
// Path to Feign
wait( 2 );
level.sullivan do_dialogue("stay_sharp");
wait( 1 );
}
event2_kill_off_remaining()
{
trigger = GetEnt( "event2_check_axis", "targetname" );
ai = GetAiArray( "axis" );
for( i = 0; i < ai.size; i++ )
{
if( ai[i] IsTouching( trigger ) )
{
ai[i] thread bloody_death( RandomFloatRange( 2, 5 ) );
}
}
}
event3_feign_death_scene()
{
// trigger = GetEnt( "event3_feign", "targetname" );
// trigger waittill( "trigger" );
flag_wait( "event3_goat_stop2" );
node = GetNode( "event3_feign_death_node", "targetname" );
spawners = GetEntArray( "event3_feign_guys", "targetname" );
axis = spawn_guys( spawners, "feign_enemy" );
officer = undefined;
for( i = 0; i < axis.size; i++ )
{
axis[i].activatecrosshair = false;
axis[i].ignoreme = true;
axis[i].ignoreall = true;
// Sumeet - added a dontgetup flag to stop guys getting up whom the player shot before feign went out.
axis[i].dontgetup = false;
level thread event3_feign_interrupted( axis[i] );
// Put the sword in the officer's hand.
if( axis[i].script_animname == "feign_officer" )
{
axis[i].targetname = "feign_officer";
axis[i] gun_remove();
axis[i] Attach( "weapon_jap_katana_long", "tag_weapon_right" );
officer = axis[i];
}
if( axis[i].animname != "feign_guy1" && axis[i].animname != "feign_guy4" )
{
axis[i] thread anim_loop_solo( axis[i], "feign", undefined, "stop_feign", node );
}
else
{
axis[i] thread anim_loop_solo( axis[i], "feign", undefined, "stop_feign" );
}
axis[i] thread maps\mak_anim::print_tag_pos( "tag_inhand", axis[i].animname );
}
// Sumeet - start the interrupt thread after the animations are setup
level thread event3_feign_interrupted_flare();
flag_wait( "event3_goat_stop3" );
autosave_by_name( "before_feign" );
trigger_color_trigger( 19 );
flag_set( "event3_player_ahead" );
//Sumeet - modified this so that the feign can be intterupted earlier.
flag_set( "feign_can_be_interrupted" );
//level thread anim_loop( axis, "feign", undefined, "stop_feign", node );
guys = GetEntArray( "event2_allies_group2", "targetname" );
exclude = array_combine( guys, level.heroes );
closest_ally = get_closest( node.origin, "allies", "team", exclude, true );
closest_ally.animname = "feign_redshirt";
closest_ally SetCanDamage( false );
allies[0] = level.sullivan;
allies[1] = level.roebuck;
allies[2] = closest_ally;
struct = SpawnStruct();
struct.count = 0;
struct.total = 3;
for( i = 0; i < allies.size; i++ )
{
allies[i] thread event3_anim_reach( node, struct );
}
flag_clear( "jog_enabled" );
level waittill( "event3_anim_reached" );
// Sumeet - if the feign is not interrupted then do normal animations.
if ( !flag("feign_interrupted") )
{
for( i = 0; i < allies.size; i++ )
{
allies[i] thread maps\mak_anim::enable_color_after_anim();
allies[i].goalradius = 384;
}
axis = array_remove( axis, officer );
officer notify( "stop_feign" );
closest_ally.animname = "feign_redshirt"; // Just incase the animname changes.
level thread event3_double_feign_anim( officer, node, true );
level thread event3_double_feign_anim( level.sullivan, node );
level thread event3_double_feign_anim( level.roebuck, node );
level thread event3_double_feign_anim( closest_ally, node, true );
}
else // Sumeet - feign is interrupted by the player, only play feign2 animations
{
level thread event3_single_feign2_anim( officer, node, true );
level thread event3_single_feign2_anim( level.sullivan, node );
level thread event3_single_feign2_anim( level.roebuck, node );
level thread event3_single_feign2_anim( closest_ally, node, true );
}
wait( 0.2 );
//flag_set( "feign_can_be_interrupted" );
}
event3_anim_reach( node, struct )
{
anim_reach_solo( self, "feign_in", undefined, node );
self anim_single_solo( self, "feign_in", undefined, node );
self.goalradius = 8;
self SetGoalPos( self.origin );
struct.count++;
if( struct.count == struct.total )
{
level notify( "event3_anim_reached" );
}
}
event3_double_feign_anim( guy, node, death_after_anim )
{
level thread event3_feign_interrupt_thread( guy );
guy thread anim_single_solo( guy, "feign_1", undefined, node );
guy waittill_either( "feign_interrupted", "feign_1" );
guy StopAnimScripted();
// Sumeet - give the ignore flag back
if ( !isdefined( death_after_anim ) )
guy.ignoreall = false;
guy thread anim_single_solo( guy, "feign_2", undefined, node );
if( guy.team == "axis" )
{
guy thread event3_stabber_death();
}
if( IsDefined( death_after_anim ) )
{
guy thread maps\mak_anim::death_after_anim( undefined, "ragdoll" );
}
}
// Sumeet - Seperate function for playing the feign2 animation only
// this is used when player interrupts the feign before AI
event3_single_feign2_anim( guy, node, death_after_anim )
{
guy anim_reach_solo( guy, "feign_2", undefined, node );
guy thread anim_single_solo( guy, "feign_2", undefined, node );
// set the ignoreall back and enable the color
guy.ignoreall = false;
guy.goalradius = 384;
guy enable_ai_color();
if( guy.team == "axis" )
{
guy thread event3_stabber_death();
}
if( IsDefined( death_after_anim ) )
{
guy thread maps\mak_anim::death_after_anim( undefined, "ragdoll" );
}
}
event3_stabber_death()
{
wait( 2 );
self endon( "end" );
self endon( "death" );
self thread event3_stabber_death_thread();
wait( 3 );
self notify( "finished_feign_ambush_anim" );
}
event3_stabber_death_thread()
{
self endon( "finished_feign_ambush_anim" );
self.health = 500;
count = 0;
for( ;; )
{
self waittill( "damage", dmg, attacker, dir, point, mod );
if( IsPlayer( attacker ) )
{
count += dmg;
if( count > 100 )
{
break;
}
}
self.health = 500;
}
self thread maps\mak_anim::ragdoll_after_anim();
self anim_stopanimscripted();
}
event3_feign_interrupt_thread( guy )
{
level endon( "stop_feign_interrupt" );
guy endon( "feign_1" );
level waittill( "feign_interrupted" );
guy notify( "feign_interrupted" );
}
event3_feign_interrupted_flare()
{
level endon( "stop_feign_interrupt" );
level waittill( "feign_interrupted" );
level thread maps\mak_anim::event3_flare();
}
event3_feign_interrupted( guy )
{
level endon( "stop_feign_interrupt" );
guy endon( "death" );
og_health = guy.health;
flag_wait( "feign_can_be_interrupted" );
// Do this while loop since we cannot waittill damage when a guy is doing a AnimScripted
while( IsAlive( guy ) && guy.health == og_health )
{
wait( 0.05 );
}
// Sumeet - this guy took damage
// check if this guy is not the officer, we need this guy for the animation.
if( guy.script_animname != "feign_officer" )
{
// Sumeet - Kill the guy if he takes damage after stopping the animation.
guy.dontgetup = true;
guy.skipDeathAnim = true;
guy stopanimscripted();
guy thread bloody_death();
}
level notify( "feign_interrupted" );
// Sumeet - added this so that if the feign is interrupeted eariler game would know.
flag_set("feign_interrupted");
}
event3_flare()
{
level thread event3_bloom();
level maps\_flare::flare_from_targetname( "flare1", 1, 2, 1, ( 0.83, 0.82, 1 ) );
wait( 5 );
level thread maps\_flare::flare_from_targetname( "flare2", 1, 2, 1, ( 0.83, 0.82, 1 ) );
}
event3_bloom()
{
flag_wait( "flare_start_setting_sundir" );
VisionSetNaked( "mak_flare", 0.3 );
if(NumRemoteClients())
{
blue = get_force_color_guys( "allies", "b" );
for( i = 0; i < blue.size; i++ )
{
blue[i] disable_replace_on_death();
}
level thread bloody_death_array( "allies", "b", 1, 3, true ); // Poor Blue Squad, they never stood a chance in coop.
}
//TUEY Sets the music for the AMBUSH section
maps\mak_amb::ambush_stuff();
wait( 0.2 );
VisionSetNaked( "mak", 2 );
}
//--------//
// Event4 //
//--------//
event4_start()
{
event1_remove_start_ents( true );
event4_start_allies();
set_start_position( "event4_starts" );
set_start_objective( 3 );
level thread event4();
wait( 0.1 );
trigger_color_trigger( 23 );
trigger = GetEnt( "event4", "targetname" );
trigger notify( "trigger" );
}
event4_start_allies()
{
event3_start_allies();
}
event4()
{
trigger = GetEnt( "event4", "targetname" );
trigger waittill( "trigger" );
level thread event4_bypass_initial_enemies();
event4_initial_enemies();
level notify( "event4_start" );
level anim_single_solo( level.sullivan, "compound_ahead" );
//TUEY SetMusicState back to Stealth for now TODO: Put the correct music in
setmusicstate( "POST_AMBUSH" );
if(numremoteclients())
{
// cap the AI count
SetAiLimit( 22 );
}
autosave_by_name( "truck" );
spawners = GetEntArray( "event4_initial_enemies", "targetname" );
maps\_spawner::flood_spawner_scripted( spawners );
level thread event4_truck_scene();
}
// Kills all remaining enemies in the beach area.
event4_bypass_initial_enemies()
{
level endon( "event4_start" );
trigger = GetEnt( "event4_cleanup_event3", "targetname" );
trigger waittill( "trigger" );
axis = GetAiArray( "axis" );
check_trigger = GetEnt( "event4_check_axis", "targetname" );
for( i = 0; i < axis.size; i++ )
{
if( axis[i] IsTouching( check_trigger ) )
{
axis[i] thread bloody_death( RandomFloat( 1 ) );
}
}
}
event4_initial_enemies()
{
check_trigger = GetEnt( "event4_check_axis", "targetname" );
trigger_waittill_dead( "axis", "team", check_trigger );
trigger_color_trigger( 23 );
}
event4_truck_scene()
{
level.sullivan disable_ai_color();
level.roebuck disable_ai_color();
truck = GetEnt( "event4_truck", "targetname" );
node = GetNode( "event4_driver_node", "targetname" );
level thread anim_reach_solo( level.roebuck, "undefined", undefined, node );
node = GetNode( "event4_tailgate_node", "targetname" );
level thread event4_truck_dialogue( node );
anim_reach_solo( level.sullivan, "open_tailgate", undefined, truck );
level thread event4_roebuck_truck();
flag_wait( "truck_dialogue_intro" );
setbusstate("TRUCK");
level thread event4_sullivan_truck( truck );
// level thread event4_truck_hint();
hint_model = Spawn( "script_model", truck.origin );
hint_model.angles = truck.angles;
hint_model SetModel( "static_type94_bed_door_obj" );
trigger = GetEnt( "event4_truck_trigger", "targetname" );
trigger trigger_on();
trigger waittill( "trigger", other );
hint_model Delete();
flag_set( "event4_truck_hint" );
trigger Delete();
// Animate the truck bed door opening
other thread event4_player_coop_truck_anim();
level thread event4_player_truck_anim( other, truck );
other waittill( "player_view_lerped" );
truck maps\mak_anim::play_vehicle_anim( "hatch_open" );
// TUEY
truck PlaySound( "truck_roll" );
level notify( "truck_rolling" );
flag_set( "event4_truck_go" );
flag_wait( "roebuck_in_truck" );
level thread event4_truck_go( truck );
//TUEY
setmusicstate("TRUCK_AMBUSH");
truck waittill( "smash_gate" );
}
// Sumeet - Added 3rd person animations for truck
event4_player_coop_truck_anim()
{
self SetStance( "stand" );
self freezecontrols(true);
self AllowProne ( false );
self Allowcrouch ( false );
self playeranimscriptevent( "mak_truck_hatch" );
self waittill("done");
self freezecontrols(false);
self AllowProne ( true );
self Allowcrouch ( true );
}
// Does the interactive hands animation on the player that hit the use trigger
event4_player_truck_anim( player, truck )
{
player endon( "disconnect" );
// TUEY
PlaySoundatposition( "tailgate_open", ( 0, 0, 0 ) );
PlaySoundatposition( "barrel_hit_knife", ( 0, 0, 0 ) );
// Sumeet - put the player into stand always when he is interacting with the truck
player SetStance( "stand" );
player freezecontrols(true);
player AllowProne ( false );
player Allowcrouch ( false );
player DisableWeapons();
player maps\mak_anim::play_viewhands( "event4_truck", truck, true, 0.5, 1, 20, 20, 15, 15, false );
// Sumeet- give the player stance control back
player EnableWeapons();
player freezecontrols(false);
player AllowProne ( true );
player Allowcrouch ( true );
}
// Displays the truck hint if the player does not hit the trigger within the given time
event4_truck_hint()
{
level endon( "event4_truck_go" );
wait( 6 );
level thread display_hint( "truck_hint" );
}
// This is called in between each "flash" of dsiplay_hint
// if the flag is set, then it will stop the flashing early.
event4_hint_check()
{
return flag( "event4_truck_hint" );
}
event4_sullivan_truck( truck )
{
level endon( "event4_truck_go" );
level.sullivan AllowedStances( "crouch" );
level.sullivan.a.pose = "crouch";
level.sullivan anim_reach_solo( level.sullivan, "open_tailgate", undefined, truck );
level.sullivan anim_single_solo( level.sullivan, "open_tailgate", undefined, truck );
level.sullivan SetGoalPos( level.sullivan.origin );
level endon( "event4_truck_hint" );
// Hurry up
array = [];
array[array.size] = "open_tailgate_hurry1";
array[array.size] = "open_tailgate_hurry2";
delay = 3;
for( ;; )
{
array = array_randomize( array );
for( i = 0; i < array.size; i++ )
{
if( flag( "event4_truck_hint" ) )
{
return;
}
wait( delay );
delay = 4 + RandomFloat( 3 );
level.sullivan anim_single_solo( level.sullivan, array[i], undefined, truck );
}
}
}
event4_roebuck_truck()
{
truck = GetEnt( "event4_truck", "targetname" );
tag = "tag_driver";
truck anim_reach_solo( level.roebuck, "truck_getin", tag, truck );
//truck thread anim_single_solo( truck, "getin" );
truck thread maps\mak_anim::play_vehicle_anim( "getin" );
truck anim_single_solo( level.roebuck, "truck_getin", tag, truck );
flag_set( "roebuck_in_truck" );
// TUEY
truck PlaySound( "truck_start" );
truck thread event4_truck_sounds();
level.roebuck LinkTo( truck, tag );
level.roebuck thread anim_loop_solo( level.roebuck, "truck_idle", tag, "jump_out_of_truck", truck );
truck waittill( "jump_out" );
level.roebuck notify( "jump_out_of_truck" );
// truck thread anim_single_solo( truck, "getout" );
truck thread maps\mak_anim::play_vehicle_anim( "getout" );
truck anim_single_solo( level.roebuck, "truck_getout1", tag, truck );
level.roebuck UnLink();
level.roebuck anim_single_solo( level.roebuck, "truck_getout2" );
// sumeet - setting roebuck into crouch state.
//level.roebuck allowedstances( "crouch" );
node = Getnode( "event4_roebuck_spot1", "targetname" );
level.roebuck.goalradius = 32;
level.roebuck SetGoalNode( node );
// waittill roebuck reaches the goal node and then let him stand, prone and crouch
//level.roebuck waittill( "goal" );
//level.roebuck AllowedStances( "stand", "crouch", "prone" );
}
// TUEY - function that handles the truck sounds
event4_truck_sounds()
{
wait( 2 );
truck_origin = Spawn( "script_origin", self.origin );
truck_origin PlayLoopSound( "truck_idle" );
level waittill( "truck_rolling" );
truck_origin StopLoopSound( 2 );
wait( 0.1 );
truck_origin Delete();
}
event4_truck_go( truck, using_start )
{
println( "truck.origin = ", truck.origin );
println( "truck.angles = ", truck.angles );
level thread maps\_vehicle::gopath( truck );
truck ent_flag_set( "started_on_path" );
spawners = GetEntArray( "event4_fallback_spawners1", "targetname" );
spawn_guys( spawners, undefined, true );
truck.animname = "event4_truck";
truck thread event4_smash_gate();
truck thread event4_truck_anims();
// wait( 1 );
level thread event4_fallback();
// truck waittill( "jump_out" );
// wait( 1 );
level thread event4_sullivan_light_fuel();
flag_wait( "event4_light_fuel" );
fire_ent = undefined;
// Start the fuel trail FX
if( !IsDefined( using_start ) || !using_start )
{
fire_ent = Spawn( "script_model", truck.fuel_trail[0] );
fire_ent SetModel( "tag_origin" );
PlayFXOnTag( level._effect["truck_fuel_spill_fire"], fire_ent, "tag_origin" );
wait( 1 );
// TUEY
fire_ent PlaySound( "flame_on" );
offset = ( 0, 0, 5 );
for( i = 1; i < truck.fuel_trail.size; i++ )
{
time = 0.2 + RandomFloat( 0.1 );
fire_ent MoveTo( truck.fuel_trail[i] + offset, time );
wait( time - 0.05 );
}
level thread event4_tower();
truck SetCanDamage( true );
RadiusDamage( truck.origin, 500, truck.health + 10, truck.health + 10 );
}
level thread event4_truck_barrels();
wait( 35 );
if( !IsDefined( using_start ) || !using_start )
{
if( IsDefined( fire_ent ) )
{
fire_ent Delete();
}
}
}
event4_truck_anims()
{
// self anim_single_solo( self, "drive_start" );
// self thread anim_loop_solo( self, "drive_loop", undefined, "stop_drive_loop" );
self maps\mak_anim::play_vehicle_anim( "drive_start" );
self thread maps\mak_anim::play_vehicle_animloop( "drive_loop", "stop_drive_loop" );
self waittill( "reached_end_node" );
self notify( "stop_drive_loop" );
}
// Animations for Sullivan lighting the fuel trail on fire
event4_sullivan_light_fuel()
{
level.sullivan anim_single_solo( level.sullivan, "light_the_match" );
level.sullivan thread anim_single_solo( level.sullivan, "event4_move_move" );
level.sullivan AllowedStances( "prone", "crouch", "stand" );
wait(2);
// Hudson sqaud will be landing there
level.sullivan anim_single_solo( level.sullivan, "c_squad" );
wait( 1 );
// Thats our extraction point.
level.sullivan anim_single_solo( level.sullivan, "thats_extraction_point" );
}
// Sends the barrels on the back of the truck flying
event4_truck_barrels()
{
barrels = GetEntArray( "event4_truck_barrels", "targetname" );
for( i = 0; i < barrels.size; i++ )
{
barrels[i] thread event4_throw_barrel();
wait( RandomFloatRange( 0.1, 0.5 ) );
}
}
// Actually tosses the barrel in the air
event4_throw_barrel()
{
time = 6;
self Unlink();
power = RandomIntRange( 1100, 1500 );
foward = AnglesToForward( ( RandomIntRange( 60, 80 ) * -1, RandomIntRange( 30, 120 ) * -1, 0 ) );
velocity = foward * power;
temp_model = Spawn( "script_model", self.origin );
temp_model SetModel( "tag_origin" );
temp_model LinkTo( self );
PlayFx( level._effect["barrel_explosion"], self.origin );
PlayFXOnTag( level._effect["barrel_trail"], temp_model, "tag_origin" );
self RotateVelocity( ( RandomIntRange( 400, 600 ), RandomIntRange( 800, 1200 ), 0 ), 12 );
self MoveGravity( velocity, time );
wait( time );
temp_model Delete();
self Delete();
}
event4_tower()
{
tower = GetEnt( "radio_tower1", "targetname" );
tower SetModel( "anim_makin_radiotower_dest" );
tower.animname = "event4_tower";
tower SetAnimTree();
tower anim_single_solo( tower, "intro" );
tower thread anim_loop_solo( tower, "loop", undefined, "stop_tower_loop" );
flag_wait( "event4_tower_collapse" );
wait( 3 );
// TUEY -- Play the sound, send a sound notify so the creaks stop.
tower PlaySound( "tower_collapse" );
level notify( "tower_collapse" );
exploder( 601 );
tower playsound("exp_barrel");
tower notify( "stop_tower_loop" );
tower anim_single_solo( tower, "outtro" );
}
event4_fallback()
{
flag_wait( "event4_fallback" );
// Kills the intial spawners around the gate and makes the AI to fallback
// script_fallback 400 and script_killspawner 400
trigger = GetEnt( "event4_fallback_trigger", "targetname" );
trigger notify( "trigger" );
// level thread event4_sullivan_dialog();
// spawn in the cyan squad
spawners = GetEntArray( "squad_c_spawner", "targetname" );
spawn_guys( spawners, undefined, true );
// Put the cyan guys in magic bullet shield since we need enough bodies to fill the 2nd boat
cyan_guys = get_force_color_guys( "allies", "c" );
for( i = 0; i < cyan_guys.size; i++ )
{
cyan_guys[i] set_bullet_shield();
}
trigger_color_trigger( 25 );
// Event 5 starts here
level thread event5();
}
event4_truck_dialogue( node )
{
//TUEY Set the music to post ambush
setmusicstate( "POST_AMBUSH" );
wait(3);
level.sullivan anim_single_solo( level.sullivan, "get_to_truck" );
// level.sullivan anim_single_solo( level.sullivan, "miller_knife_barrel" );
// wait( 3 );
// level.sullivan anim_single_solo( level.sullivan, "distract_enemies" );
flag_set( "truck_dialogue_intro" );
}
event4_smash_gate()
{
self waittill( "smash_gate" );
blocker = GetEnt( "event4_gate_blocker", "targetname" );
blocker Delete();
gate1 = GetEnt( "compound_gate1", "targetname" );
gate2 = GetEnt( "compound_gate2", "targetname" );
d_gate1 = GetEnt( "compound_destroyed_gate1", "targetname" );
d_gate2 = GetEnt( "compound_destroyed_gate2", "targetname" );
d_gate1 ConnectPaths();
d_gate2 ConnectPaths();
gate1_origin = gate1.origin;
gate1 Delete();
// TUEY
PlaySoundatposition( "imp_fence", gate1_origin );
gate2 Delete();
d_gate1 Show();
d_gate2 Show();
level thread maps\_anim::anim_ents_solo( d_gate1, "crash", undefined, undefined, d_gate1, "event4_gate1" );
level thread maps\_anim::anim_ents_solo( d_gate2, "crash", undefined, undefined, d_gate2, "event4_gate2" );
self waittill( "reached_end_node" );
self PlaySound( "truck_hit_tower" );
// Sumeet - truck hit the tower explosion effect, may need to move the effect a little up
PlayFXOnTag( level._effect["truck_tower_collision"], self, "tag_origin" );
tower = GetEnt( "radio_tower1", "targetname" );
tower PlaySound( "tower_explosion" );
setbusstate("RESET");
//kicks off a script that plays random metal creaks where the tower is located
tower thread maps\mak_amb::play_tower_creaks();
/*
println( "Event4 Truck final origin: " +( tower LocalToWorldCoords( tower.origin - self.origin ) - tower.origin ) );
println( "Event4 Truck final angles: " + VectorToAngles( AnglesToForward( tower.angles - self.angles ) ) );
*/
}
event4_fuel_trail()
{
self endon( "reached_end_node" );
self.fuel_trail = [];
barrel = GetEnt( "event4_truck_fuel_barrel", "script_noteworthy" );
spill_ent = Spawn( "script_model", barrel.origin + ( AnglesToUp( barrel.angles ) * 45 ) + ( 0, -3, -5 ) );
spill_ent SetModel( "tag_origin" );
spill_ent.angles = ( 0, self.angles[1] + 180, 0 );
PlayFXOnTag( level._effect["truck_fuel_spill"], spill_ent, "tag_origin" );
// spill_ent thread print_fuel_point();
spill_ent LinkTo( barrel );
self ent_flag_wait( "started_on_path" );
prev_pos = ( -10000, 0, 0 );
for( ;; )
{
next_pos = barrel.origin +( AnglesToUp( barrel.angles ) * 60 );
if( DistanceSquared( next_pos, prev_pos ) > 80 * 80 )
{
prev_pos = next_pos;
trace = BulletTrace( next_pos, next_pos +( 0, 0, -1000 ), false, undefined );
self.fuel_trail[self.fuel_trail.size] = trace["position"];
/#
// level thread draw_line_pos_to_pos( next_pos, trace["position"] );
#/
}
wait( 0.05 );
}
// spill_ent Delete();
}
print_fuel_point()
{
/#
self endon( "death" );
player = get_host();
while( 1 )
{
wait( 0.05 );
forward = self.origin + ( AnglesToForward( self.angles ) * 5 );
line( self.origin, forward );
line( self.origin, player.origin );
}
#/
}
event5_start()
{
event1_remove_start_ents( true );
wait( 0.1 );
trigger = GetEnt( "color_trigger24", "script_noteworthy" );
trigger Delete();
truck = GetEnt( "event4_truck", "targetname" );
level thread event4_truck_go( truck, true );
wait( 8 );
event5_start_allies();
trigger_color_trigger( 24 );
set_start_position( "event5_starts" );
set_start_objective( 3 );
wait( 1 );
trigger_color_trigger( 24 );
wait( 1 );
trigger_color_trigger( 25 );
}
event5_start_allies()
{
event4_start_allies();
}
event5()
{
level.player_seek_timer = 20;
event5_setup_respawner2();
respawner( "event6_respawner1", "targetname", 0.2, 1.5, 5 );
// Sumeet - guys on the top of the plant charge bunker will spawn first and then will stop
// spawning once the plant is charged so that the player doesnt get enguaged and his attention
// will be to the extraction point
respawner( "event6_respawner2", "targetname", 0.2, 0.5, 6 );
respawner( "event6_respawner3", "targetname", 0.2, 1.5, 10 );
node = GetNode( "event5_sullivan_spot1", "targetname" );
level.sullivan disable_ai_color();
level.sullivan anim_reach_solo( level.sullivan, "plant_charges", undefined, node );
// Sumeet - event 5 charge dialogue
level thread event4_sullivan_roebuck_dialog( node );
level.sullivan anim_single_solo( level.sullivan, "plant_charges", undefined, node );
level thread event5_clear_out_camp();
set_objective( 3 );
array = event5_split_up();
level thread event5_plant_charges( array["guys_charge1"], "event5_plant_charge1" );
level thread event5_plant_charges( array["guys_charge2"], "event5_plant_charge2" );
level thread event5_roebuck_charge( array["redshirt"] );
// Kill off the blue color group
bloody_death_array( "allies", "b", 3, 10 );
// Sumeet - Kills the spawners after player gets into this area, Wait for random time and stop spawning more guys
flag_wait( "event4_fallback" );
wait( randomintrange( 20, 40 ) );
level.respawner_controls["event6_respawner1"] notify( "stop_respawning" );
wait( randomintrange( 5, 10 ) );
level.respawner_controls["event6_respawner2"] notify( "stop_respawning" );
wait( randomintrange( 5, 10 ) );
level.respawner_controls["event6_respawner3"] notify( "stop_respawning" );
// Sumeet - waittill charges are set
flag_wait( "event5_charge_set" );
flag_wait( "event5_player_charge_set" );
// start spawning more guys again
respawner( "event6_respawner1", "targetname", 0.2, 0.3, 10 );
respawner( "event6_respawner3", "targetname", 0.1, 0.2, 10 );
}
event4_sullivan_roebuck_dialog( node )
{
if ( !flag( "event5_player_charge_set" ) )
level.sullivan anim_single_solo( level.sullivan, "plant_charges_now", undefined, node );
wait(1);
// Miller - back me up
level.roebuck anim_single_solo( level.roebuck, "miller_back_me_up" );
wait(0.5);
// Miller - on me
level.roebuck anim_single_solo( level.roebuck, "cmon_lets_go" );
// sumeet - Roebuck keeps calling player to give him cover until bunker door is not opened
while ( !flag("event5_bunker_door") )
{
// wait for approximately 15 secs before roebuck reminds the player to back him up
wait(randomintrange( 12,15 ));
// choose a random line to play
which_line = randomintrange( 1,4 );
// Play the big line only once in a while, so that it doesnt feel spamy
if ( which_line == 1 )
{
// Miller - I need you to cover me while I plant the charges
level.roebuck anim_single_solo( level.roebuck, "need_to_cover" );
}
else
{
// get back here
level.roebuck anim_single_solo( level.roebuck, "get_back_here" );
}
}
}
event5_clear_out_camp()
{
wait( 2 );
level.sullivan anim_single_solo( level.sullivan, "clear_out_camp" );
level.sullivan enable_ai_color();
}
// Sumeet - Spawners on the top of the bunker
event5_setup_respawner2()
{
spawners = GetEntArray( "event6_respawner2", "targetname" );
for( i = 0; i < spawners.size; i++ )
{
spawners[i].og_target = spawners[i].target;
if( IsDefined( spawners[i].script_string ) )
{
spawners[i].script_threatbiasgroup = "event5_bunker_axis";
spawners[i].target = spawners[i].script_string;
}
}
}
event5_reset_respawner2()
{
spawners = GetEntArray( "event6_respawner2", "targetname" );
for( i = 0; i < spawners.size; i++ )
{
spawners[i].script_threatbiasgroup = undefined;
spawners[i].target = spawners[i].og_target;
}
}
// Gets the nearby guys to split up and go plant charges in the compound
event5_split_up()
{
heroes = [];
heroes = level.heroes;
// Closest guys to charge1 ----------------------------------------------------
bomb_planter_group1 = [];
node = GetNode( "event5_plant_charge1", "targetname" );
guy = get_closest( node.origin, "allies", "team", heroes, true );
heroes[heroes.size] = guy;
bomb_planter_group1[bomb_planter_group1.size] = guy;
guy set_bullet_shield();
guy = get_closest( node.origin, "allies", "team", heroes, true );
heroes[heroes.size] = guy;
bomb_planter_group1[bomb_planter_group1.size] = guy;
guy set_bullet_shield();
// Closest guys to charge2 ----------------------------------------------------
bomb_planter_group2 = [];
node = GetNode( "event5_plant_charge1", "targetname" );
guy = get_closest( node.origin, "allies", "team", heroes, true );
heroes[heroes.size] = guy;
bomb_planter_group2[bomb_planter_group2.size] = guy;
guy set_bullet_shield();
guy = get_closest( node.origin, "allies", "team", heroes, true );
heroes[heroes.size] = guy;
bomb_planter_group2[bomb_planter_group2.size] = guy;
guy thread set_bullet_shield();
// Closest guy to Roebuck ----------------------------------------------------
guy = get_closest( level.roebuck.origin, "allies", "team", heroes, true );
redshirt = guy;
redshirt set_bullet_shield();
array = [];
array["guys_charge1"] = bomb_planter_group1;
array["guys_charge2"] = bomb_planter_group2;
array["redshirt"] = redshirt;
return array;
}
// Generic plant charge function for the other bomb planters
event5_plant_charges( guys, node_name )
{
node = GetNode( node_name, "targetname" );
for( i = 0; i < guys.size; i++ )
{
guys[i] disable_ai_color();
guys[i] thread maps\mak_anim::follow_path( node );
wait( RandomFloatRange( 0.5, 1.5 ) );
}
guys[0] waittill( "done_following_path" );
// Plant Charge
wait( 5 );
for( i = 0; i < guys.size; i++ )
{
if( IsDefined( guys[i] ) && IsAlive( guys[i] ) )
{
// guys[i] stop_bullet_shield();
guys[i] enable_ai_color();
}
}
}
event5_roebuck_charge( redshirt )
{
flag_set( "event5_plant_charge" );
level.roebuck disable_ai_color();
redshirt disable_ai_color();
// So I can do stuff to him later...
level.roebuck.redshirt_support = redshirt;
node = GetNode( "event5_roebuck_door_node", "targetname" );
level.roebuck thread event5_roebuck_charge_movment( node );
node = GetNode( "event5_redshirt_door_node", "targetname" );
redshirt thread event5_roebuck_charge_movment( node );
// roebuck is ready for the animation to enter the bunker
event5_bunker_door( redshirt );
// We dont want roebuck and redshirt to ignore anyone until both of them reach to the bunker node.
//level.roebuck.ignoreall = false;
level.roebuck.ignoreme = false;
//redshirt.ignoreall = false;
redshirt.ignoreme = false;
node = GetNode( "event5_redshirt_support_node", "targetname" );
redshirt SetGoalNode( node );
autosave_by_name( "plant_charge" );
level thread event6();
//player_plant = GetDvarInt( "player_plant_charge" );
player_plant = 1;
// Set the players and the allies planting charge to the higher priority threatbiasgroup
guys = get_players();
guys[guys.size] = redshirt;
guys[guys.size] = level.roebuck;
for( i = 0; i < guys.size; i++ )
{
guys[i] SetThreatBiasGroup( "event5_bunker_allies" );
}
level thread anim_single_solo( level.roebuck, "player_plant_charges" );
// Plant charge
node = GetNode( "event5_roebuck_charge_node", "targetname" );
anim_reach_solo( level.roebuck, "plant_charge_intro", undefined, node );
anim_single_solo( level.roebuck, "plant_charge_intro", undefined, node );
level thread event5_roebuck_plant_charge_timer();
level thread anim_loop_solo( level.roebuck, "plant_charge_loop", undefined, "event5_charge_set", node );
level thread event5_roebuck_charge_dialogue();
flag_wait( "event5_charge_set" );
flag_wait( "event5_player_charge_set" );
event5_roebuck_post_charge_dialogue();
set_objective( 4 );
guys = get_players();
guys[guys.size] = redshirt;
guys[guys.size] = level.sullivan;
for( i = 0; i < guys.size; i++ )
{
if( !IsDefined( guys[i] ) || !IsAlive( guys[i] ) )
{
continue;
}
if( IsPlayer( guys[i] ) )
{
guys[i] SetThreatBiasGroup( "players" );
}
else
{
guys[i] SetThreatBiasGroup( "allies" );
}
}
node = GetNode( "event6_redshirt_startnode", "targetname" );
redshirt thread follow_nodes( node );
wait( 3 );
anim_single_solo_animname( level.roebuck, "stay_with_me", undefined, undefined, undefined, "roebuck" );
wait( 2 );
anim_single_solo_animname( level.roebuck, "all_around_us", undefined, undefined, undefined, "roebuck" );
}
event5_roebuck_post_charge_dialogue()
{
level.roebuck anim_single_solo_animname( level.roebuck, "extraction_point", undefined, undefined, undefined, "roebuck" );
level.roebuck anim_single_solo_animname( level.roebuck, "jerry_rig_charges", undefined, undefined, undefined, "roebuck" );
wait( 3 );
level thread repeat_dialog( level.roebuck, "get_to_boats", 5, 3, 5, "outtro_start", "roebuck" );
}
event5_roebuck_charge_dialogue()
{
wait( 4.2 ); // Actualy length of sound for when roebuck starts to plant the charge
// "Damn!... Timer's fried... We may only get a few minutes before detonation."
level.roebuck animscripts\face::SaySpecificDialogue( undefined, "Mak1_IGD_208A_ROEB", 1.0, "dialogue_done" );
//level.roebuck waittill( "dialogue_done" );
//"The timer got fried in that last fire fight... We may only get a few minutes before detonation."
// level.roebuck animscripts\face::SaySpecificDialogue( undefined, "Mak1_IGD_210A_ROEB", 1.0 );
}
// Handles the movement for Roebuck and nearest redshirt to get near the bunker door.
// Ignored everything so they get into position quickly
event5_roebuck_charge_movment( node )
{
level endon( "event5_bunker_door" );
self.goalradius = 32;
self.ignoreme = true;
self follow_nodes( node );
// Sumeet - changed this so that roebuck starts following nodes but doesnt ignore
// the enemies around
self.ignoreme = false;
self.ignoreall = false;
}
// Roebuck and redshirt own a enemy trying to come out of the bunker door
event5_bunker_door( redshirt )
{
trigger = GetEnt( "event5_bunker_door_scene", "targetname" );
trigger waittill( "trigger" );
flag_set( "event5_bunker_door" );
redshirt.og_animname = redshirt.animname;
redshirt.animname = "bunkerdoor_redshirt";
guys = [];
guys[guys.size] = level.roebuck;
guys[guys.size] = redshirt;
door = GetEnt( "bunker_door", "targetname" );
anim_pos = spawnStruct();
anim_pos.origin = door.origin;
anim_pos.angles = ( 0, -90, 0 );
// TUEY
door PlaySound( "door_squeak_open" );
for( i = 0; i < guys.size; i++ )
{
guys[i].ignoreall = true;
guys[i].ignoreme = true;
}
anim_reach( guys, "bunkerdoor", undefined, anim_pos );
spawner = GetEnt( "event5_bunkerdoor_spawner", "targetname" );
guy = spawner stalingradspawn(); // Sumeet - force spawned the guy
// Sumeet - added a back up function if stalingrad fails
if ( !isdefined(guy) )
{
guy = event5_bunker_guy_spawn();
}
guy.animname = "bunkerdoor_japanese";
guys[guys.size] = guy;
guy gun_switchto( guy.sidearm, "right" );
//TUEY play's a scream on the guy
playsoundatposition( "door_guy_yell", guy.origin );
guy thread maps\mak_anim::death_after_anim( undefined, "no_deathanim" );
// guy thread print_notetracks( "single anim" );
// Sumeet - delete the player clip so that he can go near the door now.
// Avoids the player getting stuck into the door.
door_blocker = getent("bunker_door_clip", "targetname");
door_blocker ConnectPaths();
door_blocker delete();
// Connect the paths through door.
//door ConnectPaths();
level thread anim_ents_solo( door, "open", undefined, undefined, anim_pos, "event5_bunkerdoor" );
anim_single( guys, "bunkerdoor", undefined, anim_pos );
level notify( "bunkerdoor_done" );
// Incase we interupt the event5_roebuck_charge_movment(), we need to reset the things we ignore
for( i = 0; i < guys.size; i++ )
{
guys[i].ignoreme = false;
guys[i].ignoreall = false;
}
level.roebuck thread anim_single_solo( level.roebuck, "cover_door" );
if( IsDefined( redshirt ) && IsAlive( redshirt ) )
{
redshirt.animname = redshirt.og_animname;
}
//TUEY Set Music State to BOMB_IS_ARMING
setmusicstate( "BOMB_IS_ARMING" );
}
// Sumeet - Fix for the bunker guy not spawning in
event5_bunker_guy_spawn()
{
// get the closest player from roebuck
player = get_closest_player( level.roebuck.origin );
// get the farthest AI from the player
ai_axis = GetAiArray( "axis" );
guy = getFarthest( player.origin, ai_axis );
while ( !isdefined( guy ) || !isalive( guy ) )
{
guy = getFarthest( player.origin, ai_axis );
}
// clear the goalvolume if defined
if ( isdefined( guy.script_goalvolume ) )
guy.script_goalvolume = "";
// set his targetname
guy.targetname = "event5_bunkerdoor_guy";
// return the guy
return guy;
}
event5_drone_thread()
{
structs = GetStructArray( "event5_drone_wave1", "targetname" );
min_delay = 0.3;
max_delay = 0.7;
level.max_drones["axis"] = 20;
for( ;; )
{
structs = array_randomize( structs );
for( i = 0; i < structs.size; i++ )
{
while( level.drones["axis"].lastindex > level.max_drones["axis"] )
{
wait( 0.1 );
}
structs[i] thread maps\_drones::drone_spawngroup( structs[i].targeted, true, 3 + RandomInt( 2 ), false, "axis" );
wait( RandomFloatRange( min_delay, max_delay ) );
}
}
}
event5_roebuck_plant_charge_timer()
{
flag_set( "roebuck_event5_planting_charges" );
wait( 4 );
flag_set( "event5_charge_set" );
}
//event5_near_roebuck()
//{
// trigger = GetEnt( "event5_near_roebuck", "targetname" );
//
// talk_timer = 0;
//
// count_down = 10;
// delay = 1;
// for( q = count_down; q > 0; q-- )
// {
// while( 1 )
// {
// wait( 0.1 );
//
// touched = false;
// players = get_players();
// for( i = 0; i < players.size; i++ )
// {
// if( players[i] IsTouching( trigger ) )
// {
// touched = true;
// break;
// }
// }
//
// if( touched )
// {
// break;
// }
// else
// {
// if( GetTime() > talk_timer )
// {
// talk_timer = GetTime() + RandomIntRange( 3000, 5000 );
// iprintln( "ROEBUCK: Stay near me! I can't plant the charge otherwise!" );
// }
// }
// }
//
// wait( delay );
//
///#
// iprintln( "Count down = " + q );
//#/
// }
//
// // Ok, get out of there and leave
// flag_set( "event5_charge_set" );
//}
event5_start_respawner()
{
// wait( 2 );
// spawners = GetEntArray( "event5_bunker_rushers", "targetname" );
// spawn_guys( spawners, undefined, true );
// wait( 1 );
respawner( "event6_respawner2", "targetname", 0.2, 0.5, 15 );
// wait( 4 );
// spawner = GetEnt( "event6_mger", "targetname" );
// guy = spawn_guy( spawner );
// guy.ignoreme = true;
// guy.ignoreall = true;
// mg = GetEnt( "event6_lmg", "script_noteworthy" );
// mg SetTurretIgnoreGoals( true );
// level thread reman_mg_thread( mg, guy, -5000, "axis", "team" );
// level thread event6_mg_manned( mg );
// guy waittill( "goal" );
// guy.ignoreall = false;
}
//--------//
// EVENT6 //
//--------//
event6_outtro_start()
{
event1_remove_start_ents( true );
event6_start_allies();
trigger_color_trigger( 26 );
wait( 0.1 );
trigger = GetEnt( "color_trigger24", "script_noteworthy" );
trigger Delete();
truck = GetEnt( "event4_truck", "targetname" );
level thread event4_truck_go( truck, true );
flag_wait( "event4_light_fuel" );
wait( 5 );
set_start_position( "event6_outtro_starts" );
set_start_objective( 4 );
level.event6_boat1 = GetEnt( "event6_boat1", "targetname" );
level.event6_boat1.boaters = 0;
level.event6_boat1.enter_node = GetNode( "boat1_enter", "targetname" );
level.event6_boat2 = GetEnt( "event6_boat2", "targetname" );
level.event6_boat2.boaters = 0;
level.event6_boat2.enter_node = GetNode( "boat2_enter", "targetname" );
node = GetNode( "event6_sullivan_spot3", "targetname" );
level.sullivan SetGoalNode( node );
level.sullivan waittill( "goal" );
flag_set( "sullivan_outtro_ready" );
level.event6_boat1 = GetEnt( "event6_boat1", "targetname" );
level.event6_boat1.boaters = 0;
level.event6_boat1.enter_node = GetNode( "boat1_enter", "targetname" );
level.event6_boat1 thread event6_boat_ride();
level.event6_boat2 = GetEnt( "event6_boat2", "targetname" );
level.event6_boat2.boaters = 0;
level.event6_boat2.enter_node = GetNode( "boat2_enter", "targetname" );
level.event6_boat2 thread event6_boat_ride();
level thread event6_outtro();
}
event6_start_allies()
{
event5_start_allies();
}
event6()
{
level.event6_boat1 = GetEnt( "event6_boat1", "targetname" );
level.event6_boat1.boaters = 0;
level.event6_boat1.enter_node = GetNode( "boat1_enter", "targetname" );
level.event6_boat1 thread event6_boat_ride();
level.event6_boat2 = GetEnt( "event6_boat2", "targetname" );
level.event6_boat2.boaters = 0;
level.event6_boat2.enter_node = GetNode( "boat2_enter", "targetname" );
level.event6_boat2 thread event6_boat_ride();
level thread event5_sullivan_position();
level.roebuck thread event6_navigate( "event6_roebuck_startnode" );
flag_wait( "event5_player_charge_set" );
// Tuey
level thread maps\mak_amb::music_switch_delay( 3, "BOMB_IS_ARMED" );
// Have everyone move through the compound to the boats
level thread event6_exit_trigger_think();
// this moves the AI into positions that will surround the player when he
// is trying to escape
trigger_color_trigger( 26 );
level thread event6_outtro();
}
event5_sullivan_position()
{
// Get Sullivan in position
node = GetNode( "event6_sullivan_spot2", "targetname" );
level.sullivan disable_ai_color();
level.sullivan.goalradius = 64;
level.sullivan SetGoalNode( node );
}
event6_reset_ignoreme()
{
self endon( "death" );
self endon( "player_seeking" );
if( RandomInt( 100 ) > 30 )
{
self.ignoreme = true;
self.goalradius = 128;
self waittill( "reached_path_end" );
self.ignoreme = false;
}
else
{
self.ignoreme = true;
wait( 4 );
self.ignoreme = false;
}
}
event6_exit_trigger_think()
{
boaters = level.heroes;
if( IsDefined( level.roebuck.redshirt_support ) && IsAlive( level.roebuck.redshirt_support ) )
{
boaters[boaters.size] = level.roebuck.redshirt_support;
}
// trigger = GetEnt( "event6_start_trigger", "targetname" );
trigger = GetEnt( "event6_exit2", "script_noteworthy" );
while( 1 )
{
trigger waittill( "trigger", other );
if( IsDefined( trigger.script_noteworthy ) )
{
flag_set( trigger.script_noteworthy );
if( trigger.script_noteworthy == "event6_exit2" )
{
// Sumeet - we dont need this anymore.
//event5_reset_respawner2(); // Resets the spawners initial node
level.roebuck.redshirt_support stop_bullet_shield();
level thread event6_sullivan_to_boats();
maps\_colors::kill_color_replacements();
respawner( "event6_hill_respawners", "targetname", 0.2, 1.5, 5 );
trigger_color_trigger( 27 );
}
else if( trigger.script_noteworthy == "event6_exit3" )
{
flag_set( "event4_tower_collapse" );
}
}
if( !IsDefined( trigger.target ) )
{
break;
}
trigger = GetEnt( trigger.target, "targetname" );
}
}
event6_mg_manned( mg )
{
mg waittill( "manned" );
iprintln( "LMG!!! GET THE HELL OUTTA HERE!!!" );
}
event6_sullivan_to_boats()
{
level.sullivan anim_single_solo( level.sullivan, "get_to_boats", undefined, level.sullivan.node );
level.sullivan.ignoreall = true;
node = GetNode( "event6_sullivan_spot3", "targetname" );
// level.sullivan SetGoalNode( node );
level.sullivan thread anim_single_solo( level.sullivan, "get_to_boats_b" );
level.sullivan thread anim_reach_solo( level.sullivan, "undefined", undefined, node );
level thread repeat_dialog( level.sullivan, "get_to_boats", 7, 3, 5, "outtro_start" );
level.sullivan.grenadeawareness = 0;
level.sullivan.ignoreme = true;
level.sullivan waittill( "anim_reach_complete" );
level.sullivan.ignoreall = false;
flag_set( "sullivan_outtro_ready" );
}
// Roebuck going to the boat
event6_navigate( t_name )
{
self set_bullet_shield();
// Sumeet - roebuck should ignore suppression and grenades so that he makes it to the boats afap
self.ignoresuppression = 1;
self.grenadeawareness = 0;
//node = GetNode( t_name, "targetname" );
//self follow_nodes( node );
flag_wait( "event5_charge_set" );
// Sumeet - roebuck charge outro dialogue
node = GetNode( "event5_roebuck_charge_node", "targetname" );
anim_single_solo( level.roebuck, "plant_charge_outro", undefined, node );
node = GetNode( "event5_roebuck_support_node", "targetname" );
level.roebuck SetGoalNode( node );
level anim_single_solo( level.roebuck, "plant_charge_outro2" );
flag_wait( "event5_player_charge_set" );
self thread event6_get_to_boat();
// Sumeet - waittill sullivan is doing his boat in animation
flag_wait( "roebuck_dialogue_cmon_time" );
// roebuck - come on, come on
level.roebuck do_dialogue( "cmon" );
wait(2.7);
// roebuck - you're gonna be okay, just hang in there
level.roebuck do_dialogue( "you_are_gonna_be_ok" );
}
event6_get_to_boat()
{
self set_bullet_shield();
if( IsDefined( self.assigned_to_boat ) )
{
println( "Already assigned to boat" );
return;
}
// We can use this to determine if a guy is going to get into the boat or not.
self.assigned_to_boat = true;
boat = undefined;
is_sullivan = false;
// Pick a boat to get to
if( IsDefined( self.script_noteworthy ) )
{
if( self == level.roebuck )
{
boat = level.event6_boat1;
}
else if( self == level.sullivan )
{
is_sullivan = true;
boat = level.event6_boat1;
}
else if( self == level.sniper )
{
boat = level.event6_boat2;
}
}
if( !IsDefined( boat ) )
{
// Sumeet - only assign the boat 2 if there are less than four boaters.
// This should avoid the more than four guys getting into the boat.
boat = level.event6_boat2;
}
boat.boaters++;
node = boat.enter_node;
if( boat.boaters > 4 )
{
/#
println( "Too many boaters, aborting..." );
#/
return;
}
// Get to the boat
self.ignoreall = true;
self SetCanDamage( false );
self.goalradius = 64;
self.ignoresuppression = 1;
self.grenadeawareness = 0;
self disable_arrivals( true, true );
if( !is_sullivan )
{
self.animname = "boat_guy1";
}
anim_reach_solo( self, "undefined", undefined, node );
// Animation assignment
if( !IsDefined( boat.rider_count ) )
{
boat.rider_count = 0;
}
boat.rider_count++;
if( !is_sullivan )
{
self.animname = "boat_guy" + boat.rider_count;
}
anim_reach_solo( self, "boat_getin", undefined, boat );
// Sumeet - set a flag so that roebuck can start his dialogue thread
if ( self == level.sullivan )
flag_set( "roebuck_dialogue_cmon_time" ); // Only used for dialogues
// Sumeet - For sullivan, there will be one single animation for getting
// into the boat and through out the outtro
if ( self == level.sullivan )
self thread event6_get_to_boat_sullivan(boat);
else
anim_single_solo( self, "boat_getin", undefined, boat );
// Sumeet - Added roebuck in boat check
if( self == level.roebuck )
{
flag_set("roebuck_in_boat");
}
// Animated onto boat count
if( !IsDefined( boat.rider_on_count ) )
{
boat.rider_on_count = 0;
}
boat.rider_on_count++;
// Loop on the boat
self LinkTo( boat, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
if ( self != level.sullivan )
level thread anim_loop_solo( self, "boat_underfire", undefined, "stop_boat_underfire", boat );
if( boat == level.event6_boat1 )
{
// Sumeet- sullivan is reached the boat, wait till roebuck makes it to the boat.
if( is_sullivan )
{
flag_wait("sullivan_boat_in"); // sullivan in the boat
flag_wait("roebuck_in_boat"); // now that sullivan is in the boat, Wait for roebuck to be in the boat.
flag_set( "event6_boat1_ready" );
}
}
else
{
if( boat.rider_on_count == 4 )
{
flag_set( "event6_boat2_ready" );
}
flag_wait( "event6_boat2_ready" );
}
flag_wait( "event6_boat1_ready" );
self notify( "on_boat" );
// Sumeet - Dont play the normal reaction and boat calm animations on sullivan and Roebuck
if ( self == level.roebuck )
{
// here is where roebuck will play their special animation
self thread event6_get_to_boat_roebuck(boat);
}
else if ( self != level.sullivan )
{
// these animations are for redshirts
level waittill( "stop_boat_underfire" );
anim_single_solo( self, "boat_reaction", undefined, boat );
level thread anim_loop_solo( self, "boat_calm", undefined, "never", boat );
}
}
// Sumeet - play different set of animations on sullivan and Roebuck
event6_get_to_boat_roebuck(boat)
{
self.animname = "roebuck";
anim_single_solo( self, "outtro_end", undefined, boat );
}
event6_get_to_boat_sullivan(boat)
{
// There is one complete animation from the moment sullivan starts putting the player into
// the boat and throughout the outtro.
self.animname = "sullivan";
anim_single_solo( self, "boat_getin", undefined, boat );
}
event6_outtro()
{
players = get_players();
// Sumeet - We dont need this anymore as we play the same animation on the players at the same time.
if( players.size > 1 )
{
flag_wait( "sullivan_outtro_ready" ); // Testing: We want Sullivan in position only if a coop game, if SP just animate him
}
trigger = GetEnt( "event6_ambush", "targetname" );
trigger waittill( "trigger");
level.enable_cover_warning = false;
//TUEY Sets the buses and music state up for the attack...
setbusstate("ATTACKED");
setmusicstate("ATTACKED");
playsoundatposition("rocket_dirt_scripted", (0,0,0));
playsoundatposition("dew", (0,0,0));
playsoundatposition("player_scream_cool", (0,0,0));
playsoundatposition("Mak1_OUT_300a_SULL", (0,0,0));
level notify( "outtro_start" );
level.sniper thread event6_get_to_boat();
level thread event6_get_ai_on_boats();
spawner = GetEnt( "outtro_spawner", "targetname" );
guy = spawner stalingradspawn(); // Sumeet - force spawned the guy
// Sumeet - added a backup if stalingradspawn fails
if ( !isdefined( guy ) )
{
guy = event5_outtro_guy_spawn();
}
guy.animname = "outtro_enemy";
guy.targetname = "outtro_enemy_ai";
guy gun_remove();
guy Attach( "weapon_jap_katana_long", "tag_weapon_right" );
// Sumeet - outtro effetcs for the players.
level thread event6_outtro_effects();
level thread event6_stop_laststand();
level thread event6_guys_to_boats();
players = get_players();
for( i = 0; i < players.size; i++ )
{
player = players[i];
level.players_part1_done = 0;
player thread event6_outtro_player(player );
}
level waittill( "part1_done" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
player = players[i];
player thread event6_outtro_player_part2(player, i);
}
}
event6_outtro_player( player )
{
player EnableInvulnerability();
player Hide();
// Sumeet - If the player is in last stand then revive him
if ( player maps\_laststand::player_is_in_laststand() )
{
player RevivePlayer();
}
player StartCameraTween( 0.5 );
node = GetNode( "event6_ambush_node", "targetname" );
event6_player_outtro( player, node );
player StartCameraTween( 0.5 );
setsaveddvar( "ai_friendlySuppression", "0" );
level.players_part1_done++;
if( level.players_part1_done == get_players().size )
level notify( "part1_done" );
}
event6_outtro_player_part2( player, i )
{
level.sullivan.ignoreSuppression = true;
player PlayerLinkTo( level.sullivan, "tag_sync", 0, 30, 30, 30, 30, true );
level thread maps\mak_amb::play_dragging_sound();
level thread maps\mak_amb::play_shock_loop_manual();
flag_wait( "sullivan_at_boat" );
level notify("IN_BOAT");
player StartCameraTween( 0.5 );
player Unlink();
player thread maps\mak_anim::play_viewhands( "outtro2", level.event6_boat1, true, 1, 1, 15, 15, 10, 10, false, undefined );
player waittill( "player_view_lerped" );
if( i == 0 )
level.sullivan thread event6_get_to_boat();
player waittill( "outtro2_viewhands_anim_done" );
player StartCameraTween( 0.6 );
player PlayerLinkTo( level.event6_boat1 );
// Sumeet - only allow player to
player SetStance( "crouch" );
player AllowProne( false);
player AllowCrouch( true);
player AllowStand( false);
if( i == 0 )
flag_set("player_in_boat");
setsaveddvar( "ai_friendlySuppression", "1" );
if(numremoteclients())
{
// un cap the AI count
ResetAILimit();
}
}
event6_outtro_effects()
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] thread event6_outtro_effects_internal();
players[i] thread event6_outtro_sounds();
}
}
event6_outtro_effects_internal()
{
// Sumeet - Spawn a magic greanade and shellshock the player for smooth transition into the animation
// play shellshock explosion
playfx(level._effect["rocket_explode"], ( 3088, -15120, 88.9 ) );
playsoundatposition ("rocket_dirt_scripted", (0,0,0));
PlayRumbleOnPosition( "explosion_generic", self.origin );
self StopShellShock();
wait(0.05);
self shellshock( "explosion_mak", randomfloatrange(2,3) );
}
event6_outtro_sounds()
{
while( !( flag("player_in_boat") ) )
{
self playsound("breathing_hurt");
wait(1);
self playsound("breathing_heartbeat");
}
for( i=0;i<5;i++ )
{
self playsound("breathing_better");
wait(1);
}
}
// Sumeet - Fix for the bunker guy not spawning in
event5_outtro_guy_spawn()
{
// get the closest player from roebuck
player = get_closest_player( level.sullivan.origin );
// get the farthest AI from the player
ai_axis = GetAiArray( "axis" );
guy = getFarthest( player.origin, ai_axis );
while ( !isdefined( guy ) || !isalive( guy ) )
{
guy = getFarthest( player.origin, ai_axis );
}
// clear the goalvolume if defined
if ( isdefined( guy.script_goalvolume ) )
guy.script_goalvolume = "";
// set his targetname
guy.targetname = "outtro_spawner";
// return the guy
return guy;
}
// Sumeet - Putting other players in spectate mode.
// In this case from arcade point of view
event6_outtro_playerspectate_think( player )
{
// only do this if this is co-op mode
players = get_players();
if( players.size > 1 )
{
for( i = 0; i < players.size; i++ )
{
players[i] thread event6_outtro_player_warp( player );
}
}
}
// Sumeet - We will still need 3rd person animations to be hooked up as a player who is
// left behind can see the guys
event6_outtro_player_warp(player)
{
// end this thread if the player is disconnected or dead
self endon("disconnect");
self endon("death");
if ( isdefined ( self ) && isalive( self ) )
{
if( self != player )
{
self hide();
self notify( "stop damage hud" );
self disableWeapons();
self freezecontrols(true);
// This will make sure that if someone is in last stand then also he wont die.
self EnableInvulnerability();
// put the player in spectator mode of the client who hit the trigger.
level.otherPlayersSpectate = true;
level.otherPlayersSpectateClient = player;
self thread maps\_callbackglobal::spawnSpectator();
}
}
}
event6_stop_laststand()
{
level.no_laststandmissionfail = false;
level.playerlaststand_func = ::event6_no_death_last_stand;
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( players[i] maps\_laststand::player_is_in_laststand() )
{
players[i] event6_no_death_last_stand();
}
}
}
event6_no_death_last_stand()
{
self thread event6_no_death_last_stand_internal();
}
event6_no_death_last_stand_internal()
{
self SetCanDamage( false );
self.bleedout_time = 999999;
}
event6_get_ai_on_boats()
{
excluders = [];
excluders[excluders.size] = level.sullivan;
excluders[excluders.size] = level.roebuck;
excluders[excluders.size] = level.sniper;
for( i = 0; i < 5; i++ )
{
wait( 1 );
guy = get_closest( level.event6_boat2.origin, "allies", "team", excluders, true );
if( !IsDefined( guy ) )
{
continue;
}
excluders[excluders.size] = guy;
guy thread event6_get_to_boat();
}
}
event6_outtro_enemy()
{
guy = GetEnt( "outtro_enemy_ai", "targetname" );
node = GetNode( "event6_ambush_node", "targetname" );
level thread anim_single_solo( guy, "ambush", undefined, node );
guy thread maps\mak_anim::death_after_anim( undefined, "ragdoll", "start_ragdoll" );
}
event6_player_outtro( player, node )
{
player endon( "disconnect" );
player DisableWeapons();
level thread event6_outtro_enemy();
player maps\mak_anim::play_viewhands( "outtro", node, true, 1, 1, 25, 25, 20, 20, false, undefined );
level thread event6_enemy_nodes();
// Give the player only the pistol
weapons = player GetWeaponsList();
pistol = undefined;
clip = undefined;
ammo = undefined;
for( i = 0; i < weapons.size; i++ )
{
if( WeaponClass( weapons[i] ) == "pistol" )
{
pistol = weapons[i];
clip = player GetWeaponAmmoClip( pistol );
ammo = player GetWeaponAmmoStock( pistol );
}
}
if( !IsDefined( pistol ) )
{
pistol = level.laststandpistol;
clip = RandomIntRange( 4, 7 );
ammo = RandomIntRange( 16, 25 );
}
if( ammo < 16 )
{
ammo = RandomIntRange( 16, 25 );
}
player TakeAllWeapons();
player GiveWeapon( pistol );
player SetWeaponAmmoClip( pistol, clip );
player SetWeaponAmmoStock( pistol, 16 );
player SwitchToWeapon( pistol );
player EnableWeapons();
}
event6_guys_to_boats()
{
cyan_guys = [];
yellow_guys = [];
blue_guys = [];
cyan_guys = get_force_color_guys( "allies", "c" );
yellow_guys = get_force_color_guys( "allies", "y" );
blue_guys = get_force_color_guys( "allies", "b" );
guys = array_combine( cyan_guys, yellow_guys );
guys = array_combine( guys, blue_guys );
origin = level.event6_boat2.origin; // Near the LMG
guys = get_array_of_closest( origin, guys );
for( i = 0; i < guys.size; i++ )
{
if( !IsDefined( guys[i] ) || !IsAlive( guys[i] ) )
{
continue;
}
wait( 0.5 );
guys[i] thread event6_get_to_boat();
}
}
// this function spawns guys that will be facing the player in outtro area
event6_enemy_nodes()
{
nodes = GetNodeArray( "outtro_enemy_nodes", "targetname" );
// Sumeet - Now using the event6_spawner3 instead of event6_spawner3
spawners = GetEntArray( "event6_respawner3", "targetname" );
// Set the spawners to target the nodes
for( i = 0; i < spawners.size; i++ )
{
spawners[i].target = "outtro_enemy_nodes";
}
// Send the AI to the nodes
ai = GetAiArray( "axis" );
for( i = 0; i < nodes.size; i++ )
{
if( IsDefined( ai[i] ) )
{
ai[i].goalradius = 64;
ai[i] SetGoalNode( nodes[i] );
}
}
}
event6_boat_ride( delay )
{
if( self == level.event6_boat1 )
{
//CHRIS_P
//play the idle sound before the boat leaves
self playloopsound("boat_idle");
flag_wait( "event6_boat1_ready" );
// playloopsound("boat_run_scripted"); //force the 2d loop to play for the end...
spawners = GetEntArray( "event6_last_enemies", "targetname" );
spawn_guys( spawners, "event6_last_ai" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] StartCameraTween( 0.6 );
}
setbusstate("ENDING");
self StartPath();
self stoploopsound();
// Sumeet - added some spawners in the hut, may be we can blow them up - Ask Corcky
hut_trig = getent("event6_las_enemies_hut_trig", "targetname");
hut_trig notify("trigger");
level.event6_boat1 waittill( "blow_up" );
level notify( "stop_boat_underfire" );
level event6_blow_up_compound();
//define this so that nextmission can clean up the client hud elems
level.nextmission_cleanup = ::clean_up_fadeout_hud;
players = get_players();
for(i=0;i<players.size;i++)
{
players[i] thread hud_fade_to_black(5);
players[i] thread outtro_hide_hud();
}
// wait for 7.5 sec and then call nextmission
//TUEY Set the bus state to Level Out so we fade properly.
setbusstate("LEVEL_OUT");
wait( 7.5 );
nextmission();
}
else
{
//CHRIS_P
//play the idle sound before the boat leaves
self playloopsound("boat_idle");
flag_wait( "event6_boat2_ready" );
if( !flag( "event6_boat1_ready" ) )
{
flag_wait( "event6_boat1_ready" );
wait( 1.5 );
}
self StartPath();
setbusstate("ENDING");
self stoploopsound();
//playloopsound("boat_run_scripted"); //force the 2d loop to play for the end...
}
}
// Sumeet - Hide the hud while in outtro
outtro_hide_hud()
{
self SetClientDvar( "hud_showStance", "0" );
self SetClientDvar( "compass", "0" );
self SetClientDvar( "ammoCounterHide", "1" );
self setclientdvar("miniscoreboardhide","1");
}
// Sumeet - Fadeout hud
hud_fade_to_black(time)
{
self endon("death");
self endon("disconnect");
if(!isDefined(time))
{
time = 1;
}
if(!isDefined(self.warpblack))
{
self.warpblack = NewClientHudElem( self );
self.warpblack.x = 0;
self.warpblack.y = 0;
self.warpblack.horzAlign = "fullscreen";
self.warpblack.vertAlign = "fullscreen";
self.warpblack.foreground = false;
self.warpblack.sort = 50;
self.warpblack.alpha = 0;
self.warpblack SetShader( "black", 640, 480 );
}
self.warpblack FadeOverTime( time );
self.warpblack.alpha = 1;
}
// Sumeet - Fadeout hudhud cleanup method
clean_up_fadeout_hud()
{
players = get_players();
for(i=0;i<players.size;i++)
{
if(isDefined(players[i].warpblack))
{
players[i].warpblack Destroy();
}
}
}
event6_blow_up_compound()
{
// Sumeet - took this call out so that we have enemies to shoot at while in boat.
//bloody_death_array( "event6_last_ai", "targetname", 0.2, 1 );
exploder( 605 );
//TUEY BLOWS UP
playsoundatposition ("exp_hut_1_end",(3928, -13647, 273));
wait( 1 );
exploder( 609 );
playsoundatposition ("exp_hut_2_end",(3313, -12838, 529));
level thread play_explosion_death_anim( ( 3606.4, -15165.5, 157.1 ), ( 0, 318.75, 0 ) );
level thread play_explosion_death_anim( ( 3606.4, -15165.5, 157.1 ), ( 0, 270, 0 ) );
level thread play_explosion_death_anim( ( 3606.4, -15165.5, 157.1 ), ( 0 ,3.75, 0 ) );
wait( 2 );
exploder( 617 );
playsoundatposition ("exp_hut_3_end",(3928, -13647, 273));
wait( 4 );
}
//-----------------//
// UTILITY SECTION //
//-----------------//
anim_single_solo_animname( guy, anime, tag, node, tag_entity, animname_override )
{
self endon( "death" );
newguy[ 0 ] = guy;
anim_single( newguy, anime, tag, node, tag_entity, animname_override );
}
get_closest( origin, value, key, exclude, check_if_alive )
{
dist = 99999 * 99999;
if( !IsDefined( check_if_alive ) )
{
check_if_alive = false;
}
// Get all of the axis we care about.
if( key == "team" )
{
if( value == "both" || value == "" )
{
array = GetAiArray();
}
else
{
array = GetAiArray( value );
}
}
else
{
array = GetEntArray( value, key );
}
if( array.size < 1 )
{
return;
}
if( IsDefined( exclude ) )
{
new_array = [];
for( i = 0; i < array.size; i++ )
{
do_exclude = false;
for( q = 0; q < exclude.size; q++ )
{
if( array[i] == exclude[q] )
{
do_exclude = true;
}
}
if( !do_exclude )
{
new_array[new_array.size] = array[i];
}
}
array = new_array;
}
ent = undefined;
for( i = 0;i < array.size;i ++ )
{
if( check_if_alive && !Isalive( array[ i ] ) )
{
continue;
}
newdist = DistanceSquared( array[ i ].origin, origin );
if( newdist >= dist )
{
continue;
}
dist = newdist;
ent = array[i];
}
return ent;
}
// Randomly say a line according the given parameters
repeat_dialog_along_vec( array, vec, dist, min_time, max_time, level_endon )
{
level notify( "stop_repeat_dialog" );
level endon( "stop_repeat_dialog" );
self endon( "death" );
if( IsDefined( level_endon ) )
{
level endon( level_endon );
}
by_pass_wait = false;
while( 1 )
{
array = array_randomize( array );
for( i = 0; i < array.size; i++ )
{
if( by_pass_wait )
{
wait( 1 );
}
else
{
wait( min_time + RandomFloat( max_time ) );
}
// Get Furthest Player
players = get_players();
furthest = -999999;
furthest_player = players[0];
for( q = 0; q < players.size; q++ )
{
dot = VectorDot( players[q].origin, AnglesToForward( vec ) );
if( dot > furthest )
{
furthest = dot;
furthest_player = players[q];
}
}
diff = self.origin - furthest_player.origin;
dot = VectorDot( diff, AnglesToForward( vec ) );
if( dot < dist )
{
by_pass_wait = true;
i--;
println( "^1 (" + self.name + ") FAILED TO REMIND PLAYER AS THE PLAYER IS TOO CLOSE" );
continue;
}
if( self._animActive > 0 )
{
by_pass_wait = true;
i--;
println( "^1 (" + self.name + ") FAILED TO REMIND PLAYER AS I AM PLAYING A ANIMATION" );
continue;
}
by_pass_wait = false;
self PlaySound( level.scr_sound[self.animname][array[i]] );
}
}
}
// spawn function
balcony_death()
{
self.animname = "generic";
self.balcony_guy = true;
self disable_long_death();
node = GetNode( self.target, "targetname" );
dmg_total = 0;
self.health = 1000;
self.targetname = "event2_light_guys";
while( 1 )
{
self waittill( "damage", dmg );
if( flag( "event3_start" ) )
{
return;
}
self.health = 1000;
dmg_total += dmg;
if( dmg_total > 150 )
{
self playsound ("japanese_yell_delay");
self thread anim_single_solo( self, "balcony_death", undefined, node );
self thread maps\mak_anim::death_after_anim( undefined, "ragdoll", "start_ragdoll" );
return;
}
}
}
// spawn function
spawn_to_die()
{
wait( 0.1 );
self DoDamage( self.health + 10, self.origin );
}
// Waits until all AI with the given value/key are dead before exiting
trigger_waittill_dead( value, key, trigger, flag_name )
{
for( ;; )
{
wait( 0.2 );
touching = false;
// Get all of the axis we care about.
if( key == "team" )
{
guys = GetAiArray( value );
}
else
{
guys = GetEntArray( value, key );
}
for( i = 0; i < guys.size; i++ )
{
if( IsDefined( guys[i] ) && IsAlive( guys[i] ) && guys[i] IsTouching( trigger ) )
{
touching = true;
break;
}
}
if( !touching )
{
break;
}
}
if( IsDefined( flag_name ) )
{
flag_set( flag_name );
}
}
// Mini respawning mechanism.
respawner( key, value, min_delay, max_delay, total_amount )
{
spawners = GetEntArray( key, value );
control = spawnStruct();
if( IsDefined( min_delay ) )
{
control.script_delay_min = min_delay;
}
if( IsDefined( max_delay ) )
{
control.script_delay_max = max_delay;
}
control.total_amount = 32;
if( Isdefined( total_amount ) )
{
control.total_amount = total_amount;
}
control.amount = 0;
for( i = 0; i < spawners.size; i++ )
{
control thread respawner_think( spawners[i] );
}
if( !IsDefined( level.respawner_controls ) )
{
level.respawner_controls = [];
}
level.respawner_controls[key] = control;
}
// self is the control struct
respawner_think( spawner )
{
self endon( "stop_respawning" );
spawner endon( "death" );
for( ;; )
{
while( self.amount >= self.total_amount )
{
wait( 0.1 );
}
spawner.count = 1;
guy = spawn_guy( spawner, undefined, true );
if( IsDefined( guy ) )
{
self.amount++;
guy waittill( "death" );
self.amount--;
}
self script_delay();
}
}
follow_nodes( node, start_delay )
{
self notify( "stop_follow_nodes" );
self endon( "stop_follow_nodes" );
self endon("death");
if( IsDefined( start_delay ) )
{
wait( start_delay );
}
og_goalradius = self.goalradius;
self.goalradius = 32;
for( ;; )
{
if( IsDefined( node.radius ) )
{
self.goalradius = node.radius;
}
if( !Isdefined( node.target ) )
{
if( IsDefineD( self.enable_arrivals_on_last_node ) && self.enable_arrivals_on_last_node )
{
self disable_arrivals( false, false );
self.enable_arrivals_on_last_node = undefined;
}
}
self SetGoalNode( node );
self.follow_node = node;
self waittill( "goal" );
if( IsDefined( node.script_flag ) )
{
self notify( node.script_flag );
}
if( IsDefined( node.script_flag_set ) )
{
flag_set( node.script_flag_set );
}
if( IsDefined( node.script_flag_wait ) )
{
flag_wait( node.script_flag_wait );
}
node script_delay();
if( IsDefined( self.script_noteworthy ) )
{
if( self.script_noteworthy == "die" )
{
self stop_bullet_shield();
self SetCanDamage( true ); // Just incase...
self DoDamage( self.health + 10, self.origin );
}
}
if( !IsDefined( node.target ) )
{
break;
}
node = GetNode( node.target, "targetname" );
}
self SetGoalNode( node );
self waittill( "goal" );
if( IsDefined( node.script_flag_wait ) )
{
flag_wait( node.script_flag_wait );
}
self.goalradius = og_goalradius;
self notify( "follow_nodes_done" );
}
sort_nodes_by_script_int( nodes )
{
for( i = 0; i < nodes.size; i++ )
{
for( j = i; j < nodes.size; j++ )
{
if( nodes[j].script_int < nodes[i].script_int )
{
temp = nodes[i];
nodes[i] = nodes[j];
nodes[j] = temp;
}
}
}
return nodes;
}
trigger_color_trigger( num )
{
trigger = GetEnt( "color_trigger" + num, "script_noteworthy" );
if( IsDefined( trigger ) )
{
trigger notify( "trigger" );
}
}
// Makes the Allies use Jog
start_jog( guys, min_x, max_x, struct_name, optional_leader_dist )
{
level endon( "stop_jog" );
flag_set( "jog_enabled" );
level thread jog_run_thread( guys, struct_name, optional_leader_dist );
for( i = 0; i < guys.size; i++ )
{
if( IsDefined( guys[i] ) )
{
guys[i] thread jog_internal( min_x, max_x );
wait( RandomFloat( 1 ) );
}
}
}
jog_internal( min_x, max_x )
{
self endon( "death" );
jogs = [];
jogs[jogs.size] = "jog1";
jogs[jogs.size] = "jog2";
self disable_arrivals( true, true );
self.run_dont_jog = false;
jogging = false;
while( flag( "jog_enabled" ) )
{
if( self.origin[0] > min_x && self.origin[0] < max_x )
{
jogging = true;
if( !self.run_dont_jog )
{
if( IsDefined( self.jog_anim ) )
{
jog = self.jog_anim;
self.moveplaybackrate = 1;
}
else
{
jog = jogs[RandomInt( jogs.size )];
self.moveplaybackrate = 0.9;
}
self set_generic_run_anim( jog );
delay = GetAnimLength( level.scr_anim["generic"][jog] );
wait( delay - ( 0.1 + RandomFloat( 0.5 ) ) );
}
else
{
jogging = false;
}
}
else
{
jogging = false;
}
if( !jogging )
{
if( self.origin[0] < -9200 )
{
if( IsDefined( self.jog_anim ) )
{
jog = self.jog_anim;
self.moveplaybackrate = 1;
}
else
{
jog = jogs[RandomInt( jogs.size )];
self.moveplaybackrate = 0.9;
}
self set_generic_run_anim( jog );
self.moveplaybackrate = 1.2;
}
else
{
self.moveplaybackrate = 1;
// Sumeet - Added the jog_sprint cycle
self set_generic_run_anim( "jog_sprint" );
}
}
wait( 0.5 );
}
self.jog_anim = undefined;
self.moveplaybackrate = 1.0;
self clear_run_anim();
self disable_arrivals( false, false );
level notify( "stop_jog" );
}
jog_run_thread( guys, struct_name, optional_leader_dist )
{
level endon( "stop_jog" );
// DOT:
// diff = plane pos - player pos
// dot = vectordot( diff, anglestoforward( angle ) );
// dot is now the distance
leader_dist = 256;
if( IsDefined( optional_leader_dist ) )
{
leader_dist = optional_leader_dist;
}
old_struct = undefined;
struct = GetStruct( struct_name, "targetname" );
structs = [];
structs[0] = struct;
while( IsDefined( struct.target ) )
{
old_struct = struct;
struct = GetStruct( struct.target, "targetname" );
structs[structs.size] = struct;
old_struct.angles = VectorToAngles( struct.origin - old_struct.origin );
}
// Have the last struct angles be the same as the old one
struct.angles = old_struct.angles;
for( ;; )
{
// center = get_avg_center( guys );
guys = array_removeundefined( guys );
guys = array_removedead( guys );
lead_guy = guys[0];
for( i = 1; i < guys.size; i++ )
{
if( guys[i].origin[0] > lead_guy.origin[0] )
{
lead_guy = guys[i];
}
}
players = get_players();
furthest = players[0];
for( i = 1; i < players.size; i++ )
{
if( players[i].origin[0] > furthest.origin[0] )
{
furthest = players[i];
}
}
struct = get_closest_exclude( lead_guy.origin, structs );
diff = lead_guy.origin - furthest.origin;
dot = VectorDot( diff, AnglesToForward( struct.angles ) );
for( i = 0; i < guys.size; i++ )
{
if( dot < 200 )
{
if( guys[i] == lead_guy )
{
guys[i] thread print3d_on_ent( "^2Lead RUN", "jogging", "stop_jog" );
}
else
{
guys[i] thread print3d_on_ent( "RUN", "jogging", "stop_jog" );
}
guys[i].run_dont_jog = true;
}
else
{
if( guys[i] == lead_guy )
{
guys[i] thread print3d_on_ent( "^2Lead JOG", "jogging", "stop_jog" );
guys[i].run_dont_jog = false;
}
else if( DistanceSquared( guys[i].origin, lead_guy.origin ) > leader_dist * leader_dist )
{
guys[i] thread print3d_on_ent( "RUN", "jogging", "stop_jog" );
guys[i].run_dont_jog = true;
}
else
{
guys[i] thread print3d_on_ent( "JOG", "jogging", "stop_jog" );
guys[i].run_dont_jog = false;
}
}
}
wait( 0.25 );
}
}
get_avg_center( array )
{
center = ( 0, 0, 0 );
for( i = 0; i < array.size; i++ )
{
center = ( center[0] + array[i].origin[0], center[1] + array[i].origin[1], center[2] + array[i].origin[2] );
}
center = ( center[0] / array.size, center[1] / array.size, center[2] / array.size );
return center;
}
ignore_all_timer( array, time )
{
for( i = 0; i < array.size; i++ )
{
array[i].ignoreall = true;
}
wait( time );
for( i = 0; i < array.size; i++ )
{
if( IsDefined( array[i] ) )
{
array[i].ignoreall = false;
}
}
}
// Have a redshirt talk
redshirt_dialog( ref )
{
og_animname = undefined;
if( IsDefined( self.animname ) )
{
og_animname = self.animname;
}
self.animname = "generic";
self anim_single_solo( self, ref );
if( IsDefined( og_animname ) )
{
self.animname = og_animname;
}
else
{
// Check to make sure no other
if( !IsDefined( self.animname ) )
{
self.animname = undefined;
}
}
}
// Disables grenades for an entire Team
disable_grenades_for_team( team )
{
ai = GetAiArray( team );
for( i = 0; i < ai.size; i++ )
{
ai[i] disable_grenades();
}
}
// Enables grenades for an entire Team
enable_grenades_for_team( team )
{
ai = GetAiArray( team );
for( i = 0; i < ai.size; i++ )
{
ai[i] enable_grenades();
}
}
// Disables grenades for AI
disable_grenades()
{
self.og_grenadeammo = self.grenadeammo;
self.grenadeammo = 0;
}
// Enables grenades for AI
enable_grenades()
{
if( IsDefined( self.og_grenadeammo ) )
{
self.grenadeammo = self.og_grenadeammo;
}
}
// Disables Arrivals and Exits
disable_arrivals( arrivals, exits, level_waittill, delay )
{
if( IsDefined( level_waittill ) )
{
level waittill( level_waittill );
}
if( IsDefined( delay ) )
{
wait( delay );
}
self.disableArrivals = arrivals;
self.disableexits = exits;
}
// Custom function that doe the "build" stuff for Vehicles rather than hijacking a util script
build_custom_vehicle( type )
{
model = undefined;
death_model = undefined;
death_fx = "explosions/large_vehicle_explosion";
death_sound = "explo_metal_rand";
health = 2000;
min_health = 1000;
max_health = 5000;
team = "axis";
turretType = undefined;
turretModel = undefined;
func = undefined;
if( type == "rubber_raft" )
{
model = "makin_raft_rubber";
death_fx = undefined;
death_model = "makin_raft_rubber";
health = 7500;
min_health = 5000;
max_health = 10000;
team = "allies";
func = ::rubber_raft_init;
}
else if( type == "type94" )
{
// model = "dest_type94truckcamo_body_dmg0";
model = "vehicle_jap_wheeled_type94_camo";
death_fx = undefined;
death_model = undefined;
health = -1;
min_health = -1;
max_health = -1;
team = "allies";
func = ::rubber_raft_init;
}
maps\_vehicle::build_template( type, model );
maps\_vehicle::build_life( health, min_health, max_health );
maps\_vehicle::build_treadfx();
maps\_vehicle::build_team( team );
maps\_vehicle::build_localinit( func );
if( IsDefined( death_model ) )
{
maps\_vehicle::build_deathmodel( model, death_model );
}
if( IsDefined( death_fx ) )
{
maps\_vehicle::build_deathfx( death_fx, "tag_engine", death_sound, undefined, undefined, undefined, undefined ); // TODO change to actual explosion fx/sound when we get it
}
if( IsDefined( turretType ) && IsDefined( turretModel ) )
{
maps\_vehicle::build_turret( turretType, "tag_gunLeft", turretModel, true );
maps\_vehicle::build_turret( turretType, "tag_gunRight", turretModel, true );
}
}
rubber_raft_init()
{
// Don't need to do anything yet, but _vehicle needs an init
}
type94_init()
{
// Don't need to do anything yet, but _vehicle needs an init
}
// Lights the given AI on fire
torch_ai( delay )
{
self endon( "death" );
wait( 0.05 );
tagArray = [];
tagArray[tagArray.size] = "J_Wrist_RI";
tagArray[tagArray.size] = "J_Wrist_LE";
tagArray[tagArray.size] = "J_Elbow_LE";
tagArray[tagArray.size] = "J_Elbow_RI";
tagArray[tagArray.size] = "J_Knee_RI";
tagArray[tagArray.size] = "J_Knee_LE";
tagArray[tagArray.size] = "J_Ankle_RI";
tagArray[tagArray.size] = "J_Ankle_LE";
tagArray = array_randomize( tagArray );
for( i = 0; i < 3; i++ )
{
PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[i] );
if( IsDefined( delay ) )
{
wait( delay );
}
}
PlayFxOnTag( level._effect["character_fire_death_torso"], self, "J_SpineLower" );
wait( 3 );
self StartTanning();
}
// Clamps the angle to 180/-180
angle_normalize_180( angle )
{
scaled_angle = angle * 0.00277778; //( 1.0f / 360.0f );
return int( ( scaled_angle - int( scaled_angle + 0.5 ) ) * 360 );
}
angles_normalize_180( angles )
{
return( angle_normalize_180( angles[0] ), angle_normalize_180( angles[1] ), angle_normalize_180( angles[2] ) );
}
// Returns the death explosion that will be used
get_explosion_death( yaw )
{
death_array = [];
// Choose the quadrant
if( ( yaw > 135 ) ||( yaw <= -135 ) ) // Front quadrant
{
// level thread do_print3d_pos( self.origin, "FRONT[back anim]" );
death_array[death_array.size] = %death_explosion_stand_B_v1;
death_array[death_array.size] = %death_explosion_stand_B_v2;
death_array[death_array.size] = %death_explosion_stand_B_v3;
death_array[death_array.size] = %death_explosion_stand_B_v4;
}
else if( ( yaw > 45 ) &&( yaw <= 135 ) ) // Right quadrant
{
// level thread do_print3d_pos( self.origin, "RIGHT[left anim]" );
death_array[death_array.size] = %death_explosion_stand_L_v1;
death_array[death_array.size] = %death_explosion_stand_L_v2;
death_array[death_array.size] = %death_explosion_stand_L_v3;
}
else if( ( yaw > -45 ) &&( yaw <= 45 ) ) // Back quadrant
{
// level thread do_print3d_pos( self.origin, "BACK[front anim]" );
death_array[death_array.size] = %death_explosion_stand_F_v1;
death_array[death_array.size] = %death_explosion_stand_F_v2;
death_array[death_array.size] = %death_explosion_stand_F_v3;
death_array[death_array.size] = %death_explosion_stand_F_v4;
}
else // Left quadrant
{
// level thread do_print3d_pos( self.origin, "LEFT[right anim]" );
death_array[death_array.size] = %death_explosion_stand_R_v1;
death_array[death_array.size] = %death_explosion_stand_R_v2;
}
return get_random( death_array );
}
// Returns a random element from the given array
get_random( array )
{
return array[RandomInt( array.size )];
}
// Sets up the AI for force gibbing
set_random_gib()
{
refs = [];
refs[refs.size] = "right_arm";
refs[refs.size] = "left_arm";
refs[refs.size] = "right_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "no_legs";
refs[refs.size] = "guts";
self.a.gib_ref = get_random( refs );
}
dof_enable( toggle )
{
SetSavedDvar( "scr_dof_enable", toggle );
}
// spawns in AI out of every spawner given
spawn_guys( spawners, target_name, ok_to_spawn )
{
guys = [];
for( i = 0; i < spawners.size; i++ )
{
guy = spawn_guy( spawners[i], target_name, ok_to_spawn );
if( IsDefined( guy ) )
{
guys[guys.size] = guy;
}
}
// We do not want to return the guys if ok_to_spawn is used. Since a guy in the array may be dead.
// So, only return the guys array if we do not want to ok_to_spawn.
if( !IsDefined( ok_to_spawn ) || !ok_to_spawn )
{
return guys;
}
}
// spawns in an AI( and returns the spawned AI )
spawn_guy( spawner, target_name, ok_to_spawn )
{
if( IsDefined( ok_to_spawn ) && ok_to_spawn )
{
while( !OkTospawn() )
{
wait( 0.1 );
}
}
if( IsDefined( spawner.script_forcespawn ) && spawner.script_forcespawn )
{
guy = spawner Stalingradspawn();
}
else
{
guy = spawner Dospawn();
}
if( !spawn_failed( guy ) )
{
if( IsDefined( target_name ) )
{
guy.targetname = target_name;
}
return guy;
}
return undefined;
}
// Sends an AI to the given node, then kills him with bloody_death
reach_node_bloody_death( node, delay, wait_til_goal )
{
self.goalradius = 32;
self SetGoalNode( node );
if( IsDefined( wait_til_goal ) )
{
self waittill( "goal" );
}
self thread bloody_death( delay );
}
// Sumeet modified to take x co-ordinate, will kill everyone before that
bloody_death_array( value, key, min_delay, max_delay, one_at_a_time, x )
{
guys = [];
if( !IsDefined( one_at_a_time ) )
{
one_at_a_time = false;
}
if( key == "r" || key == "b" || key == "c" || key == "y" )
{
guys = get_force_color_guys( value, key );
}
else if( key == "team" )
{
guys = GetAiArray( value );
}
else
{
guys = GetEntArray( value, key );
}
for( i = 0; i < guys.size; i++ )
{
// Sumeet added co-ordinate based killing, used to kill everyone at in a certain parts of map
// This kills AI instantly, with no random wait.
if ( isdefined( x ) )
{
if ( x > guys[i].origin[0] )
{
guys[i] thread bloody_death();
continue;
}
}
if( one_at_a_time )
{
if( IsDefined( guys[i] ) )
{
guys[i] bloody_death( min_delay + RandomFloat( max_delay ) );
}
}
else
{
if( IsDefined( guys[i] ) )
{
guys[i] thread bloody_death( min_delay + RandomFloat( max_delay ) );
}
}
}
}
// Kill the given AI with style( fx )
bloody_death( delay )
{
self endon( "death" );
if( !IsAi( self ) || !IsAlive( self ) )
{
return;
}
if( IsDefined( self.bloody_death ) && self.bloody_death )
{
return;
}
self.bloody_death = true;
if( IsDefined( delay ) )
{
wait( RandomFloat( delay ) );
}
tags = [];
tags[0] = "j_hip_le";
tags[1] = "j_hip_ri";
tags[2] = "j_head";
tags[3] = "j_spine4";
tags[4] = "j_elbow_le";
tags[5] = "j_elbow_ri";
tags[6] = "j_clavicle_le";
tags[7] = "j_clavicle_ri";
for( i = 0; i < 2; i++ )
{
random = RandomIntRange( 0, tags.size );
//vec = self GetTagOrigin( tags[random] );
self thread bloody_death_fx( tags[random], undefined );
wait( RandomFloat( 0.1 ) );
}
dmg = self.health + 10;
if( IsDefined( self.balcony_guy ) && self.balcony_guy )
{
dmg = 155;
}
self DoDamage( dmg, self.origin );
}
// self = the AI on which we're playing fx
bloody_death_fx( tag, fxName )
{
if( !is_mature() )
{
return;
}
if( !IsDefined( fxName ) )
{
fxName = level._effect["flesh_hit"];
}
PlayFxOnTag( fxName, self, tag );
}
// Waits for all ents to recieve the waittill_msg( or death ) before continuing on
wait_for_group_notify( ents, waittill_msg )
{
struct = spawnStruct();
threads = ents.size;
for( i = 0; i < ents.size; i++ )
{
ents[i] thread wait_for_groupent_notify( struct, waittill_msg );
}
while( threads )
{
struct waittill( "group_notify" );
threads--;
}
}
// waits for an individual to get the waittill_msg and notifies the struct( used above )
wait_for_groupent_notify( struct, waittill_msg )
{
self waittill_either( "death", waittill_msg );
struct notify( "group_notify" );
}
get_event1_pow_group()
{
pows = GetEntArray( "event1_pows", "targetname" );
beaters = GetEntArray( "event1_pow_beaters", "targetname" );
guys = array_combine( pows, beaters );
for( i = 0; i < guys.size; i++ )
{
guys[i] init_intro_settings();
if( guys[i].targetname == "event1_pow_beaters" )
{
guys[i].a.nodeath = false;
guys[i] thread maps\mak_anim::death_after_anim( undefined, "ragdoll", undefined, RandomFloat( 1 ) );
}
// Sumeet - Removed the designation from the pows.
if( guys[i].targetname == "event1_pows" )
{
guys[i].weapon = "";
}
}
return guys;
}
// Mainly used for spawn functions
random_player_seek()
{
self endon( "death" );
if( flag( "random_player_seek" ) )
{
if( IsDefined( self.player_no_seek ) )
{
return;
}
level thread flag_clear_delayed( "random_player_seek", level.player_seek_timer );
self.player_seek = true;
self.goalradius = 128;
self SetThreatBiasGroup( "rushers" );
self SetGoalEntity( get_closest_player( self.origin ) );
self notify( "player_seeking" );
if( IsDefined( self.script_sound ) )
{
self animscripts\face::SaySpecificDialogue( undefined, self.script_sound, 1.0 );
}
wait( 1 );
self.ignoreme = false;
}
}
// Mainly used for spawn functions
set_targetname_to_noteworthy()
{
self.targetname = self.script_noteworthy;
}
// Mainly used for spawn functions
set_disable_arrivals()
{
self disable_arrivals( true, true );
}
// Mainly used for spawn functions
set_bullet_shield()
{
if( !IsDefined( self.magic_bullet_shield ) )
{
self thread magic_bullet_shield();
}
}
stop_bullet_shield()
{
if( IsDefined( self.magic_bullet_shield ) )
{
self thread stop_magic_bullet_shield();
}
}
set_no_damage()
{
self SetCanDamage( false );
}
// Sumeet - Mainly used in spawn function to turn off gibbing.
set_no_gib()
{
self.no_gib = 1; // referred in death.gsc
}
// Sorts the players in order of their entitynumber, good way to get the host
get_sorted_players()
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
for( j = i; j < players.size; j++ )
{
if( players[j] GetEntityNumber() > players[i] GetEntityNumber() )
{
temp = players[i];
players[i] = players[j];
players[j] = temp;
}
}
}
return players;
}
// Set a attribute on the player, like ignoreme, or whatever.
set_player_attrib( attrib, value )
{
if( !IsDefined( level.player_attribs ) )
{
level.player_attribs = [];
}
level.player_attribs[attrib] = value;
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] set_player_attrib_internal( attrib, value );
}
}
// Set the attribute of the given player
set_player_attrib_internal( attrib, value, value2 )
{
switch( attrib )
{
case "ignoreme":
self.ignoreme = value;
break;
case "stand":
self AllowStand( value );
break;
case "crouch":
self AllowCrouch( value );
break;
case "prone":
self AllowProne( value );
break;
case "fov":
self SetClientDvar( "cg_fov", value );
break;
}
}
// Sets all of the current attributes on the given player.
set_onplayer_attribs()
{
if( IsDefined( level.player_attribs ) )
{
keys = GetArrayKeys( level.player_attribs );
for( i = 0; i < keys.size; i++ )
{
self set_player_attrib_internal( keys[i], level.player_attribs[keys[i]] );
}
}
}
// Sets all of the players movement speeds
set_player_speed( player_speed, time )
{
self notify( "stop_set_player_speed" );
self endon( "stop_set_player_speed" );
base_speed = 190;
level.player_speed = player_speed;
if( !IsDefined( time ) )
{
time = 0;
}
steps = abs( int( time * 4 ) );
target_speed_scale = player_speed / base_speed;
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] thread set_player_speed_internal( target_speed_scale, steps );
}
}
// Adjusts the player's speed within the given amount of steps( time * 4 )
set_player_speed_internal( target_speed_scale, steps )
{
self endon( "death" );
self endon( "disconnect" );
self notify( "stop_set_player_speed" );
self endon( "stop_set_player_speed" );
if( !IsDefined( self.move_speed_scale ) )
{
self.move_speed_scale = 1;
}
// Don't set the speedscale if it's already set to it
if( self.move_speed_scale == target_speed_scale )
{
return;
}
difference = target_speed_scale - self.move_speed_scale;
increment = difference / steps;
for( i = 0; i < steps; i++ )
{
self.move_speed_scale += increment;
self SetMoveSpeedScale( self.move_speed_scale );
wait( 0.5 );
}
self.move_speed_scale = target_speed_scale;
self SetMoveSpeedScale( self.move_speed_scale );
}
timescale_duration( timescale, in_time, duration, out_time, delay )
{
if( IsDefined( delay ) )
{
wait( delay );
}
set_timescale( timescale, in_time );
wait( duration );
set_timescale( 1, out_time );
}
// Adjusts the player's speed within the given amount of steps( time * 4 )
set_timescale( timescale, trans_time )
{
curr_scale = GetTimeScale();
difference = timescale - curr_scale;
steps = trans_time * 20;
increment = difference / steps;
for( i = 0; i < steps; i++ )
{
curr_scale += increment;
SetTimeScale( curr_scale );
wait( 0.05 );
}
SetTimeScale( timescale );
}
// Adds a spawner function to the given key value paired entity
create_spawner_function( value, key, func )
{
spawners = GetEntArray( value, key );
for( i = 0; i < spawners.size; i++ )
{
spawners[i] add_spawn_function( func );
}
}
reman_mg_thread( mg, guy, threatbias, value, key )
{
mg endon( "stop_reman_mg_think" );
owner = mg GetTurretOwner();
if( IsDefined( owner ) )
{
guy = owner;
}
if( IsDefined( guy ) )
{
if( IsDefined( threatbias ) )
{
guy.threatbias = threatbias;
}
guy.player_no_seek = true;
guy disable_long_death();
guy waittill( "death" );
}
while( 1 )
{
wait( RandomFloatRange( 1, 3 ) );
if( key == "team" )
{
backup = GetAiArray( value );
}
else
{
backup = GetEntArray( value, key );
}
new_mger = undefined;
if( backup.size > 0 )
{
backup = get_array_of_closest( mg.origin, backup );
backup = array_removeUndefined( backup );
backup = array_removeDead( backup );
if( backup.size > 3 )
{
num = RandomIntRange( 1, 4 );
new_mger = backup[num];
}
else
{
new_mger = backup[0];
}
break;
}
}
if( IsDefined( new_mger ) )
{
new_mger thread reman_mg_goto( mg );
level thread reman_mg_thread( mg, new_mger, threatbias, value, key );
}
}
reman_mg_goto( mg )
{
node = GetNode( mg.targetname, "target" );
self.player_no_seek = true;
self.ignoreme = true;
self.ignoreall = true;
self.goalradius = 16;
self SetGoalNode( node );
self waittill( "goal" );
self.ignoreme = false;
self.ignoreall = false;
mg notify( "manned" );
self UseTurret( mg );
self KnockBack( false );
}
plant_charge_think( trigger )
{
self endon( "death" );
if( IsDefined( self.script_flag_wait ) )
{
if( !IsDefined( level.flag[self.script_flag_wait] ) )
{
flag_init( self.script_flag_wait );
}
}
if( IsDefined( self.script_flag ) )
{
if( !IsDefined( level.flag[self.script_flag] ) )
{
flag_init( self.script_flag );
}
}
glowy_model = undefined;
planted_model = undefined;
targets = GetEntArray( self.target, "targetname" );
for( i = 0; i < targets.size; i++ )
{
if( IsDefined( targets[i].script_noteworthy ) )
{
if( targets[i].script_noteworthy == "glowy" )
{
glowy_model = targets[i];
}
}
else
{
planted_model = targets[i];
}
targets[i] Hide();
}
self trigger_off();
if( IsDefined( self.script_flag_wait ) )
{
flag_wait( self.script_flag_wait );
}
self trigger_on();
self SetHintString( &"SCRIPT_PLATFORM_HINT_PLANTEXPLOSIVES" );
glowy_model Show();
self.charge_planted = false;
while( 1 )
{
self waittill( "trigger", other );
if( !IsDefined( self.script_timer ) )
{
break;
}
// Sumeet - make the player stand or crouch and the ticking sound
other DisableWeapons();
other AllowProne ( false );
other plant_charge_bar( self );
// Sumeet - Give the stance ability back
other AllowProne ( true );
other EnableWeapons();
if( self.charge_planted )
{
// Just in case the ticker sound is not turnd off.
other stopsounds();
// Sumeet - added sound once the charge has been set
playsoundatposition( "mak_charge_set", self.origin );
break;
}
}
if( IsDefined( self.script_flag ) )
{
flag_set( self.script_flag );
}
if( IsDefined( planted_model ) )
{
planted_model Show();
}
if( IsDefined( glowy_model ) )
{
glowy_model Delete();
}
self Delete();
}
// Sumeet - Added the third person player animations for the bomb planting
plant_charge_animation_think( player )
{
// just in case
self endon("stop_charge_bar");
self endon( "stop_charge_bar_thread" );
// play this animation only if its co-op
if ( is_coop() )
{
while ( 1 )
{
stance = player getstance();
if ( stance == "stand" )
{
player playeranimscriptevent( "mak_bomb_stand" );
}
else if ( stance == "crouch" )
{
player playeranimscriptevent( "mak_bomb_crouch" );
}
// waittill the animation is done.
player waittill("done");
}
}
}
plant_charge_bar( trigger )
{
self endon( "disconnect" );
self endon( "death" );
trigger endon( "stop_charge_bar" );
trigger thread plant_charge_bar_thread( self );
// Sumeet - Added 3rd person animations for bomb planting, self is the player who is activating the trigger
trigger thread plant_charge_animation_think( self );
x = 0;
y = -90;
x_size = 100;
y_size = 10;
time = trigger.script_timer;
self.plant_title = newClientHudElem( self );
self.plant_title.x = x;
self.plant_title.y = y - 20;
self.plant_title.alignX = "center";
self.plant_title.horzAlign = "center";
self.plant_title.vertAlign = "bottom";
self.plant_title.foreground = true;
self.plant_title.fontScale = 1.25;
self.plant_title.sort = 1;
self.plant_title.hidewheninmenu = true;
self.plant_title SetText( &"MAK_PLANTING" );
self.plant_bg = newClientHudElem( self );
self.plant_bg.x = x -( x_size * 0.5 );
self.plant_bg.y = y;
self.plant_bg.horzAlign = "center";
self.plant_bg.vertAlign = "bottom";
self.plant_bg.foreground = true;
self.plant_bg.sort = 1;
self.plant_bg.hidewheninmenu = true;
self.plant_bg SetShader( "black", x_size, y_size );
self.plant_fg = newClientHudElem( self );
self.plant_fg.x = x -( x_size * 0.5 ) + 2;
self.plant_fg.y = y + 2;
self.plant_fg.horzAlign = "center";
self.plant_fg.vertAlign = "bottom";
self.plant_fg.foreground = true;
self.plant_fg.sort = 2;
self.plant_fg.hidewheninmenu = true;
self.plant_fg SetShader( "white", 0, y_size - 4 );
self.plant_fg ScaleOverTime( time, x_size - 4, y_size - 4 );
wait( time );
trigger notify( "stop_charge_bar_thread" );
if( IsDefined( self.plant_title ) )
{
self.plant_title Destroy();
}
if( IsDefined( self.plant_bg ) )
{
self.plant_bg Destroy();
}
if( IsDefined( self.plant_fg ) )
{
self.plant_fg Destroy();
}
trigger.charge_planted = true;
}
plant_charge_bar_thread( other )
{
self endon( "stop_charge_bar_thread" );
while( IsDefined( other ) && other UseButtonPressed() && DistanceSquared( other.origin, self.origin ) < 512 * 512 )
{
other thread plant_charge_trigger_hint(self);
other thread plant_charge_ticker_sound(self);
wait( 0.05 );
}
self notify( "stop_charge_bar" );
// sumeet - stop the ticking sound
other stoploopsound();
if( IsDefined( other ) )
{
if( IsDefined( other.plant_title ) )
{
other.plant_title Destroy();
}
if( IsDefined( other.plant_bg ) )
{
other.plant_bg Destroy();
}
if( IsDefined( other.plant_fg ) )
{
other.plant_fg Destroy();
}
}
}
// Sumeet - hiding the hintstring for other players when one player is using the trigger i.e planting the bomb
plant_charge_trigger_hint(trigger)
{
if ( !isdefined( trigger.nohintstring ) )
{
trigger.nohintstring = false;
}
if ( !(trigger.nohintstring) )
{
trigger.nohintstring = true;
trigger SetHintString("");
trigger waittill( "stop_charge_bar" );
trigger SetHintString( &"SCRIPT_PLATFORM_HINT_PLANTEXPLOSIVES" );
trigger.nohintstring = false;
}
}
// Sumeet - Sound ticker function
plant_charge_ticker_sound(trigger)
{
if ( !isdefined( self.isplayingticker ) )
{
self.isplayingticker = false;
}
// this way only one thread will be created
if ( !( self.isplayingticker ) )
{
self.isplayingticker = true;
self playsound( "mak_charge_planting" );
trigger waittill("stop_charge_bar");
self stopsounds();
self.isplayingticker = false;
}
}
repeat_dialog( guy, anime, amount, min_delay, max_delay, end_on, animname_override )
{
level endon( end_on );
level notify( "stop_repeat_dialog" );
level endon( "stop_repeat_dialog" );
guy endon( "death" );
// Hurry up
array = [];
for( i = 1; i < amount; i++ )
{
array[array.size] = anime + i;
}
for( ;; )
{
array = array_randomize( array );
for( i = 0; i < array.size; i++ )
{
delay = min_delay + RandomFloat( max_delay );
wait( delay );
guy anim_single_solo_animname( guy, array[i], undefined, undefined, undefined, animname_override );
}
}
}
autosave_light_check()
{
if( level.missionfailed )
{
return false;
}
if( maps\_arcademode::arcademode_complete() )
{
return false;
}
if( maps\_laststand::player_any_player_in_laststand() )
{
return false;
}
// health check
if( !maps\_autosave::autosave_health_check() )
{
return false;
}
host = get_host();
if( host IsThrowingGrenade() && host GetCurrentOffHand() != "molotov" )
{
/#
maps\_autosave::auto_save_print( "autosave_player_check: FAILED!!! -> host is throwing a grenade" );
#/
return false;
}
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( players[i] animscripts\banzai::in_banzai_attack() )
{
/#
maps\_autosave::auto_save_print( "autosave_player_check: FAILED!!! -> player " + i + " is in banzai attack." );
#/
return false;
}
}
// save was unsuccessful for internal reasons, such as lack of memory
if( !IsSaveSuccessful() )
{
/#
maps\_autosave::auto_save_print( "autosave_check: FAILED!!! -> save call was unsuccessful" );
#/
return false;
}
return true;
}
//----------------//
// STARTS SECTION //
//----------------//
// Get starting AI, probably heros
get_starting_guys()
{
guys = GetEntArray( "starting_allies", "targetname" );
return guys;
}
add_extra_starting_guy()
{
if( !IsDefined( level.starting_guys ) )
{
level.starting_guys = [];
}
level.starting_guys[level.starting_guys.size] = self;
}
// Get the points to warp the starting AI and players to
get_sorted_starts( start_name )
{
starts = getstructarray( start_name, "targetname" );
player_starts = [];
ai_starts = [];
for( i = 0; i < starts.size; i++ )
{
if( IsDefined( starts[i].script_int ) )
{
player_starts[player_starts.size] = starts[i];
}
else
{
ai_starts[ai_starts.size] = starts[i];
}
}
for( i = 0; i < player_starts.size; i++ )
{
for( j = i; j < player_starts.size; j++ )
{
if( player_starts[j].script_int < player_starts[i].script_int )
{
temp = player_starts[i];
player_starts[i] = player_starts[j];
player_starts[j] = temp;
}
}
}
split_array = [];
split_array[0] = ai_starts;
split_array[1] = player_starts;
return split_array;
}
// Does all of the players/ai position upon a start.
set_start_position( start_name, only_players )
{
start_hide_players();
start_warp_guys( start_name, only_players );
}
// warp the starting ai to the start points
start_warp_guys( start_name, only_players )
{
players = [];
ai = [];
if( IsDefined( only_players ) )
{
players = get_sorted_players();
}
else
{
players = get_sorted_players();
ai = get_starting_guys();
}
if( IsDefined( level.starting_guys ) )
{
ai = array_combine( level.starting_guys, ai );
}
guys = array_combine( ai, players );
starts_array = get_sorted_starts( start_name );
ai_starts = starts_array[0];
player_starts = starts_array[1];
if( !IsDefined( starts_array ) || starts_array.size < 1 || !IsDefined( guys ) )
{
println( "^1start_warp_guys(), starts or guys are not defined!" );
return;
}
ai_num = 0;
player_num = 0;
for( i = 0; i < guys.size; i++ )
{
if( IsPlayer( guys[i] ) )
{
// Temp -- Don't want to ent the map
if( !IsDefined( player_starts[player_num] ) )
{
player_num--;
}
guys[i] SetOrigin( player_starts[player_num].origin );
guys[i] SetPlayerAngles( player_starts[player_num].angles );
player_num++;
}
else
{
guys[i] Teleport( ai_starts[ai_num].origin, ai_starts[ai_num].angles );
guys[i] SetGoalPos( ai_starts[ai_num].origin );
ai_num++;
}
}
}
// Hide players so AI to teleport, doesnt work atm
start_hide_players()
{
// get all players
players = get_players();
hide_spot = GetStruct( "hide_spot", "targetname" );
for( i = 0; i < players.size; i++ )
{
players[i] SetOrigin( hide_spot.origin );
}
}
// Set the the objective if using a start.
set_start_objective( num )
{
num++;
for( i = 0; i < num; i++ )
{
set_objective( i );
}
}
// hide players so AI to teleport, doesnt work atm
hide_players()
{
// grab all players
players = get_players();
for( i = 0; i < players.size; i++ )
{
org = Spawn( "script_origin", players[i].origin );
players[i].start_org = org;
players[i] LinkTo( players[i].start_org );
players[i].start_org MoveTo( players[i].start_org.origin -( 0, 0, 10000 ), 0.1, 0.1 );
}
level waittill( "ai teleported" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i].start_org MoveTo( players[i].start_org.origin +( 0, 0, 10000 ), 0.1, 0.1 );
players[i] UnLink();
players[i].start_org Delete();
}
}
// The objecive setting function for makin rad
set_objective( num, ent )
{
if( num == 0 )
{
//Secure the Village
Objective_Add( 0, "active", &"MAK_OBJ_SECURE_VILLAGE", ( -9705, -15483, 132 ) );
Objective_Current( 0 );
}
else if( num == 1 )
{
Objective_State( 0, "done" );
Objective_Add( 1, "active", &"MAK_OBJ_REGROUP_2ND_SQUAD", ( -3096, -16800, 39.2 ) );
Objective_Current( 1 );
}
else if( num == 1.5 )
{
Objective_String( 1, &"MAK_OBJ_RESCUE_2ND_SQUAD" );
}
else if( num == 2 )
{
Objective_State( 1, "done" );
Objective_Add( 2, "active", &"MAK_OBJ_EXTRACTION_POINT", ( 3048, -14174, 376 ) );
Objective_Current( 2 );
}
else if( num == 3 )
{
origin = ( 2684, -12778, 144 );
players = get_players();
if( players.size > 1 )
{
Objective_Add( 3, "active", &"MAK_OBJ_PLANTCHARGE_COOP", origin );
}
else
{
Objective_Add( 3, "active", &"MAK_OBJ_PLANTCHARGE", origin );
}
Objective_Current( 3 );
}
else if( num == 4 ) // This actually reactivates/repositions Proceed to Extraction Point, but completes Plant Charge.
{
Objective_State( 3, "done" );
wait_network_frame();
Objective_Position( 2, ( 3473, -15627, 6 ) );
Objective_Current( 2 );
}
wait_network_frame();
}
end_level()
{
trigger = GetEnt( "end_level", "targetname" );
if( IsDefined( trigger ) )
{
trigger waittill( "trigger" );
to_be_continued();
}
}
to_be_continued()
{
if( GetDvar( "not_demo" ) != "" )
{
return;
}
// Put players on god mode
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] EnableInvulnerability();
}
// To Be Continued...
bg = NewHudElem();
bg.x = 0;
bg.y = 0;
bg.horzAlign = "fullscreen";
bg.vertAlign = "fullscreen";
bg.foreground = false;
bg.sort = 50;
bg SetShader( "black", 640, 480 );
bg.alpha = 0;
bg FadeOverTime( 0.5 );
bg.alpha = 1;
//TUEY Added "shock" file to control busses and fade out other sounds()
set_all_players_shock( "level_end", 20 );
//TUEY Sets the music for the AMBUSH section
maps\mak_amb::change_music_state( "ENDLEVEL" );
wait( 0.5 );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] FreezeControls( true );
}
wait( 1.5 );
continued_text = NewHudElem();
continued_text.x = 0;
continued_text.y = 0;
continued_text.alignX = "center";
continued_text.alignY = "middle";
continued_text.horzAlign = "center";
continued_text.vertAlign = "middle";
continued_text.sort = 1; // force to draw after the background
continued_text.foreground = true;
continued_text.fontScale = 1.75;
continued_text SetText( &"MAK_CONTINUED" );
continued_text.alpha = 0;
continued_text FadeOverTime( 1.2 );
continued_text.alpha = 1;
wait( 6 );
nextmission();
}
player_speed_within_coords( speed, axis, min, max, flag_name )
{
players = get_players();
for( i = 0;i < players.size; i++ )
{
players[i] thread player_speed_within_coords_internal( speed, axis, min, max, flag_name );
}
}
player_speed_within_coords_internal( speed, axis, min, max, flag_name )
{
self endon( "disconnect" );
base_speed = 190;
level.player_speed = speed;
steps = abs( int( 5 * 4 ) );
target_speed = speed / base_speed;
using_speed = false;
while( !flag( flag_name ) )
{
change_speed = false;
if( axis == "x" )
{
if( self.origin[0] > min && self.origin[0] < max )
{
change_speed = true;
}
}
else if( axis == "y" )
{
if( self.origin[1] > min && self.origin[1] < max )
{
change_speed = true;
}
}
if( change_speed && !using_speed )
{
using_speed = true;
self thread set_player_speed_internal( target_speed, steps );
}
if( !change_speed && using_speed )
{
using_speed = false;
self thread set_player_speed_internal( 1, steps );
}
wait( 0.1 );
}
self thread set_player_speed_internal( 1, steps );
}
// Sumeet - do stuff needed when save game is restored
onMakSaveGameRestored()
{
maps\_callbackglobal::Callback_SaveRestored();
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] set_onplayer_attribs();
}
}
//---------------//
// Debug Section //
//---------------//
// spawns a note at the given position and uses print3d to draw it
spawn_todo( msg, origin, time, wait_flag )
{
/#
org = Spawn( "script_origin", origin );
if( IsDefined( wait_flag ) )
{
org thread do_print3d( msg, time );
flag_wait( wait_flag );
}
else
{
org do_print3d( msg, time );
}
org Delete();
#/
}
do_print3d_pos( vec, msg, timer, offset )
{
/#
self endon( "stop_do_print3d_pos" );
if( !IsDefined( timer ) )
{
timer = GetTime() + 99999999999;
}
else
{
timer = GetTime() +( timer * 1000 );
}
if( !IsDefined( offset ) )
{
offset = ( 0, 0, 0 );
}
self endon( "death" );
while( GetTime() < timer )
{
print3d( vec + offset, msg );
wait( 0.05 );
}
#/
}
do_print3d( msg, timer, offset )
{
/#
self endon( "death" );
if( !IsDefined( timer ) )
{
timer = GetTime() + 99999999999;
}
else
{
timer = GetTime() +( timer * 1000 );
}
if( !IsDefined( offset ) )
{
offset = ( 0, 0, 0 );
}
self endon( "death" );
while( GetTime() < timer )
{
print3d( self.origin + offset, msg );
wait( 0.05 );
}
#/
}
// Draws a line from self to player always
line_to_player()
{
/#
self endon( "death" );
players = get_players();
while( 1 )
{
line( self.origin, players[0].origin );
wait( 0.05 );
}
#/
}
// Just draws a line from 2 points in space
line_points( point1, point2, color )
{
/#
self endon( "stop_line_points" );
if( !IsDefined( color ) )
{
color = ( 1, 1, 1 );
}
while( 1 )
{
line( point1, point2, color );
wait( 0.05 );
}
#/
}
// Creates a Hudelem
set_hudelem( text, x, y, scale, alpha, color, sort )
{
/#
if( !IsDefined( alpha ) )
{
alpha = 1;
}
if( !IsDefined( scale ) )
{
scale = 1;
}
if( !IsDefined( sort ) )
{
sort = 20;
}
if( !IsDefined( color ) )
{
color = ( 1, 1, 1 );
}
players = get_players();
hud = NewDebugHudElem( players[0] );
hud.location = 0;
hud.alignX = "center";
hud.alignY = "middle";
hud.foreground = 1;
hud.fontScale = scale;
hud.sort = sort;
hud.alpha = alpha;
hud.x = x;
hud.y = y;
hud.og_scale = scale;
if( IsDefined( text ) )
{
hud SetText( text );
}
return hud;
#/
}
// Draws line from the given tagname's position and points out to it's forward direction.
draw_tag_angles( tagname, color )
{
/#
self endon( "death" );
if( !IsDefined( color ) )
{
color = ( 1, 1, 1 );
}
while( 1 )
{
forward = AnglesToForward( self GetTagAngles( tagname ) );
pos2 = self GetTagOrigin( tagname ) + vector_multiply( forward, 5 );
line( self GetTagOrigin( tagname ), pos2, color );
wait( 0.05 );
}
#/
}
draw_tag_name( tagname, color )
{
/#
self endon( "death" );
if( !IsDefined( color ) )
{
color = ( 1, 1, 1 );
}
while( 1 )
{
// forward = AnglesToForward( self GetTagAngles( tagname ) );
// pos2 = self GetTagOrigin( tagname ) + vector_multiply( forward, 5 );
// line( self GetTagOrigin( tagname ), pos2, color );
print3d( self GetTagOrigin( tagname ), tagname );
wait( 0.05 );
}
#/
}
print_health()
{
/#
self endon( "death" );
while( 1 )
{
print3d( self.origin +( 0, 0, 72 ), self.health );
wait( 0.05 );
}
#/
}
print3d_on_ent( msg, thread_endon, level_endon, offset )
{
/#
self endon( "death" );
if( IsDefined( thread_endon ) )
{
self notify( thread_endon );
self endon( thread_endon );
}
if( IsDefined( level_endon ) )
{
level endon( level_endon );
}
if( !IsDefined( offset ) )
{
offset = ( 0, 0, 72 );
}
while( 1 )
{
print3d( self.origin + offset, msg );
wait( 0.05 );
}
#/
}
draw_line_ent_to_ent( ent1, ent2 )
{
/#
ent1 endon( "death" );
ent2 endon( "death" );
while( 1 )
{
line( ent1.origin, ent2.origin );
wait( 0.05 );
}
#/
}
draw_line_pos_to_pos( pos1, pos2 )
{
/#
self endon( "death" );
while( 1 )
{
line( pos1, pos2 );
wait( 0.05 );
}
#/
}
// Debug, draws line from given position to host
draw_line_to_player( pos, color )
{
/#
level notify( "stop_draw_line" );
level endon( "stop_draw_line" );
if( !IsDefined( color ) )
{
color = ( 1, 1, 1 );
}
players = get_players();
while( 1 )
{
line( players[0].origin, pos, color );
wait( 0.05 );
}
#/
}
speed_check()
{
/#
flag_wait( "all_players_connected" );
time = 0.1;
old_pos = ( 0, 0, 0 );
players = get_players();
text = undefined;
value = undefined;
for( ;; )
{
if( GetDvarInt( "debug_speed" ) < 1 )
{
if( IsDefined( text ) )
{
text Destroy();
}
if( IsDefined( value ) )
{
value Destroy();
}
wait( 0.1 );
continue;
}
wait( time );
if( !IsDefined( text ) )
{
text = create_speed_hudelem( false );
}
if( !IsDefined( value ) )
{
value = create_speed_hudelem( true );
}
new_pos = players[0].origin;
speed = int( Distance( new_pos, old_pos ) / time );
value SetValue( speed );
old_pos = new_pos;
}
#/
}
create_speed_hudelem( is_value )
{
/#
align_x = "right";
if( is_value )
{
align_x = "left";
}
hud = NewHudElem();
hud.x = 320;
hud.y = 450;
hud.alignX = align_x;
hud.alignY = "middle";
hud.sort = 1; // force to draw after the background
hud.foreground = true;
hud.fontScale = 1.75;
if( is_value )
{
hud SetValue( 0 );
}
else
{
hud SetText( "Speed: " );
}
return hud;
#/
}
debug_ai_prints()
{
/#
if( GetDvar( "debug_ai_print" ) == "" )
{
SetDvar( "debug_ai_print", "0" );
}
if( GetDvar( "debug_ai_print_range" ) == "" )
{
SetDvar( "debug_ai_print_range", "1000" );
}
level.debug_ai_print = false;
while( 1 )
{
wait( 0.5 );
if( GetDvar( "debug_ai_print" ) == "0" )
{
level.debug_ai_print = false;
continue;
}
level.debug_ai_print = true;
ai = GetAiArray();
for( i = 0; i < ai.size; i++ )
{
ai[i] thread debug_ai_prints_thread();
}
}
#/
}
debug_ai_prints_thread()
{
/#
self endon( "death" );
if( IsDefined( self.ai_print ) )
{
return;
}
self.ai_print = true;
while( level.debug_ai_print )
{
range = GetDvarInt( "debug_ai_print_range" );
player = get_host();
if( DistanceSquared( player.origin, self.origin ) < range * range )
{
print3d( self.origin + ( 0, 0, 96 ), self get_debug_ai_print() );
wait( 0.05 );
}
else
{
wait( 0.2 );
}
}
self.ai_print = false;
#/
}
get_debug_ai_print()
{
dvar = GetDvar( "debug_ai_print" );
switch( dvar )
{
case "script_noteworthy":
value = self.script_noteworthy;
break;
case "threatbias":
value = self.threatbias;
break;
case "getthreatbiasgroup":
value = self GetThreatBiasGroup();
break;
case "accuracy":
value = self.accuracy;
break;
case "ignoreme":
value = self.ignoreme;
break;
case "ignoreall":
value = self.ignoreall;
break;
case "health":
value = self.health;
break;
case "goalradius":
value = self.goalradius;
break;
case "disablearrivals":
value = self.disableArrivals;
break;
case "disableexits":
value = self.disableexits;
break;
case "moveplaybackrate":
value = self.moveplaybackrate;
break;
case "animname":
value = self.animname;
break;
case "script_forcecolor":
if( IsDefined( self.script_forceColor ) )
{
value = self.script_forceColor;
}
else
{
value = "undefined";
}
break;
case "player_seek":
if( IsDefined( self.player_seek ) )
{
value = self.player_seek;
}
else
{
value = "undefined";
}
break;
default:
value = "undefined";
}
if( !IsDefined( value ) )
{
value = "undefined";
}
return value;
}
flame_guy_death()
{
self waittill( "death" );
}
died_by_flame_explosion()
{
self waittill( "death" );
if( WeaponClass( self.damageWeapon ) == "grenade" )
{
attacker = self.attacker;
if( WeaponType( attacker.weapon ) != "gas" )
{
return;
}
if( !IsDefined( attacker.flame_kills ) )
{
attacker.flame_kills = 0;
}
attacker.flame_kills++;
if( attacker.flame_kills > 4 )
{
// do achievement
}
}
}
float_print3d( msg, time, rate )
{
/#
self endon( "death" );
time = GetTime() + ( time * 1000 );
offset = ( 0, 0, 72 );
while( GetTime() < time )
{
offset = offset + ( 0, 0, 2 );
print3d( self.origin + offset, msg, ( 1, 0, 0 ) );
wait( 0.05 );
}
#/
}
print_notetracks( anime )
{
/#
self endon( "death" );
// MikeD (8/22/2007): Stop the previous thread.
self notify( "stop_draw_notetrack" );
self endon( "stop_draw_notetrack" );
while( 1 )
{
self waittill( anime, notetrack );
self thread float_print3d( anime + ": " + notetrack, 3 );
}
#/
}
/*------------------------------------
plays dialogue/animation on a guy
------------------------------------*/
do_dialogue(dialogue,lookTarget)
{
if(self == level.sullivan)
{
aname = "sullivan";
}
else if(self == level.roebuck)
{
aname = "roebuck";
}
else
{
aname = "generic";
}
self thread maps\_anim::anim_facialFiller( "dialogue_done", lookTarget );
self animscripts\face::SaySpecificDialogue( undefined, level.scr_sound[aname][dialogue], 1.0, "dialogue_done" );
self waittill("dialogue_done");
}
// Sumeet - Some outtro death effects
play_explosion_death_anim( origin, angles )
{
guy = spawn_fake_guy( origin, angles, "axis", "generic" );
level thread anim_single_solo( guy, "death_explosion_forward", undefined, guy );
wait( 1 );
guy startragdoll();
}
// Spawn a drone model
#using_animtree ("generic_human");
spawn_fake_guy( startpoint, startangles, side, animname )
{
guy = spawn( "script_model", startpoint );
guy.angles = startangles;
{
guy character\char_jap_makonly_rifle::main();
guy maps\_drones::drone_axis_assignWeapon_japanese();
guy.team = "axis";
}
guy UseAnimTree( #animtree );
guy.animname = animname;
guy makeFakeAI(); // allow it to be animated
return guy;
}
#using_animtree( "generic_human" );
collectible_corpse()
{
orig = getstruct( "orig_collectible_loop", "targetname" );
corpse = spawn( "script_model", orig.origin );
corpse.angles = orig.angles;
corpse character\char_jap_makonly_rifle::main();
corpse detach( corpse.gearModel );
corpse UseAnimTree( #animtree );
corpse.animname = "collectible";
corpse.targetname = "collectible_corpse";
level thread anim_loop_solo( corpse, "collectible_loop", undefined, "stop_collectible_loop", orig );
}