// Script to perform orbit whilst maintaining the same face // to a specific direction. This is designed for use with two linked // prims, the root is the centre prim, and a second prim orbits around // the root, always keeping its face in the same (global) direction. // // There are two ways of using this script - as a single script in // the root prim, or with copies of the script in both root and any // rotating child prims. // // Set gScriptScriptVersion = TRUE/FALSE as required // // The single script version is for placing in the central root // prim and it will make the 1st linked prim orbit it. // // The multi-script version will need the script in the root (centre) // prim and in any child prims that you wish to be orbiting. // // Kimm Paulino // April 2012 // Single or multiple script version integer gSingleScriptVersion = FALSE; // Configure the script integer gTouchControl = FALSE; float ROT_PERIOD = 5.0; integer ROT_STEPS = 20; // Don't change below here integer gStep = 0; integer gRotating = FALSE; integer gRoot = FALSE; default { on_rez (integer start_param) { llResetScript(); } state_entry() { gStep = 0; integer num = llGetLinkNumber(); if (num <= 1) { gRoot = TRUE; } if (gSingleScriptVersion && !gRoot) { // In single script version, only function if we are the root llOwnerSay ("This script is configured for Single Script use and so must be in the root (centre) prim."); return; } if (!gTouchControl) { llSetTimerEvent (ROT_PERIOD/(float)ROT_STEPS); } } touch_start (integer num_detected) { if (gSingleScriptVersion && !gRoot) { return; } if (gTouchControl) { if (gRotating) { gRotating = FALSE; llSetTimerEvent (0.0); } else { gRotating = TRUE; llSetTimerEvent (ROT_PERIOD/(float)ROT_STEPS); } } } timer () { if (gSingleScriptVersion && !gRoot) { return; } gStep ++; if (gStep > ROT_STEPS) { gStep = 0; } // If this is the root, it is the centre prim // If single script, then move the slave then the root together if (gSingleScriptVersion) { // Now move the first linked prim float rot = - gStep * (360.0/(float)ROT_STEPS); llSetLinkPrimitiveParamsFast (2, [PRIM_ROTATION, llEuler2Rot (<0.0, 0.0, rot>*DEG_TO_RAD) / llGetRootRotation()]); // Move the root rot = gStep * (360.0/(float)ROT_STEPS); llSetRot (llEuler2Rot (<0.0, 0.0, rot>*DEG_TO_RAD)); } else // multiple scripts - just move one ... { if (gRoot) { // Move the root float rot = gStep * (360.0/(float)ROT_STEPS); llSetRot (llEuler2Rot (<0.0, 0.0, rot>*DEG_TO_RAD)); } else { // Move this prim, as a child float rot = - gStep * (360.0/(float)ROT_STEPS); llSetRot (llEuler2Rot (<0.0, 0.0, rot>*DEG_TO_RAD) / llGetRootRotation()); } } } }