Teleport HUD

From Second Life Wiki
Revision as of 09:35, 25 June 2008 by Digitall Kidd (talk | contribs) (mispelling: lower then -> lower than.)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

<lsl> //Teleport HUD //Jesse Barnett //1/16/08

//One of my first "real" scripts from waaaaaay back when. //Hopefully users will do more than just use this script. Strided lists and //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 //destinations you can add.

//A lot of code but this is the only teleporter I have been using for over a year now. //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 //Type what you want to name it in open chat, hit enter and you are done //It will store the sim name, the name you gave it for the menu buttons and the location //automatically //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 //you and you will instantly teleport to that spot. //You can also easily remove destinations by picking ""Remove" in the menu and then //touching the button name you wish to remove. //In case you are worried about loosing your destinations, you can also use the //"List" button to output the list of all destinations from all sims. //I have never lost the destinations because of sim resets etc. //Have lost them twice tweaking the script. But adding destinations again is so easy //it is no problem.

//To use, create a button and attach it to the desired position on your HUD. //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.


string sim; list sims; list dest; list main_menu; list menu_options =["Add", "Remove", "Back", "List"]; integer rez_chan; integer rez_chan_handle; integer menu_chan; integer menu_chan_handle; integer edit_chan = 0;// Could change this to another channel if you want for privacy //It is only used to enter the destination name when you use "Add" integer edit_chan_handle; integer edit_test = FALSE; vector target; string tp_object = "bubble";

default { 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 { state_entry() { edit_test = TRUE; llSetTimerEvent(20); edit_chan_handle = llListen(edit_chan, "", llGetOwner(), ""); } listen(integer chan, string name, key id, string msg) { integer e = llListFindList(sims,[sim]); if (e == -1) { sims = (sims =[]) + sims +[sim]; } vector pos = llGetPos(); dest = (dest =[]) + dest +[sim, msg, pos]; llOwnerSay("Added : " + sim + " , " + msg + " = " + (string) pos); llListenRemove(edit_chan_handle); state default; } timer() { llSetTimerEvent(0); llListenRemove(edit_chan_handle); llOwnerSay("Timeout. Click TP HUD to start again"); state default; } }

state rem_dest { state_entry() { edit_test = TRUE; llSetTimerEvent(20); menu_chan_handle = llListen(menu_chan, "", llGetOwner(), ""); } listen(integer chan, string name, key id, string msg) { integer d = llListFindList(dest,[msg]); if (d != -1) { dest = llDeleteSubList(dest, d - 1, d + 1); llOwnerSay("Removed : " + msg); integer f = llListFindList(dest,[sim]); if (f == -1) { sims = llDeleteSubList(sims, f, f); llListenRemove(menu_chan_handle); state default; } llListenRemove(menu_chan_handle); state default; } } timer() { llSetTimerEvent(0); llListenRemove(menu_chan_handle); llOwnerSay("Timeout. Click TP HUD to start again"); state default; } } </lsl> Question2.JPGEditted warpPos script for syntax errorJesse Barnett 11:46, 23 April 2008 (PDT) <lsl> ////////////////////////////////////////////////////////////////////////////////////////////////////// // Multi-HUD WarpPos // "Apr 23 2008", "14:36:26" // Creator: Jesse Barnett // Released into the Public Domain //////////////////////////////////////////////////////////////////////////////////////////////////////

integer listenId; // Listener ID key gAvatarID; vector target; // The location the av will be teleported to.

warpPos(vector target) { //R&D by Keknehv Psaltery, 05/25/2006 //with a little pokeing by Strife, and a bit more //munging by Talarus Luan //Final cleanup by Keknehv Psaltery //and of course Jesse Barnett got to jump in here //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 > 206) jumps = 206; list rules =[PRIM_POSITION, target]; //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() { 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) { integer jumps = (integer) (llVecDist(target, llGetPos()) / 10.0) + 1; if (jumps > 206) { integer loops = jumps / 206; if (loops > 2) loops = 2; while (loops > 0) { loops--; warpPos(target); } } warpPos(target); llSleep(0.5); llDie(); } } } } </lsl>