//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;
}