cod5-sdk/raw/maps/see1_opening.gsc

2156 lines
54 KiB
Plaintext

#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
#include maps\see1_code;
#include maps\see1_anim;
#include maps\_music;
#using_animtree( "generic_human" );
opening_main()
{
// Number of drone reduction, for coop
if(NumRemoteClients() > 0) // Are we in coop?
{
if(NumRemoteClients() > 1) // 3 or 4 player coop
{
level.max_drones["allies"] = 0; // Down from 32
level.max_drones["axis"] = 8; // Down from 32
}
else // 2 player coop
{
level.max_drones["allies"] = 0; // Down from 32
level.max_drones["axis"] = 11; // Down from 32
}
}
// Spawn germans who will then retreat and die in the wheat field
level thread opening_spawn_germans();
level thread opening_spawn_molotov_tossers();
level thread opening_spawn_fake_tank();
//level thread opening_player_speed_change();
level see1_intro();
// 1. As player exists the door, he sees heros meleeing germans
// Several Germans are defending the front of the house
level thread opening_objectives();
// The heroes will be animated initially, so turn off colors for now
//level.hero1 disable_ai_color();
//level.hero2 disable_ai_color();
// wait for player to kick the event off
//trigger = getent( "opening_vig_start", "targetname" );
//trigger waittill( "trigger" );
// plane flyby, followed with distant flashes
level thread opening_plane_flash();
// hero 1 and 2 are both meleing german soldiers
level thread melee_comabt_1_vignette();
level thread melee_comabt_2_vignette();
// 2 friendly tanks that move along the road and fire into the field
level thread opening_spawn_tanks();
// Failsafe: Move friendlies if the player does not move quickly enough to trigger colors chain
level thread force_move_friends();
level thread dialog_player_into_wheat_field();
level thread opening_molotov_instructions();
level notify( "player_exits_house" );
// prepare the enemies that run out from the other side
// These guys run, and die while running
initialize_spawn_function( "opening_running_germans", "script_noteworthy", ::spawn_func_running_and_dying );
initialize_spawn_function( "opening_running_germans_close", "script_noteworthy", ::spawn_func_running_and_dying );
// These guys manage to make it to the end, and deletes there
initialize_spawn_function( "opening_running_germans_2", "script_noteworthy", ::spawn_func_running_and_dying_to_end );
// vignette to have 2 enemies on fire come out of the field
level thread spawn_flaming_guys();
level thread spawn_flaming_guys_side();
// Play additional fire fx when molotoves are tosses into the field
level thread additional_fires();
// Failsafe: If the player sticks around, spawn more tanks down the road
level thread opening_spawn_more_tanks();
level thread lower_accuracy_for_event_2();
// Event ends in the downhill path
end_trigger = getent( "event_1_ends", "targetname" );
end_trigger waittill( "trigger" );
level notify( "event_1_ends" );
level thread opening_cleanup();
}
opening_name_hide()
{
wait( 37 );
level.hero1.name = undefined;
level.hero1.script_friendname = undefined;
wait( 15 );
level.hero1.name = "Sgt. Reznov";
level.hero1.script_friendname = "Sgt. Reznov";
}
opening_player_speed_change()
{
players_speed_set( 0.3, 1 );
level waittill( "player_exits_house" );
wait( 2 );
players_speed_set( 1.0, 6 );
}
#using_animtree( "generic_human" );
see1_intro()
{
if( is_german_build() )
{
exploder( 99 );
wait( 4.5 ); // normal introscreen is 6.5 seconds. Push the event 2 seconds earlier
//level waittill( "finished final intro screen fadein" );
//share_screen( get_host(), false );
level notify( "intro_spawns" );
level notify( "player_exits_house" );
wait( 4 );
share_screen( get_host(), false );
level.hero1 thread intro_german_dialog();
return;
}
battlechatter_off();
//share_screen( get_host(), true, true );
level waittill( "finished final intro screen fadein" );
players = get_players();
//tuey set music state intro
setmusicstate("INTRO");
wait( 2 );
level thread restore_share_screen( "intro_restore_share_screen" );
level thread waking_up();
//flag_wait( "introscreen_complete" );
level notify("start_chant");
spawn_trigger = getent( "opening_vig_start", "targetname" );
spawn_trigger trigger_off();
all_friends_hold_fire();
// level.ground_ref_ent = spawn( "script_model", (0,0,0) );
// players[0] playerSetGroundReferenceEnt( level.ground_ref_ent );
//players[0] thread waking_up();
for( i = 0; i < players.size; i++ )
{
players[i] SetDoubleVision( 5, 0.05 );
players[i] SetBlur( 2, 0.05 );
}
// spawn the AIs:
spawner_1 = getent( "opening_german_1", "targetname" );
spawner_2 = getent( "opening_german_2", "targetname" );
spawner_3 = getent( "opening_german_3", "targetname" );
spawner_4 = getent( "opening_russian_1", "targetname" );
spawner_5 = getent( "opening_russian_2", "targetname" );
german_1 = spawn_guy( spawner_1 );
german_2 = spawn_guy( spawner_2 );
german_3 = spawn_guy( spawner_3 );
//russian_1 = spawn_guy( spawner_4 );
russian_2 = spawn_guy( spawner_5 );
reznov = level.hero1;
chernov = level.hero2;
level thread opening_name_hide();
orig = getstruct( "see1_collect_anim", "targetname" );
level.russian_corpse = spawn( "script_model", german_1.origin );
level.russian_corpse.angles = german_1.angles;
level.russian_corpse character\char_rus_r_rifle::main();
if( level.wii == false )
{
level.russian_corpse detach( level.russian_corpse.gearModel );
}
level.russian_corpse.animname = "dead_guy";
level.russian_corpse UseAnimTree( #animtree );
//level.russian_corpse hide();
russian_1 = level.russian_corpse;
german_1.dropweapon = false;
german_2.dropweapon = false;
german_3.dropweapon = false;
//russian_1.dropweapon = false;
russian_2.dropweapon = false;
german_1.grenadeammo = 0;
german_2.grenadeammo = 0;
german_3.grenadeammo = 0;
//russian_1.grenadeammo = 0;
russian_2.grenadeammo = 0;
german_1.animname = "german1";
german_2.animname = "german2";
german_3.animname = "german3";
russian_1.animname = "dead_guy";
russian_2.animname = "dead_guy2";
reznov.animname = "reznov";
chernov.animname = "chernov";
//german_1.allowdeath = true;
german_2.allowdeath = true;
german_3.allowdeath = true;
//german_1.health = 5;
german_2.health = 5;
german_3.health = 5;
german_1.nodeathragdoll = true;
german_2.nodeathragdoll = true;
german_3.nodeathragdoll = true;
//russian_1.nodeathragdoll = true;
russian_2.nodeathragdoll = true;
german_1 hold_fire();
german_2 hold_fire();
german_3 hold_fire();
//russian_1 hold_fire();
russian_2 hold_fire();
reznov hold_fire();
chernov hold_fire();
reznov hide();
chernov hide();
if( level.wii )
{
german_2 thread wii_show_hide_weapon_1();
german_3 thread wii_show_hide_weapon_2();
}
guys = [];
guys[0] = german_1;
guys[1] = german_2;
guys[2] = german_3;
guys[3] = russian_1;
guys[4] = reznov;
guys[5] = chernov;
guys[6] = russian_2;
reznov disable_ai_color();
chernov disable_ai_color();
german_1.deathanim = %ch_seelow1_intro_german1_dead;
//russian_1.deathanim = %ch_seelow1_intro_deadguy_dead;
russian_2.deathanim = %ch_seelow1_intro_deadguy2_dead;
// remove gears from the Russians
//russian_1 Detach( russian_1.gearmodel, "" );
if( level.wii == false )
{
russian_2 Detach( russian_2.gearmodel, "" );
german_1 Detach( german_1.gearmodel, "" );
german_2 Detach( german_2.gearmodel, "" );
german_3 Detach( german_3.gearmodel, "" );
}
animspot = getent( "intro_anim_node", "targetname" );
reznov thread intro_wait_anim_done();
level thread intro_russian_1_death( russian_1 );
level thread intro_german_1_death( russian_2 );
level thread intro_german_1_death( german_1 );
level thread intro_german_2_injured_loop( animspot, german_2 );
level thread intro_german_3_injured_loop( animspot, german_3 );
level thread intro_german_injured_kill( german_2, "event_1_ends", "opening_german1_spared" );
level thread intro_german_injured_kill( german_3, "event_1_ends", "opening_german2_spared" );
level thread drop_all_weapons( german_1 );
level thread drop_all_weapons( german_2 );
level thread drop_all_weapons( german_3 );
level thread intro_achievement_detection();
opening_knife = spawn( "script_model", german_3 gettagorigin( "TAG_WEAPON_LEFT" ) );
opening_knife.angles = german_3 gettagangles( "TAG_WEAPON_LEFT" );
opening_knife setmodel("static_berlin_ger_knife");
opening_knife linkto( german_3, "TAG_WEAPON_LEFT" );
level thread opening_timing();
animSpot thread anim_single( guys, "intro" );
lerp_nodes = [];
lerp_nodes[0] = getnode( "opening_player1_start", "script_noteworthy" );
lerp_nodes[1] = getnode( "opening_player2_start", "script_noteworthy" );
lerp_nodes[2] = getnode( "opening_player3_start", "script_noteworthy" );
lerp_nodes[3] = getnode( "opening_player4_start", "script_noteworthy" );
for( i = 0; i < players.size; i++ )
{
level thread play_player_anim_intro( i, players[i], animSpot, lerp_nodes[i] );
}
russian_1 thread opening_attach_detach_player_weapon( russian_2 );
wait( 4 );
for( i = 0; i < players.size; i++ )
{
players[i] SetDoubleVision( 0, 2 );
players[i] SetBlur( 0, 2 );
}
//TUEY Set next music state up now so it times out properly
setmusicstate("FIELDS_OF_FIRE");
level waittill( "intro_hands_end" );
opening_knife delete();
if( isdefined( level.opening_watch ) )
{
level.opening_watch delete();
}
spawn_trigger trigger_on();
all_friends_resume_fire();
level thread release_player_later( 1 );
//level thread test_tanks();
}
wii_show_hide_weapon_1()
{
my_weapon = self.weapon;
// this is the guy putting gun on table
// wait till he puts the gun down, then spawn a new gun and detach
//for( i = 0; i < 50; i++ )
//{
// iprintlnbold( i );
// wait( 1 );
//}
wait( 11 );
temp_gun = spawn( "script_model", self gettagorigin( "tag_weapon_right" ) );
temp_gun.angles = self gettagangles( "tag_weapon_right" );
temp_gun setmodel( "weapon_ger_g43_rifle" );
self Detach( GetWeaponModel( my_weapon ), "tag_weapon_right" );
level waittill( "kick_face" );
self Attach( GetWeaponModel( my_weapon ), "tag_weapon_right" );
temp_gun delete();
}
wii_show_hide_weapon_2()
{
my_weapon = self.weapon;
// this is the guy checking the corpse
self Detach( GetWeaponModel( my_weapon ), "tag_weapon_right" );
level waittill( "kick_face" );
self Attach( GetWeaponModel( my_weapon ), "tag_weapon_right" );
}
drop_all_weapons( german )
{
level waittill( "opening_house_explosion" );
wait( 0.2 );
german Detach( GetWeaponModel( german.weapon ), "tag_weapon_right" );
}
#using_animtree( "generic_human" );
opening_russian_corpse()
{
animspot = getent( "intro_anim_node", "targetname" );
level.russian_corpse show();
level.russian_corpse UseAnimTree( #animtree );
level anim_loop_solo( level.russian_corpse, "intro_death", undefined, "stop_death_loop", animspot );
level.russian_corpse show();
}
///TEST
test_tanks()
{
tank = spawnvehicle( "vehicle_rus_tracked_t34",
"tank",
"t34",
( 2800, -6613, -666 ),
( 0, 0, 0 ) );
level.ev2_tank_3_can_mount = true;
level thread maps\see1_event2::pacing_get_on_tank_3b( tank );
}
opening_fake_german()
{
spawner = getent( "opening_fake_german", "targetname" );
spawned = spawner stalingradSpawn( true );
if( spawn_failed( spawned ) )
{
return;
}
spawned hold_fire();
spawned.health = 99999;
trigger = getent( "opening_field_spawners", "script_noteworthy" );
trigger waittill( "trigger" );
spawned dodamage( spawned.health + 100, ( 0, 0, 0 ) );
}
waking_up()
{
overlay = newHudElem();
overlay.x = 0;
overlay.y = 0;
overlay setshader( "black", 640, 480 );
overlay.alignX = "left";
overlay.alignY = "top";
overlay.horzAlign = "fullscreen";
overlay.vertAlign = "fullscreen";
overlay.alpha = 0;
overlay.sort = 1;
//overlay thread fadeOverlay( 0.0001, 1, 2 );
level.ground_ref_ent = spawn( "script_model", (0,0,0) );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] playerSetGroundReferenceEnt( level.ground_ref_ent );
}
level.ground_ref_ent rotateto( ( -50, 30, 10 ), .2, 0.1, 0.1 ); // 1+80, leans left, 2+80, looks left, 3+80: looks downward
//overlay thread fadeOverlay( 4, .3, 1);
level waittill( "stright_up_player" );
level.ground_ref_ent rotateto( (0,0,0), 4, 1, 1 );
}
release_player_later( time )
{
//player_1_link = getent( "intro_lock_player", "targetname" );
//players[0] setorigin( players[0].origin + (0,0,10) );
}
intro_wait_anim_done()
{
self waittillmatch( "single anim", "end" );
level notify( "intro_anim_done" );
//level.hero1 enable_ai_color();
//level.hero1 thread opening_react_to_tank_fire();
//end_node1 = getnode( "ev1_hero1_end_node", "targetname" );
//level.hero1 setgoalnode( end_node1 );
//level.hero2 enable_ai_color();
//level.hero2 thread opening_react_to_tank_fire();
//end_node2 = getnode( "ev1_hero2_end_node", "targetname" );
//level.hero2 setgoalnode( end_node2 );
wait( 1 );
//level.hero2 say_dialogue( "chernov", "retreating" );
wait( 0.5 );
//level.hero1 say_dialogue( "reznov", "not_save" );
wait( 0.5 );
level.hero1 say_dialogue( "reznov", "burn_wheat" );
wait( 0.5 );
level.hero1 say_dialogue( "reznov", "no_escape" );
level thread shoot_from_behind_dialog();
wait( 3 );
battlechatter_on();
//tuey set music state Fields of Fire
setmusicstate("FIELDS_OF_FIRE");
}
intro_german_dialog()
{
wait( 1 );
//level.hero2 say_dialogue( "chernov", "retreating" );
wait( 0.5 );
//level.hero1 say_dialogue( "reznov", "not_save" );
wait( 0.5 );
level.hero1 say_dialogue( "reznov", "burn_wheat" );
wait( 0.5 );
level.hero1 say_dialogue( "reznov", "no_escape" );
level thread shoot_from_behind_dialog();
wait( 3 );
battlechatter_on();
//tuey set music state Fields of Fire
setmusicstate("FIELDS_OF_FIRE");
}
intro_russian_1_death( guy )
{
guy waittillmatch( "single anim", "end" );
animspot = getent( "intro_anim_node", "targetname" );
//level.russian_corpse show();
//level.russian_corpse UseAnimTree( #animtree );
level thread anim_loop_solo( level.russian_corpse, "intro_death", undefined, "stop_death_loop", animspot );
// wait till all players are far away, then delete
while( 1 )
{
players = get_players();
still_too_close = false;
if( !isdefined( level.russian_corpse ) )
{
return;
}
for( i = 0; i < players.size; i++ )
{
if( distance( players[i].origin, level.russian_corpse.origin ) < 3000 )
{
still_too_close = true;
}
else if( distance( players[i].origin, level.russian_corpse.origin ) > 10000 )
{
level.russian_corpse notify( "stop_death_loop" );
level.russian_corpse delete();
return;
}
}
if( still_too_close == false )
{
level.russian_corpse notify( "stop_death_loop" );
level.russian_corpse delete();
return;
}
wait( 0.5 );
}
/*
level.russian_corpse show();
level thread opening_russian_corpse();
wait( 0.05 );
guy hide();
guy dodamage( guy.health + 10, ( 0, 0, 0 ) );
guy delete();
*/
}
intro_german_1_death( guy )
{
guy waittillmatch( "single anim", "end" );
guy stopanimscripted();
//iprintlnbold( "German dies" );
guy dodamage( guy.health + 10, ( 0, 0, 0 ) );
guy notify( "death" );
}
intro_german_2_injured_loop( animspot, guy )
{
level endon( "event_1_ends" );
guy setcandamage( true );
guy waittillmatch( "single anim", "end" );
guy.health = 1;
guy.nodeathragdoll = true;
guy.deathanim = %ch_seelow1_intro_german2_dead;
level thread intro_german_end_anim_at_damage( guy, "opening_german1_killed" );
while( isalive( guy ) )
{
animspot thread anim_single_solo( guy, "intro_loop" );
guy waittill( "single anim" );
}
}
intro_german_3_injured_loop( animspot, guy )
{
level endon( "event_1_ends" );
guy setcandamage( true );
guy waittillmatch( "single anim", "end" );
guy.health = 1;
guy.nodeathragdoll = true;
guy.deathanim = %ch_seelow1_intro_german3_dead;
level thread intro_german_end_anim_at_damage( guy, "opening_german2_killed" );
while( isalive( guy ) )
{
animspot thread anim_single_solo( guy, "intro_loop" );
guy waittill( "single anim" );
}
}
intro_german_injured_kill( guy, msg, flag_live )
{
level waittill( msg );
if( isalive( guy ) )
{
guy dodamage( 10000, ( 0, 0, 0 ) );
guy notify( "death" );
flag_set( flag_live );
}
}
intro_achievement_detection()
{
level waittill( "event_1_ends" );
wait( 1 );
if( flag( "opening_german1_killed" ) && flag( "opening_german2_killed" ) )
{
// Both enemies KILLED
russian_diary_event( "evil" );
}
else if( flag( "opening_german1_spared" ) && flag( "opening_german2_spared" ) )
{
// Both enemies SPARED
russian_diary_event( "good" );
}
else
{
// 1 enemy killed, 1 spared.
}
}
opening_attach_watch( guy )
{
//iprintlnbold( "attach" );
level.opening_watch = spawn( "script_model", guy gettagorigin( "TAG_WEAPON_LEFT" ) );
level.opening_watch.angles = guy gettagangles( "TAG_WEAPON_LEFT" );
level.opening_watch setmodel( "anim_seelow_pocketwatch" );
level.opening_watch linkto( guy, "TAG_WEAPON_LEFT" );
}
opening_detach_watch( guy )
{
level.opening_watch delete();
}
opening_attach_book( guy )
{
//iprintlnbold( "attach" );
//level.opening_book = spawn( "script_model", guy gettagorigin( "TAG_WEAPON_LEFT" ) );
//level.opening_book.angles = guy gettagangles( "TAG_WEAPON_LEFT" );
//level.opening_book setmodel( "static_berlin_books_diary" );
level.opening_book.origin = guy gettagorigin( "TAG_WEAPON_LEFT" );
level.opening_book.angles = guy gettagangles( "TAG_WEAPON_LEFT" );
level.opening_book linkto( guy, "TAG_WEAPON_LEFT" );
}
opening_detach_book( guy )
{
level.opening_book delete();
}
opening_player_straight( guy )
{
level notify( "stright_up_player" );
}
opening_kick_face( guy )
{
level notify( "kick_face" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] dodamage( players[i].health * 0.1, ( 1509, -6516, -560 ) );
}
}
opening_punch_face( guy )
{
level notify( "punch_face" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] dodamage( players[i].health * 0.1, ( 1509, -6516, -560 ) );
}
}
opening_outside_reaction( guy )
{
level notify( "outside_reaction" );
exploder( 98 );
/*
wait( 30 );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] PlayRumbleOnEntity( "damage_heavy" );
}
*/
}
opening_detach_player( guy )
{
level notify( "intro_release_player" );
//iprintlnbold( "release player track" );
}
opening_timing()
{
level waittill( "outside_reaction" );
level notify( "intro_spawns" );
//iprintlnbold( "intro spawns" );
battlechatter_off();
}
opening_attach_detach_player_weapon( new_guy )
{
wait( 0.5 );
//iprintlnbold( "DETACH" );
//self Detach( "weapon_rus_mosinnagant_rifle", "tag_weapon_right" );
//self.weapon = "none";
level waittill( "intro_hands_end" );
new_guy Detach( "weapon_rus_mosinnagant_rifle", "tag_weapon_right" );
new_guy.weapon = "none";
}
intro_german_end_anim_at_damage( guy, flag_name )
{
level endon( "event_1_ends" );
guy waittill( "damage", amount, attacker );
//iprintlnbold( "DAMAGE" );
guy stopanimscripted();
guy.health = 5;
guy dodamage( 10000, ( 0, 0, 0 ), attacker, attacker );
flag_set( flag_name );
//guy notify( "death" );
}
opening_zeitzev_gunshotFX( guy )
{
PlayFxOnTag( level._effect["rifleflash"], guy, "tag_flash" ); // muzzleflash
wait( 0.2 );
PlayFxOnTag( level._effect["rifle_shelleject"], guy, "tag_brass" ); // shell eject
}
opening_zeitzev_explosion( guy )
{
exploder( 99 );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] PlayRumbleOnEntity( "artillery_rumble" );
}
level notify( "opening_house_explosion" );
book_struct = getstruct( "opening_fake_book", "targetname" );
level.opening_book = spawn( "script_model", book_struct.origin );
level.opening_book.angles = book_struct.angles;
level.opening_book setmodel( "static_berlin_books_diary" );
level.hero1 show();
level.hero2 show();
}
opening_objectives()
{
// OBJ: To river
objective_add( 1, "current", level.obj1_string, ( 2810, -6138, -662 ) );
trigger = getent( "opening_obj_trig1", "targetname" );
trigger waittill( "trigger" );
objective_position( 1, ( 2999, -3940, -673.1 ) );
trigger = getent( "flame_spawn_trigger", "targetname" );
trigger waittill( "trigger" );
objective_position( 1, ( 3537, -2243, -913 ) );
level waittill( "event_1_ends" );
}
#using_animtree( "generic_human" );
// Russian soldier melees a German, then run to cover
melee_comabt_1_vignette()
{
anim_node = getnode( "melee_combat_1", "targetname" );
// spawn a german
spawner = getent( "melee_combat_1_german", "targetname" );
german = spawner stalingradspawn();
if( !maps\_utility::spawn_failed( german ) )
{
german setup_vig_ai( "german" );
german.health = 99999;
german thread killed_by_player_only();
//german.deathanim = level.scr_anim["german"]["melee_combat_1_death"];
//german.weapon hide();
}
german Detach( GetWeaponModel( german.weapon ), "tag_weapon_right" );
german.weapon = "none";
german.dropweapon = false;
german.grenadeammo = 0;
spawner2 = getent( "melee_combat_1_russian", "targetname" );
russian = spawner2 stalingradspawn();
if( !maps\_utility::spawn_failed( russian ) )
{
russian setup_vig_ai( "russian" );
russian disable_ai_color();
russian thread magic_bullet_shield();
russian.NoFriendlyfire = true;
}
guys = [];
guys[0] = german;
guys[1] = russian;
german.killer = russian;
waittillframeend;
if( isalive( german ) && isalive( russian ) )
{
level anim_reach( guys, "melee_combat_1", undefined, anim_node, undefined );
if( isalive( german ) && isalive( russian ) )
{
russian thread monitor_other_guys_death( german );
german thread monitor_other_guys_death2( russian );
//german thread track_knockdown( russian );
level anim_single( guys, "melee_combat_1", undefined, anim_node, undefined );
}
}
if( !isalive( russian ) )
{
return;
}
russian resume_fire();
flag_wait( "molotov_tossed" );
russian enable_ai_color();
russian thread late_stop_magic_bullet();
russian.animname = "generic";
russian thread opening_react_to_tank_fire();
}
late_stop_magic_bullet()
{
self endon( "death" );
wait( 3 );
self thread stop_magic_bullet_shield();
}
monitor_other_guys_death2( otherguy )
{
self endon( "anim_complete" );
self endon( "death" );
otherguy waittill( "death" );
self StopAnimScripted();
self resume_fire();
self.health = 1;
wait( 2 );
self dodamage( self.health + 100, ( 0, 0, 0 ) );
}
track_knockdown( russian )
{
self thread track_punches();
wait( 8 );
self.deathanim = %ch_berlin1_E3vignette3_german_death;
self playsound( "fall_body" );
wait( 1 );
if( isalive( russian ) )
{
PlayFxOnTag( level._effect["rifleflash"], russian, "tag_flash" ); // muzzleflash
russian playsound( "weap_mosinnagant_fire" );
}
wait( 0.2 );
if( isalive( russian ) )
{
PlayFxOnTag( level._effect["rifle_shelleject"], russian, "tag_brass" ); // shell eject
}
}
track_punches()
{
//self thread track_punches_single( 3 );
self thread track_punches_single( 5.5 );
self thread track_punches_single( 7.2 );
}
track_punches_single( time )
{
self endon( "death" );
wait( time );
self playsound( "ber3b_gun_impct" );
}
killed_by_player_only()
{
while( 1 )
{
self waittill( "damage", amount, attacker, direction_vec, point, type );
if( isplayer( attacker ) )
{
self dodamage( self.health + 100, ( 0, 0, 0 ), attacker, attacker );
}
}
}
#using_animtree( "generic_human" );
// Russian soldier melees a German, then run to cover
melee_comabt_2_vignette()
{
anim_node = getnode( "melee_combat_2", "targetname" );
spawner = getent( "melee_combat_2_german", "targetname" );
german = spawner stalingradspawn();
if( !maps\_utility::spawn_failed( german ) )
{
german setup_vig_ai( "german" );
german.health = 99999;
german thread killed_by_player_only();
//german.deathanim = level.scr_anim["german"]["melee_combat_2_death"];
//german.weapon hide();
}
german Detach( GetWeaponModel( german.weapon ), "tag_weapon_right" );
german.weapon = "none";
german.dropweapon = false;
german.grenadeammo = 0;
spawner2 = getent( "melee_combat_2_russian", "targetname" );
russian = spawner2 stalingradspawn();
if( !maps\_utility::spawn_failed( russian ) )
{
russian setup_vig_ai( "russian" );
russian disable_ai_color();
russian thread magic_bullet_shield();
russian.NoFriendlyfire = true;
}
guys = [];
guys[0] = german;
guys[1] = russian;
german.killer = russian;
waittillframeend;
//russian thread say_dialogue( "russian", level.opening_dialogs_list[level.opening_dialog_index] );
//level.opening_dialog_index++;
if( isalive( german ) && isalive( russian ) )
{
level anim_reach( guys, "melee_combat_2", undefined, anim_node, undefined );
if( isalive( german ) && isalive( russian ) )
{
russian thread monitor_other_guys_death( german );
german thread monitor_other_guys_death2( russian );
german thread track_knockdown( russian );
level anim_single( guys, "melee_combat_2", undefined, anim_node, undefined );
}
}
if( !isalive( russian ) )
{
return;
}
russian resume_fire();
flag_wait( "molotov_tossed" );
russian enable_ai_color();
russian thread late_stop_magic_bullet();
russian.animname = "generic";
russian thread opening_react_to_tank_fire();
}
//---------------------------------------------------------------------------------
opening_spawn_germans()
{
level waittill( "player_exits_house" );
//level waittill( "intro_spawns" );
//level waittill( "player_exits_house" );
spawners = getentarray( "opening_german_retreating", "targetname" );
array_thread( spawners, ::add_spawn_function, ::opening_spawn_germans_think );
for( i = 0; i < spawners.size; i++ )
{
german = spawners[i] stalingradspawn();
// ensure that no more than 4 are spawned in a single frame. Helps network latency
if( i % 4 == 0 )
{
wait_network_frame(); // Modifed to actually wait on the network correctly. DSL
}
}
}
opening_spawn_germans_think()
{
self endon( "death" );
self hold_fire();
self.goalradius = 32;
self.grenadeammo = 0;
self.ignoreall = 1;
self.animname = "generic";
//first_node_name = self.script_noteworthy + "_1";
second_node_name = self.script_noteworthy + "_2";
//first_node = getnode( first_node_name, "script_noteworthy" );
second_node = getnode( second_node_name, "script_noteworthy" );
self setgoalnode( second_node );
//self thread play_random_turning_anim();
self thread randomly_get_shot_from_behind();
// kill himself once there
self waittill( "goal" );
self doDamage( self.health + 25, ( 0,180,48 ) );
}
randomly_get_shot_from_behind()
{
self endon( "death" );
chance = randomint( 100 );
if( chance < 50 )
{
wait( randomfloat( 4 ) + 2 );
self doDamage( self.health + 25, ( 0,90,48 ) );
}
}
//---------------------------------------------------------------------------------
opening_spawn_fake_tank()
{
drone_trigger = getent( "intro_fake_drones", "script_noteworthy" );
drone_trigger trigger_off();
level waittill( "intro_spawns" );
drone_trigger trigger_on();
drone_trigger notify( "trigger" );
wait( 8 );
tank_trigger = getent( "intro_fake_tank_trigger", "script_noteworthy" );
tank_trigger notify( "trigger" );
wait( 1 );
tank = getent( "opening_fake_tank", "targetname" );
tank SetTurretTargetVec( ( 1706, -5651, -666 ) );
tank waittill( "reached_end_node" );
if( isalive( tank ) )
{
tank notify( "death" );
tank delete();
}
}
opening_spawn_molotov_tossers()
{
level waittill( "intro_spawns" );
level.molotov_tosser_fall_down = 0;
// molotov guys have all been spawned. 3 friends and 2 heroes
level.friends[0] thread opening_molotov_tossers_think();
level.friends[1] thread opening_molotov_tossers_think();
level.friends[2] thread opening_molotov_tossers_think();
level.hero1 thread opening_molotov_tossers_think( "hero" );
level.hero2 thread opening_molotov_tossers_think( "hero" );
}
opening_molotov_tossers_think( hero )
{
self endon( "death" );
self.goalradius = 32;
self.health = 99999;
self.grenadeammo = 0;
self hold_fire();
self disable_ai_color();
first_node_name = self.script_noteworthy + "_node1";
second_node_name = self.script_noteworthy + "_node2";
first_node = getnode( first_node_name, "script_noteworthy" );
second_node = getnode( second_node_name, "script_noteworthy" );
if( is_german_build() == false )
{
if( isdefined( hero ) && hero == "hero" )
{
}
else
{
self setgoalnode( first_node );
level waittill( "player_exits_house" );
}
}
self setgoalnode( second_node );
self.ignoreme = true;
//self.grenadeWeapon = "molotov";
self waittill( "goal" );
//iprintlnbold( "GOAL" );
if( self == level.hero1 )
{
self.animname = "reznov";
}
else if( self == level.hero2 )
{
self.animname = "chernov";
}
else
{
self.animname = "russian";
}
second_node thread anim_single_solo( self, "toss_molotov" );
self thread fake_throw_molotov();
self waittillmatch( "single anim", "end" );
//run_node = getnode( self.script_noteworthy, "script_noteworthy" );
//self.goalradius = 32;
//self thread run_chain_nodes( run_node );
if( self == level.hero1 || self == level.hero2 )
{
run_node = getnode( self.script_noteworthy, "script_noteworthy" );
self setgoalnode( run_node );
}
else
{
self.animname = "generic";
}
self thread opening_react_to_tank_fire();
flag_set( "molotov_tossed" );
wait( 2 );
self enable_ai_color();
self resume_fire();
//self waittill( "chain_ends" );
//self.health = 1;
//self dodamage( self.health + 25, ( 0,180,48 ) );
//self delete();
}
fake_throw_molotov()
{
self endon( "death" );
molotov = spawn( "script_model", self gettagorigin( "tag_weapon_left" ) );
molotov.angles = self gettagangles( "tag_weapon_left" );
molotov setmodel( "weapon_rus_molotov_grenade" );
molotov linkto( self, "tag_weapon_left" );
wait( 3.5 );
playfxontag( level._effect["molotov_trail_fire"], molotov, "tag_flash" );
wait( 2.2 );
molotov unlink();
molotov_target = getstruct( self.script_noteworthy, "targetname" );
forward = VectorNormalize( ( molotov_target.origin + ( 0, 0, 300 ) ) - molotov.origin );
velocities = forward * 12000;
molotov physicslaunch( ( molotov.origin ), velocities );
//velocities = ( forward + ( 300, 0, 0 ) ) * 10;
//molotov movegravity( velocities, 4 );
wait( 1.2 );
playfx( level._effect["molotov_explosion"], molotov_target.origin );
//Kevin adding molotov explosion sound
playsoundatposition("weap_molotov_impact",molotov.origin);
level thread start_spreading_fire( molotov_target.origin, 0.2 );
molotov delete();
}
opening_react_to_tank_fire()
{
self endon( "death" );
while( 1 )
{
level waittill( "tank_fires" );
if( isdefined( level.tank_fire_pos ) && isdefined( level.tank_fire_target ) )
{
nearestPoint = PointOnSegmentNearestToPoint( level.tank_fire_pos, level.tank_fire_target, self.origin );
dist = distance( nearestPoint, self.origin );
if( dist <= 250 )
{
wait( randomfloat( 0.5 ) );
if( isalive( self ) )
{
if( self.angles[1] > 70 && self.angles[1] < 110 )
{
if( level.molotov_tosser_fall_down == 1 )
{
trigger = getent( "dont_flinch", "targetname" );
if( self istouching( trigger ) )
{
return;
}
else
{
self anim_single_solo( self, "flinching_run_1" );
}
/*
self set_run_anim( "flinching_run_1" );
animation_time = getAnimLength( %ch_seelow1_flinch_run );
wait( animation_time );
self reset_run_anim();
*/
}
else if( self != level.hero1 )
{
trigger = getent( "dont_flinch", "targetname" );
if( self istouching( trigger ) )
{
return;
}
else
{
level.molotov_tosser_fall_down = 1;
self anim_single_solo( self, "flinching_run_2" );
/*
self set_run_anim( "flinching_run_2" );
animation_time = getAnimLength( %ch_seelow1_knockdown_run_b );
wait( animation_time );
self reset_run_anim();
*/
level.molotov_tosser_fall_down = 0;
}
}
}
}
}
}
wait( 0.05 );
}
}
start_spreading_fire( pos, wait_time )
{
wait( wait_time );
playfx( level._effect["wheat_fire_medium"], pos );
//client notify for Kevins audio
SetClientSysState("levelNotify","wheat_fire");
//wait( 1 );
//playfx( level._effect["tree_brush_fire"], pos+ ( 80, 30, 10 ) );
//playfx( level._effect["tree_brush_fire"], pos + ( -80, -10, 6 ) );
}
//---------------------------------------------------------------------------------
opening_spawn_tanks()
{
level thread opening_tank_1();
level thread opening_tank_2();
level thread wait_for_move_trigger();
wait( 6 );
level notify( "move_tanks" );
}
wait_for_move_trigger()
{
trigger = getent( "opening_move_tanks", "targetname" );
trigger waittill( "trigger" );
level notify( "move_tanks" );
level thread opening_fake_german();
}
opening_loop_fire_at_target( target_ent, fire_msg, end_msg )
{
if( isdefined( end_msg ) )
{
level endon( end_msg );
}
self SetTurretTargetEnt( target_ent );
max_fires = 10;
current_fires = 0;
while( 1 )
{
if( current_fires > max_fires )
{
return;
}
if( isalive( self ) )
{
wait( randomfloat( 1.5 ) + 1.2 );
if( isalive( self ) )
{
level notify( fire_msg );
level.tank_fire_pos = self.origin;
level.tank_fire_target = target_ent.origin;
wait( 0.3 );
self FireWeapon();
playfx( level._effect["tank_fire_dust"],self.origin );
current_fires++;
if( target_ent.targetname == "opening_tank_1_target_2" || target_ent.targetname == "opening_tank_2_target_2" )
{
playfx( level._effect["wheat_blow_up"], target_ent.origin + ( 200, 0, 20 ) );
}
play_puddle_fx( self.origin, target_ent.origin );
}
wait( 4 );
}
else
{
return;
}
}
}
play_puddle_fx( tank_origin, target_origin )
{
//find the nearest struct to the tank
puddle_origins = getstructarray( "opening_puddle", "targetname" );
nearest_puddle = puddle_origins[0];
nearest_puddle_dist = distance( nearest_puddle.origin, tank_origin );
for( i = 0; i < puddle_origins.size; i++ )
{
if( distance( puddle_origins[i].origin, tank_origin ) < nearest_puddle_dist )
{
nearest_puddle = puddle_origins[i];
nearest_puddle_dist = distance( nearest_puddle.origin, tank_origin );
}
}
// now the nearest struct is found. Make sure it's close enough to the firing tracer
nearestPoint = PointOnSegmentNearestToPoint( tank_origin, target_origin, nearest_puddle.origin );
dist = distance( nearestPoint, nearest_puddle.origin );
if( dist <= 300 )
{
//print3d( nearest_puddle.origin + ( 0, 0, 30 ), "Puddle" );
playfx( level._effect["puddle"], nearest_puddle.origin + ( 0, 0, 4 ) );
}
}
opening_tank_1()
{
start_node_1 = getvehiclenode( "opening_tank_1_start", "targetname" );
tank1 = spawnvehicle( "vehicle_rus_tracked_t34",
"tank1",
"t34",
start_node_1.origin,
start_node_1.angles );
tank1.vehicletype = "t34";
vehicle_init( tank1 );
tank1 attachPath( start_node_1 );
tank1.health = 100000;
// prepare targets to fire at
tank1_target1 = getent( "opening_tank_1_target_1", "targetname" );
tank1_target2 = getent( "opening_tank_1_target_2", "targetname" );
tank1_target3 = getent( "opening_tank_1_target_3", "targetname" );
tank1 thread opening_loop_fire_at_target( tank1_target1, "tank_fires", "move_tanks" );
level waittill( "move_tanks" );
tank1 thread opening_loop_fire_at_target( tank1_target2, "tank_fires", "stop_firing_1" );
tank1 startpath();
end_node = getvehiclenode( "opening_tank_1_stop_fire", "script_noteworthy" );
tank1 setwaitnode( end_node );
tank1 waittill( "reached_wait_node" );
level notify( "stop_firing_1" );
tank1 SetTurretTargetEnt( tank1_target3 );
tank1 waittill( "reached_end_node" );
tank1_target1 delete();
tank1_target2 delete();
tank1_target3 delete();
tank1 doDamage( tank1.health + 25, ( 0,180,48 ) );
tank1 delete();
}
opening_tank_2()
{
start_node_2 = getvehiclenode( "opening_tank_2_start", "targetname" );
tank2 = spawnvehicle( "vehicle_rus_tracked_t34",
"tank2",
"t34",
start_node_2.origin,
start_node_2.angles );
tank2.vehicletype = "t34";
vehicle_init( tank2 );
tank2 attachPath( start_node_2 );
tank2.health = 100000;
// prepare targets to fire at
tank2_target1 = getent( "opening_tank_2_target_1", "targetname" );
tank2_target2 = getent( "opening_tank_2_target_2", "targetname" );
tank2_target3 = getent( "opening_tank_2_target_3", "targetname" );
tank2 thread opening_loop_fire_at_target( tank2_target1, "tank_fires", "move_tanks" );
level waittill( "move_tanks" );
wait( 3 );
tank2 thread opening_loop_fire_at_target( tank2_target2, "tank_fires", "stop_firing_2" );
tank2 startpath();
// now fire at the house with player trigger. If the player is slow, wait for him at the node
level.house_blown_up = false;
tank2 thread opening_tank_2_wait();
player_trigger = getent( "flame_spawn_trigger", "targetname" );
player_trigger waittill( "trigger" );
level notify( "stop_firing_2" );
house_target = getent( "opening_house_explosion_target", "targetname" );
tank2 SetTurretTargetEnt( house_target );
wait( 2 );
tank2 FireWeapon();
exploder( 101 );
level.house_blown_up = true;
//client notify for Kevins audio
SetClientSysState("levelNotify","house_explosion");
tank2 SetTurretTargetEnt( tank2_target3 );
level notify( "house_blown_up" );
tank2 waittill( "reached_end_node" );
tank2_target1 delete();
tank2_target2 delete();
tank2_target3 delete();
tank2 doDamage( tank2.health + 25, ( 0,180,48 ) );
tank2 delete();
}
opening_tank_2_wait()
{
end_node = getvehiclenode( "opening_tank_2_stop_fire_2", "script_noteworthy" );
self setwaitnode( end_node );
self waittill( "reached_wait_node" );
if( level.house_blown_up == false )
{
self setspeed( 0, 5 );
while( level.house_blown_up == false )
{
wait( 0.05 );
}
self resumespeed( 5 );
}
wait( 1 );
}
opening_spawn_more_tanks()
{
level endon( "event_1_ends" );
trigger = getent( "flame_spawn_trigger", "targetname" );
trigger waittill( "trigger" );
start_node = getvehiclenode( "opening_tank_3_start", "targetname" );
count = 0;
while( 1 )
{
if( get_players()[0] istouching( trigger ) )
{
level thread opening_spawn_move_tank( start_node );
wait( randomint( 17 ) + 12 );
}
wait( 0.05 );
count++;
if( count > 5 )
{
return;
}
}
}
opening_spawn_move_tank( start_node )
{
tank = spawnvehicle( "vehicle_rus_tracked_t34",
"tank",
"t34",
start_node.origin,
start_node.angles );
tank attachPath( start_node );
tank.health = 100000;
tank startpath();
tank waittill( "reached_end_node" );
tank doDamage( tank.health + 25, ( 0,180,48 ) );
tank delete();
}
//---------------------------------------------------------------------------------
additional_fires()
{
flag_wait( "molotov_tossed" );
structs = getstructarray( "opening_burning_field_points", "targetname" );
for( i = 0; i < structs.size; i++ )
{
if( isdefined( structs[i].script_noteworthy ) && structs[i].script_noteworthy == "temp_disable" )
{
continue;
}
else
{
wait( 0.05 );
playfx( level._effect["wheat_fire_medium"], structs[i].origin );
}
}
structs2 = getstructarray( "opening_burning_field_points_large", "targetname" );
for( i = 0; i < structs2.size; i++ )
{
if( isdefined( structs2[i].script_noteworthy ) && structs2[i].script_noteworthy == "temp_disable" )
{
continue;
}
else
{
wait( 0.05 );
playfx( level._effect["wheat_fire_large"], structs2[i].origin + ( 0, 0, 30 ) );
}
}
structs3 = getstructarray( "opening_burning_field_points_smoke", "targetname" );
for( i = 0; i < structs3.size; i++ )
{
wait( 0.05 );
playfx( level._effect["wheat_smoke"], structs3[i].origin );
}
}
force_move_friends()
{
init_trigger = getent( "opening_initial_move_friends", "targetname" );
init_trigger waittill( "trigger" );
level thread pacing_dialog();
wait( 6 );
init_trigger trigger_off();
init_trigger_2 = getent( "opening_initial_move_friends_1", "targetname" );
if( isdefined( init_trigger_2 ) )
{
init_trigger_2 notify( "trigger" );
}
}
shoot_from_behind_dialog()
{
level.hero1 say_dialogue( "reznov", "shoot" );
wait( 0.5 );
level.hero2 say_dialogue( "chernov", "in_the_back" );
wait( 0.5 );
level.hero2 say_dialogue( "reznov", "wherever" );
}
pacing_dialog()
{
trigger = getent( "scurve_pacing", "targetname" );
trigger waittill( "trigger" );
level.hero1 say_dialogue( "reznov", "things_changed" );
wait( 0.5 );
level.hero1 say_dialogue( "reznov", "their_blood" );
}
spawn_func_running_and_dying()
{
self.goalradius = 16;
self.ignoreall = 1;
self.pacifist = 1;
self.health = 999;
self.accuracy = 0.01;
self.animname = "generic";
self endon( "death" );
if( is_german_build() == false )
{
//self assign_random_retreat_anim();
self putGunAway();
self set_run_anim( "flame_run" );
}
//self.deathanim = %ai_flame_death_run_die;
/*
index = randomint( 100 );
if( index < 50 )
{
self set_run_anim( "flame_run" );
}
else
{
self set_run_anim( "panick_run_2" );
}
*/
self thread protect_from_dying( 2);
if( is_german_build() == false )
{
self thread animscripts\death::flame_death_fx();
}
wait( 2 );
while( distance( self.origin, self.goalpos ) > 100 )
{
wait( 0.1 );
}
//self waittill( "goal" );
if( is_german_build() == false )
{
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);
BulletTracer( ( 2051, -5465, -666 ) + ( randomint(50)-25, 0, 0 ) , self gettagorigin( tags[random] ) );
if( random == 2 )
{
playfxontag( level._effect["headshot_hit"], self, tags[random]);
break;
}
else
{
playfxontag( level._effect["flesh_hit"], self, tags[random]);
wait(randomfloat(0.1));
}
}
}
if( self.script_noteworthy == "opening_running_germans_close" )
{
self doDamage( self.health + 25, ( 2550, -5224, -666 ) );
}
else
{
self doDamage( self.health + 25, ( 2550, -5224, -666 ) );
}
}
protect_from_dying( time )
{
self endon( "death" );
self.health = 9999;
wait( time );
self.health = 50;
}
spawn_func_running_and_dying_to_end()
{
self endon( "death" );
self endon( "ready_to_die_already" );
self.goalradius = 16;
self.ignoreall = 1;
self.pacifist = 1;
self.health = 200;
self.accuracy = 0.01;
self thread goal_die_to_player();
wait( 2 );
while( distance( self.origin, self.goalpos ) > 100 )
{
wait( 0.1 );
}
if( is_german_build() == false )
{
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 + randomint(3); i++)
{
random = randomintrange(0, tags.size);
BulletTracer( ( 2051, -5465, -666 ) + ( randomint(50)-25, 0, 0 ) , self gettagorigin( tags[random] ) );
if( random == 2 )
{
playfxontag( level._effect["headshot_hit"], self, tags[random]);
break;
}
else
{
playfxontag( level._effect["flesh_hit"], self, tags[random]);
wait(randomfloat(0.2));
}
}
}
//self waittill( "goal" );
self doDamage( self.health + 25, ( 2046, -5308, -666 ) );
}
goal_die_to_player()
{
self endon( "death" );
self endon( "goal" );
while( 1 )
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( distance( players[i].origin, self.origin ) < 80 )
{
self notify( "ready_to_die_already" );
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 + randomint(3); i++)
{
random = randomintrange(0, tags.size);
BulletTracer( ( 2051, -5465, -666 ) + ( randomint(50)-25, 0, 0 ) , self gettagorigin( tags[random] ) );
if( random == 2 )
{
playfxontag( level._effect["headshot_hit"], self, tags[random]);
break;
}
else
{
playfxontag( level._effect["flesh_hit"], self, tags[random]);
wait(randomfloat(0.2));
}
}
self doDamage( self.health + 25, ( 0,180,48 ) );
return;
}
}
wait( 0.1 );
}
}
spawn_flaming_guys()
{
/*
trigger = getent( "flame_spawn_trigger", "targetname" );
trigger waittill( "trigger" );
level thread running_on_fire_1_vignette();
level thread running_on_fire_2_vignette();
*/
}
running_on_fire_1_vignette()
{
spawner = getent( "opening_fire_runner_1_death", "targetname" );
german = spawner StalingradSpawn();
spawn_failed (german);
german.animname = "german";
//german = spawn_fake_guy_to_anim( "running_on_fire_1", "axis", "german", "guy" );
german thread animscripts\death::flame_death_fx();
level thread anim_single_solo( german, "running_on_fire_1", undefined, german );
level thread early_kill_german( german );
wait( 5 );
//german doDamage( german.health + 25, ( 0,180,48 ) );
german startragdoll();
}
running_on_fire_2_vignette()
{
//german = spawn_fake_guy_to_anim( "running_on_fire_2", "axis", "german", "guy" );
spawner = getent( "opening_fire_runner_1_death", "targetname" );
german = spawner StalingradSpawn();
spawn_failed (german);
german.animname = "german";
german thread animscripts\death::flame_death_fx();
level thread anim_single_solo( german, "running_on_fire_2", undefined, german );
level thread early_kill_german( german );
wait( 5 );
//german doDamage( german.health + 25, ( 0,180,48 ) );
german startragdoll();
}
early_kill_german( german )
{
german waittill( "damage" );
//iprintlnbold( "damage" );
german stopanimscripted();
german startragdoll();
}
spawn_flaming_guys_side()
{
trigger = getent( "opening_fire_hole_trig", "targetname" );
trigger waittill( "trigger" );
pos1 = getstruct( "opening_fire_hole_target", "targetname" );
pos2 = getstruct( "opening_fire_hole_target_2", "targetname" );
playfx( level._effect["molotov_explosion"], pos1.origin );
playfx( level._effect["molotov_explosion"], pos2.origin );
if( is_german_build() == false )
{
level thread running_on_fire_3_vignette();
wait( 0.5 );
level thread running_on_fire_5_vignette();
}
}
running_on_fire_3_vignette()
{
//german = spawn_fake_guy_to_anim( "running_on_fire_3", "axis", "german", "guy" );
spawner = getent( "opening_fire_runner_1_death", "targetname" );
german = spawner StalingradSpawn();
spawn_failed (german);
german hold_fire();
german.animname = "german";
german.health = 10;
german.allowdeath = true;
german thread animscripts\death::flame_death_fx();
level thread anim_single_solo( german, "running_on_fire_1", undefined, german );
level thread early_kill_german( german );
wait( 5 );
//german doDamage( german.health + 25, ( 0,180,48 ) );
if( isalive( german ) )
{
german startragdoll();
}
}
running_on_fire_4_vignette()
{
german = spawn_fake_guy_to_anim( "running_on_fire_4", "axis", "german", "guy" );
german thread animscripts\death::flame_death_fx();
level thread anim_single_solo( german, "running_on_fire_2", undefined, german );
wait( 5 );
//german doDamage( german.health + 25, ( 0,180,48 ) );
german startragdoll();
}
running_on_fire_5_vignette()
{
//german = spawn_fake_guy_to_anim( "running_on_fire_5", "axis", "german", "guy" );
spawner = getent( "opening_fire_runner_2_death", "targetname" );
german = spawner StalingradSpawn();
spawn_failed (german);
german hold_fire();
german.animname = "german";
german.health = 10;
german.allowdeath = true;
german thread animscripts\death::flame_death_fx();
level thread anim_single_solo( german, "running_on_fire_2", undefined, german );
level thread early_kill_german( german );
wait( 5 );
//german doDamage( german.health + 25, ( 0,180,48 ) );
if( isalive( german ) )
{
german startragdoll();
}
}
//---------------------------------------------------------------------------------
opening_plane_flash()
{
trigger = getent( "opening_obj_trig1", "targetname" );
trigger waittill( "trigger" );
wait( 2 );
level thread opening_flashes();
start_node = getvehiclenode( "opening_plane_start", "targetname" );
plane = spawnvehicle( "vehicle_rus_airplane_il2",
"plane",
"stuka",
start_node.origin,
start_node.angles );
plane attachPath( start_node );
plane startpath();
plane playsound( "fly_by" );
wait( 3 );
//level thread maps\see1_event3::plane_tracer_burst( plane );
plane waittill( "reached_end_node" );
plane notify( "stop_firing" );
plane delete();
}
opening_flashes()
{
flash_points1 = getstruct( "opening_flash_1", "targetname" );
//flash_points2 = getstruct( "opening_flash_2", "targetname" );
flash_points2 = getstruct( "opening_flash_2_new", "targetname" );
flash_points3 = getstruct( "opening_flash_3", "targetname" );
wait( 5 );
//playfx( level._effect["flak_flash"], flash_points1.origin );
//wait( 0.5 );
//playfx( level._effect["flak_flash"], flash_points2.origin );
//wait( 0.5 );
//playfx( level._effect["flak_flash"], flash_points3.origin );
//wait( 0.5 );
playfx( level._effect["napalm"], flash_points1.origin );
//kevin's playsound
playsoundatposition("bomb1L",flash_points1.origin);
wait( 0.7 );
playfx( level._effect["napalm"], flash_points2.origin );
playsoundatposition("bomb2L",flash_points2.origin);
//wait( 1.4 );
//playfx( level._effect["napalm"], flash_points3.origin );
//playsoundatposition("plane_bomb1L",flash_points1.origin);
}
lower_accuracy_for_event_2()
{
start_trigger = getent( "opening_initial_move_friends_2", "targetname" );
start_trigger waittill( "trigger" );
//iprintlnbold( "lower" );
level thread lower_friendlies_accuracy( 0.1, "restore_accuracy" );
end_trigger1 = getent( "ev1_move_init_enemies", "targetname" );
end_trigger2 = getent( "restore_accuracy_1", "targetname" );
end_trigger3 = getent( "restore_accuracy_2", "targetname" );
level thread wait_for_trigger_and_notify( end_trigger2, "restore_accuracy" );
level thread wait_for_trigger_and_notify( end_trigger3, "restore_accuracy" );
end_trigger1 waittill( "trigger" );
level thread wait_time( 30, "restore_accuracy" );
}
dialog_player_into_wheat_field()
{
trigger = getent( "opening_into_wheat_field", "targetname" );
trigger waittill( "trigger" );
level.hero2 say_dialogue_wait( "chernov", "stay_out" );
level.hero2 say_dialogue_wait( "chernov", "soon_ashes" );
if( isdefined( trigger ) && any_player_touching( trigger ) )
{
// wait for player to exit flame
while( 1 )
{
if( !isdefined( trigger ) )
{
return;
}
if( any_player_touching( trigger ) == false )
{
wait( 1 );
level.hero1 say_dialogue_wait( "reznov", "fireproof" );
return;
}
else
{
wait( 0.1 );
}
}
}
}
opening_molotov_instructions()
{
trigger = getent( "opening_initial_move_friends", "targetname" );
trigger waittill( "trigger" );
print_text_on_screen( &"SEE1_USE_MOLOTOV" );
}
opening_cleanup()
{
wait( 0.1 );
delete_ent_array( "opening_mg_vig", "targetname" );
delete_ent_array( "opening_into_wheat_field", "targetname" );
delete_ent_array( "opening_obj_trig1", "targetname" );
delete_ent_array( "opening_move_tanks", "targetname" );
delete_ent_array( "opening_vig_start", "targetname" );
delete_ent_array( "opening_fire_hole_trig", "targetname" );
delete_ent_array( "flame_spawn_trigger", "targetname" );
delete_ent_array( "opening_field_spawners", "targetname" );
delete_ent_array( "intro_anim_node", "targetname" );
delete_ent_array( "opening_initial_move_1", "targetname" );
delete_ent_array( "opening_initial_move_friends", "targetname" );
delete_ent_array( "opening_initial_move_friends_1", "targetname" );
delete_ent_array( "opening_initial_move_friends_2", "targetname" );
delete_ent_array( "intro_fake_drones", "script_noteworthy" );
delete_ent_array( "opening_field_spawners", "script_noteworthy" );
delete_ent_array( "intro_fake_tank_trigger", "script_noteworthy" );
delete_ent_array( "intro_drones_temp", "script_noteworthy" );
}