IW4-Dump-Files/maps/_float.gsc

105 lines
2.8 KiB
Plaintext

//causes objects to bob like in water...simulates a ripple from a point in space and causes a uniform sin wave effect on the objects.
//range = the height range to bob up and down
//freq = how often the objects bob up and down per time freq of 1 would mean it would bomb up in 1 sec and down the next. freq of .5 would mean it would bob up once every 2 sec and down the next 2
//wavelength = the size of the waves caused by the "ripple"
//rotation = the amount the object rotates off its center as it bobs
//origin = the origin of the ripple...if you want it to look like waves - should be kept far away from the objects.
#include common_scripts\utility;
main( range, freq, wavelength, rotation, origin )
{
floaters = getentarray( "script_floater", "targetname" );
if ( !floaters.size )
return;
//defaults
_range = 10;
_freq = .5;
_wavelength = 50;
_origin = ( 0, 0, 0 );
_rotation = 10;
//intended variables
if ( isdefined( range ) )
_range = range;
if ( isdefined( freq ) )
_freq = freq;
if ( isdefined( wavelength ) )
_wavelength = wavelength;
if ( isdefined( origin ) )
_origin = origin;
if ( isdefined( rotation ) )
_rotation = rotation;
for ( i = 0;i < floaters.size;i++ )
floaters[ i ] thread floater_think( _range, _freq, _wavelength, _rotation, _origin );
}
floater_think( range, freq, wavelength, rotation, origin )
{
self.range = range;
self.time = 1 / freq;
self.acc = self.time * .25;
center = self getorigin();
//convert our wavelength into a range of degrees
//find out distance (degrees) away from a reference
//where are we on the sign wave? (what height)
conv_fac = 360 / wavelength;
dist = distance( center, origin );
degrees = dist * conv_fac;
frac = sin( degrees );
//are we going up or down
if ( cos( degrees ) < 0 )
self.range = -1 * self.range;
org = spawn( "script_origin", center );
self linkto( org );
angles = vectortoangles( center - origin );
self.nangles = org.angles;
org.angles = org.angles + ( rotation, rotation * .25, angles[ 2 ] );
self.rangles = org.angles;
self thread floater_move( frac, org );
self thread floater_bob( frac, org );
}
floater_bob( frac, org )
{
self endon( "death" );
self endon( "stop_float_script" );
wait( abval( self.time * frac ) );
while ( 1 )
{
self.rangles = vector_multiply( self.rangles, -1 );
org rotateto( self.rangles, self.time, self.acc, self.acc );
org waittill( "rotatedone" );
}
}
floater_move( frac, org )
{
self endon( "death" );
self endon( "stop_float_script" );
wait( abval( self.time * frac ) );
org moveZ( self.range * .5, self.time * .5, self.acc, self.acc );
while ( 1 )
{
org waittill( "movedone" );
self.range = -1 * self.range;
org moveZ( self.range, self.time, self.acc, self.acc );
}
}
abval( num )
{
if ( num < 0 )
return( -1 * num );
else
return num;
}