Zippadeedoodah (Teleporter)

Written by: Headmaster

These are those "sit & go" type prim based teleporters that you might use to get from the ground to a skybox (or similar). It uses a function that uses almost no memory compared with and as opposed to another popular function performing a similar task.

Add the destination as a comma separated string of three numbers to the description of the prim the script is in (ideally the root).
    https://d1yjxggot69855.cloudfront.net/skins/monobook/bullet.gif); ">
  • E.g. 36,128,4000.5
The numbers represent the X,Y and Z coordinates of the destination on the region the scripted object is on.

When you sit on the object the operation happens automatically.

 

  • Thanks to Strife Onizuka for helping improve this function (and my knowledge).
  • Temp Rez Version ( V7 )

This version is a one way, self deleting type. E.g. An object containing this script could be rezzed by a sign when touched allowing visitors to use the rezzed teleporter to be taken directly to areas of a region/parcel. Since the sign could be just 1 prim providing multiple destinations and each rezzed teleporter is both temporary and phantom the savings on both prim count and server stress

 are obvious.

// V7 //
 
Zippadeedoodah(vector dest) // Feed in the destination vector.
{
    integer l_num = (!!llGetLinkNumber()); // Establish the link number of the root.
    list params = [6, dest]; // Create the parameters for llSetPrimParamsFast.
    // Loop while the distance between the root and dest is greater than 0.001 meter.
    while(llVecDist(llGetRootPosition(), dest) > 0.001)
    llSetLinkPrimitiveParamsFast(l_num, params); // Each iteration attempt to move to dest.
}
 
default
{
    on_rez(integer param)
    {
        llSetClickAction(CLICK_ACTION_SIT); // Makes the prim "Click to sit".
        llSetLinkPrimitiveParamsFast(-1, [PRIM_TEMP_ON_REZ, TRUE,  // Make the object temporary.
                                          PRIM_PHANTOM, TRUE]);    // And phantom.
        // Makes the object less intensive for the region. Also makes a smoother llUnSit.
    }
    changed(integer change)
    {
        if(change & CHANGED_LINK) // If an avatar sits on the object they become one of the links.
        {
            integer links = 0; // Create an integer type variable
            if(llGetObjectPrimCount(llGetKey()) < (links = llGetNumberOfPrims())) // Check if there are more links than prims.
            {
                llSetLinkPrimitiveParamsFast(-1, [PRIM_TEMP_ON_REZ, TRUE]); // Make the object temporary.
                Zippadeedoodah(((vector)("<" + llGetObjectDesc() + ">"))); // Call the function to transport us.
                llUnSit(llGetLinkKey(links)); // When we arrive, Un-Sit the key that is not a prim.
                llDie(); // Delete the object.
            }
        }
    }
}

 

Permanent Version ( V9 )

 

This version drops the user off at the destination then either waits for the set time or goes straight back home to be reused.

 

// V9 //
 
float time = 3600.0; // The time in seconds to wait before returning to home position.
                     // If set to zero, the return home for the object will be immediate.
 
/////////////////////////////////////////////////////////////////////////////////////////
 
Zippadeedoodah(vector dest) // Feed in the destination vector.
{
    integer l_num = (!!llGetLinkNumber()); // Establish the link number of the root.
    list params = [6, dest]; // Create the parameters for llSetPrimParamsFast.
    // Loop while the distance between the root and dest is greater than 0.001 meter.
    while(llVecDist(llGetRootPosition(), dest) > 0.001)
    llSetLinkPrimitiveParamsFast(l_num, params); // Each iteration attempt to move to dest.
}
 
vector home; // Used to store the home position.
 
default
{
    state_entry()
    {
        home = llGetRootPosition(); // Establish where our home pos is.
        // For this reason, Reset the script when the home position of the object is chosen.
        llSetClickAction(CLICK_ACTION_SIT); // Makes the prim "Click to sit".
        llSetStatus(STATUS_PHANTOM, TRUE); // Makes the object less intensive for the region.
    }                                      // Also makes a smoother llUnSit.
    changed(integer change)
    {
        if(change & CHANGED_LINK) // If an avatar sits on the object they become one of the links.
        {
            integer links = 0; // Create an integer type variable
            if(llGetObjectPrimCount(llGetKey()) < (links = llGetNumberOfPrims())) // Check if there are more links than prims.
            {
                vector Dest; // Create a vector type variable.
                if(llVecDist(llGetRootPosition(), (Dest = ((vector)("<" + llGetObjectDesc() + ">")))) > 0.0015)
                { // Check if the object is near destination. If not, go there.
                    Zippadeedoodah(Dest); // Call the function to transport us.
                    llUnSit(llGetLinkKey(links)); // When we arrive, Un-Sit the key that is not a prim.
                    if(((integer)time))
                    llSetTimerEvent(time); // Start a timer.
                    else
                    Zippadeedoodah(home); // Go back home.
                }
                else
                llUnSit(llGetLinkKey(links)); // Un-Sit the key that is not a prim.
            }
        }
    }
    timer()
    {
        llSetTimerEvent(0.0); // Cancel the timer.
        Zippadeedoodah(home); // Go back home.
    }
}

 

Category: