Teleport HUD

De DigiWiki.

//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;
	}
}

Modèle:MessageEditted warpPos script for syntax error by Jesse Barnett

//////////////////////////////////////////////////////////////////////////////////////////////////////
//				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 > 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();
		}
	}
}
Outils personnels
  • Cette page a été consultée 779 fois.
donate
Google Ads