IW4-Dump-Files/maps/dcemp_code.gsc

3518 lines
84 KiB
Plaintext
Raw Permalink Blame History

#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
#include maps\_hud_util;
CONST_BTR_SLIDE_TIME_1 = 1.5;
CONST_BTR_SLIDE_TIME_2 = .65;
CONST_STREET_CAR_WAIT = .25;
CONST_NEW_HELI_DROP_HEIGHT = 5500;
//------- SPACE SUIT INPUT --------->
CONST_ISS_INPUT_X_MIN = 8;
CONST_ISS_INPUT_RATE_X = .3;
CONST_ISS_INPUT_FORCE_X = .75;
CONST_ISS_INPUT_ACC_X_MAX = 5;
CONST_ISS_INPUT_DEC_X = .05;
CONST_ISS_INPUT_RATE_Y = .5;
CONST_ISS_INPUT_DEC_Y = .05;
CONST_ISS_INPUT_ACC_Y_MIN = 1;
//<---------------------------------
/************************************************************************************************************/
/* INTRO */
/************************************************************************************************************/
iss_get_satellite_model()
{
node = getent( "iss_player_link", "targetname" );
model = spawn_anim_model( "iss_satellite", node.origin );
model.angles = node.angles;
model linkto( node );
foreach( part in level.iss_ents[ "satellite" ] )
part linkto( model );
return model;
}
iss_satellite_update_model( veh )
{
while( 1 )
{
self moveto( veh.origin, .1 );
self rotateto( veh.angles, .1 );
wait .05;
}
}
iss_camera_setup()
{
setsaveddvar( "ui_hidemap", 1 );
SetSavedDvar( "hud_showStance", "0" );
SetSavedDvar( "compass", "0" );
SetSavedDvar( "ammoCounterHide", "1" );
level.player allowcrouch( false );
level.player allowprone( false );
level.player freezecontrols( true );
node = getent( "iss_player_link2", "targetname" );
camera = spawn_anim_model( "iss_rig", node.origin );
//camera hide();
camera.angles = node.angles;
camera linkto( node );
camera.node = node;
level.player playerlinktodelta( camera, "tag_origin", 1, 0, 0, 0, 0 );
level.player PlayerSetGroundReferenceEnt( camera );
node anim_first_frame_solo( camera, "ISS_animation" );
// camera thread iss_camera_spotlight();
return camera;
}
iss_camera_spotlight()
{
offset = self iss_camera_offset();
setsaveddvar( "r_spotlightstartradius", "16" );
setsaveddvar( "r_spotlightEndradius", "500" );
setsaveddvar( "r_spotlightfovinnerfraction", ".1" );
setsaveddvar( "r_spotlightexponent", "5" );
setsaveddvar( "r_spotlightBrightness", "2" );
origin = self.origin + offset;
model = spawn( "script_model", origin );
model setmodel( "TAG_ORIGIN" );
model.angles = level.player getplayerangles();
playfxontag( level._effect[ "space_helmet_spot_light" ], model, "TAG_ORIGIN" );
while( !flag( "iss_destroy_blast_wave" ) )
{
offset = self iss_camera_offset();
model.origin = self.origin + offset; // model moveto( self.origin + offset, .1 );
model.angles = level.player getplayerangles() + self.angles;
wait .05;
}
model delete();
}
iss_camera_offset()
{
up = anglestoup( self.angles );
right = anglestoright( self.angles );
forward = anglestoforward( self.angles );
offset = ( up * 64 ) + ( right * 16 ) + ( forward * -2 );
return offset;
}
iss_satellite()
{
model = iss_get_satellite_model();
diff = (5092, 4344, 3438) - ( 5440, 4634, 3470 );
node = getent( "iss_player_link", "targetname" );
node2 = spawn( "script_origin", node.origin );
node2.angles = node.angles;
node2.targetname = "iss_player_link2";
node2 linkto( model );
camera = iss_camera_setup();
array = [];
array[ "model" ] = model;
array[ "node" ] = node;
array[ "camera" ] = camera;
return array;
}
iss_organize_ents()
{
level.iss_ents = [];
nodes = getstructarray( "iss_group_node", "targetname" );
array_thread( nodes, ::iss_organize_ents_by_node );
array_wait( nodes, "done_organizing" );
flag_set( "iss_organize_ents" );
}
iss_organize_ents_by_node()
{
ents = getentarray( "iss_entity", "targetname" );
level.iss_ents[ self.script_noteworthy ] = [];
node = getstruct( "iss_blast_node", "targetname" );
num = 0;
foreach( obj in ents )
{
if( distancesquared( obj getorigin(), self.origin ) > squared( self.radius ) )
continue;
obj.distance_to_blast = distance( node.origin, obj getorigin() );
size = level.iss_ents[ self.script_noteworthy ].size;
level.iss_ents[ self.script_noteworthy ][ size ] = obj;
num++;
if( num == 50 )
{
wait .05;
num = 0;
}
}
self notify( "done_organizing" );
}
iss_destroy_iss()
{
level.iss_destroy_small = 0;
parts = level.iss_ents[ "iss" ];
flag_init( "temp" );
array_thread( parts, ::iss_destroy_iss_parts );
}
iss_destroy_sat()
{
parts = level.iss_ents[ "satellite" ];
array_thread( parts, ::iss_destroy_sat_parts );
}
iss_destroy_iss_parts()
{
magicnumber = .0012;
time = magicnumber * self.distance_to_blast;
time = time - 3;// + randomfloat( .1 );
flag_wait_or_timeout( "iss_destroy_blast_wave", time );
flag_set( "iss_destroy_first_wave" );
thread flag_set_delayed( "iss_destroy_blast_wave", 1.5 );
if( isdefined( self.script_noteworthy ) && self.script_noteworthy == "delete" )
{
self delete();
return;
}
if( flag( "iss_destroy_blast_wave" ) && self.script_type == "small" )
{
level.iss_destroy_small++;
if( level.iss_destroy_small > 1 )
{
self delete();
level.iss_destroy_small = 0;
return;
}
}
dist = [];
dist[ "small" ] = 55000;
dist[ "medium" ] = 25000;
dist[ "large" ] = 16000;
rot = [];
rot[ "small" ] = 500;
rot[ "medium" ] = 200;
rot[ "large" ] = 100;
signp = 1;
signr = 1;
if( cointoss() )
signp = -1;
if( cointoss() )
signr = -1;
blaststart = getstruct( "iss_blast_node", "targetname" );
blastend = getstruct( blaststart.target, "targetname" );
time = 30;
rotation = ( randomfloatrange( .75, 1 ) * signp, 0, randomfloatrange( .75, 1 ) * signr );
vector = vectornormalize( blastend.origin - blaststart.origin );
origin = self getorigin() + ( vector * dist[ self.script_type ] * randomfloatrange( .8, 1.2 ) );
angles = rotation * rot[ self.script_type ] * randomfloatrange( .8, 1.2 );
self moveto( origin, time );
self rotatevelocity( angles, time );
}
iss_destroy_sat_parts()
{
if( isdefined( self.script_noteworthy ) && self.script_noteworthy == "delete" )
{
self delete();
return;
}
if( self.script_type == "small" )
{
level.iss_destroy_small++;
if( level.iss_destroy_small > 10 )
{
self delete();
level.iss_destroy_small = 0;
return;
}
wait .5;
}
self unlink();
dist = [];
dist[ "small" ] = 40000;
dist[ "medium" ] = 20000;
dist[ "large" ] = 15000;
rot = [];
rot[ "small" ] = 500;
rot[ "medium" ] = 200;
rot[ "large" ] = 100;
signp = 1;
signr = 1;
if( cointoss() )
signp = -1;
if( cointoss() )
signr = -1;
blaststart = getstruct( "iss_blast_node", "targetname" );
blastend = getstruct( blaststart.target, "targetname" );
time = 30;
rotation = ( randomfloatrange( .75, 1 ) * signp, 0, randomfloatrange( .75, 1 ) * signr );
vector = vectornormalize( blastend.origin - blaststart.origin );
origin = self getorigin() + ( vector * dist[ self.script_type ] * randomfloatrange( .8, 1.2 ) );
angles = rotation * rot[ self.script_type ] * randomfloatrange( .8, 1.2 );
self moveto( origin, time );
self rotatevelocity( angles, time );
}
iss_kill_player()
{
cam = level.iss_sat[ "camera" ];
cam.node unlink();
blaststart = getstruct( "iss_blast_node", "targetname" );
blastend = getstruct( blaststart.target, "targetname" );
time = 30;
vector = vectornormalize( blastend.origin - blaststart.origin );
origin = cam.origin + ( vector * 25000 );
angles = ( 0, 0, 80 );
cam.node moveto( origin, time );
cam.node rotatevelocity( angles, time );
time = 4;
plate = spawn( "script_model", level.player geteye() + ( vector * -2000 ) );
plate setmodel( "iss_sail_center" );
plate rotatevelocity( ( 195, 0, -215 ), time );
while( time > 0 )
{
plate moveto( level.player geteye() + ( vector * 256 ), time );
time -= .05;
wait .05;
}
}
iss_player_quake()
{
level endon( "iss_done" );
while( 1 )
{
earthquake( .35, .2, level.player.origin, 1024 );
wait .05;
}
}
iss_lights_out()
{
node = getent( "earth_model", "targetname" );
model = spawn( "script_model", node.origin + ( 0,0,300 ) );
model.angles = node.angles;
model.targetname = "iss_lights";
wait 1;
for( i = 1; i <= level.bg_iss_darknum; i++ )
{
name = "bg_iss_dark0";
if( i > 9 )
name = "bg_iss_dark";
model setmodel( name + i );
wait randomfloatrange( .2, .4 );
}
}
iss_preload_lights()
{
origin = level.player.origin + ( 0,0,1024 );
for( i = 1; i <= level.bg_iss_darknum; i++ )
{
name = "bg_iss_dark0";
if( i > 9 )
name = "bg_iss_dark";
model = spawn( "script_model", origin );
model.targetname = "iss_lights";
model setmodel( name + i );
}
}
/************************************************************************************************************/
/* INTRO */
/************************************************************************************************************/
intro_enemy_setup()
{
flag_wait( "crash_cut_to_black" );
thread battlechatter_off();
flag_wait( "emp_entity_cleanup_done" );
ai = getaiarray( "axis" );
ai = array_removeDead_or_dying( ai );
array_thread( ai, ::intro_enemy_reaction );
}
intro_enemy_reaction()
{
self endon( "death" );
self endon( "long_death" );
self.allowdeath = true;
self.diequietly = true;
self thread anim_generic_loop( self, "covercrouch_hide_idle" );
flag_wait( "emp_back_from_whiteout" );
center = getstruct( "emp_center", "targetname" );
node = spawnstruct();
node.origin = self.origin;
angles = node.origin - center.origin;
node.angles = vectortoangles( angles );
animes = [];
animes[ animes.size ] = "cqb_stand_react_A";
animes[ animes.size ] = "cqb_stand_react_B";
animes[ animes.size ] = "cqb_stand_react_C";
animes[ animes.size ] = "cqb_stand_react_D";
animes[ animes.size ] = "cqb_stand_react_E";
self notify( "stop_loop" );
self anim_stopanimscripted();
node anim_generic_gravity( self, random( animes ) );
self setgoalnode( getnode( "intro_enemy_node", "targetname" ) );
self.goalradius = 100;
self add_wait( ::waittill_msg, "goal" );
level add_wait( ::flag_wait, "street_player_hide" );
do_wait_any();
self delete();
}
/************************************************************************************************************/
/* EMP */
/************************************************************************************************************/
emp_entities()
{
switch( self.targetname )
{
case "emp_delete":
self emp_ents_wait();
if( isdefined( self.script_noteworthy ) )
{
switch( self.script_noteworthy )
{
case "lamp":
playfx( level._effect[ "powerline_runner_oneshot" ], self getorigin() + ( 0, 0, 50) );
thread play_sound_in_space( "glass_pane_blowout", self getorigin() );
break;
case "window":
playfx( level._effect[ "dcemp_glass_74x44" ], self getorigin(), anglestoforward( (0,270,0) ) );//, anglestoright( (0,270,0) ) );
thread play_sound_in_space( "glass_pane_blowout", self getorigin() );
break;
}
}
self delete();
break;
case "emp_swap":
if( isdefined( self.target ) )
{
after = getent( self.target, "targetname" );
after hide();
self emp_ents_wait();
after show();
self delete();
}
else
self emp_smart_swap();
break;
case "emp_light":
self setlightintensity( 1.5 );
self emp_ents_wait();
self setlightintensity( 0 );
break;
case "emp_show":
self hide();
self emp_ents_wait();
self show();
playfx( level._effect[ "powerline_runner_oneshot" ], self getorigin() );
thread play_sound_in_space( "glass_pane_blowout", self getorigin() );
break;
}
}
emp_smart_swap()
{
self emp_ents_wait();
switch( self.model )
{
case "ch_street_light_01_on":
self setmodel( "ch_street_light_01_off" );
break;
}
}
emp_ents_wait( type )
{
flag_wait( "iss_done" );
wait 2;
center = getstruct( "emp_center", "targetname" );
dist = 0;
magicnumber = 1 / 2500;
if( !isdefined( type ) )
type = self.targetname;
switch( type )
{
case "emp_delete":
dist = distance( self getorigin(), center.origin );
break;
case "emp_swap":
dist = distance( self.origin, center.origin );
break;
case "emp_light":
dist = distance( self.origin, center.origin );
break;
case "emp_show":
dist = distance( self.origin, center.origin );
break;
}
time = dist * magicnumber - 13;
if( time < 0 )
time = 0;
wait time;
}
emp_stop_start_heli()
{
self endon( "death" );
flag_wait( "emp_entity_cleanup_done" );
speed = self vehicle_getspeed();
self notify( "newpath" );
self vehicle_setspeedimmediate( 0, 100, 100 );
node = undefined;
if( level.start_point != "emp" )
node = getstruct( self.currentNode.target, "targetname" );
flag_wait( "iss_done" );
self vehicle_setspeedimmediate( speed, 100, 100 );
if( level.start_point != "emp" )
self thread maps\_vehicle::vehicle_paths( node );
}
#using_animtree( "vehicles" );
emp_heli_spotlight()
{
level.emp_heli_spotlight = self;
add_wait( ::flag_wait, "emp_entity_cleanup_done" );
self add_func( maps\_attack_heli::heli_spotlight_off );
thread do_wait();
self thread emp_stop_start_heli();
wait 2;
flag_wait( "iss_done" );
node = getstruct( "emp_anim_heli_spot", "targetname" );
heli = spawn_anim_model( "emp_mi28", self.origin );
heli maps\_vehicle::vehicle_lights_on( "running" );
heli maps\_attack_heli::heli_spotlight_on( "tag_spotlight", false );
heli thread play_loop_sound_on_entity( "scn_dcemp_cobra_shutdown_hover" );
self delete();
// node thread anim_first_frame_solo( heli, "crash" );
// wait level.EMPWAIT_BETA;
node thread anim_single_solo( heli, "crash" );
heli waittillmatch( "single anim", "emp" );
heli stop_loop_sound_on_entity( "scn_dcemp_cobra_shutdown_hover" );
heli delaycall( .1, ::playsound, "scn_dcemp_cobra_shutdown" );
flag_set( "emp_heli_crash_go" );
heli thread heli_spark_effects();
heli maps\_attack_heli::heli_spotlight_off();
heli thread attackheli_spotlight_flicker();
heli maps\_vehicle::vehicle_lights_off( "running" );
heli waittillmatch( "single anim", "explode" );
heli notify( "stop_heli_spark_effects" );
heli playsound( "scn_dcemp_cobra_shutdown_crash" );
flag_set( "emp_heli_crash" );
playfx( level._effect[ "helicopter_crash" ], heli gettagorigin( "TAG_DEATHFX" ) );
//thread play_sound_in_space( "mi17_helicopter_crash_dist", heli gettagorigin( "TAG_DEATHFX" ) );
heli setmodel( "vehicle_mi-28_d_animated" );
time = 0;
level.player delaycall( time, ::PlayRumbleLoopOnEntity, "tank_rumble" );
level.player delaycall( 1.5 + time, ::stopRumble, "tank_rumble" );
noself_delaycall( time, ::earthquake, 0.25, 1.5, level.player.origin, 5000 );
node waittill( "crash" );
//heli delete();
}
heli_spark_effects()
{
self endon( "stop_heli_spark_effects" );
while ( true )
{
playfxontag( getfx( "powerline_runner_oneshot" ), self, "tag_engine_left" );
wait( RandomFloatRange( .15, .25 ) );
}
}
attackheli_spotlight_flicker()
{
self endon( "death" );
flickers = randomintrange( 3, 5 );
for ( i=0; i<flickers; i++ )
{
PlayFXOnTag( level._effect[ "_attack_heli_spotlight" ], self, "tag_flash" );
wait randomfloatrange( 0.05, 0.15 );
waittillframeend;
StopFXOnTag( level._effect[ "_attack_heli_spotlight" ], self, "tag_flash" );
wait randomfloatrange( 0.05, 0.15 );
waittillframeend;
}
}
#using_animtree( "vehicles" );
emp_heli_rappel()
{
if( !isdefined( level.helis_crash_rappel ) )
level.helis_crash_rappel = [];
level.helis_crash_rappel[ level.helis_crash_rappel.size ] = self;
self thread emp_stop_start_heli();
flag_wait( "emp_heli_crash_go" );
wait .25;
if( isdefined( level.emp_heli_rappel ) )
wait .5;
level.emp_heli_rappel = 1;
heli = spawn( "script_model", self.origin );
heli.angles = self.angles;
heli setmodel( self.model );
heli.animname = "emp_heli_rappel";
heli UseAnimTree( #animtree );
self delete();
heli thread heli_spark_effects();
node = spawn( "script_origin", heli.origin );
node.angles = ( 0, heli.angles[ 1 ], 0 );
heli linkto( node );
node thread anim_single_solo( heli, "crash" );
time = 6.5;
node movez( -400, time, time, 0 );
wait time;
heli notify( "stop_heli_spark_effects" );
playfx( level._effect[ "helicopter_explosion" ], heli.origin );
thread play_sound_in_space( "mi17_helicopter_crash_dist", heli.origin );
time = 1;
level.player delaycall( time, ::PlayRumbleLoopOnEntity, "tank_rumble" );
level.player delaycall( 1.0 + time, ::stopRumble, "tank_rumble" );
noself_delaycall( time, ::earthquake, 0.2, 1, level.player.origin, 5000 );
heli delete();
node delete();
}
#using_animtree( "vehicles" );
emp_heli_distant()
{
if( !isdefined( level.helis_crash_distant ) )
level.helis_crash_distant = [];
level.helis_crash_distant[ level.helis_crash_distant.size ] = self;
self thread emp_stop_start_heli();
self emp_ents_wait( "emp_swap" );
heli = spawn( "script_model", self.origin );
heli.angles = self.angles;
heli setmodel( self.model );
heli.animname = "emp_heli_distant";
heli UseAnimTree( #animtree );
self delete();
heli anim_single_solo( heli, "crash" );
heli delete();
}
emp_btr()
{
level.emp_btr80 = self;
flag_wait( "emp_heli_crash_go" );
wait .35;
btr = spawn( "script_model", self.origin );
btr.angles = self.angles;
btr setmodel( self.model );
btr thread heli_spark_effects();
self delete();
wait 2;
btr notify( "stop_heli_spark_effects" );
}
emp_jet_crash()
{
flag_wait( "iss_done" );
wait 4;
wait level.EMPWAIT_BETA;
jet = spawn_vehicle_from_targetname_and_drive( "emp_jet_crasher" );
//jet ent_flag_set( "contrails" );
jet ent_flag_clear( "engineeffects" );
wait 5.25;
flag_set( "emp_jet_crash" );
level.player PlayRumbleLoopOnEntity( "tank_rumble" );
level.player delaycall( 1, ::stopRumble, "tank_rumble" );
earthquake( 0.15, 1, level.player.origin, 2000 );
exploder( "emp_jet_crash" );
wait .25;
jet delete();
}
#using_animtree( "vehicles" );
emp_heli_crash()
{
heli = getent( "emp_heli_crash_last", "targetname" );
heli hide();
flag_wait( "iss_done" );
wait level.EMPWAIT_BETA;
spawners = getentarray( "emp_heli_crash_guys", "targetname" );
guys = array_spawn( spawners, true );
guys[0] thread emp_heli_crash_guys_link( heli, "WHEEL_FRONT_L_JNT" );
guys[1] thread emp_heli_crash_guys_link( heli, "WHEEL_FRONT_R_JNT" );
wait .5;
node = spawnstruct();
node.origin = heli.origin;
node.angles = heli.angles;
heli.animname = "emp_heli_last";
heli UseAnimTree( #animtree );
node anim_first_frame_solo( heli, "crash" );
wait 3.5;
heli show();
node thread anim_single_solo( heli, "crash" );
guys[ 0 ] delaythread( 7.5, ::emp_heli_crash_guys_fallout );
guys[ 1 ] delaythread( 8.5, ::emp_heli_crash_guys_fallout );
heli thread heli_spark_effects();
wait 9.65;
heli notify( "stop_heli_spark_effects" );
playfxontag( level._effect[ "helicopter_explosion" ], heli, "TAG_ORIGIN" );
thread play_sound_in_space( "exp_armor_vehicle", heli.origin );
range = 900;
maxd = 600;
RadiusDamage( heli.origin + (0,0,10), range, maxd, 20, heli );//similar to destructibles
time = .25;
level.player delaycall( time, ::PlayRumbleLoopOnEntity, "tank_rumble" );
level.player delaycall( 1.0 + time, ::stopRumble, "tank_rumble" );
noself_delaycall( time, ::earthquake, 0.2, 1, level.player.origin, 5000 );
}
#using_animtree( "generic_human" );
emp_heli_crash_guys_link( heli, tag )
{
self hide();
self.ignoreme = true;
self.ignoreall = true;
heli anim_generic_first_frame( self, "fastrope_fall", tag );
wait .1;
self linkto( heli );
}
emp_heli_crash_guys_fallout()
{
self show();
node = spawn( "script_origin", self.origin );
node.angles = self.angles;
self linkto( node );
//find out the various end origins we need
grndpos = GetGroundPosition( node.origin, 0, 1000, 64 );
delta = getmovedelta( getanim_generic( "fastrope_fall" ), 0, 1 );
endpos = node.origin + delta;
animdist = abs( delta[ 2 ] );
//this is the full distance from the ai's height to the ground
fulldist = node.origin[ 2 ] - grndpos[ 2 ];
//this is the extra distance we need to cover that the animation does not
extradist = endpos[ 2 ] - grndpos[ 2 ];
//this is the length of time it takes for the ai to fall the distance of delta[ 2 ]
length = getanimlength( getanim_generic( "fastrope_fall" ) );
//this is the equation to figure out the time it takes to fall delta[ 2 ] + dist
time = ( length * fulldist ) / animdist;
time -= .25;
//this is the new rate the animation needs to play at in order for it to play the full length of time
rate = ( length / time );
self playsound( "generic_death_falling_scream" );
node thread anim_generic( self, "fastrope_fall" );
node movez( extradist * -1, time );
node rotatevelocity( (0, randomfloatrange( -100, 100 ), 0), time );
wait .05;
self setanimknoball( getanim_generic( "fastrope_fall" ), %body, 1, 0, rate );
wait time -.2;
self.skipdeathanim = 1;
self kill();
self startragdoll();
wait .1;
playfx( level._effect[ "bodyfall_dust_high" ], grndpos );
}
/************************************************************************************************************/
/* STREET */
/************************************************************************************************************/
street_hide_moment()
{
foreach( member in level.team )
member ent_flag_wait( "street_hide" );
flag_wait( "street_player_hide" );
flag_set( "street_safe" );
flag_set( "street_crash_heli_hide" );
flag_wait( "street_crash_hide" );
wait CONST_STREET_CAR_WAIT;
wait .1;
exploder( "hide_heli_crash" );
clip = getent( "hide_clip", "targetname" );
clip disconnectpaths();
clip solid();
if( isalive( level.player ) && level.player istouching( clip ) )
level.player kill();
array_thread( level.team, ::walkdist_reset );
foreach( member in level.team )
{
anime = undefined;
switch( member.script_noteworthy )
{
case "foley":
anime = "exposed_flashbang_v5";
break;
case "dunn":
anime = "exposed_flashbang_v1";
break;
case "marine1":
anime = "exposed_flashbang_v4";
break;
case "marine2":
anime = "exposed_flashbang_v1";
break;
case "marine3":
anime = "bog_b_spotter_react";
break;
}
member thread anim_generic_gravity_run( member, anime );
member playsound( "generic_flashbang_american_" + randomintrange( 1,9 ) );
}
level.player shellshock( "default", 3 );
objective_onentity( level.objnum, level.foley, ( 0,0,70 ) );
level.sky delete();
array_call( getaiarray( "axis" ), ::delete );
glass = getglassarray( "street_hide_glass" );
dir = anglestoforward( ( 0, 345, 0 ) );
foreach( piece in glass )
destroyglass( piece, dir * 200 );
// time = 4.5;
// array_thread( level.team, ::notify_delay, "killanimscript", time );
wait 4;
flag_set( "allow_ammo_pickups" );
level.player giveWeapon( "Beretta" );
level.player SetWeaponAmmoClip( "Beretta", 30 );
level.player SetWeaponAmmoStock( "Beretta", 90 );
level.player SetWeaponAmmoStock( "m4m203_eotech", 300 );
level.player SetWeaponAmmoStock( "m203_m4_eotech", 9 );
level.player setWeaponAmmoStock( "fraggrenade", 4 );
level.player setWeaponAmmoStock( "flash_grenade", 4 );
if( isalive( level.player ) )
thread autosave_by_name( "street_hide_moment" );
wait 1;
SetSavedDvar( "ammoCounterHide", "0" );
time = 1.25;
wait time;
//What the hell are we gonna do now? We got no air support...we got no comms<6D>we're screwed man! We are totally- fucked!
level.dunn thread dialogue_queue( "dcemp_cpd_wearetotally" );
wait 6.25 - time;
//Shut up!! Get a grip Corporal! Our weapons still work, which means we can still kick some ass, huah?
level.foley thread dialogue_queue( "dcemp_fly_getagrip" );
level.dunn delaycall( .5, ::stopsounds );
flag_wait( "corner_start_crash_scene" );
wait .4;
level.foley stopsounds();
wait .5;
level.foley add_wait( ::anim_generic_gravity, level.foley, "corner_standR_explosion_divedown" );
level.foley add_func( ::anim_generic_gravity_run, level.foley, "corner_standR_explosion_standup" );
thread do_wait();
wait .5;
level.team[ "marine2" ] thread anim_generic( level.team[ "marine2" ], "bog_b_spotter_react" );
length = getanimlength( getanim_generic( "bog_b_spotter_react" ) );
level.team[ "marine2" ] delaythread( length * .93, ::anim_stopanimscripted );
wait .45;
level.team[ "marine1" ] thread anim_generic_run( level.team[ "marine1" ], "corner_standR_flinchB" );
wait .15;
level.team[ "marine3" ] thread anim_generic( level.team[ "marine3" ], "bog_b_spotter_react" );
length = getanimlength( getanim_generic( "bog_b_spotter_react" ) );
level.team[ "marine3" ] delaythread( length * .93, ::anim_stopanimscripted );
wait .05;
level.dunn thread anim_generic_run( level.dunn, "exposed_idle_reactA" );
array_thread( level.team, ::walkdist_zero );
}
street_heli_player_kill()
{
magicnumber = .001;
time = 22;
units = time / magicnumber;
model = spawn( "script_model", level.player.origin + ( 0,0,units + 60 ) );
model setmodel( "vehicle_little_bird_landed" );
model rotatevelocity( (0,100,0), time + 1 );
interval = .1;
count = int( time / interval );
frac = ( units / count ) * -1;
time = 1;
while( !flag( "street_safe" ) && count > 0 )
{
if( !flag( "street_insta_death" ) )
{
org = ( model.origin[0] + ( level.player.origin[0] - model.origin[0] ) * .25, model.origin[1] + ( level.player.origin[1] - model.origin[1] ) * .25, model.origin[2] + frac );
model moveto( org, interval );
wait interval;
count--;
}
else
{
org = ( model.origin[0] + ( level.player.origin[0] - model.origin[0] ) * .25, model.origin[1] + ( level.player.origin[1] - model.origin[1] ) * .25, level.player.origin[2] + 50 );
model moveto( org, time );
wait interval;
time -= interval;
if( time <= 0 )
count = 0;
else
count--;
}
}
origin = level.player.origin + (0,0,80);
model delete();
if( flag( "street_safe" ) )
return;
range = 300;
PhysicsExplosionSphere( origin, range, 0, range * .01 );//similar to destructibles
playfx( level._effect[ "helicopter_explosion" ], origin );
thread play_sound_in_space( "exp_armor_vehicle", origin );
wait .2;
level.player kill();
}
#using_animtree( "generic_human" );
street_guy_fall_guy()
{
node = getstruct( self.target, "targetname" );
self playsound( "generic_death_falling_scream" );
node anim_generic( self, "fastrope_fall" );
self.skipdeathanim = 1;
self kill();
self startragdoll();
flag_set( "street_guy_fall" );
}
street_btr_scene()
{
//SETUP
heli = getent( "street_heli", "targetname" );
target = getent( "street_heli_target", "targetname" );
slide1 = getent( "street_btr_slide_1", "targetname" );
slide2 = getent( "street_btr_slide_2", "targetname" );
heli hide();
target hide();
slide1 hide();
slide2 hide();
target notsolid();
slide1 notsolid();
slide2 notsolid();
dmg_trig = getent( "btr_dmg_trig", "targetname" );
dmg_trig trigger_off();
clip = getent( "street_btr80_d_clip", "targetname" );
clip notsolid();
clip connectpaths();
self maps\_vehicle::mgoff();
self stopsounds();
d_heli = street_btr_make_destroyed_heli();
level.street_btrorigin = self.origin;
if( level.start_point != "corner" )
{
flag_wait( "street_crash_btr_first" );
//start dropping the heli
street_btr_scene_drop_heli();
flag_set( "street_btr_death" );
waittillframeend;
//kill the btr and get a model so we can animate it
earthquake( .5, 1.25, level.player.origin, 2048 );
level.player PlayRumbleLoopOnEntity( "tank_rumble" );
level.player delaycall( 1.25, ::stopRumble, "tank_rumble" );
dmg_trig trigger_on();
model = self street_btr_scene_kill_btr();
thread street_btr_blur( model );
//show the damaged heli
array_call( getentarray( "street_heli_destroyed", "targetname" ), ::show );
//move the heli parts
d_heli thread street_btr_animate_heli();
//move the btr
model street_btr_animate_btr();
}
else
{
model = self street_btr_scene_kill_btr();
model.origin = slide2.origin;
model.angles = slide2.angles;
}
//delete the damage trig and turn on the clip brush
clip solid();
clip disconnectpaths();
flag_set( "street_btr_scene_done" );
}
street_crash_cars()
{
parts = array_combine( getentarray( self.target, "targetname" ), getstructarray( self.target, "targetname" ) );
info = [];
info[ "fx" ] = [];
info[ "light" ] = [];
foreach( part in parts )
{
switch( part.script_noteworthy )
{
case "fire_fx":
info[ "fx" ][ info[ "fx" ].size ] = part;
break;
case "light":
part.old_intensity = part getlightintensity();
part setlightintensity( 0 );
info[ "light" ][ info[ "light" ].size ] = part;
break;
case "start":
self.endorg = self.origin;
self.endang = self.angles;
self.origin = part.origin;
self.angles = part.angles;
part delete();
break;
}
}
if( level.start_point == "corner" )
{
self maps\_vehicle::force_kill();
if( isdefined( self.endorg ))
{
self.origin = self.endorg;
self.angles = self.endang;
}
}
else
{
flag_wait( self.script_flag_wait );
self maps\_vehicle::force_kill();
wait CONST_STREET_CAR_WAIT;
do_player_crash_fx( self.origin );
if( isdefined( self.endorg ))
{
magicnumber = .005;
time = distance( self.origin, self.endorg ) * magicnumber;
self moveto( self.endorg, time );
self rotateto( self.endang, time );
wait time;
}
}
//fx and light
foreach( fx in info[ "fx" ] )
{
playfx( level._effect[ "me_dumpster_fire_FX" ], fx.origin, anglestoforward( fx.angles ), anglestoup( fx.angles ) );
thread play_loopsound_in_space( "fire_dumpster_medium", fx.origin );
}
foreach( light in info[ "light" ] )
light setlightintensity( light.old_intensity );
wait .05;
array_thread( info[ "light" ], ::light_street_fire );
}
street_crash_helis()
{
parts = array_combine( getentarray( self.target, "targetname" ), getstructarray( self.target, "targetname" ) );
deathmodel = [];
fx_array = [];
clip = undefined;
endorg = undefined;
endang = undefined;
foreach( part in parts )
{
switch( part.script_noteworthy )
{
case "end":
endorg = part.origin;
endang = part.angles;
part delete();
break;
case "destroy":
part hide();
deathmodel[ deathmodel.size ] = part;
break;
case "fire_fx":
fx_array[ fx_array.size ] = part;
break;
case "clip":
clip = part;
clip notsolid();
break;
}
}
if( level.start_point != "corner" && level.start_point != "meetup" )
{
self hide();
if( self.script_flag_wait == "street_crash_heli_first" )
self.origin += ( 0,0, CONST_NEW_HELI_DROP_HEIGHT );
//self.script_flag_wait = "street_crash_btr_first";
flag_wait( self.script_flag_wait );
self show();
dist = distance( self.origin, endorg );
magicnumber = .001;
time = dist * magicnumber;
sndtime = time - 3;
if( sndtime >= 0 )
self delaycall( sndtime, ::playsound, "scn_dcemp_heli_shutdown" );
self moveto( endorg, time, time );
self rotateto( endang, time );
if( isdefined( self.script_flag_set ) )
thread flag_set_delayed( self.script_flag_set, time - CONST_STREET_CAR_WAIT );
self waittill( "movedone" );
do_player_crash_fx( self.origin );
range = 300;
maxd = 300;
if( !flag( "street_safe" ) )
RadiusDamage( self.origin + (0,0,10), range, maxd, 20, self );//similar to destructibles
PhysicsExplosionSphere( self.origin, range, 0, range * .01 );//similar to destructibles
playfx( level._effect[ "helicopter_explosion" ], endorg + ( 0, 0, -128) );
thread play_sound_in_space( "exp_armor_vehicle", endorg );
}
self delete();
if( isdefined( clip ) )
clip solid();
if( deathmodel.size )
array_call( deathmodel, ::show );
foreach( fx in fx_array )
{
playfx( level._effect[ "me_dumpster_fire_FX" ], fx.origin, anglestoforward( fx.angles ), anglestoup( fx.angles ) );
thread play_loopsound_in_space( "fire_dumpster_medium", fx.origin );
}
}
#using_animtree( "vehicles" );
street_crash_helis_anim()
{
parts = [];
fx_array = [];
clip = undefined;
dmg = undefined;
if( isdefined( self.target ) )
parts = array_combine( getentarray( self.target, "targetname" ), getstructarray( self.target, "targetname" ) );
foreach( part in parts )
{
switch( part.script_noteworthy )
{
case "fire_fx":
fx_array[ fx_array.size ] = part;
break;
case "clip":
clip = part;
clip notsolid();
break;
case "damage":
dmg = part;
dmg trigger_off();
break;
}
}
name = "street_mi28";
switch( self.script_flag_set )
{
case "street_crash_cop":
name = "street_mi28a";
break;
case "street_crash_left":
name = "street_bh";
break;
case "street_crash_left2":
name = "street_mi28b";
break;
}
if( level.start_point != "corner" && level.start_point != "meetup" )
{
flag_wait( self.script_flag_wait );
switch( self.script_flag_set )
{
case "street_crash_left":
car = getent( "street_cars_blackhawk_bounce", "targetname" );
clipcar = getent( "street_blackhawk_car_clip", "targetname" );
clipcar linkto( car );
//car.angles += (0,90,0);
car.animname = "street_car";
car UseAnimTree( #animtree );
self thread anim_single_solo( car, "crash" );
break;
}
}
heli = spawn_anim_model( name, self.origin );
self thread anim_single_solo( heli, "crash" );
if( level.start_point != "corner" && level.start_point != "meetup" )
{
// heli waittillmatch( "single anim", "play_sound" );
// heli playsound( "scn_dcemp_heli_shutdown" );
heli waittillmatch( "single anim", "pre_explode" );
thread flag_set( self.script_flag_set );
heli waittillmatch( "single anim", "explode" );
switch( self.script_flag_set )
{
case "street_crash_cop":
name = "vehicle_mi-28_d_animated";
break;
case "street_crash_left":
thread street_heli_crash_secondaries_2();
name = "vehicle_blackhawk_crash";
break;
case "street_crash_left2":
thread street_heli_crash_secondaries_3();
name = "vehicle_mi-28_d_animated";
break;
}
dmg trigger_on();
heli setmodel( name );
do_player_crash_fx( self.origin );
range = 300;
maxd = 300;
if( !flag( "street_safe" ) )
RadiusDamage( heli gettagOrigin( "TAG_DEATHFX" ), range, maxd, 20, heli );//similar to destructibles
PhysicsExplosionSphere( heli gettagOrigin( "TAG_DEATHFX" ), range, 0, range * .01 );//similar to destructibles
switch( self.script_flag_set )
{
case "street_crash_left":
playfx( level._effect[ "helicopter_crash" ], heli gettagorigin( "TAG_DEATHFX" ) + (0,0,-60) );
break;
case "street_crash_cop":
case "street_crash_left2":
playfxontag( level._effect[ "helicopter_explosion" ], heli, "TAG_DEATHFX" );
break;
}
thread play_sound_in_space( "exp_armor_vehicle", heli gettagOrigin( "TAG_DEATHFX" ) );
heli waittillmatch( "single anim", "end" );
}
else
{
heli waittillmatch( "single anim", "explode" );
switch( self.script_flag_set )
{
case "street_crash_cop":
name = "vehicle_mi-28_d_animated";
break;
case "street_crash_left":
thread street_heli_crash_secondaries_2();
name = "vehicle_blackhawk_crash";
break;
case "street_crash_left2":
thread street_heli_crash_secondaries_3();
name = "vehicle_mi-28_d_animated";
break;
}
heli setmodel( name );
}
dmg delete();
if( isdefined( clip ) )
clip solid();
foreach( fx in fx_array )
{
playfx( level._effect[ "me_dumpster_fire_FX" ], fx.origin, anglestoforward( fx.angles ), anglestoup( fx.angles ) );
thread play_loopsound_in_space( "fire_dumpster_medium", fx.origin );
}
}
street_heli_crash_secondaries_2()
{
trees = getentarray( "street_blackhawk_tree", "targetname" );
array_thread( trees, ::street_trees );
dmg = getstructarray( "street_damage_node_2", "targetname" );
array_thread( dmg, ::street_damage_radius );
}
street_heli_crash_secondaries_3()
{
trees = getentarray( "street_heli3_tree", "targetname" );
array_thread( trees, ::street_trees );
dmg = getstructarray( "street_damage_node_3", "targetname" );
array_thread( dmg, ::street_damage_radius );
}
street_damage_radius()
{
RadiusDamage( self.origin, self.radius, 1000, 1000 );
}
street_trees()
{
dir = [];
dir[0] = anglestoforward( ( 0, 160 - randomfloatrange( 50, 90 ), 0 ) );
dir[1] = anglestoforward( ( 0, 160, 0 ) );
dir[2] = anglestoforward( ( 0, 160 + randomfloatrange( 50, 90 ), 0 ) );
time = 2;
parts = getentarray( self.target, "targetname" );
self delete();
centers = [];
foreach( part in parts )
{
org = getent( part.target, "targetname" );;
part linkto( org );
centers[ centers.size ] = org;
}
foreach( index, part in centers )
{
vec = dir[ index ];
p = randomfloatrange( 100, 150 );
r = randomfloatrange( 100, 150 );
if( cointoss() )
p *= -1;
if( cointoss() )
r *= -1;
vec += ( 0,0, randomfloat( .5 ) + .75 );
vec *= randomfloatrange( 300, 400 );
rot = ( p, 0, r );
part movegravity( vec, time );
part rotatevelocity( rot, time, 0, time );
}
wait time;
array_call( parts, ::delete );
array_call( centers, ::delete );
}
street_cars_bounce()
{
flag_wait( self.script_noteworthy );
wait randomfloatrange( .2, .4 );
height = randomfloatrange( 15, 24 );
time = randomfloatrange( .5, .75 );
min = 5;
max = 10;
rotation = ( randomfloatrange( min, max ), randomfloatrange( min, max ), randomfloatrange( min, max ) );
angles = self.angles;
origin = self.origin;
self movez( height, time, 0, time * .5 );
self rotateto( self.angles + rotation, time, 0, time );
wait time * .6;
self delaycall( time * .5, ::rotateto, angles, time * .5 );
self moveto( origin, time, time, 0 );
wait time;
time = time * .2;
height = height * .1;
rotation = rotation * .1;
self movez( height, time, 0, time );
self rotateto( self.angles + rotation, time, 0, time );
wait time * .85;
self delaycall( time * .5, ::rotateto, angles, time * .5 );
self moveto( origin, time, time, 0 );
}
street_crash_motorcycle()
{
forward = anglestoforward( self.angles );
target = getent( self.target, "targetname" );
endorg = target.origin;
endang = target.angles;
target delete();
origin = self.origin;
angles = self.angles;
self.origin = self.origin + ( forward * 400 );
self.angles = self.angles + ( 0,180,0 );
flag_wait( "street_crash_left2" );
wait .5;
playfxontag( level._effect[ "firelp_med_pm" ], self, "tag_death_fx" );
self playloopsound( "fire_dumpster_medium" );
wait 2.5;
playfx( level._effect[ "small_vehicle_explosion" ], self.origin );
self playsound( "car_explode" );
time = 1.5;
self moveto( origin, time );
self rotateto( angles, time );
wait time;
time = 1;
self moveto( endorg, time, 0, time );
self rotateto( endang, time, 0, time );
wait time;
self.origin = self.origin;
self.angles = self.angles;
}
street_btr_make_destroyed_heli()
{
pieces = getentarray( "street_heli_destroyed", "targetname" );
array_call( pieces, ::hide );
array = [];
foreach( part in pieces )
{
array[ part.script_noteworthy ] = part;
part notsolid();
}
body = array[ "back" ];
body.parts = array;
return body;
}
street_btr_scene_drop_heli()
{
heli = getent( "street_heli", "targetname" );
target = getent( "street_heli_target", "targetname" );
heli show();
dist = distance( heli.origin, target.origin );
magicnumber = .001;
time = dist * magicnumber;
heli moveto( target.origin, time, time );
heli rotatevelocity( ( 0,105,0 ), time );
wait time;
heli delete();
target delete();
}
street_btr_scene_kill_btr()
{
model = spawn( "script_model", self.origin );
model.angles = self.angles;
model setmodel( "vehicle_btr80_d" );
model.vehicletype = self.vehicletype;
model.modeldummyon = false;
model thread maps\_vehicle::kill_fx( "vehicle_btr80", false );
self delete();
range = 300;
RadiusDamage( model.origin + (0,0,10), range, 300, 20, model );//similar to destructibles
PhysicsExplosionSphere( model.origin, range, 0, range * .01 );//similar to destructibles
return model;
}
street_kill_vehicle()
{
model = spawn( "script_model", self.origin );
model.angles = self.angles;
model setmodel( self.model );
model.vehicletype = self.vehicletype;
model.modeldummyon = false;
model thread maps\_vehicle::kill_fx( self.model, false );
self delete();
range = 300;
RadiusDamage( model.origin + (0,0,10), range, 300, 20, model );//similar to destructibles
PhysicsExplosionSphere( model.origin, range, 0, range * .01 );//similar to destructibles
return model;
}
street_btr_animate_btr()
{
slide1 = getent( "street_btr_slide_1", "targetname" );
slide2 = getent( "street_btr_slide_2", "targetname" );
dmg_trig = getent( "btr_dmg_trig", "targetname" );
dmg_trig thread street_btr_move_dmg_trig( self );
time = CONST_BTR_SLIDE_TIME_1;
self moveto( slide1.origin, time, 0, time );
self rotateto( slide1.angles, time, 0, time );
wait time;
time = CONST_BTR_SLIDE_TIME_2;
self moveto( slide2.origin, time, time, 0 );
self rotateto( slide2.angles, time, time, 0 );
wait time;
earthquake( .2, .5, level.player.origin, 2048 );
//cleanup
slide1 delete();
slide2 delete();
}
street_btr_blur( btr )
{
if( !player_looking_at( btr.origin, undefined, true ) )
return;
setblur( 4, 0 );
wait .1;
setblur( 0, .5 );
}
street_btr_move_dmg_trig( btr )
{
btr_origin = btr.origin;
dmg_origin = self.origin;
while( !flag( "street_btr_scene_done" ) )
{
delta = btr.origin - btr_origin;
self.origin = ( dmg_origin + ( delta[ 0 ], delta[ 1 ], 0 ) );
wait .05;
}
self delete();
}
street_btr_animate_heli()
{
struct = getstruct( "street_physics_launch_point", "targetname" );
parts = self.parts;
foreach( part in parts )
{
vec = vectornormalize( ( part.origin + (0,0,32) ) - struct.origin );
vec = vec * randomfloatrange( 800, 900 );
//part PhysicsLaunchClient( targets[ part.script_noteworthy ].origin, vec );
part movegravity( vec, 5 );
part rotatevelocity( ( randomfloatrange( 150, 250 ), randomfloatrange( 150, 250 ), randomfloatrange( 150, 250 ) ), 5, 0, 5 );
}
wait 5;
foreach( part in parts )
part delete();
}
do_player_crash_fx( origin )
{
if( flag( "do_player_crash_fx" ) )
return;
flag_set( "do_player_crash_fx" );
thread flag_clear_delayed( "do_player_crash_fx", .25 );
dist = distancesquared( level.player.origin, origin );
//player stuff
if( dist < squared( 1500 ) )
{
level.player PlayRumbleLoopOnEntity( "tank_rumble" );
level.player delaycall( 1.0, ::stopRumble, "tank_rumble" );
earthquake( 0.5, 1, origin, 2000 );
level.player setvelocity( anglestoup( level.player.angles ) * 210 );
if( dist < squared( 650 ) )
{
//level.player dirtEffect( origin );
level.player allowStand( false );
level.player allowProne( false );
level.player setstance( "crouch" );
level.player blend_movespeedscale( .5 );
level.player delayThread( .1, ::playLocalSoundWrapper, "breathing_hurt" );
time = 1;
level.player delayThread( .5, ::blend_movespeedscale, .8, 1.0 );
level.player delayThread( time + .25, ::playLocalSoundWrapper, "breathing_better" );
level.player delaycall( time, ::allowStand, true );
level.player delaycall( time, ::allowProne, true );
level.player delaycall( time, ::setstance, "stand" );
}
}
}
/************************************************************************************************************/
/* CORNER */
/************************************************************************************************************/
corner_hide_damage()
{
scene = corner_get_scene();
array_call( scene[ "lights" ], ::setlightintensity, 0.0 );
}
corner_show_damage()
{
scene = corner_get_scene();
array_call( scene[ "lights" ], ::setlightintensity, 2.0 );
wait .05;
array_thread( scene[ "lights" ], ::light_street_fire );
exploder( "plane_crash_aftermath" );
}
corner_get_scene()
{
array = [];
// fixed an issue from rockets checkin when you where away. -Roger
// plane = getentarray( "corner_crash_plane", "targetname" );
// tail = getentarray( "crash_plane_tail", "targetname" );
// post_crash_ents = array_combine( plane, tail );
// array[ "plane" ] = plane;
array[ "lights" ] = getentarray( "light_crash_fire", "script_noteworthy" );
return array;
}
corner_palm_style_door_open( soundalias )
{
wait( 1.35 );
if ( IsDefined( soundalias ) )
self PlaySound( soundalias );
else
self PlaySound( "door_wood_slow_open" );
self ConnectPaths();
self RotateTo( self.angles + ( 0, 70, 0 ), 2, .5, 0 );
self waittill( "rotatedone" );
self RotateTo( self.angles + ( 0, 29, 0 ), 1.5, 0, 1.5 );
}
corner_plane_launch()
{
wait randomfloat( 2 );
names = [];
names[ names.size ] = "vehicle_van_white_door_rb";
names[ names.size ] = "bc_military_tire01";
names[ names.size ] = "vehicle_van_white_hood";
names[ names.size ] = "rubble_large_slab_02";
names[ names.size ] = "727_seats_row_left";
if( !isdefined( level.corner_plane_launch_num ) )
level.corner_plane_launch_num = 0;
level.corner_plane_launch_num++;
if( level.corner_plane_launch_num == names.size )
level.corner_plane_launch_num = 0;
name = names[ level.corner_plane_launch_num ];
model = spawn( "script_model", self.origin );
model setmodel( name );
vec = anglestoforward( self.angles ) * randomfloatrange( 1300, 1500 );
neg1 = 1;
neg2 = 1;
neg3 = 1;
if( cointoss() )
neg1 = -1;
if( cointoss() )
neg2 = -1;
if( cointoss() )
neg3 = -1;
fxmod = spawn( "script_model", model.origin );
fxmod setmodel( "tag_origin" );
fxmod linkto( model );
playfxontag( level._effect[ "firelp_med_pm_nolight" ], fxmod, "TAG_ORIGIN" );
time = 1.0;
model movegravity( vec, time );
model rotatevelocity( ( randomfloatrange( 50, 100) * neg1, randomfloatrange( 50, 100) * neg2, randomfloatrange( 50, 100) * neg3 ), time );
node = getstruct( "corner_anim1", "targetname" );
wait time - .05;
names = [];
names[ names.size ] = "wood_door_kick";
names[ names.size ] = "explo_tree";
names[ names.size ] = "door_wood_double_kick";
names[ names.size ] = "door_wood_fence_post_kick";
names[ names.size ] = "door_cargo_container_burst_open";
names[ names.size ] = "bullet_ap_metal";
thread play_sound_in_space( random( names ), fxmod.origin );
wait .05;
fxmod delete();
model delete();
}
corner_truck_engine_crash()
{
self corner_vehicle_engine_crash_setup();
flag_wait( "corner_engine_hit" );
level.corner_engine linkto( self );
self delaythread( .25, ::corner_vehicle_engine_crash_move );
node = getstruct( "corner_engine_fx_sparks", "targetname" );
centerfx = spawn( "script_model", node.origin );
centerfx.angles = node.angles;
centerfx setmodel( "tag_origin" );
centerfx linkto( self );
wait .2 + .25;
for( i=0; i< 11; i++ )
{
playfx( level._effect[ "fire_trail_60" ], centerfx.origin + ( randomfloatrange( -15, 15 ), 0, -5 ), anglestoup( centerfx.angles ), anglestoforward( centerfx.angles ) );
if( i > 8 )
wait .2;
else
wait .1;
}
wait .25;
playfx( level._effect[ "firelp_med_pm_nolight" ], centerfx.origin );//, anglestoup( centerfx.angles ), anglestoforward( centerfx.angles ) );
wait 3.0;
flag_set( "corner_look_outside" );
centerfx delete();
}
corner_vehicle_engine_crash_setup()
{
self thread street_cars_bounce();
ents = getentarray( self.target, "targetname" );
array = [];
foreach( ent in ents )
array[ ent.script_noteworthy ] = ent;
array[ "clip" ] linkto( self );
array[ "clip" ] disconnectpaths();
self.clip = array[ "clip" ];
self.endorg = array[ "target" ].origin;
self.endang = array[ "target" ].angles;
array[ "target" ] delete();
}
corner_engine_crash()
{
self hide();
target1 = getent( self.target, "targetname" );
target2 = getent( target1.target, "targetname" );
midorg = target1.origin;
midang = target1.angles;
endorg = target2.origin;
endang = target2.angles;
target1 delete();
target2 delete();
flag_wait( "corner_engine_crash" );
self show();
node = getstruct( "corner_engine_fx_fire", "targetname" );
fx = spawn( "script_model", node.origin );
fx.angles = node.angles;
fx setmodel( "tag_origin" );
fx linkto( self );
playfxontag( level._effect[ "window_fire_large" ], fx, "TAG_ORIGIN" );
self playloopsound( "fire_dumpster_medium" );
magicnumber = .001;
time = distance( self.origin, midorg ) * magicnumber;
self moveto( midorg, time );
self rotateto( midang, time );
wait time;
self playsound( "exp_armor_vehicle" );
time = .5;
earthquake( 0.5, time, self.origin, 3000 );
quakeobj = spawn( "script_origin", level.player.origin + (0,0,200) );
quakeobj PlayRumbleLoopOnEntity( "steady_rumble" );
quakeobj delaycall( time, ::stopRumble, "steady_rumble" );
magicnumber = .001;
time = distance( self.origin, endorg ) * magicnumber;
self moveto( endorg, time );
self rotateto( endang, time );
wait time;
level.corner_engine = self;
self playsound( "exp_armor_vehicle" );
time = 1.5;
earthquake( 0.5, time * .5, self.origin, 3000 );
quakeobj.origin += (0,0,50);
quakeobj PlayRumbleLoopOnEntity( "steady_rumble" );
quakeobj movez( 700, time );
quakeobj delaycall( time, ::stopRumble, "steady_rumble" );
quakeobj delaycall( time + .1, ::delete );
flag_set( "corner_engine_hit" );
}
corner_vehicle_engine_crash_move()
{
self.clip connectpaths();
magicnumber = .0025;
time = distance( self.origin, self.endorg ) * magicnumber;
self moveto( self.endorg, time, 0, time );
self rotateto( self.endang, time, 0, time );
wait time + .2;
self.clip disconnectpaths();
}
corner_dead_check()
{
spawner = getent( "meepup_dead_guy", "targetname" );
guy = dronespawn_bodyonly( spawner );
level.corner_dead_check_guy = guy;
guy.animname = "dead_guy";
wait .05;
guy gun_remove();
node = getstruct( spawner.target, "targetname" );
node thread anim_loop_solo( guy, "hunted_woundedhostage_idle_start" );
flag_wait( "parking_main" );
guy delete();
}
/************************************************************************************************************/
/* MEETUP */
/************************************************************************************************************/
meetup_runner_threads()
{
level.foley delaythread( 0, ::meetup_runner_jog, "meetup_runner_foley" );
level.team[ "marine1" ] delaythread( 3, ::meetup_runner_walk, "meetup_runner_2" );
level.team[ "marine3" ] delaythread( 2, ::meetup_runner_jog, "meetup_runner_3" );
level.team[ "marine2" ] delaythread( 1.5, ::meetup_runner_walk, "meetup_runner_1" );
level.dunn meetup_runner_dunn();
}
meetup_runner_dunn()
{
node = getstruct( "meetup_runner_anim_node", "targetname" );
node.origin = self.origin;
//start
self disable_exits();
self disable_arrivals();
self setlookatentity( level.runner );
self clearentitytarget();
self set_ignoreall( true );
self disable_dontevershoot();
self anim_generic_run( self, "exposed_crouch_2_stand" );
self thread anim_generic( self, "stand_exposed_wave_halt_v2" );
self.alertlevel = "noncombat";
self allowedstances( "stand" );
flag_wait( "meetup_do_scripted_scene" );
//node waittill( "DCemp_run_sequence" );
time = getanimlength( getanim_generic( "DCemp_run_sequence_guy1" ) );
time *= .62;
self thread delaycall( time, ::setlookatentity );
node anim_generic_gravity( self, "DCemp_run_sequence_guy1" );
self setgoalpos( self.origin );
}
meetup_runner_jog( name )
{
meetup_runner_start();
node = getstruct( name, "targetname" );
ent = spawn( "script_origin", self.origin );
ent.angles = self.angles;
self linkto( ent );
time = .75;
ent rotateto( vectortoangles( node.origin - ent.origin ), time, time );
ent thread anim_generic_run( self, "casual_killer_jog_start" );
ent waittill( "rotatedone" );
self unlink();
ent delete();
self thread meetup_runner_end();
self set_generic_run_anim_array( "casual_killer_jog" );
node anim_generic_reach( self, "casual_killer_jog_stop" );
node anim_generic_gravity_run( self, "casual_killer_jog_stop" );
self setgoalpos( self.origin );
self ent_flag_set( "meetup_runner_end" );
}
meetup_runner_walk( name )
{
meetup_runner_start();
node = getstruct( name, "targetname" );
ent = spawn( "script_origin", self.origin );
ent.angles = self.angles;
self linkto( ent );
time = .5;
ent rotateto( vectortoangles( node.origin - ent.origin ) + (0,10,0), time, time );
ent thread anim_generic_run( self, "patrol_bored_2_walk" );
ent waittill( "rotatedone" );
self unlink();
ent delete();
self thread meetup_runner_end();
self set_generic_run_anim_array( "patrol_bored_patrolwalk" );
if( distance( node.origin, self.origin ) > 48 )
node anim_generic_reach( self, "patrol_bored_walk_2_bored" );
else
node = self;
node anim_generic_gravity_run( self, "patrol_bored_walk_2_bored" );
self setgoalpos( self.origin );
self ent_flag_set( "meetup_runner_end" );
}
meetup_runner_start()
{
self disable_exits();
self disable_arrivals();
self setlookatentity( level.runner );
switch( self.script_noteworthy )
{
case "foley":
self anim_generic_run( self, "exposed_crouch_2_stand" );
break;
case "marine1":
self anim_generic_run( self, "coverstand_hide_2_aim" );
break;
case "marine2":
self anim_generic_run( self, "corner_standR_trans_alert_2_A_v2" );
break;
}
self.alertlevel = "noncombat";
self anim_generic_run( self, "casual_stand_idle_trans_in" );
self allowedstances( "stand" );
}
#using_animtree( "generic_human" );
meetup_runner_end()
{
self ent_flag_init( "meetup_runner_end" );
flag_wait( "meetup_runner_leave" );
angle = 0;
switch( self.script_noteworthy )
{
case "marine3":
wait 0;
angle = 80;
break;
case "marine2":
wait .2;
angle = 65;
break;
case "foley":
wait .5;
angle = 70;
break;
}
if( !angle )
return;
self ent_flag_wait( "meetup_runner_end" );
self ai_turn( angle );
self anim_generic_run( self, "casual_stand_idle_trans_in" );
}
/************************************************************************************************************/
/* LOBBY */
/************************************************************************************************************/
lobby_enemy_suppressive_fire()
{
level endon( "office_enemy_suppressive_fire" );
level thread notify_delay( "office_enemy_suppressive_fire", 5 );
node = getstruct( "office_magic_bullet_target2", "targetname" );
target = spawnstruct();
target.origin = self geteye();
while( 1 )
{
weapon = "ak47";
if( cointoss() )
weapon = "rpd";
shots = randomintrange( 10, 25 );
for( i = 0; i < shots; i++ )
{
magicbullet( weapon, node.origin, target.origin + ( randomfloatrange( -64, 64 ), 0, randomfloat( 10 ) - 10 ) );
wait .1;
}
wait randomfloatrange( .5, 1.5 );
}
}
/************************************************************************************************************/
/* OFFICE */
/************************************************************************************************************/
office_enemies_wave1()
{
self endon( "death" );
self.ignoreall = true;
self.oldgrenadeammo = self.grenadeammo;
self.grenadeammo = 0;
add_wait( ::flag_wait, "lobby_robo_death" );
self add_wait( ::waittill_msg, "damage" );
level add_wait( ::waittill_msg, "office_enemies_wave1_hurt" );
do_wait_any();
level notify( "office_enemies_wave1_hurt" );
self.ignoreall = false;
trigger_wait( "office_enemies_wave2", "target" );
self.grenadeammo = self.oldgrenadeammo;
}
office_enemies_wave1_runner()
{
self.ignoreall = true;
level delaythread( 2, ::dcemp_lightningFlash, "double" );
thread flag_set_delayed( "_weather_lightning_enabled", 4 );
self endon( "death" );
self waittill( "goal" );
self.ignoreall = false;
}
/************************************************************************************************************/
/* PARKING */
/************************************************************************************************************/
parking_drone()
{
spawner = getent( "parkinglot_drone", "targetname" );
guy = dronespawn_bodyonly( spawner );
guy gun_remove();
spawner anim_generic( guy, "death_pose_on_desk" );
}
parking_dead_check()
{
spawner = getent( "parking_dead_check_guy", "targetname" );
guy = dronespawn_bodyonly( spawner );
level.parking_dead_check_guy = guy;
guy.animname = "dead_guy";
wait .05;
guy gun_remove();
node = getstruct( spawner.target, "targetname" );
node thread anim_loop_solo( guy, "hunted_woundedhostage_idle_start" );
flag_wait( "tunnels_main" );
guy delete();
}
parking_high_spec()
{
while( 1 )
{
flag_wait( "parking_high_spec" );
lerp_saveddvar( "r_specularColorScale", 15, 2 );
flag_waitopen( "parking_high_spec" );
lerp_saveddvar( "r_specularColorScale", 10, 2 );
}
}
parking_btr_extra_wait()
{
self thread anim_generic_loop( self, "coverstand_hide_idle" );
while( !flag( "parking_open_fire" ) && distancesquared( self.origin, level.player.origin ) > squared( 1250 ) )
wait .1;
self notify( "stop_loop" );
self anim_stopanimscripted();
}
parking_traverse_from_office()
{
node = getent( "office_to_parking_jump_down", "targetname" );
link = spawn( "script_origin", node.origin );
link.angles = node.angles;
link anim_generic_reach( self, "traverse_jumpdown_96" );
link thread anim_generic( self, "traverse_jumpdown_96" );
length = getanimlength( getanim_generic( "traverse_jumpdown_96" ) );
wait length * .66;
self anim_stopanimscripted();
node = getent( "office_to_parking_hop", "targetname" );
length = getanimlength( getanim_generic( "traverse40" ) );
height1 = 25;
height2 = -14;
time1 = length * .34;
time2 = length * .75;
time3 = length - time2 - .25;
link.origin = node.origin + ( 0,0, height1 );
link.angles = node.angles;
self linkto( link );
link thread anim_generic_run( self, "traverse40" );
link movez( height1 * -1, time1 );
wait time2;
link movez( height2, time3 );
wait time3;
self unlink();
}
/************************************************************************************************************/
/* PLAZA */
/************************************************************************************************************/
plaza_flare_fx()
{
model = getent( "street_flare", "targetname" );
model.fxtag = getent( model.target, "targetname" );
model.fxtag linkto( model );
playfxontag( level._effect[ "groundflare" ], model.fxtag, "TAG_ORIGIN" );
}
plaza_enemies()
{
self endon( "death" );
self endon( "long_death" );
self.ignoreall = true;
self add_wait( ::waittill_msg, "damage" );
self add_wait( ::waittill_msg, "death" );
self add_func( ::flag_set, "plaza_open_fire" );
thread do_wait_any();
self set_allowdeath( true );
self walkdist_zero();
self pathrandompercent_zero();
self thread anim_generic_loop( self, "covercrouch_hide_idle" );
self thread plaza_enemies_wakeup();
self thread plaza_enemies_player_close();
level endon( "plaza_open_fire" );
level endon( "plaza_throw_react" );
flag_wait( "plaza_show_enemies" );
node = getstruct( self.target, "targetname" );
node script_delay();
self notify( "stop_loop" );
self anim_stopanimscripted();
node anim_generic_reach( self, node.script_animation );
node anim_generic_gravity_run( self, node.script_animation );
node = getnode( node.target, "targetname" );
self setgoalnode( node );
self.goalradius = 80;
}
plaza_enemies_player_close()
{
level endon( "plaza_open_fire" );
level.player endon( "death" );
while( distancesquared( level.player.origin, self.origin ) > squared( 300 ) )
wait .25;
flag_set( "plaza_open_fire" );
}
plaza_enemies_wakeup()
{
self endon( "death" );
self endon( "long_death" );
flag_wait_any( "plaza_open_fire", "plaza_throw_react" );
node = spawnstruct();
node.origin = self.origin;
node.angles = ( 0, 270, 0 );
if( !isdefined( level.plaza_enemies_wakeup ) )
level.plaza_enemies_wakeup = 0;
self.reactnum = level.plaza_enemies_wakeup;
level.plaza_enemies_wakeup++;
anims = [];
anims[ anims.size ] = "patrol_bored_react_look_retreat";
anims[ anims.size ] = "exposed_idle_reactB";
anims[ anims.size ] = "exposed_idle_reactB";
delays = [];
delays[ delays.size ] = 0;
delays[ delays.size ] = 0;
delays[ delays.size ] = .5;
if( !flag( "plaza_open_fire" ) )
wait .5;
wait( delays[ self.reactnum ] );
self anim_stopanimscripted();
self.ignoreall = false;
self walkdist_reset();
self pathrandompercent_reset();
node anim_generic_gravity_run( self, anims[ self.reactnum ] );
}
/************************************************************************************************************/
/* MISC */
/************************************************************************************************************/
send_team_to_random_nodes( team, nodes )
{
index = 0;
foreach( actor in team )
{
node = nodes[ index ];
node.taken = actor;
actor thread follow_path( node );
index++;
}
}
send_team_to_specific_nodes( name, type )
{
nodes = getnodearray( name, type );
if( !nodes.size )
nodes = getentarray( name, type );
if( !nodes.size )
nodes = getstructarray( name, type );
foreach( node in nodes )
{
name = node.script_noteworthy;
if( !isalive( level.team[ name ] ) )
continue;
level.team[ name ] thread follow_path( node );
}
}
emp_teleport_player( name )
{
if ( !isdefined( name ) )
name = level.start_point;
array = getstructarray( "start_point", "targetname" );
nodes = [];
foreach ( ent in array )
{
if ( ent.script_noteworthy != name )
continue;
nodes[ nodes.size ] = ent;
}
teleport_players( nodes );
}
emp_teleport_team( team, nodes )
{
index = 0;
foreach( actor in team )
{
actor thread teleport_actor( nodes[ index ] );
index++;
}
}
emp_teleport_team_specific( team, nodes )
{
foreach( node in nodes )
level.team[ node.script_noteworthy ] thread teleport_actor( node );
}
teleport_actor( node )
{
link = spawn( "script_origin", self.origin );
link.angles = self.angles;
self linkto( link );
link moveto( node.origin, .05 );
if( isdefined( node.angles ) )
link rotateto( node.angles, .05 );
link waittill( "movedone" );
wait .05;
self setgoalpos( node.origin );
self unlink();
link delete();
self orientmode( "face angle", node.angles[ 1 ] );
}
flickerlight_flares()
{
wait randomfloatrange( .05, .5 );
intensity = self getlightintensity();
while( 1 )
{
self setlightintensity( intensity * randomfloatrange( .8, 1.1 ) );
wait .05;
}
}
light_street_fire()
{
wait randomfloatrange( .05, .5 );
intensity = self getlightintensity();
color = self getlightcolor();
origin = self.origin;
while( 1 )
{
for( i = 0; i<randomintrange( 2, 8 ); i ++ )
{
x = randomfloatrange( 4, 10 );
light_street_fire_dance( color, intensity, origin, x );
}
for( i = 0; i<randomintrange( 25, 60 ); i ++ )
{
x = randomfloatrange( .5, 1 );
light_street_fire_dance( color, intensity, origin, x );
}
}
}
light_street_fire_dance( color, intensity, origin, x )
{
time = randomfloatrange( .05, .1 );
self setlightintensity( intensity * randomfloatrange( .90, 1.1 ) );
self setlightcolor( ( color[0] + randomfloatrange( -.05, .05 ), color[1], color[2] ) );
self moveto( origin + ( randomfloatrange( x * -1, x ), randomfloatrange( x * -1, x ), randomfloatrange( x * -1, x ) ), time );
wait time;
}
handle_color_advance( sname, start, end )
{
for ( i = start; i <= end; i++ )
{
name = sname + i;
color_trig = getent( name, "targetname" );
flag_wait( name );
volume = color_trig get_color_volume_from_trigger();
volume waittill_volume_dead_or_dying();
color_trig activate_trigger();
}
}
handle_node_advance( sname, start, end )
{
for ( i = start; i <= end; i++ )
{
name = sname + i;
color_trig = getent( name, "targetname" );
flag_wait( name );
volume = color_trig get_color_volume_from_trigger();
volume waittill_volume_dead_or_dying();
nodes = color_trig get_color_nodes_from_trigger();
advance_team_to_nodes( nodes );
}
}
enable_node_advance()
{
self.node_advance = true;
}
disable_node_advance( nodes )
{
self.node_advance = undefined;
}
advance_team_to_nodes( nodes )
{
team = [];
foreach( key, member in level.team )
{
if( !isdefined( member.node_advance ) )
continue;
team[ key ] = member;
}
if( !team.size )
return;
foreach( node in nodes )
{
guy = team[ node.script_noteworthy ];
if( !isdefined( guy ) )
continue;
guy thread follow_path( node );
}
}
stop_shield_on_random_teammate( num )
{
if( !isdefined( num ) )
num = 1;
array = [];
foreach( member in level.team )
{
if( member is_hero() )
continue;
if( !isdefined( member.magic_bullet_shield ) )
continue;
array[ array.size ] = member;
}
if( !array.size )
return;
if( array.size < num )
num = array.size;
for( i = 0; i < num; i++ )
{
actor = random( array );
array = array_remove( array, actor );
actor stop_magic_bullet_shield();
}
}
kill_random_teammate( num, del )
{
if( !isdefined( num ) )
num = 1;
if( !isdefined( del ) )
del = false;
array = [];
foreach( member in level.team )
{
if( member is_hero() )
continue;
if( isdefined( member.magic_bullet_shield ) )
continue;
array[ array.size ] = member;
}
if( !array.size )
return false;
if( array.size < num )
num = array.size;
array = get_array_of_farthest( level.player.origin, array );
for( i = 0; i < array.size; i++ )
{
member = array[ i ];
if( player_looking_at( member geteye() ) )
continue;
if( del )
member delete();
else
member kill();
num--;
if( num == 0 )
return true;
}
array = array_removedead( array );
array = get_array_of_farthest( level.player.origin, array );
//if we got here its because we couldn't kill enough people the player was NOT looking at
//so now we dont do a look at check.
for( i = 0; i < num; i++ )
{
member = array[ i ];
if( del )
member delete();
else
member kill();
num--;
if( num == 0 )
return true;
}
return false;
}
add_team( team )
{
array = [];
if( !isarray( team ) )
array[ array.size ] = team;
else
array = team;
array_thread( array, ::remove_team );
foreach( member in array )
{
if( isdefined( member.script_noteworthy ) )
{
member.animname = member.script_noteworthy;
level.team[ member.script_noteworthy ] = member;
}
else
level.team[ level.team.size ] = member;
}
}
remove_team()
{
self notify( "remove_team" );
self endon( "remove_team" );
self waittill( "death" );
level.team = array_removedead_keepkeys( level.team );
}
team_init()
{
self thread magic_bullet_shield();
add_team( self );
if( isdefined( self.script_noteworthy ) )
{
if( self.script_noteworthy == "foley" )
{
self make_hero();
level.foley = self;
}
if( self.script_noteworthy == "dunn" )
{
self make_hero();
level.dunn = self;
}
}
spawners = getentarray( "intro_team", "targetname" );
if( level.team.size == spawners.size )
flag_set( "team_initialized" );
}
setup_sun()
{
level.suncolor = [];
level.suncolor[ "intro" ] = [];
level.suncolor[ "intro" ][ 0 ] = 1.0;
level.suncolor[ "intro" ][ 1 ] = 0.61;
level.suncolor[ "intro" ][ 2 ] = 0.21;
multiplier = 1.8;
level.suncolor[ "emp" ] = [];
level.suncolor[ "emp" ][ 0 ] = level.suncolor[ "intro" ][ 0 ] * multiplier;
level.suncolor[ "emp" ][ 1 ] = level.suncolor[ "intro" ][ 1 ] * multiplier;
level.suncolor[ "emp" ][ 2 ] = level.suncolor[ "intro" ][ 2 ] * multiplier;
level.suncolor[ "sunset" ] = [];
level.suncolor[ "sunset" ][ 0 ] = 0.31;
level.suncolor[ "sunset" ][ 1 ] = 0.35;
level.suncolor[ "sunset" ][ 2 ] = 0.42;
level.suncolor[ "office" ] = [];
level.suncolor[ "office" ][ 0 ] = 0.88;
level.suncolor[ "office" ][ 1 ] = 0.93;
level.suncolor[ "office" ][ 2 ] = 1.0;
level.suncolor_cur = level.suncolor[ "intro" ];
level.sky = getent( "sky_dcburning", "targetname" );
}
vision_set_intro( time )
{
if( !isdefined( time ) )
time = 0;
thread maps\_utility::set_vision_set( "dcburning_crash", time );
thread maps\_utility::vision_set_fog_changes( "dcburning_crash", time );
thread lerp_sunlight( level.suncolor[ "intro" ], time );
}
vision_set_emp( time )
{
time = 2;
fx = getstruct( "emp_sun_fx", "targetname" );
model = spawn( "script_model", fx.origin );
model.angles = vectortoangles( level.player.origin - fx.origin );
model setmodel( "tag_origin" );
setsaveddvar( "r_spotlightstartradius", "800" );
setsaveddvar( "r_spotlightEndradius", "1200" );
setsaveddvar( "r_spotlightfovinnerfraction", ".5" );
setsaveddvar( "r_spotlightexponent", "4" );
setsaveddvar( "r_spotlightBrightness", "8" );
model thread vision_update_sun_spotlight_fx();
model thread fake_motion();
thread maps\_utility::set_vision_set( "dcemp_emp", time );
thread maps\_utility::vision_set_fog_changes( "dcemp_emp", time );
thread lerp_sunlight( level.suncolor[ "emp" ], time );
wait 5;
time = 3;
thread maps\_utility::set_vision_set( "dcemp_postemp", time );
thread maps\_utility::vision_set_fog_changes( "dcemp_postemp", time );
thread lerp_sunlight( level.suncolor[ "intro" ], time );
wait time;
model notify( "stop_sun_fx" );
wait 1;
model delete();
}
vision_update_sun_spotlight_fx()
{
self endon( "stop_sun_fx" );
while( 1 )
{
wait .05;
self.angles = vectortoangles( level.player.origin - self.origin );
}
}
fake_motion()
{
self endon( "stop_sun_fx" );
origin = self.origin;
time = .5;
min = -128;
max = 128;
while( 1 )
{
delta = ( randomfloatrange( min, max ), randomfloatrange( min, max ), randomfloatrange( min, max ) );
self moveto( origin + delta, time, time * .5, time * .5 );
wait time;
self moveto( origin, time, time * .5, time * .5 );
wait time;
}
}
vision_set_sunset( time )
{
if( !isdefined( time ) )
time = 60;
thread maps\_utility::set_vision_set( "dcemp_postemp2", time );
thread maps\_utility::vision_set_fog_changes( "dcemp_postemp2", time );
thread lerp_sunlight( level.suncolor[ "sunset" ], time );
}
vision_set_office( time )
{
if( !isdefined( time ) )
time = 5;
thread maps\_utility::set_vision_set( "dcemp_office", time );
thread maps\_utility::vision_set_fog_changes( "dcemp_office", time );
}
vision_set_lobby()
{
time = 3;
trigger_wait_targetname( "lobby_vision_change" );
thread maps\_utility::set_vision_set( "dcemp_office", time );
thread maps\_utility::vision_set_fog_changes( "dcemp_office", time );
}
vision_set_parking( time )
{
if( !isdefined( time ) )
time = 5;
thread maps\_utility::set_vision_set( "dcemp_parking", time );
thread maps\_utility::vision_set_fog_changes( "dcemp_parking", time );
thread lerp_saveddvar( "r_specularColorScale", 10, time );
}
vision_set_night( time )
{
if( !isdefined( time ) )
time = 0;
thread maps\_utility::set_vision_set( "dcemp", time );
thread maps\_utility::vision_set_fog_changes( "dcemp", time );
}
vision_set_whitehouse()
{
thread maps\_utility::set_vision_set( "whitehouse", 0 );
thread maps\_utility::vision_set_fog_changes( "whitehouse", 0 );
}
handle_sunlight()
{
while( 1 )
{
trigger_wait( "office_ally_color_1", "target" );
resetsunlight();
trigger_wait( "lobby_vision_change", "targetname" );
thread lerp_sunlight( level.suncolor[ "sunset" ], 0 );
}
}
lerp_sunlight( color, time )
{
level notify( "lerp_sunlight" );
level endon( "lerp_sunlight" );
if( array_compare( color, level.suncolor_cur ) )
return;
interval = .05;
count = time / interval;
current = 0;
start_color = level.suncolor_cur;
rangeR = color[0] - start_color[0];
rangeG = color[1] - start_color[1];
rangeB = color[2] - start_color[2];
while( current < count )
{
fracR = rangeR * ( current / count );
fracG = rangeG * ( current / count );
fracB = rangeB * ( current / count );
level.suncolor_cur[ 0 ] = start_color[0] + fracR;
level.suncolor_cur[ 1 ] = start_color[1] + fracG;
level.suncolor_cur[ 2 ] = start_color[2] + fracB;
setSunlight( level.suncolor_cur[ 0 ], level.suncolor_cur[ 1 ], level.suncolor_cur[ 2 ] );
current++;
wait interval;
}
level.suncolor_cur = color;
setSunlight( color[ 0 ], color[ 1 ], color[ 2 ] );
}
lerp_specular( scale, time )
{
level notify( "lerp_specular" );
level endon( "lerp_specular" );
start_scale = getdvarfloat( "r_specularColorScale", "2.5" );
if( scale == start_scale )
return;
interval = .05;
count = time / interval;
current = 0;
range = scale - start_scale;
while( current < count )
{
frac = range * ( current / count );
setSavedDvar( "r_specularColorScale", string( start_scale + frac ) );
current++;
wait interval;
}
setSavedDvar( "r_specularColorScale", string( scale ) );
}
anim_generic_gravity_run( guy, anime, tag )
{
self thread anim_generic_gravity( guy, anime, tag );
length = getanimlength( getanim_generic( anime ) );
wait length - .2;
guy clearanim( getanim_generic( anime ), .2);
guy notify( "killanimscript" );
}
set_pushplayer( value )
{
if( value )
self.dontchangepushplayer = true;
else
self.dontchangepushplayer = undefined;
self pushplayer( value );
}
ai_turn( angle )
{
self.turnThreshold = self.defaultTurnThreshold;
self.a.array[ "turn_left_45" ] = %exposed_tracking_turn45L;
self.a.array[ "turn_left_90" ] = %exposed_tracking_turn90L;
self.a.array[ "turn_left_135" ] = %exposed_tracking_turn135L;
self.a.array[ "turn_left_180" ] = %exposed_tracking_turn180L;
self.a.array[ "turn_right_45" ] = %exposed_tracking_turn45R;
self.a.array[ "turn_right_90" ] = %exposed_tracking_turn90R;
self.a.array[ "turn_right_135" ] = %exposed_tracking_turn135R;
self.a.array[ "turn_right_180" ] = %exposed_tracking_turn180R;
self.a.array[ "straight_level" ] = %exposed_aim_5;
self animscripts\combat::TurnToFaceRelativeYaw( angle );
}
fx_rain_pause()
{
node = getstruct( "rainfxnode", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius && !isdefined( EntFx.v[ "exploder" ] ) )
EntFx pauseEffect();
}
/*
array = getfxarraybyID( "rain_noise_splashes" );
array = array_combine( array, getfxarraybyID( "rain_splash_lite" ) );
array = array_combine( array, getfxarraybyID( "cgo_ship_puddle_large" ) );
array = array_combine( array, getfxarraybyID( "cgo_ship_puddle_small" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_4x64" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_4x128" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_8x64" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_8x128" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_64x64" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_128x128" ) );
array_thread( array, ::pauseEffect );*/
}
fx_rain_pause2()
{
node = getstruct( "rainfxnode2", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius && !isdefined( EntFx.v[ "exploder" ] ) )
EntFx pauseEffect();
}
}
fx_rain_restart()
{
node = getstruct( "rainfxnode", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius && !isdefined( EntFx.v[ "exploder" ] ) )
EntFx restartEffect();
}
/* array = getfxarraybyID( "rain_noise_splashes" );
array = array_combine( array, getfxarraybyID( "rain_splash_lite" ) );
array = array_combine( array, getfxarraybyID( "cgo_ship_puddle_large" ) );
array = array_combine( array, getfxarraybyID( "cgo_ship_puddle_small" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_4x64" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_4x128" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_8x64" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_8x128" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_64x64" ) );
array = array_combine( array, getfxarraybyID( "rain_splash_lite_128x128" ) );
array_thread( array, ::restartEffect );*/
}
fx_end_pause()
{
node = getstruct( "whitehousefxnode", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius && !isdefined( EntFx.v[ "exploder" ] ) )
EntFx pauseEffect();
}
}
fx_end_restart()
{
node = getstruct( "whitehousefxnode", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius && !isdefined( EntFx.v[ "exploder" ] ) )
EntFx restartEffect();
}
}
fx_intro_pause()
{
if( !flag( "intro_fx" ) )
return;
pauseExploder( "plane_crash_aftermath" );
node = getstruct( "introfxnode", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius )
EntFx pauseEffect();
}
flag_clear( "intro_fx" );
}
fx_intro_restart()
{
if( flag( "intro_fx" ) )
return;
restartExploder( "plane_crash_aftermath" );
node = getstruct( "introfxnode", "targetname" );
radius = squared( node.radius );
foreach( EntFx in level.createfxent )
{
if( distancesquared( EntFx.v[ "origin" ], node.origin ) < radius )
EntFx restartEffect();
}
flag_set( "intro_fx" );
}
fx_iss_pause()
{
if( !flag( "iss_fx" ) )
return;
foreach( EntFx in level.createfxent )
{
if( EntFx.v[ "fxid" ] == "dcemp_sun" )
EntFx pauseEffect();
}
flag_clear( "iss_fx" );
}
dcemp_create_triggerfx()
{
intro = spawnstruct();
intro.node = getstruct( "introfxnode", "targetname" );
intro.radius = squared( intro.node.radius );
rain = spawnstruct();
rain.node = getstruct( "rainfxnode", "targetname" );
rain.radius = squared( rain.node.radius );
rain = spawnstruct();
rain.node = getstruct( "rainfxnode2", "targetname" );
rain.radius = squared( rain.node.radius );
end = spawnstruct();
end.node = getstruct( "whitehousefxnode", "targetname" );
end.radius = squared( end.node.radius );
/*israinfx = false;
if( self.v[ "fxid" ] == "rain_noise_splashes" ||
self.v[ "fxid" ] == "rain_splash_lite" ||
self.v[ "fxid" ] == "cgo_ship_puddle_large" ||
self.v[ "fxid" ] == "cgo_ship_puddle_small" ||
self.v[ "fxid" ] == "rain_splash_lite_4x64" ||
self.v[ "fxid" ] == "rain_splash_lite_4x128" ||
self.v[ "fxid" ] == "rain_splash_lite_8x64" ||
self.v[ "fxid" ] == "rain_splash_lite_8x128" ||
self.v[ "fxid" ] == "rain_splash_lite_64x64" ||
self.v[ "fxid" ] == "rain_splash_lite_128x128" )
israinfx = true;*/
isissfx = false;
if( self.v[ "fxid" ] == "dcemp_sun" ||
self.v[ "fxid" ] == "space_nuke" ||
self.v[ "fxid" ] == "space_nuke_shockwave" ||
self.v[ "fxid" ] == "space_emp" ||
self.v[ "fxid" ] == "space_explosion" ||
self.v[ "fxid" ] == "space_explosion_small" )
isissfx = true;
isendfx = false;
if( self.v[ "fxid" ] == "carpetbomb" ||
self.v[ "fxid" ] == "wire_spark" )
isendfx = true;
//INTRO FX
if( distancesquared( self.v[ "origin" ], intro.node.origin ) < intro.radius )
flag_wait( "intro_fx" );
//ISS FX
else
if( isissfx )
flag_wait( "iss_fx" );
//RAIN FX
else
if( distancesquared( self.v[ "origin" ], rain.node.origin ) < rain.radius )
flag_wait( "rain_fx" );
//RAIN FX2
else
if( distancesquared( self.v[ "origin" ], rain.node.origin ) < rain.radius )
flag_wait( "rain_fx2" );
//END FX
else
if( distancesquared( self.v[ "origin" ], end.node.origin ) < end.radius || isendfx )
flag_wait( "end_fx" );
//OTHER FX just start at first frame
self common_scripts\_fx::create_triggerfx();
}
lerp_lightintensity( value, time )
{
curr = self getlightintensity();
range = value - curr;
interval = .05;
count = int( time / interval );
delta = range / count;
while( count )
{
curr += delta;
self setlightintensity( curr );
wait interval;
count--;
}
self setlightintensity( value );
}
dcemp_lightningFlash( type )
{
flash = [];
flash[ "quick" ] = 0;
flash[ "double" ] = 1;
flash[ "triple" ] = 2;
maps\_weather::lightningFlash( maps\dcemp_fx::lightning_normal, maps\dcemp_fx::lightning_flash, flash[ type ] );
}
CornerStndR_aim()
{
self setAnimlimited( %CornerStndR_lean_aim_5, 1, .2 );
self setAnimLimited( %aim_6, .55, .2 );
self setAnimKnobLimited( %CornerStndR_lean_aim_6, 1, .2 );
self setAnimLimited( %add_idle, 1, .2 );
self setAnimKnobLimitedRestart( %CornerStndR_lean_idle, 1, .2 );
//%CornerStndR_lean_auto
self waittill( "stop_custom_aim" );
}
CornerCrR_aim()
{
self setAnimlimited( %CornerCrR_lean_aim_5, 1, .2 );
self setAnimLimited( %aim_6, .5, .2 );
self setAnimKnobLimited( %CornerCrR_lean_aim_6, 1, .2 );
self setAnimLimited( %add_idle, 1, .2 );
self setAnimKnobLimitedRestart( %CornerCrR_lean_idle, 1, .2 );
//%CornerStndR_lean_auto
self waittill( "stop_custom_aim" );
}
bodyshot( fx )
{
origin = self gettagorigin( "J_SpineUpper" );
enemy = random( level.team );
vec = vectornormalize( enemy.origin - origin );
vec = vector_multiply( vec, 10 );
PlayFX( getfx( fx ), origin + vec );
}
script2model_precache()
{
precachelist = [];
data = getstructarray( "script_to_model_swap_intro", "script_noteworthy" );
data = array_add( data, getstruct( "earth_model", "targetname" ) );
data = array_combine( data, getstructarray( "crash_cars", "targetname" ) );
data = array_combine( data, getstructarray( "street_cars_bounce", "targetname" ) );
data = array_combine( data, getstructarray( "iss_entity", "targetname" ) );
foreach( obj in data )
{
if( isdefined( precachelist[ obj.script_modelname ] ) )
continue;
precachelist[ obj.script_modelname ] = obj.script_modelname;
}
foreach( model in precachelist )
precachemodel( model );
}
script2model_intro()
{
if( flag( "script2model_intro" ) )
return;
data = getstructarray( "script_to_model_swap_intro", "script_noteworthy" );
data = array_combine( data, getstructarray( "crash_cars", "targetname" ) );
data = array_combine( data, getstructarray( "street_cars_bounce", "targetname" ) );
foreach( obj in data )
{
model = spawn( "script_model", obj.origin );
model.angles = obj.angles;
model.targetname = obj.targetname;
model.script_noteworthy = obj.script_noteworthy;
model setmodel( obj.script_modelname );
}
flag_set( "script2model_intro" );
}
script2model_iss()
{
if( flag( "script2model_iss" ) )
return;
earthdata = getstruct( "earth_model", "targetname" );
earth = spawn( "script_model", earthdata.origin );
earth.angles = (0,0,0);
earth.targetname = earthdata.targetname;
earth setmodel( earthdata.script_modelname );
data = getstructarray( "iss_entity", "targetname" );
//spawning 700 entities...so need to break it up into several frames
num = 0;
foreach( obj in data )
{
model = spawn( "script_model", obj.origin );
model.angles = obj.angles;
model.targetname = obj.targetname;
model.script_noteworthy = obj.script_noteworthy;
model.script_type = obj.script_type;
model setmodel( obj.script_modelname );
num++;
if( num == 50 )
{
wait .05;
num = 0;
}
}
flag_set( "script2model_iss" );
}
script2model_del_intro()
{
if( !flag( "script2model_intro" ) )
return;
models = getentarray( "script_to_model_swap_intro", "script_noteworthy" );
models = array_combine( models, getentarray( "crash_cars", "targetname" ) );
models = array_combine( models, getentarray( "street_cars_bounce", "targetname" ) );
array_call( models, ::delete );
flag_clear( "script2model_intro" );
}
script2model_del_iss()
{
if( !flag( "script2model_iss" ) )
return;
models = getentarray( "iss_entity", "targetname" );
models = array_combine( models, getentarray( "iss_lights", "targetname" ) );
array_call( models, ::delete );
earth = getent( "earth_model", "targetname" );
earth delete();
flag_clear( "script2model_iss" );
}