67 lines
1.9 KiB
Plaintext
67 lines
1.9 KiB
Plaintext
// This is a script designed to orbit its owner.
|
|
vector startPos;
|
|
vector curPos;
|
|
|
|
vector offset; // offset from Agent
|
|
integer iteration;
|
|
float rotationRate; // degrees of rotation per iteration
|
|
float sensorInterval; // seconds between sensor scan.
|
|
|
|
default
|
|
{
|
|
state_entry()
|
|
{
|
|
llOwnerSay( "Hello, Avatar! Touch to start orbiting." );
|
|
llSetStatus( 1, FALSE ); // turn Physics off.
|
|
offset = < 2, 2, 1 >;
|
|
iteration = 0;
|
|
rotationRate = .5;
|
|
sensorInterval = .3;
|
|
}
|
|
|
|
touch_start(integer total_number)
|
|
{
|
|
startPos = llGetPos();
|
|
curPos = startPos;
|
|
|
|
llSleep( .1 );
|
|
|
|
key id = llGetOwner();
|
|
llSensorRepeat( "", id, AGENT, 96, PI, sensorInterval );
|
|
}
|
|
|
|
sensor(integer total_number)
|
|
{
|
|
iteration++;
|
|
|
|
if( iteration > 300 )
|
|
{
|
|
llResetScript();
|
|
}
|
|
|
|
if( llDetectedOwner( 0 ) == llGetOwner() )
|
|
{ // the detected Agent is my owner.
|
|
vector position = llDetectedPos(0); // find Owner position.
|
|
|
|
// calculate next object position relative both to the Owner's
|
|
// position and the current time interval counter. That is,
|
|
// use the iteration counter to define a rotation, multiply
|
|
// the rotation by the constant offset to get a rotated offset
|
|
// vector, and add that rotated offset to the current position
|
|
// to defne the new position.
|
|
|
|
float degreeRotation = llRound( rotationRate * iteration ) % 360;
|
|
rotation Rotation =
|
|
llEuler2Rot( < 0, 0, degreeRotation * DEG_TO_RAD > );
|
|
vector rotatedOffset = offset * Rotation;
|
|
position += rotatedOffset;
|
|
|
|
// change the location of the object and save the current (rotated)
|
|
// offset for use during the next iteration.
|
|
llSetPos( position );
|
|
offset = rotatedOffset;
|
|
}
|
|
}
|
|
}
|
|
|