User:Kimm Paulino/Scripts
Simple Teleport
<lsl> // Teleports on 'left click' (touch). // // Set the coordinates to tp to in the DEST= line after these comments. // // Kimm Paulino // Sept 2009 // // Teleport bit based on the following: // // Copyright (c) 2008, Scripting Your World // All rights reserved. // // Scripting Your World // By Dana Moore, Michael Thome, and Dr. Karen Zita Haigh // http://syw.fabulo.us // http://www.amazon.com/Scripting-Your-World-Official-Second/dp/0470339837/ // // You are permitted to use, share, and adapt this code under the // terms of the Creative Commons Public License described in full // at http://creativecommons.org/licenses/by/3.0/legalcode. // That means you must keep the credits, do nothing to damage our // reputation, and do not suggest that we endorse you or your work. // // Listing 2.4: Teleport3 - Optimized Intrasim Teleport
vector DEST = <224, 213, 22>; // the teleport will be to this location vector SITPOS = <0,0,0.5>; key gAv;
moveTo(vector origin, vector destination ) { // removed jumpdist
float dist = llVecDist(origin, destination); integer passes = llCeil( llLog(dist/10.0) / llLog(2.0) ); integer i; list params = [PRIM_POSITION, destination]; for (i=0; i<passes; i++) { params = (params=[]) + params + params; } llSetPrimitiveParams(params);
}
teleport(key av) {
if (av == NULL_KEY) { return; }
vector origin = llGetPos(); llSetAlpha (0.0, ALL_SIDES); moveTo(origin, DEST); // no need to sleep -- llSetPrimParams has 0.2s delay llUnSit(av); moveTo(DEST, origin); llSetAlpha (1.0, ALL_SIDES);
}
default {
state_entry() { llSetClickAction (CLICK_ACTION_SIT); llSitTarget(SITPOS, ZERO_ROTATION); }
changed(integer changebits) { if (changebits & CHANGED_LINK) { gAv = llAvatarOnSitTarget(); if (gAv != NULL_KEY) { teleport(gAv); } } }
} </lsl>
Die after 10 minutes
<lsl> // This will kill the prim it is in, 10 minutes after the prim has been rezzed. // // Kimm Paulino, June 2010
default {
state_entry() { // 10 minutes llSetTimerEvent (600.0); } timer () { llSetTimerEvent (0.0); llDie(); }
} </lsl>
Simple Prim Texture Changer
<lsl> // Texture changer. Will cycle through all textures // in the prims inventory. // // Kimm Paulino // Written for Bebelou Naidoo, April 2010
float TIMER_PERIOD = 5.0; // in seconds. integer RANDOM = 1; // 0 = sequential, 1 = random
// globals integer gNumTextures; integer gLastTexture;
default {
on_rez (integer n) { llResetScript(); }
state_entry() { gLastTexture = 0; gNumTextures = llGetInventoryNumber(INVENTORY_TEXTURE); llSetTimerEvent(TIMER_PERIOD); } timer() { integer nextTexture; if (RANDOM) { // Randomly choose one nextTexture = (integer)llFrand (gNumTextures); } else { // Move on from the last one gLastTexture ++; if (gLastTexture > gNumTextures) { gLastTexture = 0; } nextTexture = gLastTexture; } string texture = llGetInventoryName(INVENTORY_TEXTURE, nextTexture); llSetTexture(texture, ALL_SIDES); }
} </lsl>
Phantom Prim Setter
<lsl> // Script to make a prim appear to be phantom, so it can be linked, etc, // without actually being phantom. // // Basic technique found on the SL forums (sorry, I can't remember where). // // Kimm Paulino // Written for Synonyme Toll, May 2010
default {
on_rez (integer start_param) { llResetScript(); } state_entry() { // This makes the prim appear to be 'phantom like' without // actually making it phantom ... llVolumeDetect(TRUE); // Now disable the script once we've done our job llSetScriptState(llGetScriptName(), FALSE); }
} </lsl>
Floating Script
<lsl> // Script for applying a small, random impulse to physical objects // to make them float about. // // Note: There is no bound to where the objects go, this script // is meant for objects in a physically bounded area (like a fish tank with a lid) // // Feel free to use as you wish, but do let me know if you find something // interesting to do with it ... // // Kimm Paulino // Written for Synonyme Toll, Sept 2009 //
// How often to apply the new impulse (in seconds) float IMPULSE_TIME = 3.0;
// Range for the magnitude and x, y, z directions of the impulse float IMPULSE_RANGE = 0.5;
float newRand (float range) {
// Want a random number in range +- 'range' return (llFrand(range) - (range/2.0));
}
applySmallImpulse () {
vector my_vec = llGetVel(); float my_mag = llVecMag (my_vec); vector my_dir = llVecNorm (my_vec);
// Change the magnitude slightly ... my_mag = my_mag + newRand(IMPULSE_RANGE); // Change the direction slightly too ... my_dir = <my_dir.x + newRand(IMPULSE_RANGE), my_dir.y + newRand(IMPULSE_RANGE), my_dir.z + newRand(IMPULSE_RANGE)>; vector new_vec = my_dir * my_mag; //llOwnerSay ("Applying Impulse: " + (string)new_vec);
// apply the impulse to us llApplyImpulse (new_vec, TRUE);
}
default {
on_rez(integer n) { llResetScript (); } state_entry() { // Turn on Physics llSetPrimitiveParams ([PRIM_PHYSICS, TRUE]); // Set the boyancy to > 1.0 so that it floats llSetBuoyancy (1.0); // Set up a timer to apply an impulse llSetTimerEvent (IMPULSE_TIME); } timer() { applySmallImpulse(); }
} </lsl>
Sit and Play Animation
<lsl> // Sets a sit target and plays whatever animation is // stored in the contents on the prim when someone sits down. // // Kimm Paulino // Written for Synonyme Toll, April 2010
// These numbers are totally dependent on the object containing // the script, and possibly even the animation to be used too. vector gPosition = <0.0, 0.0, 0.1>; vector gRotation = <0.0, 0.0, 0.0>; // in degrees
default {
on_rez (integer start_param) { llResetScript(); } state_entry() { // These numbers are totally dependent on the object containing the script! llSitTarget (gPosition, llEuler2Rot (gRotation * DEG_TO_RAD)); }
changed (integer change) { // When someone sits on an object, the av is considered to be // a linked-in child prim, so the link number changes if (change & CHANGED_LINK) { key av = llAvatarOnSitTarget(); if (av) { // yes so need to play the animation // first request permissions - results in the callback ... llRequestPermissions(av, PERMISSION_TRIGGER_ANIMATION); } } } run_time_permissions(integer perms) { // Do we have permissions to run the animations? // results in the timer! if(perms) { llSetTimerEvent(1.0); } else { llSetTimerEvent(0.0); } } timer() { key av = llAvatarOnSitTarget(); // If the av is still sitting, play the animation stored in the prim if (av) { llStopAnimation("sit"); llStartAnimation( llGetInventoryName( INVENTORY_ANIMATION, 0 )); } else { // stop playing the animations for sitting if the av // is no longer sitting ... llStopAnimation("sit_generic"); } }
} </lsl>
Move up and down
<lsl> // Makes an object go up or down, gradually, when touched. // In order to make it a gradual movement, it uses a physical // object, which means it might be a little wobbly ... // // Kimm Paulino // Written for Nicollette Arabello, November 2009 //
integer gState; integer DOWN=0; integer GO_UP=1; integer UP=2; integer GO_DOWN=3;
float MOVE_DAMPING=4.0; float MOVE_TIME=4.0;
// Move to 1m above starting position vector gOffset = <0.0, 0.0, 1.0>; vector gStartPosition;
default {
state_entry() { // Use physics so that can use MoveToTarget gStartPosition = llGetPos (); // Stop the object rotating llSetStatus(STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z, FALSE); llSetStatus(STATUS_PHYSICS, TRUE); llMoveToTarget (gStartPosition, MOVE_DAMPING); llSetTimerEvent (MOVE_TIME); } on_rez(integer n) { llResetScript(); }
timer () { if (gState == DOWN) { gState = GO_UP; llMoveToTarget(gStartPosition + gOffset, MOVE_DAMPING); gState = UP; } else if (gState == UP) { gState = GO_DOWN; llMoveToTarget(gStartPosition, MOVE_DAMPING); gState = DOWN; } }
} </lsl>