cod4-sdk/raw/maps/_flare.gsc

253 lines
6.1 KiB
Text
Raw Normal View History

2008-01-19 00:00:00 +00:00
#include maps\_vehicle_aianim;
#include maps\_utility;
#include maps\_vehicle;
#include common_scripts\utility;
#using_animtree ("vehicles");
main( model, type )
{
if ( !isdefined( level._effect ) )
level._effect = [];
level._effect["flare_runner_intro"] = loadfx ("misc/flare_start");
level._effect["flare_runner"] = loadfx ("misc/flare");
level._effect["flare_runner_fizzout"] = loadfx ("misc/flare_end");
build_template( "flare", model, type );
build_localinit( ::init_local );
//health, optional_min, optional_max
build_life ( 9999 );
}
init_local()
{
}
// below is the script for the in game flare effect
merge_suncolor( delay, timer, rgb1, rgb2 )
{
wait( delay );
timer = timer*20;
suncolor = [];
for ( i=0; i < timer; i++ )
{
dif = i / timer;
level.thedif = dif;
c = [];
for ( p=0; p < 3; p++ )
{
c[ p ] = rgb2[ p ] * dif + rgb1[ p ] * ( 1 - dif );
}
level.sun_color = ( c[ 0 ], c[ 1 ], c[ 2 ] );
wait( 0.05 );
}
}
merge_sunsingledvar( dvar, delay, timer, l1, l2 )
{
// level notify( dvar + "new_lightmerge" );
// level endon( dvar + "new_lightmerge" );
setsaveddvar( dvar, l1 );
wait( delay );
timer = timer*20;
suncolor = [];
/*
0 i
1 timer*20
*/
for ( i=0; i < timer; i++ )
{
dif = i / timer;
level.thedif = dif;
ld = l2 * dif + l1 * ( 1 - dif );
setsaveddvar( dvar, ld );
wait( 0.05 );
}
setsaveddvar( dvar, l2 );
}
merge_sunbrightness( delay, timer, l1, l2 )
{
wait( delay );
timer = timer*20;
suncolor = [];
for ( i=0; i < timer; i++ )
{
dif = i / timer;
level.thedif = dif;
ld = l2 * dif + l1 * ( 1 - dif );
level.sun_brightness = ld;
wait( 0.05 );
}
level.sun_brightness = l2;
}
combine_sunlight_and_brightness()
{
level endon( "stop_combining_sunlight_and_brightness" );
wait( 0.05 ); // wait for the direction to start lerping
for ( ;; )
{
brightness = level.sun_brightness;
// add some flicker
if ( brightness > 1 )
brightness += randomfloat( 0.2 );
rgb = vector_Multiply( level.sun_color, brightness );
setSunLight( rgb[ 0 ], rgb[ 1 ], rgb[ 2 ] );
wait( 0.05 );
}
}
flare_path()
{
thread goPath( self );
flag_wait( "flare_stop_setting_sundir" );
self delete();
}
flare_initial_fx()
{
// initial effect
model = spawn( "script_model", (0,0,0) );
model setModel( "tag_origin" );
model linkto( self, "tag_origin", (0,0,0), (0,0,0) );
playfxontag( level._effect[ "flare_runner_intro" ], model, "tag_origin" );
self waittillmatch( "noteworthy", "flare_intro_node" );
model delete();
}
flare_explodes()
{
flag_set( "flare_start_setting_sundir" );
// flare explodes
// the amount of time for the ent to traverse the arc
level.sun_brightness = 1;
// merge our various sun values over time
// first merge in the sun color/light settings
level.red_suncolor = (0.8,0.4,0.4);
level.original_suncolor = getMapSunLight();
level.sun_color = level.original_suncolor;
thread merge_sunsingledvar( "sm_sunSampleSizeNear", 0, 0.25, 0.25, 1 );
thread combine_sunlight_and_brightness();
thread merge_suncolor( 0, 0.25, level.original_sunColor, level.red_suncolor );
thread merge_sunbrightness( 0, 0.25, 1, 3 );
model2 = spawn( "script_model", (0,0,0) );
model2 setModel( "tag_origin" );
model2 linkto( self, "tag_origin", (0,0,0), (0,0,0) );
playfxontag( level._effect[ "flare_runner" ], model2, "tag_origin" );
self waittillmatch( "noteworthy", "flare_fade_node" );
// wait( 1 );
model2 delete();
}
flare_burns_out()
{
// flare begins to phyzl out
model3 = spawn( "script_model", (0,0,0) );
model3 setModel( "tag_origin" );
model3 linkto( self, "tag_origin", (0,0,0), (0,0,0) );
playfxontag( level._effect[ "flare_runner_fizzout" ], model3, "tag_origin" );
//wait( 0.3 );
// brightness goes down then up
thread merge_sunsingledvar( "sm_sunSampleSizeNear", 0, 1, 1, 0.25 );
thread merge_sunbrightness( 0, 1, 3, 0 );
thread merge_suncolor( 0, 1, level.red_suncolor, level.original_suncolor);
thread merge_sunbrightness( 1, 1, 0, 1 );
model3 delete();
thread volume_down( 1 );
wait( 1 );
flag_set( "flare_stop_setting_sundir" );
resetSunDirection();
wait( 1 );
level notify( "stop_combining_sunlight_and_brightness" );
waittillframeend;
// make sure it gets set to the price final direction settings, or the lightmaps will be broken
resetSunLight();
flag_set( "flare_complete" );
}
flare_fx()
{
flare_initial_fx();
flare_explodes();
flare_burns_out();
}
flag_flare( msg )
{
if ( !isdefined( level.flag[ msg ] ) )
{
flag_init( msg );
return;
}
}
flare_from_targetname( targetname )
{
flare = spawn_vehicle_from_targetname( targetname );
flag_flare( "flare_in_use" );
flag_flare( "flare_complete" );
flag_flare( "flare_stop_setting_sundir" );
flag_flare( "flare_start_setting_sundir" );
flag_waitopen( "flare_in_use" );
flag_set( "flare_in_use" );
resetSunLight();
resetSunDirection();
flare thread flare_path();
flare thread flare_fx();
// get the final point that our relative sun needs to point towards to make it equal the maps sun dir
sundir = getMapSunDirection();
angles = sundir;
vec = vectorscale( angles, -100 );
flag_wait( "flare_start_setting_sundir" );
sunPointsTo = getent( flare.script_linkto, "script_linkname" ).origin;
angles = vectortoangles( flare.origin - sunPointsTo );
oldForward = anglestoforward( angles );
for ( ;; )
{
wait( 0.05 );
if ( flag( "flare_stop_setting_sundir" ) )
break;
angles = vectortoangles( flare.origin - sunPointsTo );
forward = anglestoforward( angles );
lerpSunDirection( oldForward, forward, 0.05 );
oldForward = forward;
}
flag_wait( "flare_complete" );
waittillframeend; // otherwise other things waiting on flare complete wont continue
flag_clear( "flare_complete" );
flag_clear( "flare_stop_setting_sundir" );
flag_clear( "flare_start_setting_sundir" );
resetSunLight();
resetSunDirection();
flag_clear( "flare_in_use" );
}