2832 lines
68 KiB
Text
2832 lines
68 KiB
Text
|
#include maps\_utility;
|
|||
|
#include common_scripts\utility;
|
|||
|
#include maps\_anim;
|
|||
|
#include maps\_music;
|
|||
|
#using_animtree( "generic_human" );
|
|||
|
|
|||
|
// TODO: 72.3
|
|||
|
//------
|
|||
|
// - Add aircraft
|
|||
|
// - Add ambient "whatever"
|
|||
|
// - Look for what dialogue is needed.
|
|||
|
// - Ambient, add random flybys from friendly planes.
|
|||
|
// - Fix all bugs with guy popping smoke.
|
|||
|
// - Tweak drones
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
// PrecacheShader( "pel1a_lightning1" );
|
|||
|
// PrecacheShader( "pel1a_lightning2" );
|
|||
|
// precacheShader( "white" );
|
|||
|
precachemodel ("viewmodel_usa_colt45_pistol"); // for banzai attacks
|
|||
|
precachemodel ("vehicle_usa_tracked_shermanm4a3_green_d");
|
|||
|
precachemodel ("anim_foliage_pacific_palmtree_hideout_rope");
|
|||
|
precachemodel ("dest_test_palm_spawnfrond2");
|
|||
|
precachemodel ("dest_test_palm_spawnfrond1");
|
|||
|
precacheitem ("thompson");
|
|||
|
precacheitem ("type100_smg");
|
|||
|
|
|||
|
// strings
|
|||
|
precachestring(&"PEL1A_THROWSMOKE");
|
|||
|
|
|||
|
|
|||
|
// createfx needs this high up in the chain
|
|||
|
maps\pel1a_fx::main();
|
|||
|
|
|||
|
|
|||
|
// weapon swapping for the flame thrower
|
|||
|
maps\_coop_weaponswap::init();
|
|||
|
|
|||
|
// drone loading
|
|||
|
// character\char_usa_marinewet_r_rifle::precache();
|
|||
|
character\char_jap_makpel_rifle::precache();
|
|||
|
character\char_usa_marine_r_rifle::precache();
|
|||
|
|
|||
|
// Vehicles
|
|||
|
maps\_sherman::main( "vehicle_usa_tracked_shermanm4a3_green" );
|
|||
|
maps\_aircraft::main( "vehicle_usa_aircraft_f4ucorsair", "corsair" );
|
|||
|
maps\_aircraft::main( "vehicle_jap_airplane_zero_fly", "zero" );
|
|||
|
maps\_model3::main( "artillery_jap_model3_dist" );
|
|||
|
|
|||
|
// These are called everytime a drone is spawned in to set up the character.
|
|||
|
level.drone_spawnFunction["axis"] = character\char_jap_makpel_rifle::main;
|
|||
|
level.drone_spawnFunction["allies"] = character\char_usa_marine_r_rifle::main;
|
|||
|
|
|||
|
// Call this before maps\_load::main(); to allow drone usage.
|
|||
|
maps\_drones::init();
|
|||
|
|
|||
|
// Why is this asserting?
|
|||
|
maps\_mganim::main();
|
|||
|
|
|||
|
// Setup the friendlies, needs to be before the starts to set up animnames.
|
|||
|
setup_threatbiasgroups();
|
|||
|
setup_friends();
|
|||
|
|
|||
|
// Start Function calls
|
|||
|
add_start( "event2", ::event2_start, &"STARTS_PEL1A_EVENT2" );
|
|||
|
add_start( "event3", ::event3_start, &"STARTS_PEL1A_EVENT3" );
|
|||
|
add_start( "event4", ::event4_start, &"STARTS_PEL1A_EVENT4" );
|
|||
|
default_start( ::event1_start );
|
|||
|
|
|||
|
// _load!
|
|||
|
maps\_load::main();
|
|||
|
|
|||
|
|
|||
|
// Anything special external scripts.
|
|||
|
maps\_treefall::main();
|
|||
|
maps\_mortarteam::main();
|
|||
|
maps\_tree_snipers::main();
|
|||
|
|
|||
|
//banzai charge assets
|
|||
|
maps\_banzai::init();
|
|||
|
|
|||
|
// All the level support scripts.
|
|||
|
maps\pel1a_amb::main();
|
|||
|
maps\pel1a_anim::main();
|
|||
|
maps\pel1a_status::main();
|
|||
|
//maps\createcam\pel1_cam::main();
|
|||
|
|
|||
|
// Do all of the setup stuff.
|
|||
|
setup_levelvars();
|
|||
|
|
|||
|
init_flags();
|
|||
|
|
|||
|
// temp for now, figure out how to do with callbacks on connect
|
|||
|
level thread threat_group_setter();
|
|||
|
|
|||
|
|
|||
|
// weapon swapping for the flame thrower
|
|||
|
level.onPlayerWeaponSwap = maps\_coop_weaponswap::flamethrower_swap;
|
|||
|
|
|||
|
|
|||
|
// spawn player funcs
|
|||
|
|
|||
|
// TFLAME's stuff
|
|||
|
switch(getdifficulty() )
|
|||
|
{
|
|||
|
case "easy":
|
|||
|
level.difficulty = 1;
|
|||
|
break;
|
|||
|
case "medium":
|
|||
|
level.difficulty = 2;
|
|||
|
break;
|
|||
|
case "hard":
|
|||
|
level.difficulty = 3;
|
|||
|
break;
|
|||
|
case "fu":
|
|||
|
level.difficulty = 4;
|
|||
|
break;
|
|||
|
}
|
|||
|
setup_spawn_functions();
|
|||
|
wait_for_first_player();
|
|||
|
players = get_players();
|
|||
|
array_thread(players, :: player_setup);
|
|||
|
|
|||
|
level thread trigs_off();
|
|||
|
level thread trigs_setup();
|
|||
|
array_thread(get_players(), ::achivement_checker);
|
|||
|
level thread lastpit_trap();
|
|||
|
level thread chain_on_after_pit1clear();
|
|||
|
badplacesenable(0); // too much stupid AI when using flamethrower in trenches, they just stand there too often
|
|||
|
|
|||
|
//netfriendly spawner trigger stuff
|
|||
|
|
|||
|
trigs = getentarray("nolag_trigger_spawns", "script_noteworthy");
|
|||
|
array_thread(trigs, ::do_netfriendly_trigger_spawn);
|
|||
|
|
|||
|
trigs = getentarray("flood_spawner_netfriendly", "targetname");
|
|||
|
array_thread(trigs, ::do_netfriendly_flood_spawn);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if(NumRemoteClients() > 0) // networked coop
|
|||
|
{
|
|||
|
level.max_drones["allies"] = 8; // Down from 32
|
|||
|
level.max_drones["axis"] = 8; // Down from 32
|
|||
|
}
|
|||
|
|
|||
|
thread switch_in_flamethrower();
|
|||
|
|
|||
|
// Testing/Debug
|
|||
|
|
|||
|
level thread info_gather(); // TEMP constantly running loop to get level variables
|
|||
|
|
|||
|
/#
|
|||
|
// level thread debug_ai_counts();
|
|||
|
#/
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
switch_in_flamethrower()
|
|||
|
{
|
|||
|
flag_wait("starting final intro screen fadeout");
|
|||
|
|
|||
|
players = get_players();
|
|||
|
|
|||
|
players[0] TakeWeapon("thompson");
|
|||
|
players[0] GiveWeapon("m2_flamethrower");
|
|||
|
players[0] SwitchToWeapon("m2_flamethrower");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// flamer's info gatherer
|
|||
|
info_gather()
|
|||
|
{
|
|||
|
|
|||
|
while(1)
|
|||
|
{
|
|||
|
level.player = get_players()[0];
|
|||
|
ang = level.player getplayerangles();
|
|||
|
level.curious_mg = getent("auto2372", "targetname");
|
|||
|
wait 2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Sets all of the flags used in the level
|
|||
|
init_flags()
|
|||
|
|
|||
|
{
|
|||
|
// Used to determine if there is smoke in the event1_smoke_check trigger
|
|||
|
flag_init( "event1_smoke_popped" );
|
|||
|
|
|||
|
// Used to turn on/off the model3
|
|||
|
flag_init( "model3_fire_think" );
|
|||
|
flag_set( "model3_fire_think" );
|
|||
|
flag_init( "pit2_defenders_alerted");
|
|||
|
flag_init("player_attacking");
|
|||
|
flag_init("M2_achievement_failed");
|
|||
|
flag_init("stop_gunquake");
|
|||
|
|
|||
|
}
|
|||
|
//---------//
|
|||
|
// TESTING //
|
|||
|
//---------//
|
|||
|
|
|||
|
//---------------//
|
|||
|
// Setup section //
|
|||
|
//---------------//
|
|||
|
|
|||
|
// Sets up all of the initial level variables.
|
|||
|
setup_levelvars()
|
|||
|
{
|
|||
|
// global levelvars
|
|||
|
level.maxfriendlies = 3;
|
|||
|
level.mortar = level._effect["dirt_mortar"];
|
|||
|
level thread maps\_mortar::set_mortar_quake( "dirt_mortar", 0.4, 1, 1500 );
|
|||
|
|
|||
|
// local levelvars
|
|||
|
level.mortar_crews = 3;
|
|||
|
}
|
|||
|
|
|||
|
// Setup the spawn functions for spawners.
|
|||
|
setup_spawn_functions()
|
|||
|
{
|
|||
|
// TFLAME - Guess I do it different?
|
|||
|
array_thread(getentarray("charge_player", "script_noteworthy"), :: add_spawn_function, ::charge_player_dudes);
|
|||
|
array_thread(getentarray("player_hater", "script_noteworthy"), :: add_spawn_function, ::player_hater);
|
|||
|
array_thread(getentarray("martyr", "script_noteworthy"), :: add_spawn_function, ::martyrdom);
|
|||
|
array_thread(getentarray("pit2_defenders", "targetname"), :: add_spawn_function, ::pit2_defender_setup);
|
|||
|
array_thread(getentarray("pit2_defenders2", "targetname"), :: add_spawn_function, ::pit2_defender_setup);
|
|||
|
array_thread(getentarray("pit2_allies", "targetname"), :: add_spawn_function, ::pit2_attacker_setup);
|
|||
|
array_thread(getentarray("mortar_dudes", "script_noteworthy"), :: add_spawn_function, ::mortar_dudes_setup);
|
|||
|
array_thread(getentarray("no_climb", "script_noteworthy"), :: add_spawn_function, ::treesnipers_setup);
|
|||
|
array_thread(getentarray("tankrunners", "targetname"), :: add_spawn_function, ::road_runners);
|
|||
|
array_thread(getentarray("cave2_lastguys", "targetname"), :: add_spawn_function, ::killspawner_onspawn, 29);
|
|||
|
array_thread(getentarray("intro_helpout_dudes", "targetname"), :: add_spawn_function, ::intro_helpout_dudes_setup);
|
|||
|
array_thread(getentarray("pit1_mg_guy", "script_noteworthy"), :: add_spawn_function, ::my_mg_stop);
|
|||
|
array_thread(getentarray("outro_weary_walkers", "script_noteworthy"), :: add_spawn_function, ::weary_walkers_setup);
|
|||
|
array_thread(getentarray("outro_patrollers", "script_noteworthy"), :: add_spawn_function, ::patrollers_setup);
|
|||
|
array_thread(getentarray("traffic_dude", "script_noteworthy"), :: add_spawn_function, ::traffic_dude);
|
|||
|
array_thread(getentarray("e1_firstmortar_lastguys", "targetname"), :: add_spawn_function, ::killspawner_onspawn, 23);
|
|||
|
array_thread(getentarray("actor_ally_us_usmc_reg_flamethrower", "classname"), :: add_spawn_function, ::dont_drop_flamer);
|
|||
|
array_thread(getentarray("approaching_last_tunnel_guys", "targetname"), :: add_spawn_function, ::killspawner_onspawn, 32);
|
|||
|
|
|||
|
array_thread(getentarray("actor_axis_jap_reg_type100smg", "classname"), :: add_spawn_function, ::no_nades_oneasy);
|
|||
|
create_spawner_function( "actor_axis_jap_reg_type99rifle", "classname", ::no_nades_oneasy ); // apparently there are living guys even though i don't see any in radiant
|
|||
|
array_thread(getentarray("actor_axis_jap_reg_camo_type99rifle", "classname"), :: add_spawn_function, ::no_nades_oneasy);
|
|||
|
array_thread(getentarray("actor_axis_jap_reg_camo_type100smg", "classname"), :: add_spawn_function, ::no_nades_oneasy);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
middle_mger = getent("middle_mger", "script_noteworthy"); // this guy stops shooting for some reason
|
|||
|
middle_mger.ignoreme = true;
|
|||
|
middle_mg = getent("middle_mg", "targetname");
|
|||
|
middle_mg setturretignoregoals( true );
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Event2 Spawners
|
|||
|
create_spawner_function( "event2_mg42_spawner", "script_noteworthy", ::event2_mg42_target_wrapper );
|
|||
|
|
|||
|
// Event4 Spawners
|
|||
|
create_spawner_function( "event4_door_kicker", "script_noteworthy", ::event4_door_kicker );
|
|||
|
|
|||
|
// create_spawner_function( "event4_jap_officer", "script_noteworthy", ::event4_hara_kiri );
|
|||
|
// create_spawner_function( "event4_last_captor", "script_noteworthy", ::event4_hara_kiri );
|
|||
|
|
|||
|
create_spawner_function( "event4_talker", "script_noteworthy", ::event4_talker );
|
|||
|
}
|
|||
|
|
|||
|
my_func( parm1, parm2 )
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// Setup the threatbiasgroups
|
|||
|
setup_threatbiasgroups()
|
|||
|
{
|
|||
|
// threatbias group setups
|
|||
|
CreateThreatBiasGroup( "players" );
|
|||
|
CreateThreatBiasGroup( "friends" );
|
|||
|
CreateThreatBiasGroup( "japanese_turret_gunners" );
|
|||
|
CreateThreatBiasGroup( "player_haters" );
|
|||
|
CreateThreatBiasGroup( "pit2_defenders" );
|
|||
|
CreateThreatBiasGroup( "pit2_attackers" );
|
|||
|
|
|||
|
// ignoreme group setups
|
|||
|
SetIgnoreMeGroup( "players", "japanese_turret_gunners" ); //turret guys ignore all players
|
|||
|
SetIgnoreMeGroup( "friends", "japanese_turret_gunners" ); //turret guys ignore all friends
|
|||
|
SetIgnoreMeGroup( "japanese_turret_gunners", "friends" ); //friends ignore turretguys
|
|||
|
SetIgnoreMeGroup( "friends" , "player_haters"); //player_haters only hate player
|
|||
|
|
|||
|
setthreatbias("player_haters", "players", 10000);
|
|||
|
setthreatbias("players", "player_haters", 10000); // still confused as to which way is right
|
|||
|
}
|
|||
|
|
|||
|
// Sets up the friends array, as well as threatbiasgroiups for the friendlies.
|
|||
|
setup_friends()
|
|||
|
{
|
|||
|
// Main characters setup
|
|||
|
level.friends = [];
|
|||
|
|
|||
|
level.roebuck = GetEnt( "roebuck", "script_noteworthy" );
|
|||
|
level.roebuck.animname = "roebuck";
|
|||
|
level.friends[0] = level.roebuck;
|
|||
|
|
|||
|
level.polonsky = GetEnt( "polonsky", "script_noteworthy" );
|
|||
|
level.polonsky.animname = "polonsky";
|
|||
|
level.friends[1] = level.polonsky;
|
|||
|
|
|||
|
for( i = 0; i < level.friends.size; i++ )
|
|||
|
{
|
|||
|
level.friends[i] SetThreatBiasGroup( "friends" );
|
|||
|
level.friends[i] thread magic_bullet_shield();
|
|||
|
}
|
|||
|
|
|||
|
// Temporarily put these guys in god mode until they join the player's squad
|
|||
|
// TFLAME - I noticed this can look bad as they get shot with no reaction....
|
|||
|
/*
|
|||
|
joiners = GetEntArray( "event1_joiners", "targetname" );
|
|||
|
for( i = 0; i < joiners.size; i++ )
|
|||
|
{
|
|||
|
joiners[i] SetCanDamage( false );
|
|||
|
joiners[i] thread replace_on_death();
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
//-------------------//
|
|||
|
// Objective Section //
|
|||
|
//-------------------//
|
|||
|
|
|||
|
// The objecive setting function for pel1
|
|||
|
set_objective( num, ent )
|
|||
|
{
|
|||
|
startplace = GetDvar( "start" );
|
|||
|
|
|||
|
if( num == 1 )
|
|||
|
{
|
|||
|
// Get into the trenches.
|
|||
|
Objective_Add( 0, "active", &"PEL1A_OBJECTIVE1", ( level.roebuck.origin ) );
|
|||
|
}
|
|||
|
else if( num == 2 )
|
|||
|
{
|
|||
|
// Eliminate enemy mortar crews. [&&1 remaining]
|
|||
|
Objective_Add( 1, "active" );
|
|||
|
|
|||
|
Objective_String( 1, &"PEL1A_OBJECTIVE2", level.mortar_crews );
|
|||
|
|
|||
|
mortar_node1 = GetNode( "auto2233", "targetname" );
|
|||
|
objective_location = getstruct("mortar1_objective_location", "targetname");
|
|||
|
Objective_AdditionalPosition( 1, 0, objective_location.origin );
|
|||
|
|
|||
|
mortar_node2 = GetNode( "auto2237", "targetname" );
|
|||
|
Objective_AdditionalPosition( 1, 1, mortar_node2.origin );
|
|||
|
|
|||
|
mortar_node3 = GetNode( "auto4863", "targetname" );
|
|||
|
Objective_AdditionalPosition( 1, 2, mortar_node3.origin );
|
|||
|
|
|||
|
objective_current( 1 );
|
|||
|
|
|||
|
level thread objective_mortar_update( "pit1_lastbunker_guys", 0 );
|
|||
|
level thread objective_mortar_update( "pit2_defenders", 1 );
|
|||
|
level thread objective_mortar_update( "pit3_defenders", 2 );
|
|||
|
}
|
|||
|
else if( num == 3 )
|
|||
|
{
|
|||
|
// interrogate japanese officers
|
|||
|
struct = getstruct("regroup_objective_spot", "targetname");
|
|||
|
Objective_Add( 0, "active", &"PEL1A_OBJECTIVE3", struct.origin );
|
|||
|
objective_current(0);
|
|||
|
}
|
|||
|
else if( num == 4 )
|
|||
|
{
|
|||
|
objective_state( 0, "done" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
objective_mortar_update( mortar_aigroup, id )
|
|||
|
{
|
|||
|
waittill_aigroupcleared(mortar_aigroup);
|
|||
|
|
|||
|
increase_mortar_delay();
|
|||
|
|
|||
|
if (mortar_aigroup == "pit1_lastbunker_guys")
|
|||
|
{
|
|||
|
level thread maps\_utility::autosave_by_name( "pit1_clear" );
|
|||
|
}
|
|||
|
|
|||
|
level.mortar_crews--;
|
|||
|
|
|||
|
if( level.mortar_crews == 0 )
|
|||
|
{
|
|||
|
waittill_aigroupcleared("pit3_defenders");
|
|||
|
Objective_AdditionalPosition( 1, id, ( 0, 0, 0 ) );
|
|||
|
Objective_String_NoMessage( 1, &"PEL1A_OBJECTIVE2", level.mortar_crews );
|
|||
|
Objective_State( 1, "done" );
|
|||
|
set_objective( 3 );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (level.mortar_crews == 2)
|
|||
|
{
|
|||
|
// "One down. Move on!"\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "first_mortar_pit4");
|
|||
|
}
|
|||
|
|
|||
|
/*TFLAME - Moved elsewhere
|
|||
|
if (level.mortar_crews == 1)
|
|||
|
{
|
|||
|
|
|||
|
// "Taken out - One more pit to clear."\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "second_mortar_pit3");
|
|||
|
// "Keep it up."\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "second_mortar_pit4");
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
Objective_AdditionalPosition( 1, id, ( 0, 0, 0 ) );
|
|||
|
Objective_String( 1, &"PEL1A_OBJECTIVE2", level.mortar_crews );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Decreases the frequency of the mortar explosions
|
|||
|
increase_mortar_delay()
|
|||
|
{
|
|||
|
clientNotify("imd"); // increase mortar delay.
|
|||
|
|
|||
|
// Clientsided mortars.
|
|||
|
|
|||
|
/* min_delay = level._explosion_min_delay["dirt_mortar"] + ( level._explosion_min_delay["dirt_mortar"] * 0.5 );
|
|||
|
max_delay = level._explosion_max_delay["dirt_mortar"] + ( level._explosion_max_delay["dirt_mortar"] * 0.5 );
|
|||
|
maps\_mortar::set_mortar_delays( "dirt_mortar", min_delay, max_delay ); */
|
|||
|
}
|
|||
|
|
|||
|
//----------------//
|
|||
|
// Events Section //
|
|||
|
//----------------//
|
|||
|
|
|||
|
//---------//
|
|||
|
// Event 1 //
|
|||
|
//---------//
|
|||
|
|
|||
|
// Default start
|
|||
|
event1_start()
|
|||
|
{
|
|||
|
// Start the ambients
|
|||
|
level thread event1_ambients();
|
|||
|
|
|||
|
// Send out the ai with the drones
|
|||
|
spawners = getentarray("intro_drone_ai", "targetname");
|
|||
|
level thread simple_floodspawn(spawners);
|
|||
|
|
|||
|
// Set the bloomy vision
|
|||
|
//VisionSetNaked( "pel1a_intro", 1 );
|
|||
|
|
|||
|
// Set the door angles
|
|||
|
left_door = GetEnt( "bunker_door_left", "targetname" );
|
|||
|
right_door = GetEnt( "bunker_door_right", "targetname" );
|
|||
|
left_door.angles = ( 0, 45, 0 );
|
|||
|
right_door.angles = ( 0, -30, 0 );
|
|||
|
|
|||
|
level thread set_start_position( "event1_starts", true );
|
|||
|
level event1_radio_man();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
level.roebuck setgoalnode(getnode("sarge_intro_node","targetname"));
|
|||
|
level.radio_man setgoalnode(getnode("radio_guy_intro_node","targetname"));
|
|||
|
|
|||
|
issue_color_orders( "r0", "allies" );
|
|||
|
//issue_color_orders( "y0", "allies" );
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
flag_wait("all_players_connected");
|
|||
|
level thread event1_intro_music();
|
|||
|
level thread theres_only_one_Flamer();
|
|||
|
level.roebuck thread event1_intro_dialog();
|
|||
|
battlechatter_off("allies");
|
|||
|
level waittill( "introscreen_complete" );
|
|||
|
|
|||
|
//wait( 2 );
|
|||
|
|
|||
|
// Start the colors!
|
|||
|
|
|||
|
|
|||
|
level thread event1_plane_down();
|
|||
|
level thread event1_pop_smoke();
|
|||
|
level thread player_leaves_e1_early();
|
|||
|
//level thread event1_joiners();
|
|||
|
|
|||
|
// Start the mortars!
|
|||
|
|
|||
|
// Mortars moved to the client.
|
|||
|
|
|||
|
clientNotify("sm");
|
|||
|
|
|||
|
/*
|
|||
|
// Get the dust_points for the canned mortars.
|
|||
|
dust_points = getstructarray( "ceiling_dust", "targetname" );
|
|||
|
for( i = 0; i < dust_points.size; i++ )
|
|||
|
{
|
|||
|
// Tells explosion_activate that the struct is a struct and not an entity
|
|||
|
dust_points[i].is_struct = true;
|
|||
|
}
|
|||
|
|
|||
|
// level.roebuck thread maps\_anim::anim_single_solo( level.roebuck, "mortars_to_the_trenches" );
|
|||
|
//set_objective( 1 );
|
|||
|
|
|||
|
struct = getstruct( "event1_mortar1", "targetname" );
|
|||
|
struct.is_struct = true; // Tells explosion_activate that the struct is a struct and not an entity
|
|||
|
struct thread maps\_mortar::explosion_activate( "dirt_mortar", undefined, undefined, undefined, undefined, undefined, undefined, dust_points );
|
|||
|
|
|||
|
level thread maps\_mortar::mortar_loop( "dirt_mortar", 1 );
|
|||
|
|
|||
|
//trigger = GetEnt( "event1_mortar2", "targetname" );
|
|||
|
//trigger waittill( "trigger" );
|
|||
|
|
|||
|
struct = getstruct( "event1_mortar2", "targetname" );
|
|||
|
struct.is_struct = true; // Tells explosion_activate that the struct is a struct and not an entity
|
|||
|
struct thread maps\_mortar::explosion_activate( "dirt_mortar", undefined, undefined, undefined, undefined, undefined, undefined, dust_points );
|
|||
|
*/
|
|||
|
//TFLAME - Player shouldnt have to move to get started
|
|||
|
|
|||
|
set_objective( 2 );
|
|||
|
trigger = GetEnt( "event1_find_mortars", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
level notify ("headed to first mg");
|
|||
|
|
|||
|
level.radio_man enable_ai_color();
|
|||
|
level.roebuck enable_ai_color();
|
|||
|
|
|||
|
level.polonsky anim_single_solo( level.polonsky, "first_mg1" ); // "MG up on that hill!"\
|
|||
|
level.polonsky anim_single_solo( level.polonsky, "first_mg2" ); // "It's tearing up our men!"\
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mg3" ); // "Throw some smoke for cover!... Or it will rip us to shreds!"\
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
event1_intro_dialog()
|
|||
|
{
|
|||
|
level endon ("headed to first mg");
|
|||
|
|
|||
|
level thread event1_radio_guy_moveup();
|
|||
|
|
|||
|
self.animname = "roebuck";
|
|||
|
wait 1.5;
|
|||
|
self anim_single_solo(self, "intro1"); // "Our Tanks are getting hammered by mortar fire!"\
|
|||
|
self anim_single_solo(self, "intro2"); // "We're need to clear these trenches and knock out each mortar pit!"\
|
|||
|
self anim_single_solo(self, "intro3"); // "Get ready with that flamethrower!"\
|
|||
|
self anim_single_solo(self, "intro4"); // "Incoming!!!"\
|
|||
|
//wait 1; // too long of a wait right now, no dialogue yet
|
|||
|
|
|||
|
// turn on roebucks color Ai again, send the squad up if the player hasn't moved up yet
|
|||
|
self enable_ai_color();
|
|||
|
battlechatter_on("allies");
|
|||
|
battlechatter_on("axis");
|
|||
|
battlechatter_on();
|
|||
|
|
|||
|
trig = getent("event1_find_mortars","targetname");
|
|||
|
|
|||
|
if (isdefined(trig))
|
|||
|
{
|
|||
|
trig notify ("trigger");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
event1_radio_guy_moveup()
|
|||
|
{
|
|||
|
trigger_wait("event1_find_mortars","targetname");
|
|||
|
|
|||
|
wait 2.25;
|
|||
|
level.radio_man enable_ai_color();
|
|||
|
}
|
|||
|
|
|||
|
event1_radio_man()
|
|||
|
{
|
|||
|
level.radio_man = GetEnt( "radio_man", "targetname" );
|
|||
|
level.radio_man thread magic_bullet_shield();
|
|||
|
level.radio_man.animname = "radio_man";
|
|||
|
//radio_man maps\_anim::anim_single_solo( radio_man, "air_support" );
|
|||
|
|
|||
|
level.radio_man set_force_color( "y" );
|
|||
|
}
|
|||
|
|
|||
|
// Ambients
|
|||
|
event1_ambients()
|
|||
|
{
|
|||
|
// Put the Bunker MG gunners in "god" mode till the player flanks.
|
|||
|
guys = GetEntArray( "bunker_mg_gunners", "targetname" );
|
|||
|
|
|||
|
for( i = 0; i < guys.size; i++ ) // this needs to be turned back on for when player can flank behind
|
|||
|
{
|
|||
|
guys[i] SetCanDamage( false );
|
|||
|
}
|
|||
|
|
|||
|
// Set the mgs to only shoot at drones
|
|||
|
mgs = GetEntArray( "bunker_mgs", "script_noteworthy" );
|
|||
|
|
|||
|
for( i = 0; i < mgs.size; i++ )
|
|||
|
{
|
|||
|
mgs[i].script_fireondrones = true;
|
|||
|
mgs[i] thread maps\_mgturret::mg42_target_drones( false, "axis" );
|
|||
|
}
|
|||
|
|
|||
|
level thread event1_model3_fire_think();
|
|||
|
}
|
|||
|
|
|||
|
event1_model3_fire_think()
|
|||
|
{
|
|||
|
gun = GetEnt( "model3_gun", "targetname" );
|
|||
|
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
if( !flag( "model3_fire_think" ) )
|
|||
|
{
|
|||
|
wait( 0.05 );
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
gun FireWeapon();
|
|||
|
gun notify( "model3_fired" );
|
|||
|
if (!flag("stop_gunquake") )
|
|||
|
{
|
|||
|
earthquake (0.5, 0.7, gun.origin, 8000);
|
|||
|
}
|
|||
|
wait( RandomFloatRange( 6, 10 ) );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Set the vision for right after the introscreen
|
|||
|
event1_intro_music()
|
|||
|
{
|
|||
|
wait( 1 );
|
|||
|
//TUEY Set Music State to INTRO
|
|||
|
setmusicstate("INTRO");
|
|||
|
//VisionSetNaked( "pel1a", 5 );
|
|||
|
}
|
|||
|
|
|||
|
event1_bunker_doors_open()
|
|||
|
{
|
|||
|
left_door = GetEnt( "bunker_door_left", "targetname" );
|
|||
|
left_door.script_linkto = "origin_animate_jnt";
|
|||
|
|
|||
|
right_door = GetEnt( "bunker_door_right", "targetname" );
|
|||
|
right_door.script_linkto = "origin_animate_jnt";
|
|||
|
|
|||
|
left_door ConnectPaths();
|
|||
|
right_door ConnectPaths();
|
|||
|
|
|||
|
// left_door RotateTo( ( 0, 90, 0 ), 3, 1, 0.2 );
|
|||
|
// right_door RotateTo( ( 0, -95, 0 ), 3.5, 2, 0.3 );
|
|||
|
|
|||
|
level thread maps\_anim::anim_ents_solo( left_door, "open", undefined, undefined, left_door, "bunker_door_left" );
|
|||
|
level thread maps\_anim::anim_ents_solo( right_door, "open", undefined, undefined, right_door, "bunker_door_right" );
|
|||
|
|
|||
|
anim_org = getstruct( "event1_intro_spot", "targetname" );
|
|||
|
guys[0] = level.polonsky;
|
|||
|
guys[1] = level.roebuck;
|
|||
|
|
|||
|
level thread maps\_anim::anim_single( guys, "event1_open_door", undefined, undefined, anim_org );
|
|||
|
}
|
|||
|
|
|||
|
//event1_intro_dialogue()
|
|||
|
//{
|
|||
|
// level.polonsky maps\_anim::anim_single( level.polonsky, "intro_talk" );
|
|||
|
// level.roebuck maps\_anim::anim_single( level.roebuck, "intro_talk" );
|
|||
|
//}
|
|||
|
|
|||
|
//// Tells the Joiners to group with the squad.
|
|||
|
//event1_joiners()
|
|||
|
//{
|
|||
|
// trigger = GetEnt( "event1_joiners_trigger", "targetname" );
|
|||
|
//
|
|||
|
// guys = GetEntArray( "event1_joiners", "targetname" );
|
|||
|
// for( i = 0; i < guys.size; i++ )
|
|||
|
// {
|
|||
|
// guys[i] set_force_color( "r" );
|
|||
|
// guys[i].animname = "joiner";
|
|||
|
// guys[i].ignoreall = true;
|
|||
|
// }
|
|||
|
//
|
|||
|
// trigger = GetEnt( "event1_joiner_rush_talk", "targetname" );
|
|||
|
// trigger waittill( "trigger", guy );
|
|||
|
//
|
|||
|
// maps\_anim::anim_single_solo( guy, "rush_talk" );
|
|||
|
//
|
|||
|
// for( i = 0; i < guys.size; i++ )
|
|||
|
// {
|
|||
|
// guys[i] event1_joiners_thread();
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
// When the Joiners get to their goal (color node), reset the ignores/damage variables.
|
|||
|
//event1_joiners_thread()
|
|||
|
//{
|
|||
|
// self waittill( "goal" );
|
|||
|
//
|
|||
|
// self SetCanDamage( true );
|
|||
|
// self.ignoreall = false;
|
|||
|
//}
|
|||
|
|
|||
|
// Start the little plane-being-shot-down vignette
|
|||
|
event1_plane_down()
|
|||
|
{
|
|||
|
trigger = GetEnt( "event1_plane_down", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
//level.polonsky thread maps\_anim::anim_single_solo( level.polonsky, "plane_down1" );
|
|||
|
|
|||
|
level thread event1_plane_explosion();
|
|||
|
}
|
|||
|
|
|||
|
// Plays the proper FX for the plane
|
|||
|
event1_plane_explosion()
|
|||
|
{
|
|||
|
v_node = GetVehicleNode( "auto4820", "targetname" );
|
|||
|
v_node waittill( "trigger", plane );
|
|||
|
|
|||
|
PlayFx( level._effect["plane_explosion"], plane GetTagOrigin( "tag_prop" ) );
|
|||
|
PlayFxOnTag( level._effect["plane_trail"], plane, "tag_prop" );
|
|||
|
//level.polonsky thread maps\_anim::anim_single_solo( level.polonsky, "plane_down2" );
|
|||
|
|
|||
|
plane waittill( "reached_end_node" );
|
|||
|
PlayFx( level._effect["plane_ground_explosion"], plane.origin );
|
|||
|
playsoundatposition("pel1a_corsair_crash", plane.origin);
|
|||
|
}
|
|||
|
|
|||
|
// Roebuck pops smoke
|
|||
|
event1_pop_smoke()
|
|||
|
{
|
|||
|
level endon( "stop_pop_smoke" );
|
|||
|
|
|||
|
smoke_trigger = GetEnt( "event1_smoke_trigger_check", "targetname" );
|
|||
|
smoke_trigger thread check_smoke_in_trigger( "event1_smoke_popped" );
|
|||
|
|
|||
|
trigger = GetEnt( "event1_pop_smoke", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
|
|||
|
level thread smoke_hint_and_reset();
|
|||
|
level thread event1_pop_smoke_skip();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
level thread event1_pop_smoke_anim();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
level waittill( "event1_smoke_popped" );
|
|||
|
wait( 8 );
|
|||
|
|
|||
|
// level.roebuck custom_battlechatter( "move_generic" );
|
|||
|
|
|||
|
level notify( "smoke_popped" );
|
|||
|
|
|||
|
level thread event2();
|
|||
|
}
|
|||
|
|
|||
|
// Check to see if the player skips the pop smoke scene
|
|||
|
event1_pop_smoke_skip()
|
|||
|
{
|
|||
|
level endon( "smoke_popped" );
|
|||
|
trigger = GetEnt( "ev4_mortarcrew_spawn_trig", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
// Player made it past the pop smoke without waiting
|
|||
|
level notify( "stop_pop_smoke" );
|
|||
|
|
|||
|
level thread event2();
|
|||
|
}
|
|||
|
|
|||
|
// Tells Roebuck to toss a smoke grenade
|
|||
|
event1_pop_smoke_anim()
|
|||
|
{
|
|||
|
level endon( "stop_pop_smoke" );
|
|||
|
|
|||
|
while(1)
|
|||
|
{
|
|||
|
nades = get_players()[0] getweaponammostock("m8_white_smoke");
|
|||
|
if (nades == 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
wait 0.5;
|
|||
|
}
|
|||
|
|
|||
|
node = GetNode( "event1_pop_smoke", "targetname" );
|
|||
|
// level.roebuck maps\_anim::anim_single_solo( level.roebuck, "will_pop_smoke" );
|
|||
|
|
|||
|
og_radius = level.roebuck.goalradius;
|
|||
|
|
|||
|
//TFLAME - dunno why need to do this
|
|||
|
// level.roebuck disable_ai_color();
|
|||
|
level.roebuck PushPlayer( true );
|
|||
|
level.roebuck.dontavoidplayer = true;
|
|||
|
level.roebuck.goalradius = 4;
|
|||
|
level.roebuck.ignoreall = true;
|
|||
|
level.roebuck.ignoreme = true;
|
|||
|
level.roebuck SetCanDamage( false );
|
|||
|
level.roebuck disable_pain();
|
|||
|
|
|||
|
level.roebuck SetGoalNode( node );
|
|||
|
level.roebuck waittill( "goal" );
|
|||
|
|
|||
|
level.roebuck maps\_grenade_toss::force_grenade_toss( ( 27000, -3896, 8 ), "m8_white_smoke" );
|
|||
|
level.roebuck.goalradius = og_radius;
|
|||
|
|
|||
|
level.roebuck PushPlayer( false );
|
|||
|
level.roebuck.dontavoidplayer = false;
|
|||
|
level.roebuck.ignoreall = false;
|
|||
|
level.roebuck SetCanDamage( true );
|
|||
|
level.roebuck enable_pain();
|
|||
|
level.roebuck.ignoreme = false;
|
|||
|
|
|||
|
level.roebuck enable_ai_color();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//---------//
|
|||
|
// EVENT 2 //
|
|||
|
//---------//
|
|||
|
|
|||
|
event2_start()
|
|||
|
{
|
|||
|
set_start_position( "event2_starts" ); // AI First
|
|||
|
set_start_position( "event2_starts", true ); // Players 2nd
|
|||
|
set_start_objective( 2 );
|
|||
|
|
|||
|
// // Re-enable the joiners damage.
|
|||
|
// joiners = GetEntArray( "event1_joiners", "targetname" );
|
|||
|
// for( i = 0; i < joiners.size; i++ )
|
|||
|
// {
|
|||
|
// joiners[i] SetCanDamage( true );
|
|||
|
//
|
|||
|
// // Reset the color and animnames.
|
|||
|
// joiners[i] set_force_color( "r" );
|
|||
|
// joiners[i].animname = "joiner";
|
|||
|
// }
|
|||
|
|
|||
|
// Start the drones
|
|||
|
trigger = GetEnt( "auto878", "target" );
|
|||
|
trigger notify( "trigger" );
|
|||
|
|
|||
|
// Start the ambients
|
|||
|
level thread event1_ambients();
|
|||
|
|
|||
|
// Start the mortars
|
|||
|
// level thread maps\_mortar::mortar_loop( "dirt_mortar", 1 );
|
|||
|
clientNotify("sm");
|
|||
|
|
|||
|
// Start the friendly reinforcements
|
|||
|
trigger = GetEnt( "auto4850", "target" );
|
|||
|
trigger notify( "trigger" );
|
|||
|
|
|||
|
level thread event2();
|
|||
|
}
|
|||
|
|
|||
|
event2()
|
|||
|
{
|
|||
|
thread event2_moveup_dialog();
|
|||
|
thread event2_uphill_dialog();
|
|||
|
|
|||
|
spawners = getentarray("intro_helpout_dudes", "targetname");
|
|||
|
if (level.difficulty < 4)
|
|||
|
{
|
|||
|
level thread simple_spawn( spawners, randomintrange(10, 20) ); // guys that help you out if you are pinned down by ridge guys in begining
|
|||
|
}
|
|||
|
|
|||
|
// Make it so only the left side of the intro brunker, drones are going.
|
|||
|
trigger = GetEnt( "auto878", "target" );
|
|||
|
temp_array = [];
|
|||
|
for( i = 0; i < trigger.targeted.size; i++ )
|
|||
|
{
|
|||
|
if( trigger.targeted[i].origin[0] < 27200 )
|
|||
|
{
|
|||
|
temp_array[temp_array.size] = trigger.targeted[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
trigger.targeted = temp_array;
|
|||
|
|
|||
|
// Drone trigger
|
|||
|
trigger = GetEnt( "auto878", "target" );
|
|||
|
|
|||
|
// Turn down the amount of drones
|
|||
|
trigger.script_delay_min = 1;
|
|||
|
trigger.script_delay_max = 5;
|
|||
|
|
|||
|
getent("squad_up_past_smoke_chain", "targetname") notify ("trigger");
|
|||
|
|
|||
|
//kill off the intro ai fakedrones
|
|||
|
maps\_spawner::kill_spawnernum(120);
|
|||
|
allies = getaiarray("allies");
|
|||
|
for (i=0; i < allies.size; i++)
|
|||
|
{
|
|||
|
if (isdefined(allies[i].script_noteworthy) && allies[i].script_noteworthy == "intro_drone_ai")
|
|||
|
{
|
|||
|
allies[i] thread wait_and_kill(randomint(10) );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
trigger = GetEnt( "event3", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
level thread event3();
|
|||
|
}
|
|||
|
|
|||
|
event2_uphill_dialog()
|
|||
|
{
|
|||
|
level thread cave2_clear();
|
|||
|
trigger_wait("pit2_chain","script_noteworthy");
|
|||
|
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "up_hill1"); // "Get up there!"\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "up_hill2"); // "Take the high ground!"\
|
|||
|
|
|||
|
wait 3;
|
|||
|
level.polonsky anim_single_solo(level.polonsky, "second_mortar_pit1"); // "There's the next mortar pit!"\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "second_mortar_pit2"); // "Burn 'em!!!!"\
|
|||
|
|
|||
|
waittill_aigroupcleared("pit2_defenders");
|
|||
|
// "Taken out - One more pit to clear."\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "second_mortar_pit3");
|
|||
|
// "Keep it up."\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "second_mortar_pit4");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
event2_moveup_dialog()
|
|||
|
{
|
|||
|
level notify ("squad_moving_up");
|
|||
|
wait 1;
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mg5" ); // "Go!"\
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mg7" ); // "All right... let's keep on 'em!"\
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mg8" ); // "This way!"\
|
|||
|
|
|||
|
wait 2;
|
|||
|
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mortar_pit1" ); // "Eyes open!"\
|
|||
|
level.polonsky anim_single_solo( level.polonsky, "first_mortar_pit2" ); // "First mortar pit up ahead!"\
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mortar_pit3" ); // "Go clear it out, Miller<65>"\
|
|||
|
}
|
|||
|
|
|||
|
// Handles the movement of the mg42 target
|
|||
|
event2_mg42_target_wrapper()
|
|||
|
{
|
|||
|
level thread event2_mg42_target( self );
|
|||
|
|
|||
|
level thread event2_mg_dialogue( self );
|
|||
|
}
|
|||
|
|
|||
|
event2_mg_dialogue( guy )
|
|||
|
{
|
|||
|
guy endon( "death" );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
// level.polonsky thread maps\_anim::anim_single_solo( level.polonsky, "take_out_mg" );
|
|||
|
}
|
|||
|
|
|||
|
event2_mg42_target( guy )
|
|||
|
{
|
|||
|
turret = GetEnt( "event2_mg42_gun", "script_noteworthy" );
|
|||
|
|
|||
|
center = ( 26134, -3170, -80 );
|
|||
|
|
|||
|
target = Spawn( "script_origin", center );
|
|||
|
target thread event2_mg42_target_movement();
|
|||
|
|
|||
|
trigger = Spawn( "trigger_radius", center, 2, 84, 200 );
|
|||
|
|
|||
|
current_mode = "";
|
|||
|
request_mode = "manual_ai";
|
|||
|
|
|||
|
while( IsAlive( guy ) )
|
|||
|
{
|
|||
|
if( current_mode != request_mode )
|
|||
|
{
|
|||
|
current_mode = request_mode;
|
|||
|
turret SetMode( current_mode );
|
|||
|
|
|||
|
if( current_mode == "manual_ai" )
|
|||
|
{
|
|||
|
guy SetEntityTarget( target );
|
|||
|
turret SetTargetEntity( target );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
guy ClearEntityTarget( target );
|
|||
|
turret ClearTargetEntity( target );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Check to see if anyone is touching the trigger
|
|||
|
if( any_player_IsTouching( trigger ) )
|
|||
|
{
|
|||
|
request_mode = "auto_ai";
|
|||
|
}
|
|||
|
else if( trigger team_is_touching( "allies" ) )
|
|||
|
{
|
|||
|
request_mode = "auto_ai";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
request_mode = "manual_ai";
|
|||
|
}
|
|||
|
|
|||
|
wait( 0.1 );
|
|||
|
}
|
|||
|
|
|||
|
target Delete();
|
|||
|
trigger Delete();
|
|||
|
}
|
|||
|
|
|||
|
event2_mg42_target_movement()
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
|
|||
|
x = 26128;
|
|||
|
min_y = 3136;
|
|||
|
min_z = 70;
|
|||
|
max_y = 3240;
|
|||
|
max_z = 83;
|
|||
|
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
pos = ( x, RandomFloatRange( min_y, max_y ) * -1, RandomFloatRange( min_z, max_z ) * -1 );
|
|||
|
self MoveTo( pos, RandomFloat( 3, 7 ) );
|
|||
|
self waittill( "movedone" );
|
|||
|
|
|||
|
wait( RandomFloat( 1, 5 ) );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//---------//
|
|||
|
// Event 3 //
|
|||
|
//---------//
|
|||
|
|
|||
|
event3_start()
|
|||
|
{
|
|||
|
//delete_ent( "auto3286", "target" ); // Trigger that spawns guys in the bunker at the start
|
|||
|
level event1_radio_man();
|
|||
|
set_start_position( "event3_starts" ); // AI First
|
|||
|
set_start_position( "event3_starts", true ); // Players 2nd
|
|||
|
set_start_objective( 2 );
|
|||
|
|
|||
|
wait 1;
|
|||
|
maps\_spawner::kill_spawnernum(200);
|
|||
|
maps\_spawner::kill_spawnernum(23);
|
|||
|
maps\_spawner::kill_spawnernum(25);
|
|||
|
|
|||
|
// Start the colors!
|
|||
|
//issue_color_orders( "r7", "allies" );
|
|||
|
|
|||
|
// Re-enable the joiners damage.
|
|||
|
// joiners = GetEntArray( "event1_joiners", "targetname" );
|
|||
|
// for( i = 0; i < joiners.size; i++ )
|
|||
|
// {
|
|||
|
// joiners[i] SetCanDamage( true );
|
|||
|
//
|
|||
|
// // Reset the color and animnames.
|
|||
|
// joiners[i] set_force_color( "r" );
|
|||
|
// joiners[i].animname = "joiner";
|
|||
|
// }
|
|||
|
|
|||
|
// Start the drones
|
|||
|
trigger = GetEnt( "auto878", "target" );
|
|||
|
trigger notify( "trigger" );
|
|||
|
|
|||
|
// Start the ambients
|
|||
|
level thread event1_ambients();
|
|||
|
|
|||
|
// Start the mortars
|
|||
|
//level thread maps\_mortar::mortar_loop( "dirt_mortar", 1 );
|
|||
|
clientNotify("sm");
|
|||
|
|
|||
|
// Start the friendly reinforcements
|
|||
|
//trigger = GetEnt( "auto4850", "target" );
|
|||
|
//trigger notify( "trigger" );
|
|||
|
|
|||
|
level thread event3();
|
|||
|
}
|
|||
|
|
|||
|
// Sets up a couple threads for Event3.
|
|||
|
event3()
|
|||
|
{
|
|||
|
level thread distance_fight_smoke_hint();
|
|||
|
level thread event3_mg_blow();
|
|||
|
level thread pit2_threatbias_setup();
|
|||
|
level thread kill_middle_mger();
|
|||
|
|
|||
|
level thread event3_ridge_enemy_dialog();
|
|||
|
|
|||
|
level thread event4();
|
|||
|
|
|||
|
// wait_for_first_player();
|
|||
|
// players = get_players();
|
|||
|
// while( 1 )
|
|||
|
// {
|
|||
|
// origin2 = players[0].origin - ( 0, 100, 0 );
|
|||
|
// PlayFx( level._effect["mg_tunnel_explosion"], players[0].origin, VectorNormalize( players[0].origin - origin2 ) );
|
|||
|
// wait( 3 );
|
|||
|
// }
|
|||
|
|
|||
|
trigger = GetEnt( "event3_ridge", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
// level.polonsky thread maps\_anim::anim_single_solo( level.polonsky, "lookout" );
|
|||
|
}
|
|||
|
|
|||
|
event3_ridge_enemy_dialog()
|
|||
|
{
|
|||
|
trigger_wait("event3_ridge", "targetname");
|
|||
|
maps\_spawner::kill_spawnernum(23);
|
|||
|
level.polonsky anim_single_solo(level.polonsky, "treesnipers"); // "We got snipers in the trees!"
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "barrel_enemies1"); // "Take cover! Behind the barrels, get down!"\
|
|||
|
wait 5;
|
|||
|
level.polonsky anim_single_solo(level.polonsky, "ridge_enemies1"); // "Look out! Enemies on the ridge!"\
|
|||
|
}
|
|||
|
|
|||
|
event3_mg_blow()
|
|||
|
{
|
|||
|
trigger = GetEnt( "event3_mg_blow", "targetname" );
|
|||
|
|
|||
|
amount = 0;
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
trigger waittill( "damage", dmg, attacker, dir, point, type );
|
|||
|
|
|||
|
if( attacker.classname == "script_model" )
|
|||
|
{
|
|||
|
amount += dmg;
|
|||
|
}
|
|||
|
|
|||
|
if( amount > 400 )
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
struct = getstruct( trigger.target, "targetname" );
|
|||
|
PlayFx( level._effect["mg_tincan_explosion"], struct.origin );
|
|||
|
|
|||
|
origin = struct.origin - ( 0, 0, 200 );
|
|||
|
origin2 = struct.origin - ( 0, 100, 200 );
|
|||
|
forward = VectorNormalize( origin - origin2 );
|
|||
|
PlayFx( level._effect["mg_tunnel_explosion"], origin, forward );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
origin = struct.origin - ( 0, 0, 100 );
|
|||
|
PlayFx( level._effect["smoke_plume_xlg_slow_blk_w"], origin );
|
|||
|
}
|
|||
|
|
|||
|
//---------//
|
|||
|
// Event 4 //
|
|||
|
//---------//
|
|||
|
event4_start()
|
|||
|
{
|
|||
|
|
|||
|
set_start_position( "event4_starts" ); // AI First
|
|||
|
set_start_position( "event4_starts", true ); // Players 2nd
|
|||
|
|
|||
|
wait 12;
|
|||
|
players = get_players();
|
|||
|
if (players.size == 1)
|
|||
|
{
|
|||
|
getent("tanks_movein","targetname") notify ("trigger");
|
|||
|
}
|
|||
|
|
|||
|
set_start_objective( 2 );
|
|||
|
set_mortar_notify( 2 );
|
|||
|
|
|||
|
// Start the colors!
|
|||
|
issue_color_orders( "r7", "allies" );
|
|||
|
|
|||
|
// Re-enable the joiners damage.
|
|||
|
// joiners = GetEntArray( "event1_joiners", "targetname" );
|
|||
|
// for( i = 0; i < joiners.size; i++ )
|
|||
|
// {
|
|||
|
// joiners[i] SetCanDamage( true );
|
|||
|
//
|
|||
|
// // Reset the color and animnames.
|
|||
|
// joiners[i] set_force_color( "r" );
|
|||
|
// joiners[i].animname = "joiner";
|
|||
|
// }
|
|||
|
|
|||
|
// Start the drones
|
|||
|
// trigger = GetEnt( "auto878", "target" );
|
|||
|
// trigger notify( "trigger" );
|
|||
|
|
|||
|
// Start the ambients
|
|||
|
level thread event1_ambients();
|
|||
|
|
|||
|
// Start the mortars
|
|||
|
// level thread maps\_mortar::mortar_loop( "dirt_mortar", 1 );
|
|||
|
|
|||
|
// Start the friendly reinforcements
|
|||
|
trigger = GetEnt( "auto4850", "target" );
|
|||
|
trigger notify( "trigger" );
|
|||
|
|
|||
|
level thread event4();
|
|||
|
}
|
|||
|
|
|||
|
event4()
|
|||
|
{
|
|||
|
// You are far enough, be sure the spawners are dead back in event2.
|
|||
|
scripted_kill_spawners( 200 );
|
|||
|
level thread before_last_tunnel_guys_clear();
|
|||
|
|
|||
|
trigger = GetEnt( "event4", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
thread event4_tunnel_dialog();
|
|||
|
|
|||
|
// Clear out the guys we don't want to see at the end of the level.
|
|||
|
level thread bloody_death_array( "event3_ridge_guys", "script_noteworthy" );
|
|||
|
|
|||
|
guys = GetAiArray( "axis" );
|
|||
|
for( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
if( guys[i].origin[0] < 27000 )
|
|||
|
{
|
|||
|
guys[i] thread bloody_death( 5 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
flag_clear( "model3_fire_think" );
|
|||
|
|
|||
|
level thread event4_tank_dust();
|
|||
|
level thread event4_last_area();
|
|||
|
}
|
|||
|
|
|||
|
event4_tunnel_dialog()
|
|||
|
{
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "third_mortar_pit3"); // "Get in there and clear those tunnels!"\
|
|||
|
|
|||
|
trigger_wait("event4_dialog_tunnels", "targetname");
|
|||
|
waittill_aigroupcleared("pre_pit3_defenders");
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "third_mortar_pit1"); // "Last mortar pit's dead ahead - Move!"\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "third_mortar_pit2"); // "We're almost done here."\
|
|||
|
|
|||
|
while (level.mortar_crews)
|
|||
|
{
|
|||
|
wait 0.5;
|
|||
|
}
|
|||
|
waittill_aigroupcleared("pit3_defenders");
|
|||
|
axis = getaiarray("axis");
|
|||
|
for (i=0; i < axis.size; i++)
|
|||
|
{
|
|||
|
axis[i] thread wait_and_kill(randomfloat(1,5));
|
|||
|
}
|
|||
|
|
|||
|
waittill_aigroupcleared("pre_pit3_defenders");
|
|||
|
waittill_aigroupcleared("pit1_lastbunker_guys"); // more checks since i changed up event 1
|
|||
|
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "third_mortar_pit5"); // "Outstanding!"\
|
|||
|
level thread battlechatter_off("allies");
|
|||
|
|
|||
|
level.at_end_place_count = 0;
|
|||
|
|
|||
|
level.roebuck disable_ai_color();
|
|||
|
level.radio_man disable_ai_color();
|
|||
|
level.polonsky disable_ai_color();
|
|||
|
|
|||
|
level.roebuck thread add_to_place_count_on_goal("end_sarge_node");
|
|||
|
level.radio_man thread add_to_place_count_on_goal("end_radio_guy_node");
|
|||
|
level.polonsky thread add_to_place_count_on_goal("end_polo_node");
|
|||
|
|
|||
|
while (level.at_end_place_count != 3)
|
|||
|
{
|
|||
|
wait 0.1;
|
|||
|
}
|
|||
|
getent("player_in_regroup_spot", "targetname") trigger_on();
|
|||
|
getent("player_in_regroup_spot", "targetname") waittill ("trigger");
|
|||
|
|
|||
|
thread end_level();
|
|||
|
}
|
|||
|
|
|||
|
add_to_place_count_on_goal(node_string)
|
|||
|
{
|
|||
|
self.goalradius = 256;
|
|||
|
|
|||
|
self setgoalnode(getnode(node_string,"targetname"));
|
|||
|
self thread early_goal_arrive();
|
|||
|
self waittill ("goal");
|
|||
|
level.at_end_place_count++;
|
|||
|
}
|
|||
|
|
|||
|
early_goal_arrive()
|
|||
|
{
|
|||
|
self endon ("goal");
|
|||
|
wait 0.05;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
dist = distance(self.origin, self.goalpos);
|
|||
|
if (dist < 400)
|
|||
|
{
|
|||
|
self notify ("goal");
|
|||
|
}
|
|||
|
wait 0.05;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
end_level()
|
|||
|
{
|
|||
|
time = 0;
|
|||
|
players = get_players(); // Check for M2 and u cheev
|
|||
|
if (players.size == 1)
|
|||
|
{
|
|||
|
getent("tanks_movein","targetname") notify ("trigger");
|
|||
|
time = 6;
|
|||
|
}
|
|||
|
|
|||
|
thread end_level_dialog(time);
|
|||
|
}
|
|||
|
|
|||
|
end_level_dialog(time)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
//TUEY Set music state to Level End
|
|||
|
setmusicstate("LEVEL_END");
|
|||
|
|
|||
|
// _endmission.gsc already checks this
|
|||
|
// players = get_players(); // Check for M2 and u cheev
|
|||
|
// for (i=0; i < players.size; i++)
|
|||
|
// {
|
|||
|
// if (isdefined(players[i].failedachievement) && players[i].failedachievement == false)
|
|||
|
// {
|
|||
|
// players[i] maps\_utility::giveachievement_wrapper( "ANY_ACHIEVEMENT_FTONLY");
|
|||
|
// //iprintlnbold("ACHIEVEMENT GW");
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
level.radio_man anim_single_solo(level.radio_man, "outro1"); //"Sir - Mortar pits have been neutralized... Tanks are now en route to the point."\
|
|||
|
level.polonsky anim_single_solo(level.polonsky, "outro2"); // "Tanks are moving up!"\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "outro3"); // "Radio command - Tell 'em we've cleared the mortar pits."\
|
|||
|
level.roebuck anim_single_solo(level.roebuck, "outro4"); // "Good work, Marines<65>"\
|
|||
|
|
|||
|
set_objective(4);
|
|||
|
|
|||
|
if (isdefined(time))
|
|||
|
{
|
|||
|
wait time;
|
|||
|
}
|
|||
|
nextmission();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
event4_tank_dust()
|
|||
|
{
|
|||
|
level waittill( "vehiclegroup spawned" + 5, tanks );
|
|||
|
|
|||
|
for( i = 0; i < tanks.size; i++ )
|
|||
|
{
|
|||
|
tanks[i] thread event4_tank_dust_think();
|
|||
|
}
|
|||
|
|
|||
|
v_node = GetVehicleNode( "auto3451", "targetname" );
|
|||
|
v_node waittill( "trigger" );
|
|||
|
|
|||
|
// level.polonsky thread maps\_anim::anim_single_solo( level.polonsky, "tanks_show_up" );
|
|||
|
}
|
|||
|
|
|||
|
event4_tank_dust_think()
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
|
|||
|
range = 180;
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
if( self.origin[1] < -1900 )
|
|||
|
{
|
|||
|
wait( 0.2 );
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
tank_forward = AnglesToForward( ( 0, self.angles[1], 0 ) );
|
|||
|
tank_origin = self.origin + vector_multiply( tank_forward, 100 );
|
|||
|
|
|||
|
yaw = RandomInt( 360 );
|
|||
|
|
|||
|
forward = AnglesToForward( ( 0, yaw, 0 ) );
|
|||
|
origin = tank_origin + vector_multiply( forward, RandomInt( range ) );
|
|||
|
|
|||
|
if( self.origin[1] > -1400 )
|
|||
|
{
|
|||
|
origin = ( origin[0], origin[1], 24 );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
origin = ( origin[0], origin[1], 80 );
|
|||
|
}
|
|||
|
|
|||
|
PlayFX( level._effect["ceiling_dust"], origin );
|
|||
|
|
|||
|
wait( RandomFloat( 0.5 ) );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Spawner function
|
|||
|
event4_door_kicker()
|
|||
|
{
|
|||
|
self.animname = "event4_door_kicker";
|
|||
|
self SetCanDamage( false );
|
|||
|
|
|||
|
door = GetEnt( "kick_door1", "targetname" );
|
|||
|
maps\_anim::anim_reach_solo( self, "kick_door", undefined, undefined, door );
|
|||
|
maps\_anim::anim_single_solo( self, "kick_door", undefined, undefined, door );
|
|||
|
issue_color_orders( "r15", "allies" );
|
|||
|
}
|
|||
|
|
|||
|
event4_last_area()
|
|||
|
{
|
|||
|
trigger = GetEnt( "event4_last_mortar", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
// Kill the mger
|
|||
|
mger = GetEnt( "last_mger", "script_noteworthy" );
|
|||
|
|
|||
|
if( IsDefined( mger ) ) // Incase he gets deleted for whatever reason.
|
|||
|
{
|
|||
|
mger SetCanDamage( true );
|
|||
|
mger DoDamage( mger.health + 1, ( 0, 0, 0 ) );
|
|||
|
}
|
|||
|
|
|||
|
flag_set( "model3_fire_think" );
|
|||
|
|
|||
|
// level thread event4_push_scene_setup( "event4_push_a" );
|
|||
|
// level thread event4_push_scene_setup( "event4_push_b" );
|
|||
|
//
|
|||
|
// level thread event4_disable_weapon();
|
|||
|
//level thread event4_last_objective();
|
|||
|
//
|
|||
|
// event4_conversation();
|
|||
|
|
|||
|
//flag_set( "last_objective" );
|
|||
|
}
|
|||
|
|
|||
|
event4_conversation()
|
|||
|
{
|
|||
|
// level.roebuck maps\_anim::anim_single_solo( level.roebuck, "glad_to_see" );
|
|||
|
// level.polonsky maps\_anim::anim_single_solo( level.polonsky, "same_gun" );
|
|||
|
// level.roebuck maps\_anim::anim_single_solo( level.roebuck, "detour" );
|
|||
|
}
|
|||
|
|
|||
|
// Spawn function
|
|||
|
event4_talker()
|
|||
|
{
|
|||
|
self.walkdist = 999;
|
|||
|
self.animname = "talker";
|
|||
|
self.targetname = "event4_talker";
|
|||
|
}
|
|||
|
|
|||
|
// Waits for the right conditions before setting the last objective.
|
|||
|
event4_last_objective()
|
|||
|
{
|
|||
|
// Flag set either by delay (above) or by triggerH
|
|||
|
level waittill( "last_objective" );
|
|||
|
|
|||
|
talker = GetEnt( "event4_talker", "targetname" );
|
|||
|
// talker thread maps\_anim::anim_single_solo( talker, "found_one" );
|
|||
|
|
|||
|
trigger = GetEnt( "event4_more_info", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
// talker thread maps\_anim::anim_single_solo( talker, "more_info" );
|
|||
|
}
|
|||
|
|
|||
|
// Spawns and sets up the AI's properly after spawning in.
|
|||
|
// This is the scene where the Allies are overtaking the last mortar pit
|
|||
|
event4_push_scene_setup( t_name )
|
|||
|
{
|
|||
|
// PushA guys
|
|||
|
spawners = GetEntArray( t_name + "_spawners", "targetname" );
|
|||
|
|
|||
|
guys = [];
|
|||
|
for( i = 0; i < spawners.size; i++ )
|
|||
|
{
|
|||
|
guys[i] = spawners[i] StalingradSpawn();
|
|||
|
guys[i].ignoreme = true;
|
|||
|
|
|||
|
guys[i].ignoreall = true;
|
|||
|
|
|||
|
if( guys[i].team == "allies" )
|
|||
|
{
|
|||
|
guys[i].animname = t_name + "_ally";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
guys[i].animname = t_name + "_axis";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
node = GetNode( t_name, "targetname" );
|
|||
|
level thread event4_push_scene( guys, node );
|
|||
|
}
|
|||
|
|
|||
|
event4_push_scene( guys, node )
|
|||
|
{
|
|||
|
maps\_anim::anim_single( guys, "intro", undefined, node );
|
|||
|
maps\_anim::anim_loop( guys, "loop", undefined, "never_end", node );
|
|||
|
}
|
|||
|
|
|||
|
// Disables the player's weapon if not in the trigger
|
|||
|
event4_disable_weapon()
|
|||
|
{
|
|||
|
trigger = GetEnt( "event4_disable_weapon", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
trigger waittill( "trigger", other );
|
|||
|
|
|||
|
if( IsPlayer( other ) && ( !IsDefined( other.disabled_weapon ) || !other.disabled_weapon ) )
|
|||
|
{
|
|||
|
other.disabled_weapon = true;
|
|||
|
|
|||
|
other DisableWeapons();
|
|||
|
other thread event4_enable_weapon( trigger );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Enables the player's weapon if not in the trigger
|
|||
|
event4_enable_weapon( trigger )
|
|||
|
{
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
wait( 1 );
|
|||
|
|
|||
|
if( !self IsTouching( trigger ) )
|
|||
|
{
|
|||
|
self EnableWeapons();
|
|||
|
self.disabled_weapon = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Spawner Function
|
|||
|
// This sets up the japanese officers as well as play their hara kiri animation
|
|||
|
event4_hara_kiri()
|
|||
|
{
|
|||
|
self.ignoreall = true;
|
|||
|
self.ignoreme = true;
|
|||
|
self.goalradius = 0;
|
|||
|
self SetGoalPos( self.origin );
|
|||
|
|
|||
|
if( self.team == "allies" )
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// So nothing can hurt them until we want them to kill themselves.
|
|||
|
self SetCanDamage( false );
|
|||
|
|
|||
|
if( !IsDefined( level.event4_officers ) )
|
|||
|
{
|
|||
|
level.event4_officers = 0;
|
|||
|
}
|
|||
|
|
|||
|
level.event4_officers++;
|
|||
|
|
|||
|
self.animname = "event4_officer" + level.event4_officers;
|
|||
|
|
|||
|
self gun_remove();
|
|||
|
self thread maps\_anim::anim_loop_solo( self, "hara_kiri_idle", undefined, "stop_idle" );
|
|||
|
|
|||
|
trigger = GetEnt( "event4_hara_kiri_anim", "targetname" );
|
|||
|
trigger waittill( "trigger" );
|
|||
|
|
|||
|
wait( RandomFloat( 1 ) );
|
|||
|
|
|||
|
// Attach the katana
|
|||
|
self Attach( "weapon_jap_katana", "tag_weapon_right" );
|
|||
|
|
|||
|
self notify( "stop_idle" );
|
|||
|
|
|||
|
self SetCanDamage( true );
|
|||
|
self.deathanim = level.scr_anim[self.animname]["hara_kiri"];
|
|||
|
self DoDamage( self.health + 1, ( 0, 0, 0 ) );
|
|||
|
|
|||
|
self thread event4_hara_fx();
|
|||
|
|
|||
|
if( IsDefined( level.mission_done ) )
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
level.mission_done = true;
|
|||
|
wait( 13 );
|
|||
|
nextmission();
|
|||
|
}
|
|||
|
|
|||
|
// Plays the blood fx when they are dead
|
|||
|
event4_hara_fx()
|
|||
|
{
|
|||
|
for( ;; )
|
|||
|
{
|
|||
|
self waittill( "deathanim", notetrack );
|
|||
|
|
|||
|
if( notetrack == "sndnt#bayonet_stab" )
|
|||
|
{
|
|||
|
PlayFxOnTag( level._effect["flesh_hit"], self, "tag_weapon_right" );
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
///////////////////// UTILITY FUNCTIONS //////////////////////////
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
//------------//
|
|||
|
// START UTIL //
|
|||
|
//------------//
|
|||
|
|
|||
|
// Get starting AI, probably heros
|
|||
|
get_starting_guys()
|
|||
|
{
|
|||
|
guys1 = GetEntArray( "starting_allies", "targetname" );
|
|||
|
// guys2 = GetEntArray( "event1_joiners", "targetname" );
|
|||
|
guys2 = [];
|
|||
|
radio_man = GetEnt( "radio_man", "targetname" );
|
|||
|
|
|||
|
guys2[guys2.size] = radio_man;
|
|||
|
|
|||
|
return array_combine( guys1, guys2 );
|
|||
|
}
|
|||
|
|
|||
|
// Get the points to warp the starting AI to
|
|||
|
get_start_points( start_name, only_players )
|
|||
|
{
|
|||
|
starts = [];
|
|||
|
|
|||
|
if( only_players )
|
|||
|
{
|
|||
|
structs = getstructarray( start_name, "targetname" );
|
|||
|
|
|||
|
for( i = 0; i < structs.size; i++ )
|
|||
|
{
|
|||
|
if( IsDefined( structs[i].script_int ) )
|
|||
|
{
|
|||
|
starts[starts.size] = structs[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
starts = ascend_starts( starts );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
structs = getstructarray( start_name, "targetname" );
|
|||
|
|
|||
|
for( i = 0; i < structs.size; i++ )
|
|||
|
{
|
|||
|
if( !IsDefined( structs[i].script_int ) )
|
|||
|
{
|
|||
|
starts[starts.size] = structs[i];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return starts;
|
|||
|
}
|
|||
|
|
|||
|
check_smoke_in_trigger( flag_ref )
|
|||
|
{
|
|||
|
wait 0.05;
|
|||
|
level endon ("squad_moving_up");
|
|||
|
for( ;; )
|
|||
|
{
|
|||
|
grenades = GetEntArray( "grenade", "classname" );
|
|||
|
|
|||
|
for( i = 0 ; i < grenades.size; i++ )
|
|||
|
{
|
|||
|
if( grenades[i].model != "projectile_us_smoke_grenade" )
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if( grenades[i] IsTouching( self ) )
|
|||
|
{
|
|||
|
flag_set( flag_ref );
|
|||
|
level notify ("smoke_grenade_done");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
wait( 0.5 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ascend_starts( array )
|
|||
|
{
|
|||
|
temp = array;
|
|||
|
for( i = 0; i < array.size; i++ )
|
|||
|
{
|
|||
|
for( j = i; j < array.size; j++ )
|
|||
|
{
|
|||
|
if( temp[j].script_int < array[i].script_int )
|
|||
|
{
|
|||
|
array[i] = temp[j];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return array;
|
|||
|
}
|
|||
|
|
|||
|
// Does all of the players/ai position upon a start.
|
|||
|
set_start_position( start_name, only_players )
|
|||
|
{
|
|||
|
|
|||
|
flag_wait("all_players_connected");
|
|||
|
only_players = 1;
|
|||
|
if( !only_players )
|
|||
|
{
|
|||
|
start_hide_players();
|
|||
|
|
|||
|
start_warp_guys( start_name );
|
|||
|
|
|||
|
start_unhide_players();
|
|||
|
}
|
|||
|
|
|||
|
start_warp_guys( start_name, only_players );
|
|||
|
}
|
|||
|
|
|||
|
// warp the starting ai to the start points
|
|||
|
start_warp_guys( start_name, only_players )
|
|||
|
{
|
|||
|
if( !IsDefined( only_players ) )
|
|||
|
{
|
|||
|
only_players = false;
|
|||
|
}
|
|||
|
|
|||
|
if( only_players )
|
|||
|
{
|
|||
|
guys = get_players();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
guys = get_starting_guys();
|
|||
|
}
|
|||
|
|
|||
|
//starts = get_start_points( start_name, only_players );
|
|||
|
starts = getstructarray( start_name, "targetname" );
|
|||
|
|
|||
|
if( !IsDefined( starts ) || starts.size < 1 || !IsDefined( guys ) )
|
|||
|
{
|
|||
|
println( "^1start_warp_guys(), starts or guys are not defined!" );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if( only_players )
|
|||
|
{
|
|||
|
for( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
guys[i] SetOrigin( starts[i].origin );
|
|||
|
guys[i] SetPlayerAngles( starts[i].angles );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
guys[i] Teleport( starts[i].origin, starts[i].angles );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 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].og_start_origin = players[i].origin;
|
|||
|
players[i] SetOrigin( hide_spot.origin );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// unhide the players
|
|||
|
start_unhide_players()
|
|||
|
{
|
|||
|
players = get_players();
|
|||
|
for( i = 0; i < players.size; i++ )
|
|||
|
{
|
|||
|
if( IsDefined( players[i].og_start_origin ) ) // Support hot-join for starts
|
|||
|
{
|
|||
|
players[i] SetOrigin( players[i].og_start_origin );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
players[i] SetOrigin( players[0].og_start_origin );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Set the the objective if using a start.
|
|||
|
set_start_objective( num )
|
|||
|
{
|
|||
|
for( i = 0; i < num; i++ )
|
|||
|
{
|
|||
|
set_objective( i + 1 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Sets off notifies so the objectives update properly
|
|||
|
set_mortar_notify( num )
|
|||
|
{
|
|||
|
wait( 0.05 );
|
|||
|
|
|||
|
mortar_node1 = GetNode( "auto2233", "targetname" );
|
|||
|
mortar_node2 = GetNode( "auto2237", "targetname" );
|
|||
|
mortar_node3 = GetNode( "mortar_node3", "targetname" );
|
|||
|
|
|||
|
if( num >= 1 )
|
|||
|
{
|
|||
|
mortar_node1 notify( "mortar_done" );
|
|||
|
}
|
|||
|
|
|||
|
if( num >= 2 )
|
|||
|
{
|
|||
|
mortar_node2 notify( "mortar_done" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// until we get the proper way to do this
|
|||
|
threat_group_setter()
|
|||
|
{
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
players = get_players();
|
|||
|
for( i = 0; i < players.size; i++ )
|
|||
|
{
|
|||
|
players[i] SetThreatBiasGroup( "players" );
|
|||
|
}
|
|||
|
wait( 2 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Check to see if anyone is touching self
|
|||
|
team_is_touching( team )
|
|||
|
{
|
|||
|
if( IsDefined( team ) )
|
|||
|
{
|
|||
|
guys = GetAiArray( team );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
guys = GetAiArray();
|
|||
|
}
|
|||
|
|
|||
|
for( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
if( guys[i] IsTouching( self ) )
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// used for starts
|
|||
|
delete_ent( value, key )
|
|||
|
{
|
|||
|
ent = GetEnt( value, key );
|
|||
|
ent Delete();
|
|||
|
}
|
|||
|
|
|||
|
create_spawner_function( value, key, func )
|
|||
|
{
|
|||
|
spawners = GetEntArray( value, key );
|
|||
|
|
|||
|
for( i = 0; i < spawners.size; i++ )
|
|||
|
{
|
|||
|
if (!isalive(spawners[i]) )
|
|||
|
{
|
|||
|
spawners[i] add_spawn_function( func );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
spawners[i] thread [[func]]();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bloody_death_array( value, key )
|
|||
|
{
|
|||
|
ents = GetEntArray( value, key );
|
|||
|
for( i = 0; i < ents.size; i++ )
|
|||
|
{
|
|||
|
ents[i] thread bloody_death( 1 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Fake death
|
|||
|
// self = the guy getting worked
|
|||
|
bloody_death( delay )
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
|
|||
|
if( !IsSentient( self ) || !IsAlive( self ) )
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
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 < 3 + RandomInt( 5 ); i++ )
|
|||
|
{
|
|||
|
random = RandomIntRange( 0, tags.size );
|
|||
|
//vec = self GetTagOrigin( tags[random] );
|
|||
|
self thread bloody_death_fx( tags[random], undefined );
|
|||
|
wait( RandomFloat( 0.1 ) );
|
|||
|
}
|
|||
|
|
|||
|
self DoDamage( self.health + 50, self.origin );
|
|||
|
}
|
|||
|
|
|||
|
// self = the AI on which we're playing fx
|
|||
|
bloody_death_fx( tag, fxName )
|
|||
|
{
|
|||
|
if( !IsDefined( fxName ) )
|
|||
|
{
|
|||
|
fxName = level._effect["flesh_hit"];
|
|||
|
}
|
|||
|
|
|||
|
PlayFxOnTag( fxName, self, tag );
|
|||
|
}
|
|||
|
|
|||
|
scripted_kill_spawners( num )
|
|||
|
{
|
|||
|
spawners = GetSpawnerArray();
|
|||
|
for( i = 0 ; i < spawners.size ; i++ )
|
|||
|
{
|
|||
|
if( ( IsDefined( spawners[i].script_killspawner ) ) &&( num == spawners[i].script_killspawner ) )
|
|||
|
{
|
|||
|
spawners[i] Delete();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//---------------//
|
|||
|
// Debug Section //
|
|||
|
//---------------//
|
|||
|
|
|||
|
do_print3d( msg )
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
print3d( self.origin, msg );
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
line_to_player()
|
|||
|
{
|
|||
|
players = get_players();
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
line( self.origin, players[0].origin );
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
debug_ai_counts()
|
|||
|
{
|
|||
|
/#
|
|||
|
SetDvar( "show_ai_count", "1" );
|
|||
|
|
|||
|
huds = [];
|
|||
|
huds["drones"] = debug_ai_createhud( 620, 325, "Drones:" );
|
|||
|
huds["allies"] = debug_ai_createhud( 620, 340, "Allies:" );
|
|||
|
huds["axis"] = debug_ai_createhud( 620, 355, "Axis:" );
|
|||
|
huds["total"] = debug_ai_createhud( 620, 370, "Total:" );
|
|||
|
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
dvar = GetDvarInt( "show_ai_count" );
|
|||
|
if( dvar )
|
|||
|
{
|
|||
|
allies = [];
|
|||
|
axis = [];
|
|||
|
|
|||
|
allies = GetAiArray( "allies" );
|
|||
|
axis = GetAiArray( "axis" );
|
|||
|
|
|||
|
keys = GetArraykeys( huds );
|
|||
|
for( i = 0; i < keys.size; i++ )
|
|||
|
{
|
|||
|
huds[keys[i]].title.alpha = 1;
|
|||
|
huds[keys[i]].value.alpha = 1;
|
|||
|
}
|
|||
|
|
|||
|
huds["drones"].value SetText( level.drones["allies"].lastindex + level.drones["axis"].lastindex );
|
|||
|
huds["allies"].value SetText( allies.size );
|
|||
|
huds["axis"].value SetText( axis.size );
|
|||
|
huds["total"].value SetText( allies.size + axis.size );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
keys = GetArraykeys( huds );
|
|||
|
for( i = 0; i < keys.size; i++ )
|
|||
|
{
|
|||
|
huds[keys[i]].title.alpha = 0;
|
|||
|
huds[keys[i]].value.alpha = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
#/
|
|||
|
}
|
|||
|
|
|||
|
debug_ai_createhud( x, y, text )
|
|||
|
{
|
|||
|
/#
|
|||
|
struct = SpawnStruct();
|
|||
|
|
|||
|
title = NewDebugHudElem();
|
|||
|
title.location = 0;
|
|||
|
title.alignX = "right";
|
|||
|
title.alignY = "middle";
|
|||
|
title.foreground = 1;
|
|||
|
title.fontScale = 1.2;
|
|||
|
title.alpha = 1;
|
|||
|
title.x = x;
|
|||
|
title.y = y;
|
|||
|
title SetText( text );
|
|||
|
|
|||
|
value = NewDebugHudElem();
|
|||
|
value.location = 0;
|
|||
|
value.alignX = "left";
|
|||
|
value.alignY = "middle";
|
|||
|
value.foreground = 1;
|
|||
|
value.fontScale = 1.2;
|
|||
|
value.alpha = 1;
|
|||
|
value.x = x + 2;
|
|||
|
value.y = y;
|
|||
|
value SetText( "0" );
|
|||
|
|
|||
|
struct.title = title;
|
|||
|
struct.value = value;
|
|||
|
|
|||
|
return struct;
|
|||
|
#/
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////// TONY's STUFF I.E. NEWB CENTRAL \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
|
|||
|
|
|||
|
/////// TFLAME UTILS \\\\\\\\\\
|
|||
|
|
|||
|
waittill_and_setflag(mynotify,myflag)
|
|||
|
{
|
|||
|
self waittill (mynotify);
|
|||
|
flag_set(myflag);
|
|||
|
}
|
|||
|
|
|||
|
wait_and_notify(waittime, mynotify)
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
wait waittime;
|
|||
|
self notify (mynotify);
|
|||
|
}
|
|||
|
|
|||
|
wait_and_kill(time, spot)
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
wait time;
|
|||
|
if (isdefined(spot))
|
|||
|
{
|
|||
|
bullettracer(spot.origin, self geteye(), true);
|
|||
|
magicbullet("ppsh", spot.origin, self geteye());
|
|||
|
self dodamage(self.health*10, spot.origin);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
self dodamage(self.health*10, self.origin);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
grab_ai_by_script_noteworthy(value,side)
|
|||
|
{
|
|||
|
guys = getaiarray(side);
|
|||
|
for (i=0; i < guys.size; i++)
|
|||
|
{
|
|||
|
if (isdefined(guys[i]) && isdefined(guys[i].script_noteworthy) && guys[i].script_noteworthy == value)
|
|||
|
{
|
|||
|
return guys[i];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
trigs_setup()
|
|||
|
{
|
|||
|
getent("alert_pit2_guys", "targetname") thread waittill_and_setflag("trigger", "pit2_defenders_alerted");
|
|||
|
getent("treesnipers_chain", "targetname") thread waittill_trig_and_say(level.polonsky , "polonsky", "treesnipers", 5);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////// END TFLAME UTILS \\\\\\\\\\\\\\\\\\\\\\
|
|||
|
|
|||
|
charge_player_dudes()
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
self thread player_hater();
|
|||
|
if (cointoss())
|
|||
|
{
|
|||
|
self thread martyrdom();
|
|||
|
}
|
|||
|
while(1)
|
|||
|
{
|
|||
|
self.goalradius = 128;
|
|||
|
players = get_players();
|
|||
|
myenemy = players[0];
|
|||
|
closestdist = 5000;
|
|||
|
for (i=0; i < players.size; i++)
|
|||
|
{
|
|||
|
dist = distance (self.origin, players[i].origin);
|
|||
|
if ( dist < closestdist)
|
|||
|
{
|
|||
|
closestdist = dist;
|
|||
|
myenemy = players[i];
|
|||
|
}
|
|||
|
}
|
|||
|
self setgoalentity(myenemy);
|
|||
|
wait 3;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
player_hater()
|
|||
|
{
|
|||
|
self setthreatbiasgroup("player_haters");
|
|||
|
}
|
|||
|
|
|||
|
martyrdom()
|
|||
|
{
|
|||
|
level thread martyrdom_go(self);
|
|||
|
}
|
|||
|
|
|||
|
martyrdom_go(guy)
|
|||
|
{
|
|||
|
guy waittill ("death");
|
|||
|
axis = getaiarray("axis");
|
|||
|
if (isdefined(axis[0]) )
|
|||
|
{
|
|||
|
axis[0] magicgrenade(guy.origin+(0,0,30), guy.origin, randomfloatrange(3,5) );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
pit2_threatbias_setup()
|
|||
|
{
|
|||
|
setignoremegroup("players", "pit2_defenders");
|
|||
|
setignoremegroup("friends", "pit2_defenders");
|
|||
|
setignoremegroup("pit2_defenders", "friends");
|
|||
|
flag_wait("pit2_defenders_alerted");
|
|||
|
wait 3;
|
|||
|
setthreatbias("players", "pit2_defenders", 10000);
|
|||
|
setthreatbias("friends", "pit2_defenders", 10000);
|
|||
|
setthreatbias("pit2_defenders", "friends", 10000);
|
|||
|
}
|
|||
|
|
|||
|
pit2_defender_setup()
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
self setthreatbiasgroup("pit2_defenders");
|
|||
|
self.health = 300;
|
|||
|
mynode = getnode(self.target, "targetname");
|
|||
|
flag_wait("pit2_defenders_alerted");
|
|||
|
wait 3;
|
|||
|
newnode = getnode(mynode.script_noteworthy + "_flipside", "script_noteworthy");
|
|||
|
if (isdefined(newnode))
|
|||
|
{
|
|||
|
self setgoalnode(newnode);
|
|||
|
}
|
|||
|
self.health = 100;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
pit2_attacker_setup()
|
|||
|
{
|
|||
|
getent("alert_pit2_guys", "targetname") thread wait_and_notify(randomfloatrange(4,7), "trigger");
|
|||
|
self endon ("death");
|
|||
|
self setthreatbiasgroup("pit2_attackers");
|
|||
|
self.health = 300;
|
|||
|
mynode = getnode(self.target, "targetname");
|
|||
|
guy = undefined;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
axis = getaiarray("axis");
|
|||
|
guy = axis[randomint(axis.size)];
|
|||
|
if (isdefined(guy.script_noteworthy) && guy.script_noteworthy == "pit2_defenders")
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
wait 0.05;
|
|||
|
}
|
|||
|
guy waittill ("death");
|
|||
|
self dodamage(self.health * 10, guy.origin); // don't want them standing around looking dumb
|
|||
|
}
|
|||
|
|
|||
|
kill_middle_mger()
|
|||
|
{
|
|||
|
trig = getent ("pit2_allies", "target");
|
|||
|
trig waittill ("trigger");
|
|||
|
guy = grab_ai_by_script_noteworthy("middle_mger", "axis");
|
|||
|
guy setcandamage(true);
|
|||
|
guy dodamage(guy.health*10, (0,0,0) );
|
|||
|
}
|
|||
|
|
|||
|
chain_on_after_pit1clear()
|
|||
|
{
|
|||
|
waittill_aigroupcleared("pit1_lastbunker_guys");
|
|||
|
getent("auto878", "target") notify ("stop_drone_loop");
|
|||
|
level notify ("player_cleared_bunker1");
|
|||
|
flag_set("can_save");
|
|||
|
trig = getent("player_leaving_e1", "script_noteworthy");
|
|||
|
if (isdefined(trig))
|
|||
|
{
|
|||
|
trig delete(); // this trigger checked if you left before pit1 was clear
|
|||
|
}
|
|||
|
trig = getent("pit1_all_clear_chain", "targetname");
|
|||
|
trig trigger_on();
|
|||
|
trig thread bomber_sounds();
|
|||
|
getent("pit1_clear_chainup", "targetname") trigger_on();
|
|||
|
nodes = getvehiclenodearray("bomber_nodes", "script_noteworthy");
|
|||
|
//flag_set("stop_gunquake");
|
|||
|
array_thread(nodes, ::bomber_nodes_setup);
|
|||
|
getent("e2_bridge_fakedrones", "target") trigger_on();
|
|||
|
//getent("bridge_drones", "script_noteworthy") trigger_on();
|
|||
|
}
|
|||
|
|
|||
|
achivement_checker()
|
|||
|
{
|
|||
|
self.failedachievement = false;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
self waittill("weapon_fired");
|
|||
|
|
|||
|
weap = self getcurrentweapon();
|
|||
|
if (weap != "m2_flamethrower")
|
|||
|
{
|
|||
|
self.failedachievement = true;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
trigs_off()
|
|||
|
{
|
|||
|
getent("pit1_clear_chainup", "targetname") trigger_off();
|
|||
|
getent("pit1_all_clear_chain", "targetname") trigger_off();
|
|||
|
getent("e2_bridge_fakedrones", "target") trigger_off();
|
|||
|
//getent("bridge_drones", "script_noteworthy") trigger_off();
|
|||
|
getent("event2_up_hill_dialog", "targetname") trigger_off();
|
|||
|
getent("player_in_regroup_spot", "targetname") trigger_off();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
waittill_trig_and_say(guy, animname, anime, waittime)
|
|||
|
{
|
|||
|
self waittill ("trigger");
|
|||
|
if (isdefined(waittime))
|
|||
|
{
|
|||
|
wait waittime;
|
|||
|
}
|
|||
|
guy.animname = animname;
|
|||
|
guy anim_single_solo(guy, anime);
|
|||
|
}
|
|||
|
|
|||
|
lastpit_trap()
|
|||
|
{
|
|||
|
if (level.difficulty == 1)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
getent("lastpit_trap_trig", "targetname") waittill ("trigger");
|
|||
|
nadespots = getstructarray("lastpit_trap_nadespots", "script_noteworthy");
|
|||
|
startspot = getstruct("lastpit_trap_nadestart", "targetname");
|
|||
|
for (i=0; i < nadespots.size; i++)
|
|||
|
{
|
|||
|
axis = getaiarray("axis");
|
|||
|
if (isdefined(axis[0]))
|
|||
|
{
|
|||
|
if (level.difficulty == 2 && cointoss() )
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
axis[0] magicgrenade(startspot.origin, nadespots[i].origin, 5 );
|
|||
|
wait randomfloatrange( 0.3, 1.5);
|
|||
|
if (( level.difficulty == 2 && cointoss()) || i > 1)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
theres_only_one_Flamer()
|
|||
|
{
|
|||
|
wait randomfloatrange(0.5, 2.5);
|
|||
|
if (isdefined(level.flamerplayer))
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
players = get_players();
|
|||
|
if (players.size > 1)
|
|||
|
{
|
|||
|
level.flamerplayer = players[randomint(players.size)];
|
|||
|
for (i=0; i < players.size; i++)
|
|||
|
{
|
|||
|
if (players[i] != level.flamerplayer)
|
|||
|
{
|
|||
|
players[i] takeweapon("m2_flamethrower");
|
|||
|
players[i] giveweapon("thompson");
|
|||
|
players[i] SwitchToWeapon( "thompson" );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
mortar_dudes_setup()
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
while(1)
|
|||
|
{
|
|||
|
players = get_players();
|
|||
|
for (i=0; i < players.size; i++)
|
|||
|
{
|
|||
|
dist = distance(self.origin, players[i].origin);
|
|||
|
if (dist < 215 )
|
|||
|
{
|
|||
|
self notify ("stop_mortar");
|
|||
|
//self detachall();
|
|||
|
self animscripts\shared::placeWeaponOn( "type100_smg", "right" );
|
|||
|
if (isdefined(self.target))
|
|||
|
{
|
|||
|
//getnode(self.target, "targetname") notify ("mortar_done");
|
|||
|
//wait 0.05;
|
|||
|
getnode(self.target, "targetname") notify ("stop_mortar");
|
|||
|
|
|||
|
}
|
|||
|
self stopanimscripted();
|
|||
|
self thread give_dude_weapon();
|
|||
|
|
|||
|
self solo_set_pacifist(false);
|
|||
|
self thread charge_player_dudes();
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
wait 0.5;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
give_dude_weapon()
|
|||
|
{
|
|||
|
while(1)
|
|||
|
{
|
|||
|
self animscripts\shared::placeWeaponOn( "type100_smg", "right" );
|
|||
|
wait 0.3;
|
|||
|
org = self gettagorigin("tag_weapon");
|
|||
|
if (isdefined(org))
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
solo_set_pacifist(pacifist_state)
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
if (isdefined(self) && isai(self))
|
|||
|
{
|
|||
|
self.pacifist = pacifist_state;
|
|||
|
if (pacifist_state == false)
|
|||
|
{
|
|||
|
self.maxsightdistsqrd = 90000000;
|
|||
|
self stopanimscripted();
|
|||
|
self.ignoreme = false;
|
|||
|
self.ignoreall = false;
|
|||
|
self.script_sightrange = 90000000;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
smoke_hint_and_reset()
|
|||
|
{
|
|||
|
if (flag("event1_smoke_popped") )
|
|||
|
return;
|
|||
|
level thread player_tries_toskip_mg();
|
|||
|
wait 2;
|
|||
|
smoke_hint();
|
|||
|
wait 1;
|
|||
|
if (isdefined(level.hintelem))
|
|||
|
{
|
|||
|
level.hintelem setText("");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
smoke_hint()
|
|||
|
{
|
|||
|
if (flag("event1_smoke_popped") )
|
|||
|
return;
|
|||
|
level thread smoke_vo();
|
|||
|
level endon ("smoke_grenade_done");
|
|||
|
level endon( "smoke_popped" );
|
|||
|
level endon ("stop_pop_smoke");
|
|||
|
level.hintelem = NewHudElem();
|
|||
|
level.hintelem init_results_hudelem(320, 160, "center", "bottom", 1.5, 1.0);
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
level.hintelem setText(&"PEL1A_THROWSMOKE");
|
|||
|
wait 8;
|
|||
|
level.hintelem setText("");
|
|||
|
wait 15;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
smoke_vo()
|
|||
|
{
|
|||
|
if (flag("event1_smoke_popped") )
|
|||
|
return;
|
|||
|
level endon ("smoke_grenade_done");
|
|||
|
level endon( "smoke_popped" );
|
|||
|
level endon ("stop_pop_smoke");
|
|||
|
modifier = 0;
|
|||
|
wait 1.5;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
level.polonsky anim_single_solo( level.polonsky, "first_mg4" ); // "Throw smoke!"\
|
|||
|
if (modifier < 20)
|
|||
|
{
|
|||
|
modifier = modifier + 4;
|
|||
|
}
|
|||
|
|
|||
|
wait modifier + randomintrange(5, 15);
|
|||
|
|
|||
|
if (cointoss() )
|
|||
|
{
|
|||
|
level.roebuck anim_single_solo( level.roebuck, "first_mg3" ); // "Throw some smoke for cover!... Or it will rip us to shreds!"\
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
level.polonsky anim_single_solo( level.polonsky, "first_mg4" ); // "Throw smoke!"\
|
|||
|
}
|
|||
|
wait modifier + randomintrange(5, 15);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
init_results_hudelem(x, y, alignX, alignY, fontscale, alpha)
|
|||
|
{
|
|||
|
self.x = x;
|
|||
|
self.y = y;
|
|||
|
self.alignX = alignX;
|
|||
|
self.alignY = alignY;
|
|||
|
self.fontScale = fontScale;
|
|||
|
self.alpha = alpha;
|
|||
|
self.sort = 20;
|
|||
|
self.font = "objective";
|
|||
|
}
|
|||
|
|
|||
|
treesnipers_setup()
|
|||
|
{
|
|||
|
//self disableaimassist();
|
|||
|
self endon ("death");
|
|||
|
self.pacifist = true;
|
|||
|
self.ignoreall = true;
|
|||
|
self.ignoreme = true;
|
|||
|
level waittill ("treesnipers_awake"); // comes from script_notify on trigger
|
|||
|
//self enableaimassist();
|
|||
|
self.pacifist = false;
|
|||
|
self.ignoreall = false;
|
|||
|
self.ignoreme = false;
|
|||
|
|
|||
|
tree = getent(self.target, "targetname");
|
|||
|
self thread wait_and_kill(45*level.difficulty);
|
|||
|
level.polonsky thread wait_and_say(60, "polonsky", "treesnipers", "death", self, 1500);
|
|||
|
if (!isdefined(tree))
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
if (cointoss() )
|
|||
|
{
|
|||
|
playfx( level._effect["sniper_leaf_canned"], tree.origin );
|
|||
|
}
|
|||
|
|
|||
|
tree waittill( "broken", broken_notify, attacker );
|
|||
|
|
|||
|
if( broken_notify == "hideout_fronds_dmg0" )
|
|||
|
{
|
|||
|
//tree playsound( "flame_ignite_tree" );
|
|||
|
playsoundatposition("flame_ignite_tree", tree.origin);
|
|||
|
|
|||
|
//TUEY - When we get entity playsound fixed, this will work...but it doesn't for now , so I'm commenting it out.
|
|||
|
//level thread maps\pel2_amb::play_flame_tree_loop(tree);
|
|||
|
self thread animscripts\death::flame_death_fx();
|
|||
|
self thread tree_guy_flame_sound();
|
|||
|
self setcandamage( true );
|
|||
|
self notify( "fake tree death" );
|
|||
|
players = get_players();
|
|||
|
for (i=0; i < players.size; i++)
|
|||
|
{
|
|||
|
weap = players[i] getcurrentweapon();
|
|||
|
if (weap == "m2_flamethrower")
|
|||
|
{ //dk
|
|||
|
//level.player maps\_utility::giveachievement_wrapper( "PEL2_ACHIEVEMENT_TREE");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
wait 5;
|
|||
|
|
|||
|
if( !isdefined(attacker) )
|
|||
|
{
|
|||
|
attacker = get_closest_player( self.origin );
|
|||
|
}
|
|||
|
self dodamage(self.health * 10, (0,0,0), attacker );
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
tree_guy_flame_sound()
|
|||
|
{
|
|||
|
// TEMP!
|
|||
|
temp_orig = spawn( "script_origin", self.origin );
|
|||
|
temp_orig playsound( "body_burn_vo" );
|
|||
|
|
|||
|
temp_orig waittill( "body_burn_vo" );
|
|||
|
|
|||
|
temp_orig delete();
|
|||
|
}
|
|||
|
|
|||
|
player_tries_toskip_mg()
|
|||
|
{
|
|||
|
if (flag("event1_smoke_popped") )
|
|||
|
return;
|
|||
|
|
|||
|
level endon( "smoke_popped" );
|
|||
|
level endon ("stop_pop_smoke");
|
|||
|
gun = getent("middle_mg", "targetname");
|
|||
|
trig = getent("mg_smoke_checker", "targetname");
|
|||
|
while(!flag("event1_smoke_popped") )
|
|||
|
{
|
|||
|
players = get_players();
|
|||
|
for (i=0; i < players.size; i++)
|
|||
|
{
|
|||
|
if (players[i] istouching(trig) )
|
|||
|
{
|
|||
|
org = gun gettagorigin ("tag_flash");
|
|||
|
magicbullet("type99_lmg", org, players[i] geteye() );
|
|||
|
}
|
|||
|
}
|
|||
|
wait 0.05;
|
|||
|
}
|
|||
|
wait 6;
|
|||
|
}
|
|||
|
|
|||
|
distance_fight_smoke_hint()
|
|||
|
{
|
|||
|
getent("cave3_banzai_guys", "target") waittill ("trigger");
|
|||
|
trig = getent("ok_dont_throw_smoke", "targetname");
|
|||
|
trig endon ("trigger");
|
|||
|
modifier = 0;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
wait (randomintrange(40, 80) + modifier) ;
|
|||
|
level.polonsky anim_single_solo( level.polonsky, "first_mg4" ); // "Throw smoke!"\
|
|||
|
modifier = modifier + 7*level.difficulty;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
road_runners()
|
|||
|
{
|
|||
|
self.animname = "generic";
|
|||
|
keys = getarraykeys(level.scr_anim["generic"]);
|
|||
|
self set_run_anim(keys[randomint(keys.size)]);
|
|||
|
}
|
|||
|
|
|||
|
/*------------------------------------
|
|||
|
spawn in guys thru script. Stole from ChrisP to get around too many ents in frame error
|
|||
|
------------------------------------*/
|
|||
|
simple_spawn( spawners, waittime )
|
|||
|
{
|
|||
|
if (isdefined(waittime))
|
|||
|
{
|
|||
|
wait waittime;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ai_array = [];
|
|||
|
|
|||
|
for( i = 0; i < spawners.size; i++ )
|
|||
|
{
|
|||
|
if (!isdefined(spawners[i]))
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
if( i % 2)
|
|||
|
{
|
|||
|
//wait for a new network frame to be sent out before spawning in
|
|||
|
//another guy
|
|||
|
wait_network_frame();
|
|||
|
}
|
|||
|
|
|||
|
// check if we want to forcespawn him
|
|||
|
if( IsDefined( spawners[i].script_forcespawn ) )
|
|||
|
{
|
|||
|
ai = spawners[i] StalingradSpawn();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ai = spawners[i] DoSpawn();
|
|||
|
}
|
|||
|
|
|||
|
spawn_failed( ai );
|
|||
|
|
|||
|
ai_array = add_to_array( ai_array, ai );
|
|||
|
}
|
|||
|
|
|||
|
return ai_array;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
simple_floodspawn(spawners)
|
|||
|
{
|
|||
|
|
|||
|
for(i=0;i<spawners.size;i++)
|
|||
|
{
|
|||
|
if(i % 2)
|
|||
|
{
|
|||
|
wait_network_frame();
|
|||
|
}
|
|||
|
spawners[i] thread maps\_spawner::flood_spawner_think();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
do_netfriendly_flood_spawn()
|
|||
|
{
|
|||
|
self waittill ("trigger");
|
|||
|
spawners = getentarray(self.target, "targetname");
|
|||
|
level thread simple_floodspawn(spawners);
|
|||
|
}
|
|||
|
|
|||
|
do_netfriendly_trigger_spawn()
|
|||
|
{
|
|||
|
self waittill ("trigger");
|
|||
|
spawners = getentarray(self.target, "targetname");
|
|||
|
level thread simple_spawn(spawners);
|
|||
|
}
|
|||
|
|
|||
|
bomber_nodes_setup()
|
|||
|
{
|
|||
|
self waittill ("trigger");
|
|||
|
struct = getstruct(self.targetname+"_drop", "script_noteworthy");
|
|||
|
playfx(level._effect["bomb_explosion"], struct.origin);
|
|||
|
earthquake(0.5, 1, struct.origin, 7000);
|
|||
|
playsoundatposition ("mortar_dirt", struct.origin+(-4000,0,0) );
|
|||
|
}
|
|||
|
|
|||
|
killspawner_onspawn(num)
|
|||
|
{
|
|||
|
wait 4;
|
|||
|
maps\_spawner::kill_spawnernum(num);
|
|||
|
}
|
|||
|
|
|||
|
cave2_clear()
|
|||
|
{
|
|||
|
waittill_aigroupcleared("cave2_guys");
|
|||
|
level thread maps\_utility::autosave_by_name( "cave2_clear" );
|
|||
|
trig = getent("event2_up_hill_dialog", "targetname");
|
|||
|
trig trigger_on();
|
|||
|
trig waittill ("trigger");
|
|||
|
trig = getent("pit2_chain", "script_noteworthy");
|
|||
|
if (isdefined(trig))
|
|||
|
{
|
|||
|
trig notify ("trigger");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
intro_helpout_dudes_setup()
|
|||
|
{
|
|||
|
self endon ("death");
|
|||
|
self.ignoreme = true;
|
|||
|
wait 10;
|
|||
|
self.ignoreme = false;
|
|||
|
self thread wait_and_kill(randomintrange(10,20));
|
|||
|
}
|
|||
|
|
|||
|
my_mg_stop()
|
|||
|
{
|
|||
|
spot = getent("first_mg_target", "targetname");
|
|||
|
self setentitytarget(spot);
|
|||
|
}
|
|||
|
|
|||
|
player_setup()
|
|||
|
{
|
|||
|
self setstance("crouch");
|
|||
|
}
|
|||
|
|
|||
|
bomber_sounds()
|
|||
|
{
|
|||
|
self waittill ("trigger");
|
|||
|
wait 0.5;
|
|||
|
plane = getent("soundbomber", "targetname");
|
|||
|
//plane moveto (plane.origin+(0,2500,0), 10);
|
|||
|
plane playsound("pel1a_napalm_flight");
|
|||
|
}
|
|||
|
|
|||
|
player_leaves_e1_early()
|
|||
|
{
|
|||
|
trig = getent("player_leaving_e1", "script_noteworthy");
|
|||
|
level endon ("player_cleared_bunker1");
|
|||
|
trig waittill ("trigger");
|
|||
|
trig2 = getent("e1_approaching_firstmortar_guys_trig", "targetname");
|
|||
|
if (isdefined(trig2))
|
|||
|
{
|
|||
|
trig2 notify ("trigger");
|
|||
|
}
|
|||
|
trig2 = getent("e1_approaching_firstmortar_banzai_guys", "target");
|
|||
|
if (isdefined(trig2))
|
|||
|
{
|
|||
|
trig2 notify ("trigger");
|
|||
|
}
|
|||
|
wait 1;
|
|||
|
axis = getaiarray("axis");
|
|||
|
array_thread(axis, ::charge_player_dudes);
|
|||
|
flag_clear("can_save");
|
|||
|
wait 20;
|
|||
|
flag_set("can_save");
|
|||
|
}
|
|||
|
|
|||
|
weary_walkers_setup()
|
|||
|
{
|
|||
|
self.animname = "generic";
|
|||
|
if (cointoss() )
|
|||
|
{
|
|||
|
self set_run_anim("weary1");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
self set_run_anim("weary2");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
patrollers_setup()
|
|||
|
{
|
|||
|
self.animname = "generic";
|
|||
|
self set_run_anim("patroller");
|
|||
|
}
|
|||
|
|
|||
|
traffic_dude()
|
|||
|
{
|
|||
|
self.animname = "generic";
|
|||
|
self set_run_anim("weary1");
|
|||
|
node = getnode("traffic_dude_node", "targetname");
|
|||
|
node anim_reach_solo(self, "traffic_dude_reach");
|
|||
|
node anim_loop_solo(self, "traffic_dude", undefined, "death");
|
|||
|
}
|
|||
|
|
|||
|
wait_and_say(time, animname, myline, ender, endee, distcheck)
|
|||
|
{
|
|||
|
endee endon (ender);
|
|||
|
wait time;
|
|||
|
self.animname = animname;
|
|||
|
dist = distance(get_players()[0].origin, endee.origin);
|
|||
|
if (dist < distcheck)
|
|||
|
{
|
|||
|
self anim_single_solo(self, myline);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
dont_drop_flamer()
|
|||
|
{
|
|||
|
self.dropweapon = false;
|
|||
|
}
|
|||
|
|
|||
|
before_last_tunnel_guys_clear()
|
|||
|
{
|
|||
|
waittill_aigroupcleared("before_last_tunnel_guys");
|
|||
|
wait 1;
|
|||
|
trig = getent("event4", "targetname");
|
|||
|
trig notify ("trigger");
|
|||
|
}
|
|||
|
|
|||
|
no_nades_oneasy()
|
|||
|
{
|
|||
|
if (level.difficulty > 1)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
self.script_grenades = 0;
|
|||
|
self.grenadeammo = 0;
|
|||
|
}
|