Script teleport

From The SchomEmunity Wiki
Jump to: navigation, search

This script allows you to make an object a teleportation device.

1. Make an object - just a plain cube is fine 2. Put this script into it 3. Create a notecard in your inventory: simplest is one with vectors on the first line <x,y,z> and a name on the second line. 4. Drag this notecard onto the object 5. You can now teleport from the object to the vectors specified.

It got me out of a trap space fine! But the object stays where it is and doesn't come with you.

--Mgaved 13:07, 27 February 2007 (GMT)

/ Teleporter Script  v 3.0 by Asira Sakai (with help from LSLWiki)
// requires a notecard in the object's inventory with target vectors and destination descriptions
// in alternating lines (or just a single line with a target vector)
// Will teleport any agent who "sits" on the object containing the script within the simulator
// Touching the object will select the next destination if there are more than one

string gName;                       // name of a notecard in the object's inventory
integer gLine = 0;                  // current line number
key gQueryID;                       // id used to identify dataserver queries
vector homeVector;               // starting vector
vector targetVector;              // vector to teleport to
vector color = <0,0,1>;          // set float text color to blue
integer listIndex;              // current index on the list
list destinations;              // the list of all destinations, strided <vector> , string
string staticText = "Teleport Cube v 3.0"; // optional custom text
string destinationText;            // the text describing the destination

warpPos( vector destpos ) // copied straight from LSLWiki
{   //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) );
}  // end of warpPos

init()
    {
        destinations = [];          // clear out destinations
        llSetText(staticText, color, 1.0);  // set optional initial floating text
        llSetSitText("Teleport");           // change "sit" option to "Teleport"
        llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION); // needed for llAvatarOnSitTarget to work
        gName = llGetInventoryName(INVENTORY_NOTECARD, 0); // select the first notecard in the object's inventory
        if (gName != "")  // if a notecard is found
            gQueryID = llGetNotecardLine(gName, gLine);    // request first notecard line
        else
            llSay(0,"No location set, insert notecard with target vector in <x,y,z> format");
        if(llAvatarOnSitTarget() != NULL_KEY)   // if someone is sitting
                llUnSit(llAvatarOnSitTarget()); // unsit him
    }

default
{
    state_entry()
    {
        init();
    }

    touch_start(integer total_number)
    {
        if (gName != ""){
            if (gLine <= 2)  // if there is only one destination available
                llSay(0, "Right click and select Teleport to activate");
            else {
                llSay(0, "Selecting next destination, right click and select Teleport to activate");
                // get next entries from the list
                if (listIndex >= gLine)
                    listIndex = 0;
                targetVector = (vector)llList2String(destinations, listIndex);
                destinationText = llList2String(destinations, listIndex + 1);              
                llSetText(destinationText, color, 1.0);
                listIndex += 2;
            }
        }
        else
            llResetScript();
    }
   
    dataserver(key query_id, string data) {
        if (query_id == gQueryID) {   
            if (data != EOF) {          // if not at the end of the notecard
                destinations = (destinations=[]) + destinations + data; // add the line data to the list
                gLine++;                // increase line count
                gQueryID = llGetNotecardLine(gName, gLine);    // request next line
            }
            else {  // display the loaded list to the owner
                llOwnerSay("Loaded Locations:");
                listIndex = 0;
                while (listIndex < gLine) {
                    llOwnerSay(llList2String(destinations, listIndex));
                    listIndex++;
                }
                // set up first destination
                targetVector = (vector)llList2String(destinations, 0);
                destinationText = llList2String(destinations, 1);
                if (destinationText != "")
                    llSetText(destinationText, color, 1.0);
                listIndex = 2;
            }
        }        
    }
   
    changed(integer change) {
        if (change & CHANGED_LINK){  // if a link change occurs (sit or unsit)
            if(llAvatarOnSitTarget() != NULL_KEY){  // and there is someone sitting now
                if (gName != ""){  // if there is a valid notecard loaded
                    homeVector = llGetPos();  // record current position for return
                    warpPos(targetVector);  // teleport to selected coordinates
                    llUnSit(llAvatarOnSitTarget()); // unsit him
                    warpPos(homeVector);  // teleport back to old position
                }
                else
                    llResetScript();
            }
        }
    }
}
I've made a hugely simpler teleport script that will teleport you to anywhere within a 512x512x512 cube centred on the teleport:
vector target = <165,110,25>;
default
{
    state_entry()
    {
        llSetSitText("Teleport");
        llSitTarget(target-llGetPos(), ZERO_ROTATION);
    }
}
Combine this with setting the on-left-click action on the box to sitting should mean that you can teleport around by clicking it. The only problem is that you have to edit the script and reset it to change the destination... Oh, and you end up sat in midair instead of stood up... --Decimus 12:32, 10 April 2007 (BST)