Difference between revisions of "Teleport HUD"

From Second Life Wiki
Jump to navigation Jump to search
(replaced example script with gridwide teleport HUD script using the new llTeleportAgent function)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header}}
== Gridwide Teleport HUD ==


*[[User:Jesse_Barnett|Click Here]]  To see my page and more of my scripts
# Link 9 prims.
# Drop this script.
# Add up to 8 landmarks.
# Attach to HUD and enjoy!


<lsl>
key owner;
integer gotTPperms;
integer isShowing;
toggle(integer inputInteger)
{
    if (inputInteger)
    {
        integer numOfPrims = llGetNumberOfPrims();
        rotation currentRot = llGetRot();


<lsl>
        vector white = <1.0, 1.0, 1.0>;
//Teleport HUD
        vector orange = <1.0, 0.4, 0.0>;
//Jesse Barnett
//1/16/08


//One of my first "real" scripts from waaaaaay back when.
        integer index;
//Hopefully users will do more than just use this script. Strided lists and
        while (index <= numOfPrims)
//manipulating lists are the closest we get to arrays in LSL presently.
        {
//Even with all of the list juggling here, you will be surprised just how many
            string linkName = llGetLinkName(index);
//destinations you can add.


//A lot of code but this is the only teleporter I have been using for over a year now.
            if (linkName == "TP HUD for landmarks")
//No notecards or lists to fill out. Very user freindly.
            {
//Wherever you are, just touch the button, hit ""Add" and it will prompt you for the name
                llSetLinkPrimitiveParamsFast(index,
//Type what you want to name it in open chat, hit enter and you are done
                    [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1.0,
//It will store the sim name, the name you gave it for the menu buttons and the location
                    PRIM_COLOR, 3, <0.0, 1.0, 0.0>, 1.0,
//automatically
                    PRIM_TEXT, "click green button to close\nor select TP destination", <0.0, 1.0, 0.0>, 1.0]);
//It will only show the destinations for the simulator you are in.
            }
//Pick the destination from the menu, touch the bubble that is rezzed in front of
            else if (linkName == "tp1")
//you and you will instantly teleport to that spot.
            {
//You can also easily remove destinations by picking ""Remove" in the menu and then
                llSetLinkPrimitiveParamsFast(index, [
//touching the button name you wish to remove.
                    PRIM_COLOR, ALL_SIDES, white, 1.0,
//In case you are worried about loosing your destinations, you can also use the
                    PRIM_POSITION, <0.0, 0.0, -0.0475>*currentRot,
//"List" button to output the list of all destinations from all sims.
                    PRIM_SIZE, <0.025, 0.025, 0.010>,
//I have never lost the destinations because of sim resets etc.
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 0), white, 1.0]);
//Have lost them twice tweaking the script. But adding destinations again is so easy
            }
//it is no problem.
            else if (linkName == "tp2")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, orange, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.0875>*currentRot,
                    PRIM_SIZE, <0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 1), orange, 1.0]);
            }
            else if (linkName == "tp3")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, white, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.1275>*currentRot,
                    PRIM_SIZE, <0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 2), white, 1.0]);
            }
            else if (linkName == "tp4")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, orange, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.1675>*currentRot,
                    PRIM_SIZE, <0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 3), orange, 1.0]);
            }
            else if (linkName == "tp5")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, white, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.2075>*currentRot,
                    PRIM_SIZE, <0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 4), white, 1.0]);
            }
            else if (linkName == "tp6")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, orange, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.2475>*currentRot,
                    PRIM_SIZE, <0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 5), orange, 1.0]);
            }
            else if (linkName == "tp7")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, white, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.2875>*currentRot,
                    PRIM_SIZE, <0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 6), white, 1.0]);
            }
            else if (linkName == "tp8")
            {
                llSetLinkPrimitiveParamsFast(index, [
                    PRIM_COLOR, ALL_SIDES, orange, 1.0,
                    PRIM_POSITION, <0.0, 0.0, -0.3275>*currentRot,
                    PRIM_SIZE,<0.025, 0.025, 0.01>,
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 7), orange, 1.0]);
            }


//To use, create a button and attach it to the desired position on your HUD.
            index++;
//Place this script inside, Put the warp pos script into another object you want
        }
//to rez as the bubble, edit it so that when you left click, you will sit.
    }
//Take the "bubble" back into inventory and then place it in the HUD also.
    else
    {
        rotation currentRot = llGetRot();
        integer numOfPrims = llGetNumberOfPrims();


        integer index;
        while (index <= numOfPrims)
        {
            string linkName = llGetLinkName(index);


string sim;
            if (linkName == "TP HUD for landmarks")
list sims;
            {
list dest;
                llSetLinkPrimitiveParamsFast(index,
list main_menu;
                    [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1.0,
list menu_options =["Add", "Remove", "Back", "List"];
                    PRIM_COLOR, 3, <1.0, 0.0, 0.0>, 1.0,
integer rez_chan;
                    PRIM_TEXT, "<~!~ TP HUD ~!~>", <1.0, 0.0, 0.0>, 1.0]);
integer rez_chan_handle;
            }
integer menu_chan;
            else if (linkName == "tp1" || linkName == "tp2"
integer menu_chan_handle;
                    || linkName == "tp3" || linkName == "tp4"
integer edit_chan = 0;// Could change this to another channel if you want for privacy
                    || linkName == "tp5" || linkName == "tp6"
//It is only used to enter the destination name when you use "Add"
                    || linkName == "tp7" || linkName == "tp8")
integer edit_chan_handle;
            {
integer edit_test = FALSE;
                llSetLinkPrimitiveParamsFast(index, [
vector target;
                    PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 0.0,
string tp_object = "bubble";
                    PRIM_POSITION, ZERO_VECTOR*currentRot,
                    PRIM_SIZE, <0.01, 0.01, 0.01>,
                    PRIM_TEXT, "", ZERO_VECTOR, 0.0]);
            }


default {
            index++;
touch_start(integer num_detected) {
        }
menu_chan = (integer) llFrand(-100000 - 99999999) - 100000;
    }
if (sim != llGetRegionName() || edit_test) {
//Don't recalculate if no change to region or an edit
sim = llGetRegionName();
edit_test = FALSE;
main_menu =[];
dest = llListSort(dest, 3, TRUE);//Sorts the list in Strides according to sim
sims = llListSort(sims, 1, TRUE);
integer dest_list_sim_loc = llListFindList(dest,[sim]);
//1st entry in list with the current sim
integer sim_list_sim_loc = llListFindList(sims,[sim]);
string next_sim_name = llList2String(sims, (sim_list_sim_loc + 1));
integer next_sim_loc = (integer) llListFindList(dest,[next_sim_name]) - 1;
//Calculates the last entry in the current sim
main_menu = llList2ListStrided(llDeleteSubList(dest, 0, 0), dest_list_sim_loc, next_sim_loc, 3);
//Now menu list is built only showing destinations that are in the current sim
main_menu = llListSort(main_menu, 1, TRUE);
main_menu = (main_menu =[]) + ["Options"] + main_menu;
}
menu_chan_handle = llListen(menu_chan, "", llGetOwner(), "");
llSetTimerEvent(20);
llDialog(llDetectedKey(0), "Choose destination or Options to add/remove destinations", main_menu, menu_chan);
}
listen(integer channel, string lm, key id, string message) {
if (llListFindList(main_menu + menu_options,[message]) != -1) {
if (message == "Options") {
llDialog(id, "Pick an option!", menu_options, menu_chan);
}
else if (message == "Back") {
llDialog(id, "Where do you want to go?", main_menu, menu_chan);
}
else if (message == "Add") {
integer b = TRUE;
integer m = TRUE;
b = ((llGetListLength(main_menu)) <= 11);
//Only allows 11 entries per simulator
m = (llGetFreeMemory() >= 1000);
//Make usre we have enough memory to manipulate the lists
if (!b || !m) {
llOwnerSay("You can not add any more destinations");
}
else {
llOwnerSay("What do you want to name this destination?");
llListenRemove(menu_chan_handle);
state add_dest;
}
}
else if (message == "Remove") {
llDialog(id, "Which desination do you want to remove?", main_menu, menu_chan);
state rem_dest;
}
else if (message == "List") {
integer i;
if (llGetListLength(dest) > 0) {
for (i = 0; i < llGetListLength(dest); i += 3) {
string sim_name = llList2String(dest, i);
string name = llList2String(dest, i + 1);
string location = llList2String(dest, i + 2);
llOwnerSay(sim_name + " , " + name + " = " + location);
}
}
else {
llOwnerSay("No Destinations Available.");
}
}
else if (llListFindList(dest,[message]) != -1) {
integer index = llListFindList(dest,[message]);
if (index != -1) {
vector pos = llGetPos();
if (pos.z <= 4095) {
target = (vector) llList2String(dest, index + 1);
rez_chan = (integer) llFrand(100000 - 1000000) - 100000;
llSay(0, "Touch the pumpkin to teleport");
llRezObject(tp_object, llGetPos() + (<1, 0, 1> * llGetRot()), ZERO_VECTOR,
ZERO_ROTATION, rez_chan);
}
else {
llOwnerSay("Too high to teleport. You must be lower than 4096 meters");
}
}
}
}
}
object_rez(key id)
{
llWhisper(rez_chan, (string) target);
}
timer() {
llSetTimerEvent(0);
llListenRemove(menu_chan_handle);
llListenRemove(rez_chan_handle);
return;
}
}
}


state add_dest {
default
state_entry() {
{
edit_test = TRUE;
    changed(integer change)
llSetTimerEvent(20);
    {
edit_chan_handle = llListen(edit_chan, "", llGetOwner(), "");
        if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
}
            llResetScript();
listen(integer chan, string name, key id, string msg) {
    }
integer e = llListFindList(sims,[sim]);
 
if (e == -1) {
    attach(key attached)
sims = (sims =[]) + sims +[sim];
    {
}
        if (attached != NULL_KEY)
vector pos = llGetPos();
            llResetScript();
dest = (dest =[]) + dest +[sim, msg, pos];
    }
llOwnerSay("Added : " + sim + " , " + msg + " = " + (string) pos);
 
llListenRemove(edit_chan_handle);
    state_entry()
state default;
    {
}
        llSetLinkPrimitiveParamsFast(LINK_ROOT,
timer() {
            [PRIM_NAME, "TP HUD for landmarks",
llSetTimerEvent(0);
            PRIM_LINK_TARGET, 2, PRIM_NAME, "tp1",
llListenRemove(edit_chan_handle);
            PRIM_LINK_TARGET, 3, PRIM_NAME, "tp2",
llOwnerSay("Timeout. Click TP HUD to start again");
            PRIM_LINK_TARGET, 4, PRIM_NAME, "tp3",
state default;
            PRIM_LINK_TARGET, 5, PRIM_NAME, "tp4",
}
            PRIM_LINK_TARGET, 6, PRIM_NAME, "tp5",
}
            PRIM_LINK_TARGET, 7, PRIM_NAME, "tp6",
            PRIM_LINK_TARGET, 8, PRIM_NAME, "tp7",
            PRIM_LINK_TARGET, 9, PRIM_NAME, "tp8",]);
 
        owner = llGetOwner();
        gotTPperms = FALSE;
 
        isShowing = FALSE;
        toggle(isShowing);
 
        llRequestPermissions(owner, (PERMISSION_TELEPORT | PERMISSION_TAKE_CONTROLS));
    }
 
    touch_start(integer num_detected)
    {
        key id = llDetectedKey(0);
        string linkName = llGetLinkName(llDetectedLinkNumber(0));
        string tpDestination;
 
        if (id != owner)
            return;


state rem_dest {
        if (gotTPperms && linkName == "TP HUD for landmarks")
state_entry() {
        {
edit_test = TRUE;
            isShowing = !isShowing;
llSetTimerEvent(20);
            toggle(isShowing);
menu_chan_handle = llListen(menu_chan, "", llGetOwner(), "");
        }
}
        else if (linkName == "tp1")
listen(integer chan, string name, key id, string msg) {
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 0);
integer d = llListFindList(dest,[msg]);
        else if (linkName == "tp2")
if (d != -1) {
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 1);
dest = llDeleteSubList(dest, d - 1, d + 1);
        else if (linkName == "tp3")
llOwnerSay("Removed : " + msg);
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 2);
integer f = llListFindList(dest,[sim]);
        else if (linkName == "tp4")
if (f == -1) {
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 3);
sims = llDeleteSubList(sims, f, f);
        else if (linkName == "tp5")
llListenRemove(menu_chan_handle);
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 4);
state default;
        else if (linkName == "tp6")
}
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 5);
llListenRemove(menu_chan_handle);
        else if (linkName == "tp7")
state default;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 6);
}
        else if (linkName == "tp8")
}
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 7);
timer() {
llSetTimerEvent(0);
llListenRemove(menu_chan_handle);
llOwnerSay("Timeout. Click TP HUD to start again");
state default;
}
}
</lsl>
{{message}}Editted warpPos script for syntax error  [[User:Jesse Barnett|Jesse Barnett]] 03:19, 6 March 2009 (UTC)
<lsl>


//////////////////////////////////////////////////////////////////////////////////////////////////////
        if (tpDestination == "")
// Multi-HUD WarpPos
            llOwnerSay("Invalid destination!");
// "Apr 23 2008", "14:36:26"
        else
// Creator: Jesse Barnett
            llTeleportAgent(owner, tpDestination, ZERO_VECTOR, ZERO_VECTOR);
// Released into the Public Domain
    }
//////////////////////////////////////////////////////////////////////////////////////////////////////


integer listenId; // Listener ID
    control(key id,integer held, integer change)
key gAvatarID;
    {
vector target; // The location the av will be teleported to.
        return;
    }


warpPos(vector target)
    run_time_permissions(integer perm)
{ //R&D by Keknehv Psaltery, 05/25/2006
    {
//with a little pokeing by Strife, and a bit more
        if (perm & PERMISSION_TAKE_CONTROLS)
//munging by Talarus Luan
            llTakeControls(CONTROL_UP,TRUE,TRUE);
//Final cleanup by Keknehv Psaltery
        if (perm & PERMISSION_TELEPORT)
//and of course Jesse Barnett got to jump in here
            gotTPperms = TRUE;
//and made it work up to 4096 meters
    }
//Fail safe removed
// Compute the number of jumps necessary
integer jumps = (integer) (llVecDist(target, llGetPos()) / 10.0) + 1;
if (jumps > 411)
jumps = 411;
list rules =[PRIM_POSITION, target]; //The start for the rules list
integer count = 1;
while ((count = count << 1) < jumps)
rules += rules;
llSetPrimitiveParams(rules + llList2List(rules, (count - jumps) << 1, count));
}
default {
state_entry() {
llSetObjectName("WarpPos");
}
listen(integer channel, string name, key id, string message) {
target = (vector) message;
llListenRemove(listenId);
llSetText("Touch to teleport", <1, 1, 1 >, 1);
llSitTarget(<0, 0, 0.5 >, ZERO_ROTATION);
}
on_rez(integer start_param) {
// When this object rezzes setup a listener to get the target
listenId = llListen(start_param, "", "", "");
}
changed(integer change) {
if (change & CHANGED_LINK) {
gAvatarID = llAvatarOnSitTarget();
if (gAvatarID != NULL_KEY) warpPos(target);
warpPos(target);
llSleep(0.5);
llDie();
}
}
}
}
</lsl>
</lsl>
{{LSLC|Library|Teleport HUD}}
{{LSLC|Library|Teleport HUD}}

Revision as of 13:39, 18 October 2012

Gridwide Teleport HUD

  1. Link 9 prims.
  2. Drop this script.
  3. Add up to 8 landmarks.
  4. Attach to HUD and enjoy!

<lsl> key owner; integer gotTPperms; integer isShowing;

toggle(integer inputInteger) {

   if (inputInteger)
   {
       integer numOfPrims = llGetNumberOfPrims();
       rotation currentRot = llGetRot();
       vector white = <1.0, 1.0, 1.0>;
       vector orange = <1.0, 0.4, 0.0>;
       integer index;
       while (index <= numOfPrims)
       {
           string linkName = llGetLinkName(index);
           if (linkName == "TP HUD for landmarks")
           {
               llSetLinkPrimitiveParamsFast(index,
                   [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1.0,
                   PRIM_COLOR, 3, <0.0, 1.0, 0.0>, 1.0,
                   PRIM_TEXT, "click green button to close\nor select TP destination", <0.0, 1.0, 0.0>, 1.0]);
           }
           else if (linkName == "tp1")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, white, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.0475>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.010>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 0), white, 1.0]);
           }
           else if (linkName == "tp2")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, orange, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.0875>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 1), orange, 1.0]);
           }
           else if (linkName == "tp3")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, white, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.1275>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 2), white, 1.0]);
           }
           else if (linkName == "tp4")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, orange, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.1675>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 3), orange, 1.0]);
           }
           else if (linkName == "tp5")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, white, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.2075>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 4), white, 1.0]);
           }
           else if (linkName == "tp6")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, orange, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.2475>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 5), orange, 1.0]);
           }
           else if (linkName == "tp7")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, white, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.2875>*currentRot,
                   PRIM_SIZE, <0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 6), white, 1.0]);
           }
           else if (linkName == "tp8")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, orange, 1.0,
                   PRIM_POSITION, <0.0, 0.0, -0.3275>*currentRot,
                   PRIM_SIZE,<0.025, 0.025, 0.01>,
                   PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 7), orange, 1.0]);
           }
           index++;
       }
   }
   else
   {
       rotation currentRot = llGetRot();
       integer numOfPrims = llGetNumberOfPrims();
       integer index;
       while (index <= numOfPrims)
       {
           string linkName = llGetLinkName(index);
           if (linkName == "TP HUD for landmarks")
           {
               llSetLinkPrimitiveParamsFast(index,
                   [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1.0,
                   PRIM_COLOR, 3, <1.0, 0.0, 0.0>, 1.0,
                   PRIM_TEXT, "<~!~ TP HUD ~!~>", <1.0, 0.0, 0.0>, 1.0]);
           }
           else if (linkName == "tp1" || linkName == "tp2"
                   || linkName == "tp3" || linkName == "tp4"
                   || linkName == "tp5" || linkName == "tp6"
                   || linkName == "tp7" || linkName == "tp8")
           {
               llSetLinkPrimitiveParamsFast(index, [
                   PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 0.0,
                   PRIM_POSITION, ZERO_VECTOR*currentRot,
                   PRIM_SIZE, <0.01, 0.01, 0.01>,
                   PRIM_TEXT, "", ZERO_VECTOR, 0.0]);
           }
           index++;
       }
   }

}

default {

   changed(integer change)
   {
       if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
           llResetScript();
   }
   attach(key attached)
   {
       if (attached != NULL_KEY)
           llResetScript();
   }
   state_entry()
   {
       llSetLinkPrimitiveParamsFast(LINK_ROOT,
           [PRIM_NAME, "TP HUD for landmarks",
           PRIM_LINK_TARGET, 2, PRIM_NAME, "tp1",
           PRIM_LINK_TARGET, 3, PRIM_NAME, "tp2",
           PRIM_LINK_TARGET, 4, PRIM_NAME, "tp3",
           PRIM_LINK_TARGET, 5, PRIM_NAME, "tp4",
           PRIM_LINK_TARGET, 6, PRIM_NAME, "tp5",
           PRIM_LINK_TARGET, 7, PRIM_NAME, "tp6",
           PRIM_LINK_TARGET, 8, PRIM_NAME, "tp7",
           PRIM_LINK_TARGET, 9, PRIM_NAME, "tp8",]);
       owner = llGetOwner();
       gotTPperms = FALSE;
       isShowing = FALSE;
       toggle(isShowing);
       llRequestPermissions(owner, (PERMISSION_TELEPORT | PERMISSION_TAKE_CONTROLS));
   }
   touch_start(integer num_detected)
   {
       key id = llDetectedKey(0);
       string linkName = llGetLinkName(llDetectedLinkNumber(0));
       string tpDestination;
       if (id != owner)
           return;
       if (gotTPperms && linkName == "TP HUD for landmarks")
       {
           isShowing = !isShowing;
           toggle(isShowing);
       }
       else if (linkName == "tp1")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 0);
       else if (linkName == "tp2")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 1);
       else if (linkName == "tp3")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 2);
       else if (linkName == "tp4")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 3);
       else if (linkName == "tp5")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 4);
       else if (linkName == "tp6")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 5);
       else if (linkName == "tp7")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 6);
       else if (linkName == "tp8")
           tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 7);
       if (tpDestination == "")
           llOwnerSay("Invalid destination!");
       else
           llTeleportAgent(owner, tpDestination, ZERO_VECTOR, ZERO_VECTOR);
   }
   control(key id,integer held, integer change)
   {
       return;
   }
   run_time_permissions(integer perm)
   {
       if (perm & PERMISSION_TAKE_CONTROLS)
           llTakeControls(CONTROL_UP,TRUE,TRUE);
       if (perm & PERMISSION_TELEPORT)
           gotTPperms = TRUE;
   }

} </lsl>