524 lines
12 KiB
Plaintext
524 lines
12 KiB
Plaintext
|
#include common_scripts\utility;
|
||
|
#include maps\_utility;
|
||
|
|
||
|
main()
|
||
|
{
|
||
|
level._effect[ "watersplash" ] = loadfx( "misc/cargoship_splash" );
|
||
|
level._sea_scale = 1;
|
||
|
|
||
|
level.sea_model = getent( "sea", "targetname" );
|
||
|
level._sea_org = spawn( "script_origin", level.sea_model.origin );
|
||
|
level._sea_org.offset = vector_multiply( level.sea_model.origin, -1 );
|
||
|
level._sea_org.sway = "sway2";
|
||
|
level._sea_link = spawn( "script_origin", level.sea_model.origin );
|
||
|
level._sea_link.offset = level._sea_org.offset;
|
||
|
level.sea_model linkto( level._sea_link );
|
||
|
|
||
|
level.sea_foam = getent( "sea_foam", "targetname" );
|
||
|
level.sea_foam linkto( level._sea_link );
|
||
|
level.sea_foam hide();
|
||
|
|
||
|
level.sea_black = getent( "sea_black", "targetname" );
|
||
|
level.sea_black linkto( level._sea_link );
|
||
|
|
||
|
flag_init( "_sea_waves" );
|
||
|
flag_init( "_sea_viewbob" );
|
||
|
flag_init( "_sea_bob" );
|
||
|
flag_set( "_sea_bob" );
|
||
|
|
||
|
objects = getentarray( "boat_sway", "script_noteworthy" );
|
||
|
array_thread( objects, ::sea_objectbob, level._sea_org );
|
||
|
thread sea_logic();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#using_animtree( "script_model" );
|
||
|
sea_animate()
|
||
|
{
|
||
|
self.animname = "sea";
|
||
|
self UseAnimTree( #animtree );
|
||
|
|
||
|
self setanim( %cargoship_water );
|
||
|
}
|
||
|
|
||
|
sea_logic()
|
||
|
{
|
||
|
wait .05;
|
||
|
|
||
|
/*
|
||
|
level.lite_settings = getmapsundirection();
|
||
|
level.new_lite_settings = level.lite_settings;
|
||
|
*/
|
||
|
|
||
|
string = getdvar( "r_lightTweakSunDirection" );
|
||
|
token = strtok( string, " " );
|
||
|
level.lite_settings = ( int( token[ 0 ] ), int( token[ 1 ] ), int( token[ 2 ] ) );
|
||
|
level.new_lite_settings = level.lite_settings;
|
||
|
|
||
|
level._sea_org thread sea_bob();
|
||
|
level._sea_org thread sea_litebob();
|
||
|
level._sea_org thread sea_waves();
|
||
|
level._sea_org thread sea_viewbob();
|
||
|
}
|
||
|
|
||
|
sea_objectbob_precalc( org, type )
|
||
|
{
|
||
|
self.waittime = randomfloatrange( .5, 1 );
|
||
|
if ( isdefined( self.setscale ) )
|
||
|
self.scale = self.setscale;
|
||
|
else
|
||
|
self.scale = randomfloatrange( 2, 3 );
|
||
|
|
||
|
swaymax = 0;
|
||
|
swaynum = 0;
|
||
|
|
||
|
switch( type )
|
||
|
{
|
||
|
case "sway1":{
|
||
|
swaymax = self.sway1max;
|
||
|
}break;
|
||
|
case "sway2":{
|
||
|
swaymax = self.sway2max;
|
||
|
}break;
|
||
|
}
|
||
|
|
||
|
if ( self.axial )
|
||
|
{
|
||
|
swaycalc = ( org.rotation[ 0 ] * self.pratio * self.scale ) + ( org.rotation[ 2 ] * self.rratio * self.scale );
|
||
|
|
||
|
if ( swaymax < abs( swaycalc ) )
|
||
|
{
|
||
|
if ( swaycalc < 1 )
|
||
|
swaynum = swaymax * - 1;
|
||
|
else
|
||
|
swaynum = swaymax;
|
||
|
}
|
||
|
else
|
||
|
swaynum = swaycalc;
|
||
|
|
||
|
self.ang = ( self.angles[ 0 ], self.angles[ 1 ], swaynum );
|
||
|
}
|
||
|
|
||
|
else
|
||
|
self.ang = vector_multiply( org.rotation, self.scale );
|
||
|
}
|
||
|
|
||
|
sea_objectbob( org )
|
||
|
{
|
||
|
if ( isdefined( self.targetname ) )
|
||
|
{
|
||
|
dependants = getentarray( self.targetname, "target" );
|
||
|
for ( i = 0; i < dependants.size; i++ )
|
||
|
dependants[ i ] linkto( self );
|
||
|
}
|
||
|
|
||
|
nodes = getstructarray( self.target, "targetname" );
|
||
|
A = nodes[ 0 ].origin;
|
||
|
B = undefined;
|
||
|
ent = spawn( "script_origin", ( 0, 0, 0 ) );
|
||
|
ent.axial = false;
|
||
|
|
||
|
if ( isdefined( nodes[ 1 ] ) )
|
||
|
{
|
||
|
B = nodes[ 1 ].origin;
|
||
|
ent.axial = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
vec = anglestoup( nodes[ 0 ].angles );
|
||
|
vec = vector_multiply( vec, 10 );
|
||
|
B = A + vec;
|
||
|
}
|
||
|
|
||
|
ent.origin = A;
|
||
|
ent.angles = vectortoangles( B - A );
|
||
|
ent.pratio = 1;
|
||
|
ent.rratio = 1;
|
||
|
ent.sway1max = 100;
|
||
|
ent.sway2max = 100;
|
||
|
ent.setscale = undefined;
|
||
|
|
||
|
if ( isdefined( nodes[ 0 ].script_parameters ) )
|
||
|
{
|
||
|
token = strtok( nodes[ 0 ].script_parameters, ":;, " );
|
||
|
for ( i = 0; i < token.size; i++ )
|
||
|
{
|
||
|
switch( token[ i ] )
|
||
|
{
|
||
|
case "axial":{
|
||
|
ent.axial = true;
|
||
|
}break;
|
||
|
case "sway1":{
|
||
|
i++ ;
|
||
|
ent.sway1max = int( token[ i ] );
|
||
|
}break;
|
||
|
case "sway2":{
|
||
|
i++ ;
|
||
|
ent.sway2max = int( token[ i ] );
|
||
|
}break;
|
||
|
case "setscale":{
|
||
|
i++ ;
|
||
|
if ( token[ i ] == "randomrange" )
|
||
|
{
|
||
|
i++ ;
|
||
|
r1 = int( token[ i ] );
|
||
|
i++ ;
|
||
|
r2 = int( token[ i ] );
|
||
|
ent.setscale = randomfloatrange( r1, r2 );
|
||
|
}
|
||
|
else
|
||
|
ent.setscale = int( token[ i ] );
|
||
|
}break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ent.axial )
|
||
|
{
|
||
|
ang = undefined;
|
||
|
world = ( 0, 360, 0 );
|
||
|
|
||
|
if ( !isdefined( nodes[ 1 ] ) )
|
||
|
ang = nodes[ 0 ].angles;
|
||
|
else
|
||
|
ang = vectortoangles( B - A );
|
||
|
|
||
|
ent.rratio = vectordot( anglestoright( ang ), anglestoright( world ) );
|
||
|
ent.pratio = vectordot( anglestoright( ang ), anglestoforward( world ) );
|
||
|
}
|
||
|
|
||
|
self.link = ent;
|
||
|
self notify( "got_link" );
|
||
|
|
||
|
for ( i = 0; i < nodes.size; i++ )
|
||
|
nodes[ i ] thread sea_objectbob_findparent( ent, org );
|
||
|
|
||
|
wait .05;
|
||
|
|
||
|
self linkto( ent );
|
||
|
if ( isdefined( self.script_parameters ) )
|
||
|
{
|
||
|
token = strtok( self.script_parameters, ":;, " );
|
||
|
for ( i = 0; i < token.size; i++ )
|
||
|
{
|
||
|
switch( token[ i ] )
|
||
|
{
|
||
|
case "snd":{
|
||
|
i++ ;
|
||
|
fxent = common_scripts\_createfx::createLoopSound();
|
||
|
fxent.v[ "soundalias" ] = token[ i ];
|
||
|
fxent.v[ "origin" ] = self.origin;
|
||
|
fxent.v[ "fxid" ] = "chains";
|
||
|
|
||
|
fxent.v[ "angles" ] = vectortoangles( ( fxent.v[ "origin" ] + ( 0, 0, 100 ) ) - fxent.v[ "origin" ] );
|
||
|
fxent common_scripts\_createfx::restart_fx_looper();
|
||
|
}break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
thread sea_objectbob_logic( org, ent );
|
||
|
}
|
||
|
|
||
|
sea_objectbob_logic( org, ent )
|
||
|
{
|
||
|
while ( 1 )
|
||
|
{
|
||
|
if ( org.sway == "sway2" )
|
||
|
org waittill( "sway1" );
|
||
|
|
||
|
ent sea_objectbob_precalc( org, "sway1" );
|
||
|
ent notify( "precalcdone1" );
|
||
|
if ( !isdefined( ent.parent ) )
|
||
|
wait ent.waittime;
|
||
|
|
||
|
ent rotateto( ent.ang, org.time, org.time * .5, org.time * .5 );
|
||
|
|
||
|
if ( org.sway == "sway1" )
|
||
|
org waittill( "sway2" );
|
||
|
|
||
|
ent sea_objectbob_precalc( org, "sway2" );
|
||
|
ent notify( "precalcdone2" );
|
||
|
if ( !isdefined( ent.parent ) )
|
||
|
wait ent.waittime;
|
||
|
|
||
|
ent rotateto( ent.ang, org.time, org.time * .5, org.time * .5 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_objectbob_follow( ref )
|
||
|
{
|
||
|
while ( 1 )
|
||
|
{
|
||
|
self moveto( ref.origin, .1 );
|
||
|
wait .1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_objectbob_findparent( ent, org )
|
||
|
{
|
||
|
if ( !isdefined( self.target ) )
|
||
|
return;
|
||
|
|
||
|
ent.parent = getent( self.target, "targetname" );
|
||
|
if ( !isdefined( ent.parent.link ) )
|
||
|
ent.parent waittill( "got_link" );
|
||
|
|
||
|
link = ent.parent.link;
|
||
|
origin = ent.origin;
|
||
|
base = spawn( "script_origin", ( link.origin ) );
|
||
|
base.angles = link.angles;
|
||
|
ref = spawn( "script_origin", ( ent.origin ) );
|
||
|
ref.angles = ent.angles;
|
||
|
ref linkto( base );
|
||
|
|
||
|
ent thread sea_objectbob_follow( ref );
|
||
|
|
||
|
while ( 1 )
|
||
|
{
|
||
|
link waittill( "precalcdone1" );
|
||
|
|
||
|
wait link.waittime - .05;
|
||
|
base rotateto( link.ang, org.time, org.time * .5, org.time * .5 );
|
||
|
|
||
|
|
||
|
link waittill( "precalcdone2" );
|
||
|
wait link.waittime - .05;
|
||
|
base rotateto( link.ang, org.time, org.time * .5, org.time * .5 );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sea_bob()
|
||
|
{
|
||
|
self endon( "manual_override" );
|
||
|
flag_wait( "_sea_bob" );
|
||
|
|
||
|
self thread sea_bob_reset();
|
||
|
|
||
|
wait .05;
|
||
|
while ( 1 )
|
||
|
{
|
||
|
rotationy = 0;// randomfloatrange( 1, 1.75 );
|
||
|
rotationp = 0;// randomfloatrange( .4, .75 ) * level._sea_scale;
|
||
|
rotationr = randomfloatrange( 2, 4 ) * level._sea_scale;
|
||
|
self.time = randomfloatrange( 3, 4 );
|
||
|
self.rotation = ( rotationp, rotationy, rotationr );
|
||
|
|
||
|
self.sway = "sway1";
|
||
|
self notify( "sway1" );
|
||
|
if ( flag( "_sea_bob" ) )
|
||
|
level._sea_link rotateto( self.rotation, self.time, self.time * .5, self.time * .5 );
|
||
|
self rotateto( self.rotation, self.time, self.time * .5, self.time * .5 );
|
||
|
wait self.time;
|
||
|
|
||
|
self.rotation = vector_multiply( self.rotation, -1 );
|
||
|
|
||
|
self.sway = "sway2";
|
||
|
self notify( "sway2" );
|
||
|
if ( flag( "_sea_bob" ) )
|
||
|
level._sea_link rotateto( self.rotation, self.time, self.time * .5, self.time * .5 );
|
||
|
self rotateto( self.rotation, self.time, self.time * .5, self.time * .5 );
|
||
|
wait self.time;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_bob_reset_loop()
|
||
|
{
|
||
|
self endon( "manual_override" );
|
||
|
|
||
|
flag_wait( "_sea_bob" );
|
||
|
self thread sea_bob_reset();
|
||
|
}
|
||
|
|
||
|
sea_bob_reset()
|
||
|
{
|
||
|
self endon( "manual_override" );
|
||
|
|
||
|
level waittill( "_sea_bob" );
|
||
|
thread sea_bob_reset_loop();
|
||
|
|
||
|
level endon( "_sea_bob" );
|
||
|
|
||
|
time = ( 1.5 );
|
||
|
rotation = ( 0, 0, 0 );
|
||
|
|
||
|
level._sea_link rotateto( rotation, time, time * .5, time * .5 );
|
||
|
wait time;
|
||
|
wait .05;
|
||
|
level.new_lite_settings = level.lite_settings;
|
||
|
level._sea_link.angles = ( 0, 0, 0 );
|
||
|
}
|
||
|
|
||
|
sea_waves()
|
||
|
{
|
||
|
waves = sea_waves_setup();
|
||
|
if ( !isdefined( waves ) )
|
||
|
return;
|
||
|
|
||
|
self.oldwaves = [];
|
||
|
|
||
|
while ( 1 )
|
||
|
{
|
||
|
flag_wait( "_sea_waves" );
|
||
|
self waittill( "sway1" );
|
||
|
self thread sea_waves_fx( waves, "right" );
|
||
|
|
||
|
flag_wait( "_sea_waves" );
|
||
|
self waittill( "sway2" );
|
||
|
self thread sea_waves_fx( waves, "left" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_waves_fx( waves, name )
|
||
|
{
|
||
|
wait self.time * .5;
|
||
|
range = 2;
|
||
|
|
||
|
wave = random( sea_closestWaveArray( waves[ name ], range ) );
|
||
|
if ( !isdefined( self.oldwaves[ name ] ) )
|
||
|
self.oldwaves[ name ] = wave;
|
||
|
|
||
|
while ( self.oldwaves[ name ] == wave )
|
||
|
{
|
||
|
wait .05;
|
||
|
wave = random( sea_closestWaveArray( waves[ name ], range ) );
|
||
|
}
|
||
|
self.oldwaves[ name ] = wave;
|
||
|
|
||
|
wave thread sea_waves_fx2();
|
||
|
|
||
|
thread play_sound_in_space( "elm_wave_crash_ext", wave.origin );
|
||
|
}
|
||
|
|
||
|
sea_waves_fx2()
|
||
|
{
|
||
|
wait randomfloat( .15 );
|
||
|
exploder( self.exploder.v[ "exploder" ] );
|
||
|
}
|
||
|
|
||
|
sea_closestWaveArray( array, arraysize )
|
||
|
{
|
||
|
temp = [];
|
||
|
for ( i = 0;i < array.size;i++ )
|
||
|
array[ i ]._sea_dist = distancesquared( array[ i ].origin, level.player.origin );
|
||
|
|
||
|
for ( i = 0; i < array.size; i++ )
|
||
|
temp = sea_closestWaveLogic( temp, array[ i ] );
|
||
|
|
||
|
temp2 = [];
|
||
|
for ( i = 0; i < arraysize; i++ )
|
||
|
temp2[ i ] = temp[ i ];
|
||
|
|
||
|
return temp2;
|
||
|
}
|
||
|
sea_closestWaveLogic( array, object )
|
||
|
{
|
||
|
if ( !array.size )
|
||
|
{
|
||
|
array[ 0 ] = object;
|
||
|
return array;
|
||
|
}
|
||
|
|
||
|
for ( i = 0; i < array.size; i++ )
|
||
|
{
|
||
|
if ( array[ i ]._sea_dist > object._sea_dist )
|
||
|
{
|
||
|
array = array_insert( array, object, i );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if ( i == array.size )
|
||
|
array = array_add( array, object );
|
||
|
|
||
|
return array;
|
||
|
}
|
||
|
|
||
|
sea_waves_setup()
|
||
|
{
|
||
|
nodes = getstructarray( "wave_fx", "targetname" );
|
||
|
center = getstruct( "wave_fx_center", "targetname" );
|
||
|
|
||
|
if ( !nodes.size )
|
||
|
return undefined;
|
||
|
|
||
|
forward = anglestoforward( center.angles );
|
||
|
right = anglestoright( center.angles );
|
||
|
|
||
|
waves = [];
|
||
|
waves[ "right" ] = [];
|
||
|
waves[ "left" ] = [];
|
||
|
|
||
|
for ( i = 0; i < nodes.size; i++ )
|
||
|
{
|
||
|
nodes[ i ].forward = anglestoforward( nodes[ i ].angles );
|
||
|
nodes[ i ].up = anglestoup( nodes[ i ].angles );
|
||
|
nodes[ i ].right = anglestoright( nodes[ i ].angles );
|
||
|
}
|
||
|
|
||
|
for ( i = 0; i < nodes.size; i++ )
|
||
|
{
|
||
|
if ( vectordot( nodes[ i ].forward, right ) > 0 )
|
||
|
waves[ "right" ][ waves[ "right" ].size ] = nodes[ i ];
|
||
|
else
|
||
|
waves[ "left" ][ waves[ "left" ].size ] = nodes[ i ];
|
||
|
}
|
||
|
|
||
|
//now that we have our positions...lets grab our actual exploders
|
||
|
array = level._waves_exploders;
|
||
|
for ( i = 0; i < array.size; i++ )
|
||
|
array[ i ].origin = array[ i ].v[ "origin" ];
|
||
|
|
||
|
for ( i = 0; i < waves[ "right" ].size; i++ )
|
||
|
{
|
||
|
exp = getClosest( waves[ "right" ][ i ].origin, array, 64 );
|
||
|
array = array_remove( array, exp );
|
||
|
if ( isdefined( waves[ "right" ][ i ].angles ) )
|
||
|
exp.v[ "forward" ] = anglestoup( waves[ "right" ][ i ].angles );
|
||
|
waves[ "right" ][ i ].exploder = exp;
|
||
|
}
|
||
|
for ( i = 0; i < waves[ "left" ].size; i++ )
|
||
|
{
|
||
|
exp = getClosest( waves[ "left" ][ i ].origin, array, 64 );
|
||
|
array = array_remove( array, exp );
|
||
|
if ( isdefined( waves[ "left" ][ i ].angles ) )
|
||
|
exp.v[ "forward" ] = anglestoup( waves[ "left" ][ i ].angles );
|
||
|
waves[ "left" ][ i ].exploder = exp;
|
||
|
}
|
||
|
return waves;
|
||
|
}
|
||
|
|
||
|
sea_litebob()
|
||
|
{
|
||
|
while ( 1 )
|
||
|
{
|
||
|
wait .2;
|
||
|
ang = vector_multiply( self.angles, 2 );
|
||
|
ang = ( ang[ 0 ], ang[ 1 ], ang[ 2 ] );
|
||
|
|
||
|
oldang = level.new_lite_settings;
|
||
|
level.new_lite_settings = combineangles( ang, level.lite_settings );
|
||
|
//level.new_lite_settings = level.lite_settings + ang;
|
||
|
newang = level.new_lite_settings;
|
||
|
|
||
|
old = anglestoforward( oldang );
|
||
|
new = anglestoforward( newang );
|
||
|
|
||
|
if ( flag( "cargoship_lighting_off" ) )
|
||
|
LerpSunDirection( old, new, .2 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_viewbob()
|
||
|
{
|
||
|
while ( 1 )
|
||
|
{
|
||
|
flag_wait( "_sea_viewbob" );
|
||
|
level.player playerSetGroundReferenceEnt( self );
|
||
|
|
||
|
if ( flag( "_sea_viewbob" ) )
|
||
|
level waittill( "_sea_viewbob" );
|
||
|
|
||
|
level.player playerSetGroundReferenceEnt( undefined );
|
||
|
}
|
||
|
}
|