// Long distance teleport version 1.1 // ---------------------------------- // This script is based on other public domain free scripts, so I don't // take credit for any of the work here. // Bits and pieces combined by Lisbeth Cohen - plus added show/hide. // // The basics of the script is based on Till Sterling's simple teleport // script, with cross sim transportation routine developed by // Keknehv Psaltery, modified by Strife Onizuka, Talarus Luan and // Keknehv Psaltery. // The transportation functionality is based upon Nepenthes Ixchel's // 1000m Menu-driven Intra-Sim Teleporter // // Thank you to authors who have given me permission to publish this script. // A special thank you to Keknehv Psaltery for suggesting small improvements! // // Realeased as public domain - you are NOT allowed to sell it without the // permissions of all the authors I've credited above (except those who // may have left sl at the time)! // Feel free to use it in freebies and to give it to your friends :-) // // Please do not take credit for the work of all those great authors // mentioned above! // If you edit the script, please do not change the lines above - thanks! // ------------------------------------------------------------------------ //The target location .. change this to where you want to end up (x, y, z) vector gTargetPos = <246, 181, 415>; // Text for the "pie menu" string gSitText="Teleport"; // Define channel number to listen to user commands from integer myChannel = 123; // No need to edit the global variables below // Return position for tp object - no need to edit vector gStartPos=<0,0,0>; // Key for avatar sitting on object, if any key gAvatarID=NULL_KEY; // If you don't enable this the teleport object will be left at the destination. integer gReturnToStartPos=TRUE; // This routine do the actual transport warpPos( vector destpos) { //R&D by Keknehv Psaltery, 05/25/2006 //with a little pokeing by Strife, and a bit more //some more munging by Talarus Luan //Final cleanup by Keknehv Psaltery // Compute the number of jumps necessary integer jumps = (integer)(llVecDist(destpos, llGetPos()) / 10.0) + 1; // Try and avoid stack/heap collisions if (jumps > 100 ) jumps = 100; // 1km should be plenty list rules = [ PRIM_POSITION, destpos ]; //The start for the rules list integer count = 1; while ( ( count = count << 1 ) < jumps) rules = (rules=[]) + rules + rules; //should tighten memory use. llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) << 1, count) ); } default { state_entry() { // Put the teleport text in place of the Sit in the pie menu llSetSitText(gSitText); // Read the objects position so it can return to it after teleporting gStartPos = llGetPos(); // Sit the avatar on the object llSitTarget(<0,0,1>,ZERO_ROTATION); // Define commands to listen for llListen(myChannel,"","",""); } on_rez(integer startup_param) { llResetScript(); } listen(integer chan, string name, key id, string cmd) { if (cmd == "show") { llSetAlpha( 1, ALL_SIDES ); } else if (cmd == "hide") { llSetAlpha( 0, ALL_SIDES ); } else if (cmd == "reset") { llResetScript(); } else if (cmd == "help") { llSay(0, "Usage:"); llSay(0, ""); llSay(0, "show Make teleporter visible"); llSay(0, "hide Make teleporter invisible"); llSay(0, "reset Resets teleporter script"); llSay(0, "help This text"); } } changed(integer change){ if(change & CHANGED_LINK) { // Find id for avatar sitting on the object gAvatarID = llAvatarOnSitTarget(); // If someone sits on it... if(gAvatarID != NULL_KEY) { // Move avatar to destination warpPos(gTargetPos); // Pause for 1 second llSleep(1); // Unsit avatar llUnSit(gAvatarID); // Wait 1 second more llSleep(1); // If teleporter should return to original position.... if (gReturnToStartPos) { // ... send object to its start position warpPos(gStartPos); } } } } }