Self Sims Teleport

Expired

Great for combat sims when you mlandmarks wornt work you you need a quick way to tp to a new location.  This can be used in a HUD.  This was written by Mulligan Silversmith

How to use:

Simply click on hud

Main_menu ( first option when clicked on)
  • Save  ( Save position Option)
  • Go To ( Teleport Options)

Save Options

  • Save 1 ( This will save a first point)
  • Save 2 ( This will save a second point)

Go To

  • Go 1 ( This will teleport you to your first saved point)
  • Go 2 ( This will teleport you to your second saved point)

How it Works:

The way it teleports you is it pushes the objected and when its wear by someone it pushes that person.

It goes throughSmiley Tonguelayers/Buildings/Solid Ground

  • You can change how fast it goes but be warned it could crash you. It also doesn't have a limit on how high it goes.. I setup to 999999 Feet and it worked kinda slow but worked

Known Problems:

  • Setting the "Movement" speed too fast could crash you
  • I wouldn't use on a laggy sims
  • Only works on one sims

 

/*  
    Sims Self Teleport v1.0
*/
integer menuChannel = 5666;             // What Channel the script listens too.
integer FASTGO = TRUE;                  // Used to see if main in fast mode or not
vector position_01;                     // The saved position.
vector position_02;                     // The saved position.

list menu=;             // The main menu when first clicking on hud/object
list Save=;   // Save options
list Go_Too=;     // Teleport options    
list Fast_Go=;      // This enabled or disable the main_menu so you can Teleport faster     

Pos_01()
{//The First Position to save on.
    position_01 = llGetPos(); // Get your position there and then

    llOwnerSay("Saving Position 1: "+(string)position_01); // Resays your position
}

 

Pos_02()
{//The Second Position to save on.
   position_02 = llGetPos(); // Get your position there and then

    llOwnerSay("Saving Position 2: "+(string)position_02);// Resays your position 

}//You can add more by copy/paste. Or ask for help Smiley Happy

GO_POS01()
{//User function
    do //Do-while loop.
    {
        llPushObject((llGetOwner()),(position_01-llGetPos())*(llVecDist(llGetPos(),position_01)),ZERO_VECTOR,FALSE); //Pushes the avatar to the position.

        llMoveToTarget(position_01,0.05); //If your agent gets close to the avatar it will direct the path.
    }
    while(llVecDist(position_01,llGetPos()) > 40.0); //End of do-while loop
    llMoveToTarget(position_01,0.05); //Movement
    llSleep(0.5); //Prevents you from flying.
    llStopMoveToTarget(); //Stops the movement

} 
 

GO_POS02()
{//User function
    do //Do-while loop.
    {
        llPushObject((llGetOwner()),(position_02-llGetPos())*(llVecDist(llGetPos(),position_02)),ZERO_VECTOR,FALSE); //Pushes the avatar to the position.

        llMoveToTarget(position_02,0.05); //If your agent gets close to the avatar it will direct the path.
    }

    while(llVecDist(position_02,llGetPos()) > 40.0); //End of do-while loop

    llMoveToTarget(position_02,0.05); //Movement

    llSleep(0.5); //Prevents you from flying.

    llStopMoveToTarget(); //Stops the movement

}

default
{
    state_entry()
    {
        llListen(menuChannel,"",llGetOwner(),""); // To change number this listen too change it up top!
    }
    listen(integer channel,string name,key id,string message)
    {
    if(message == "back")
    {//Takes you back to main menu after going into a second option menu
        llDialog(id,"Main Menu",menu,menuChannel);
    }
    if(message == "Save")
    {
        llDialog(id,"Save Menu",Save,menuChannel); // Opens second Dialog box
    }
    if(message == "FastGo")
    {
        llDialog(id,"Fast Go",Fast_Go,menuChannel); // Opens the Fast Go Options
    }
    if(message == "enable")
    {
        llOwnerSay("Hot Key enabled. Note that save option disabled");
        FASTGO = FALSE;
    }
    if(message == "disable")
    {
        llOwnerSay("Hot Key disabled. Note that save option enabled");

        FASTGO = TRUE;
    }
    if(message == "Go To")
    {
       llDialog(id,"Go Too Menu",Go_Too,menuChannel); // Opens second Dialog box
    }
    if(message == "Save 1")
    {
        Pos_01();//Sends info to function up top
    }
    if(message == "Save 2")
    {
        Pos_02();//Sends info to function up top
    }
    if(message == "Go 1")
    {
        llOwnerSay("Slapping to this point: "+(string)position_01+".");// Says when begin teleported and where

        GO_POS01();//Sends info to function up top
    }
    if(message == "Go 2")
    {
        llOwnerSay("Slapping to this point: "+(string)position_02+".");// Says when begin teleported and where

        GO_POS02();//Sends info to function up top
    }
}
    touch_start(integer total_number)
    {
        if(FASTGO)
        {
            llDialog(llDetectedKey(0),"Main Menu",menu,menuChannel); //When touched ui box will pop up
        }
        else
        {
            llDialog(llDetectedKey(0),"Main Menu",Go_Too,menuChannel); //This loads up if the Fast Option is enabled

        }
    }
}
/*

    Sims Self Teleport v1.1
    With dialog menu
    Created by: Mulligan Silversmith
    Finished on: Jan 2011
    All Rights Reserved
    

    This script is free software: you can redistribute it and/or modift it under the terms that you share         this script with other people.

    -You are allowed to use this script in your products however the script may not be sold stand alone under     any circumstance.

    -If you give this script to other people please give the original script with this license.

 

 

*/

 

 

Pay to Teleport

Expired

    
//Pay 2 Teleport by Haplo Voss
//Greetings! Thanks be to all that helped me along the way with answers to questions!
//Without further ado... here it is!!

//Please pay attention to notes following script!!

//-------------------------


vector gTargetPos;
integer cost;
string desc;
string hovertext;
key agent;
key gAvatarID=NULL_KEY;
integer gReturnToStartPos=TRUE;
vector gStartPos;
integer paid = 1;
integer access=0;
integer public_access;
integer origin_access;
float elapsed;
key gID;

warpPos( vector destpos)
{ //R&D by Keknehv Psaltery, 05/25/2006
//Additions by Strife, Talarus Luan
//and final cleanup by Keknehv Psaltery
integer jumps = (integer)(llVecDist(destpos, llGetPos()) / 10.0) + 1;
if (jumps > 100 )
jumps = 100;
list rules = [ PRIM_POSITION, destpos ];
integer count = 1;
while ( ( count = count << 1 ) < jumps)
rules = (rules=[]) + rules + rules;
llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) << 1, count) );
}

default
{

dataserver(key query_id, string desc){
list desc_list = llParseString2List(desc, [";"], []);
gTargetPos = (vector)llList2String(desc_list, 0);
cost = (integer)llList2String(desc_list, 1);
hovertext = llList2String(desc_list, 2) + "\n" +
llList2String(desc_list, 3) + "\n" +
llList2String(desc_list, 4) + "\n" +
llList2String(desc_list, 5) + "\n" +
llList2String(desc_list, 6);
public_access = (integer)llList2String(desc_list, 7);
origin_access = public_access;
}

money (key id, integer amount){
paid=amount;

if (paid < cost && public_access == 0){
llSay(0,"Sorry, but this class costs " + (string)cost + ". Full amount is required before access.");
llGiveMoney(id,paid);
llUnSit(llAvatarOnSitTarget());
}
else if (paid > cost && public_access == 0){
integer refund = paid - cost;
llSay(0,"This class only costs " + (string)cost + "! Refunding you L$" + (string)refund );
llSay(0,"Access Granted!");
llSetSitText("Teleport");
llGiveMoney(id,refund);
gID = id;
public_access = 1;
}
else if (paid != 0 && origin_access == 1){
integer refund = paid;
llSay(0,"This teleporter is public access!");
llSay(0,"Access Granted!");
llSetSitText("Teleport");
llGiveMoney(id,refund);
public_access = 1;
}
else{
llSay(0,"Access Granted!");
llSetSitText("Teleport");
gID = id;
public_access = 1;

}

}

on_rez(integer rez){
llResetScript();
}

state_entry(){
llRequestPermissions(llGetOwner(),PERMISSION_DEBIT );
desc = llGetNotecardLine("TPInfo",0);
llSitTarget(<0,0,1>,ZERO_ROTATION);
gStartPos = llGetPos();
}

touch_start(integer touched){
llSetSitText("\n");
llSetText(hovertext, <0,1,0>, 1);
if (public_access == 1){llSetSitText("Teleport");}
elapsed = llGetAndResetTime();
}
touch(integer num_detected) {
if (llDetectedKey(0) == llGetOwner()){
elapsed = llGetTime();
if (elapsed > 2.0) {
llOwnerSay("Description has changed - resetting script");
llSetTimerEvent(120);
llResetScript();
}

}}
touch_end(integer num_detected)
{}

timer()
{
llSetTimerEvent(0.0);
}


changed(integer change){
if(change & CHANGED_LINK)
gAvatarID = llAvatarOnSitTarget();
if(public_access == 0){llSetSitText("\n");llUnSit(gAvatarID);}
if(gAvatarID != NULL_KEY & public_access == 1 & gID == gAvatarID) {
warpPos(gTargetPos);
llSleep(.25);
llUnSit(gAvatarID);
llSleep(.25);

if (gReturnToStartPos) {
warpPos(gStartPos);
}
if(origin_access == 0){llSetSitText("\n");public_access = 0;}
if(origin_access == 1){llSetSitText("Teleport");}
}
}
}




//------------------------------

//As you can see in the script, you will need to create a notecard called "TPInfo" (no quotes). It must contain the following information, IN THE FOLLOING ORDER.

//;price to charge;text line1;line2;line3;line4;line5;public access switch

//EXAMPLE:

//<1 ,2,3>;100;WELCOME!;Right Click And;Pay L$100 to;Teleport to Island!; ; ;0

//vector = <1 ,2,3>
//price = 100
//text =
//WELCOME!
//Right Click And
//Pay L$100 to
//Teleport to Island!

 

Updated Sim to Sim Pseudo Teleporter

Expired

An update to: Sheena Desade's Sim-to-Sim Teleporter Script and Notecard (was v3.1). Includes dynamic smart menu and instant teleportation (no confirmation required) via chat link. Missing sanity checks, so format things correctly! Public domain (open-source) since April 10, 2012.
Modified by: Donjr Spiegelblatt  (May 17, 2012)
add support for:
   multi-users of the menu system at the same time
   Cancel button when only one menu is used
   support for comment lines in Data starting with # character
new features:
   PrettyButton  layout of the buttons in dialogs
   combined placeNames, simNames and locationVectors  into a two strided list called places

// Script Name: Sim-to-Sim_Pseudo-Teleporter_v41.lsl
// Author: donjr Spiegelblatt
// An update to: Sheena Desade's Sim-to-Sim Teleporter Script and Notecard (was v3.1). Includes dynamic smart menu and instant teleportation (no confirmation required) via chat link. Missing sanity checks, so format things correctly! Public domain (open-source) since April 10, 2012.
//
//This is an update of the original script from http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1646

// Downloaded from : http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1651

// This program is free software; you can redistribute it and/or modify it.
// Additional Licenes may apply that prevent you from selling this code
// You must leave any author credits and any headers intact in any script you use or publish.
///////////////////////////////////////////////////////////////////////////////////////////////////
// If you don't like these restrictions and licenses, then don't use these scripts.
//////////////////////// ORIGINAL AUTHORS CODE BEGINS ////////////////////////////////////////////


// modified by: Donjr Spiegelblatt  (May 17, 2012)
//add support for:
//   multi-users of the menu system at the same time
//   Cancel button when only one menu is used
//   suppot for comment lines in Data starting with # character
//new features:
//   PrettyButton  layout of the buttons in dialogs
//   combined placeNames, simNames and locationVectors  into a two strided list called places

// Modified to use SLURs by Ferd Frederix 6-7-2013
// modified by: Donjr Spiegelblatt  (May 17, 2012)
//add support for:
//   multi-users of the menu system at the same time
//   Cancel button when only one menu is used
//   suppot for comment lines in Data starting with # character
//new features:
//   PrettyButton  layout of the buttons in dialogs
//   combined placeNames, simNames and locationVectors  into a two strided list called places
// Script Name: Sim-to-Sim_Pseudo-Teleporter_v31.lsl
// Sheena Desade's Sim-to-Sim Teleporter Script and Notecard (v3.1).
// Includes dynamic smart menu and instant teleportation (no confirmation required) via chat link.
// Missing sanity checks, so format things correctly!
// Public domain (open-source) since April 10, 2012.

/* 
This script was made April 10, 2012 by Sheena Desade. It is meant only to be redistributed freely
(not ever to be sold)! Leave this header intact; other than those two requirements, do what you
will with it. And if you make an improvement, feel free to send me a copy. :-)
*/ 

/* *********************************
modified by: Donjr Spiegelblatt  (May 17, 2012)
add support for:
   multi-users of the menu system at the same time
   Cancel button when only one menu is used
   suppot for comment lines in Data starting with # character
new features:
   PrettyButton  layout of the buttons in dialogs
   combined placeNames, simNames and locationVectors  into a two strided list called places
********************************** */

// Modded by Ferd Frederix on 5-30-2013 to run in OpenSim


// ******** OPTIONAL SETTINGS **********
string hoverText    = "Sim-to-Sim Pseudo Teleporter - click for destinations.";
integer menuWait    = 30;       // How long to wait for the user to pick a menu choice
integer menuChannel = -14469;   // what channel for the object to 'listen' on.
                                // You can change this channel as needed,
                                // it's not calling out to an object outside of itself.
string menuText = "Please select your destination:";
string itemDataNotecard = "Data";
                                // The name of the notecard to read from
// ******** END OF OPTIONAL SETTINGS **********

// ******** SYSTEM SETTINGS - DO NOT MODIFY **********
// General variables
list menu_users = [];           // strided list of menu users
// [
// integer MENU_user    = 0;       // key of this menu user, unique one entry per user
integer MENU_handle  = 1;       // listen handle of this users llListen
integer MENU_timeout = 2;       // creation time of this dialog
integer MENU_curList = 3;       // the current page for this user
// ];
integer MENU_stride  = 4;       // Length of one strided of this list

// The following are required to read the notecard properly
integer notecardLine   = 0;
key currentDataRequest = NULL_KEY;
key notecarduuid       = NULL_KEY;

integer length;             // How many menu pages we have
list places;                // strided list of Placename and Sim/position

string BLANK  = " ";        // used for filler space(s) in dialogs

string Prev   = "<< Prev ";
string Cancel = "Cancel ";
string Next   = "Next >> ";
list Navigate ;     // the full navagation functions
// ******** END OF SYSTEM SETTINGS and Globals **********

list PrettyButtons(list options, list utilitybuttons)   // from SchmoDialog
{
    // returns a list formatted to that "options" will start in the top left of a dialog,
    // and "utilitybuttons" will start in the bottom right
    list spacers;
    list combined = options + utilitybuttons;
    while (llGetListLength(combined) % 3 != 0 && llGetListLength(combined) <12)
    {
        spacers += [BLANK];
        combined = options + spacers + utilitybuttons;
    }

    return llList2List(combined, 9, 11)
         + llList2List(combined, 6,  8)
         + llList2List(combined, 3,  5)
         + llList2List(combined, 0,  2);
}

advancedMenu(key user, integer curList)
{
    integer StartTimer = (menu_users == []);       // check if the timer needs starting
    integer p = llListFindList(menu_users,[user]);
    if(~p)      // update the returning user's "creation time and curList"
        menu_users = llListReplaceList( menu_users, [llGetUnixTime(), curList], p + MENU_timeout, p+MENU_curList);
    else if(llGetListLength(menu_users) > 63)    // make sure a listen is aviable
    {
        llInstantMessage(user, "Please try again later the system is currently full!");
        return;
    }
    else        // first time menu user open there listen and create there entry
        menu_users += [user, llListen(menuChannel,"",user,""),llGetUnixTime(), curList];

    list buttons = llList2ListStrided(places,0,-1,2);   // make a list of only Places
    list utility = [Cancel];          // user should always have a Cancel option
    if (length > 1)
    {
        // We have more than one page of places.
        p = 9 * curList; // Figures out the start of the subsection of places to display
        buttons = llList2List(buttons, p, p+8);     // 'buttons' now has one to nine places
        utility = Navigate;         // give full navigation buttons
    }
    buttons = PrettyButtons(buttons, utility);
    // the 'buttons' list also now has other options besides our Places
    // and the 'utility' button(s) are always on the bottom row.

    llDialog(user,menuText,buttons,menuChannel);  // Sends a dialog to the user with the new improved button list
    if(StartTimer)
        llSetTimerEvent(5.0); // how often to check for possible timeouts, low number here would just waste processor time
}

remove(integer index, string message)
{
    // Close this users Listen
    llListenRemove(llList2Integer(menu_users, index+MENU_handle));
    // Instant message the message to the user
    llInstantMessage(llList2Key(menu_users, index), message);
    // delete there menu_users entry
    menu_users = llDeleteSubList(menu_users, index, index+MENU_stride-1);
    if(menu_users == [])        // if there are no current users
        llSetTimerEvent(0.0);       // stop the timer
}

default
{
    on_rez(integer param)
    {
        llResetScript(); // Resets script on rez
    }
   
    state_entry()
    {
        Navigate = [ Prev, Cancel, Next ];     // the full navagation functions
        llOwnerSay("Initializing...");
        llOwnerSay("Reading item data...");
        // we start reading the notecard at line 0, the first line specify our initial request
        if(llGetInventoryType(itemDataNotecard) == INVENTORY_NOTECARD)
        {
            notecardLine=0;
            currentDataRequest = llGetNotecardLine(itemDataNotecard,notecardLine);
        }
        else
        {
            state configured;            // Handle the condition of no Data notecard
        }
    }
   
    dataserver(key query, string data)
    {
        if (query == currentDataRequest) // if we are trying to read the notecard
        {
            llOwnerSay(data);
            
            currentDataRequest = NULL_KEY; // Prevent a bug that occurs with dataserver events.
            if (data == EOF) // If it the end of the file
            {
                     // Define how many pages of entries we have in the places list
                length = llGetListLength(places) / 2;
                if(length <12)
                    length = 1;
                else
                    length = length / 9 + 1;
                llOwnerSay ("Done reading data.");
                state configured;
            }
            else
            {
                // **** IMPORTANT: I did not put any sanity checks in here, so you'll need to type
                // it all correctly, in the format "Store Name | Sim Name @ x/y/z" or it will not
                // work correctly! ****
                data = llStringTrim(data, STRING_TRIM);    // remove pesky leading and trailing whitespace
                if(llGetSubString(data,0,0) != "#" && data != "")         // lines starting with # are comments
                {
                         // We're looking for the | and @ symbol in our data line
                    list psv = llParseString2List(data,["|","@"],[]);
                    if(llGetListLength(psv) == 3) // If we found them
                    {
                            // note: Appending the BLANK make Ignore not a key word
                        string place = llStringTrim(llList2String(psv,0), STRING_TRIM)+BLANK;
                            // make sure it NOT a BLANK or one of the navigation entries
                        if(llListFindList(Navigate+[BLANK], [place]) == -1)   // these we don't want
                        {
                            string sim = llDumpList2String(llParseString2List(llStringTrim(llList2String(psv,1), STRING_TRIM), [" "], [""]), "%20");
                            // into sim erasing all internal spaces and replacing them with %20... there might be a better way to do this

                                // Generate a new temp record entry
                            list tmp = [place, sim+"/"+llStringTrim(llList2String(psv,2), STRING_TRIM)];

                            //  update entry matching on 'place' or append new entry to end of list
                            integer x = llListFindList(llList2ListStrided(places+tmp,0,-1,2),[place])*2;
                            places = llListReplaceList(places, tmp, x, x+1);

                            // We put it here so that it will not add the location unless there are also sim and placeNames.
                            // (donjr) No you put it here as you don't have all the info until this point
                        }
                    }
                    else
                    {
                        integer s = llSubStringIndex(data, "="); // Now we are looking for the = symbol
                        if(~s) // if we find it
                        {
                            string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));
                            // use our tokens to determine which variable we are defining
                            data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);
                            // use our data to define our chosen variable
                            if (token == "hover_text")
                                hoverText = data;
                            else if (token == "menu_text")
                                menuText = data;
                            else if (token == "menu_channel")
                                menuChannel = (integer)data;
                            else if (token == "selection_wait_time")
                                menuWait = (integer)data;
                        }
                    }
                }
                // Get the next line
                currentDataRequest = llGetNotecardLine(itemDataNotecard, ++notecardLine);
            }
        }
    }
    

}

state configured
{
    on_rez(integer param)
    {
        llResetScript(); // Resets script on rez
    }




    state_entry()
    {
            // collects our notecarduuid as soon as we enter this state
        notecarduuid = llGetInventoryKey(itemDataNotecard);
        if (hoverText != "none")
            llSetText(hoverText, <1.0,1.0,1.0>, 1); // if you want hovertext
        else
            llSetText("", <1 .0, 1.0, 1.0>, 0); // if you do not want hovertext
        llWhisper(0, "Ready and waiting.");
    }
   
    changed(integer change)        
    {
        // We want to reload the Data notecard if it changed
        if (change & CHANGED_INVENTORY)
        {
            if(notecarduuid != llGetInventoryKey(itemDataNotecard)) // If the change was triggered by saving the NC
            {
                llOwnerSay("Notecard change detected, resetting script.");
                llResetScript(); // resets the script
            }
        }
    }

    timer()
    {
        integer dietime = llGetUnixTime() - menuWait;
        // moving backward through the list/array
        // allows us to delete records without messing up the index.
        integer index = llGetListLength(menu_users);
        while(index)
        {
            index -= MENU_stride;
            if(llList2Integer(menu_users, index+MENU_timeout) 

 

Sim to Sim Pseudo Teleporter

Expired

Sheena Desade's Sim-to-Sim Teleporter Script and Notecard (v3.1). Includes dynamic smart menu and instant teleportation (no confirmation required) via chat link. Missing sanity checks, so format things correctly! Public domain (open-source) since April 10, 2012.

See http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1651 for an updated version by Donjr Spiegelblatt

This is Sheena Desade's Sim-to-Sim Teleporter Script (v3.1). 

Features/Pros: 
Smart Menu - seamlessly cycles, rearranges buttons in a logical order.
Dynamic List Parsing - never worry about breaking the script by adding or removing a location.
Instant Teleportation (no confirmation required!) via chat link (visit http://wiki.secondlife.com/wiki/Viewer_URI_Name_Space for more nifty links you can add to your own products).
Add as many locations as the script's memory can hold!

Missing/Cons:
Sanity checks! Format things correctly, or it will break.
Private chat - this says everything on channel zero for everyone to hear (does not use llRegionSayTo).
Annoying notecard configuration.
The sim/place names/location vectors lists could have been combined into one to save a little more memory.

---------
'Data' notecard: 

Hover_Text = Multi-Region Pseudo Teleporter: Click for Destinations
Menu_Text = Please select your destination:
Menu_Channel = 4765
Selection_Wait_Time = 30.0
Niamhinations! | Windlesham @ 207/580/133
---------

(template for the locations: Company Name | Region Name @ location x/location y/location z)

// Script Name: Sim-to-Sim_Pseudo-Teleporter_v31.lsl
// Author: Sheena Desade
// Sheena Desade's Sim-to-Sim Teleporter Script and Notecard (v3.1). Includes dynamic smart menu and instant teleportation (no confirmation required) via chat link. Missing sanity checks, so format things correctly! Public domain (open-source) since April 10, 2012.
//
//See http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1651 for an updated version by Donjr Spiegelblatt

// Downloaded from : http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1646

// This program is free software; you can redistribute it and/or modify it.
// Additional Licenes may apply that prevent you from selling this code
// You must leave any author credits and any headers intact in any script you use or publish.
///////////////////////////////////////////////////////////////////////////////////////////////////
// If you don't like these restrictions and licenses, then don't use these scripts.
//////////////////////// ORIGINAL AUTHORS CODE BEGINS ////////////////////////////////////////////


// This is Sheena Desade's Sim-to-Sim Teleporter Script (v3.1). 
//
//Features/Pros: 
//Smart Menu - seamlessly cycles, rearranges buttons in a logical order.
//Dynamic List Parsing - never worry about breaking the script by adding or removing a location.
//Instant Teleportation (no confirmation required!) via chat link (visit http://wiki.secondlife.com/wiki/Viewer_URI_Name_Space for more nifty links you can add to your own products).
//Add as many locations as the script's memory can hold!
//
//Missing/Cons:
//Sanity checks! Format things correctly, or it will break.
//Private chat - this says everything on channel zero for everyone to hear (does not use llRegionSayTo).
//Annoying notecard configuration.
//The sim/place names/location vectors lists could have been combined into one to save a little more memory.
//
//---------
//'Data' notecard: 
//
//Hover_Text = Multi-Region Pseudo Teleporter: Click for Destinations
//Menu_Text = Please select your destination:
//Menu_Channel = 4765
//Selection_Wait_Time = 30.0
//Niamhinations! | Windlesham @ 207/580/133
//---------
//
//(template for the locations: Company Name | Region Name @ location x/location y/location z)
/* 
This script was made April 10, 2012 by Sheena Desade. It is meant only to be redistributed freely (not ever to be sold)! Leave this header intact; other than those two requirements, do what you will with it. And if you make an improvement, feel free to send me a copy. :-)
*/

// ******** OPTIONAL SETTINGS **********
string hoverText = "Sim-to-Sim Pseudo Teleporter - click for destinations.";
float menuWait = 30.0;          // How long to wait for the user to pick a menu choice
integer menuChannel = 0;        // what channel for the object to 'listen' on. You can change this channel as needed, 
                                // it's not calling out to an object outside of itself. 
string menuText = "Please select your destination:";
string itemDataNotecard = "Data";
                                // The name of the notecard to read from
// ******** END OF OPTIONAL SETTINGS **********

// ******** SYSTEM SETTINGS - DO NOT MODIFY **********

// General variables
integer menu_handler;        // what the function that brings up the menu is called
integer loc = -1;            // -1 = none chosen; 0 = first location, etc.
integer length;              // How long the placeNames list is, which we base everything else off of
integer curList = 1;         // The current list number we're on
key curUser = NULL_KEY;      // The current user's key

// The following are required to read the notecard properly
integer notecardLine;
key currentDataRequest;
key notecarduuid;  

// These are the lists that hold all of our information
list simNames;               // The sim names of the places to teleport to
list placeNames;             // The region names of the places to teleport to
list locationVectors;        // The position to teleport to
// ******** END OF SYSTEM SETTINGS **********

init() // Setup the dataserver event for future use
{
    llOwnerSay("Reading item data...");
    notecardLine = 0; // we start reading the notecard at line 0, the first line
    currentDataRequest = llGetNotecardLine(itemDataNotecard, notecardLine); // specify our initial request
}

advancedMenu(key user, string text, integer channel)
{
    menu_handler = llListen(menuChannel,"","",""); // Lets the object 'hear' the option you choose
    if (length <= 12) llDialog(user,text,placeNames,channel); // Brings up a simple dialog if you have 12 or less options.
    
    else // If we have more than 12 options, create a multi-page dialog
    {
        list buttons; // Makes a list called 'buttons' that we will use later
        
        if (curList >= 1) // If we are not on page 0 (shouldn't be possible)
        {
            integer temp = (9*curList)-1; // Figures out which locations to display as buttons
            buttons = llList2List(placeNames, temp-8, temp); // the 'buttons' list now has nine locations
            // (List2List starts at 0, so we count 0 as 1)
            buttons = llListInsertList(buttons, ["<< Prev", "Cancel", "Next >>"], temp+1); 
            // the 'buttons' list also now has three other options besides our nine locations
            // (ListInsertList does NOT start at 0. It starts at 1.)
        }
        
        buttons = 
          llList2List(buttons, -3, -1)
        + llList2List(buttons, -6, -4)
        + llList2List(buttons, -9, -7)
        + llList2List(buttons, -12, -10);  // Puts our buttons in the logical order, instead of the default reversed one
        
        llDialog(user,text,buttons,channel);  // Sends a dialog to the user with the new improved button list
    
    }
}

default
{
    on_rez(integer param)
    {
        llResetScript(); // Resets script on rez
    }
    
    state_entry()
    {
        llOwnerSay("Initializing...");
        notecarduuid = llGetInventoryKey(itemDataNotecard); // collects our notecarduuid as soon as we enter this state
        init(); // runs our init function to use with our dataserver function
    }
    
    dataserver(key query, string data) 
    {
        if (query == currentDataRequest) // if we are trying to read the notecard
        {
            currentDataRequest = ""; // Prevent a bug that occurs with dataserver events.
            if (data != EOF) // If it isn't the end of the file
                        
            // **** IMPORTANT: I did not put any sanity checks in here, so you'll need to type
            // it all correctly, in the format "Store Name | Sim Name @ x/y/z" or it will not
            // work correctly! ****
            
            {
                integer s = llSubStringIndex(data, "@"); // We're looking for the @ symbol in our NC line
                if(~s) // If we find it
                {
                    string data1 = llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM);
                    // this line cuts out and saves everything before the @ symbol to use for the next index
                    string data4 = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);
                    // this line erases the @ symbol and temporarily saves the location into a seperate string
                    
                    integer s = llSubStringIndex(data1, "|"); // Now we're looking for the pipe symbol in only the 
                    // 'data1' variable defined when we were parsing for the @ symbol
                    if(~s) // If we find it (which we should, but we will check later to make sure our lists are
                    // the same length, anyway)
                    {
                        string data2 = llDumpList2String(llParseString2List(llStringTrim(llDeleteSubString(data1, 0, s), STRING_TRIM), [" "], [""]), "%20");
                        // Saves the first part in a temp string, erasing all spaces and replacing them with %20... there might be a better way to do this
                        string data3 = llStringTrim(llDeleteSubString(data1, s, -1), STRING_TRIM);
                        // Saves the second part in a temp string
                        
                        simNames += [data2];
                        // copies the temporary string data2 into our simNames list. Could probably combine the two 
                        // commands as with locationVectors.
                        placeNames += [data3];
                        // copies the temporary string data3 into our placeNames list. Could probably combine the 
                        // two commands, as with locationVectors and simNames.
                        locationVectors += [data4];
                        // this line copies the temporary string into our locationVectors list. We put it here so that it
                        // will not add the locationVector unless there are also sim and placeNames.
                    }
                }
                
                else
                {
                    integer s = llSubStringIndex(data, "="); // Now we are looking for the = symbol
                    if(~s) // if we find it
                    {
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));
                        // use our tokens to determine which variable we are defining
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);
                        // use our data to define our chosen variable
                        
                        if (token == "hover_text")
                            hoverText = data;
                        else if (token == "menu_text")
                            menuText = data;
                        else if (token == "menu_channel")
                            menuChannel = (integer)data;
                        else if (token == "selection_wait_time")
                            menuWait = (float)data;
                    }
                }
                
                notecardLine++;
                // Get the next line
                currentDataRequest = llGetNotecardLine(itemDataNotecard, notecardLine);
            }
            
            else // If it is the End of File
            {                
                length = llGetListLength(placeNames); // Defines how many entries we have in the placeNames list
                llOwnerSay ("Done reading data.");
                state configured;
            }
        }
    }
}

state configured
{
    state_entry()
    {
       if (hoverText != "none") llSetText(hoverText, <1 .0,1.0,1.0>, 1); // if you want hovertext
       if (hoverText == "none") llSetText("---", <1 .0, 1.0, 1.0>, 0); // if you do not want hovertext
       llWhisper(0, "Ready and waiting.");
       loc = -1; // Resets the location to none
    }
    
    changed(integer change)         
    {
        // We want to reload channel notecard if it changed
        if (change & CHANGED_INVENTORY)
        {
            if(notecarduuid != llGetInventoryKey(itemDataNotecard)) // If the change was triggered by saving the NC
            {
                llOwnerSay("Notecard change detected, resetting script.");
                llResetScript(); // resets the script
            }
        }
    }

    timer()
    {
        llListenRemove(menu_handler); // remove the listen event
        llInstantMessage(curUser, "Menu session timed out; choices automatically reset.");
        llSetTimerEvent(0.0); // removes the timer event, as it's not needed at the moment
        curList = 1; // reset our page to page one
        loc = -1; // set our location to none
        curUser = NULL_KEY; // resets the user to none
    }
    
    touch_start(integer total_number)
    {
        if(curUser == NULL_KEY || curUser == llDetectedKey(0)) // if there is no user or the toucher is the 
        // current user
            {
                curUser = llDetectedKey(0); // records the key of the curent user
                advancedMenu(curUser, menuText, menuChannel); // Sends the user our dialog box
                llSetTimerEvent(menuWait); // Sets our timer event so the menu will time out
            }
        
        if(curUser != NULL_KEY && curUser != llDetectedKey(0)) // If the toucher is not the current user
            llInstantMessage(llDetectedKey(0), "Sorry, this terminal is in use. Please wait your turn.");
    }
    
    listen(integer channel,string name,key id,string message) 
    //this is for the script to follow instructions based on what happens with the menu.
    {        
        if(message == "<< Prev")
        {            
            if(curList <= 1) // If we're on the first page
            { 
                curList = llCeil((float)length/9); // the current page needs to be changed to the last page, since
                // we're cycling backwards. We do this by rounding up (to cover any remainders) the length variable
                // (how many options we have total) divided by nine (since that's the number of buttons we need). 4.000 
                // will always round up to 4 (I think?).
                advancedMenu(curUser, menuText, menuChannel); // Give them our menu dialog
                llSetTimerEvent(menuWait); // how long until the menu times out?
            }
            
            else // If we're not on page one
            {
                curList--; // Go backwards a page
                advancedMenu(curUser, menuText, menuChannel); // Give them our menu dialog
                llSetTimerEvent(menuWait); // how long until the menu times out?
            }
        }
        
        else if(message == "Next >>")
        {
            if(curList*9 >= length) // if we have cycled through all options in our list
            {
                curList = 1; // go to page one
                advancedMenu(curUser, menuText, menuChannel); // Give the user our dialog menu
                llSetTimerEvent(menuWait); // how long until the menu times out?
            }
            
            else
            { 
                curList++; // go to the next page
                advancedMenu(curUser, menuText, menuChannel);  // Give the user our dialog menu
                llSetTimerEvent(menuWait); // how long until the menu times out?
            }
        }
        
        else if(message == "Cancel")
        {
            llInstantMessage(curUser, "Teleport cancelled.");
            curUser = NULL_KEY; // Erase the current user
            curList = 1; // Put our page back on the first page
            llListenRemove(menu_handler); // remove our listen event
            llSetTimerEvent(0.0); //removes the timer event, as it's not needed at the moment
        }
        
        else
        {
            
            loc = llListFindList(placeNames, (list)message); // determine which location we are teleporting to
            
            if(loc >= 0) // if it's an actual location
            {
                if (hoverText != "none") llSetText("Click the link to teleport", <1 .0,1.0,1.0>, 1); 
                // if you want hovertext
                llInstantMessage(curUser, "Click this link to teleport to your target location - " + "secondlife:///app/teleport/" + llList2String(simNames, loc) + "/" + llList2String(locationVectors, loc)); // Give them the link to click
                llSetTimerEvent(0.0); // removes the timer event, as it's not needed at the moment
                llSleep(2.5);
                curUser = NULL_KEY; // resets our user so others can use the teleporter
                loc = -1; // reset our location to none
                curList = 1; // reset our page to one
                if (hoverText != "none") llSetText(hoverText, <1 .0,1.0,1.0>, 1); 
            }
        }
    }
}