Teleport HUD

== Gridwide Teleport HUD (works in no-script areas) ==
# Link 9 prims.
# Drop this script.
# Add up to 8 landmarks.
# Attach to HUD and enjoy!
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 = 1;// root of linkset
 do
 {
 string linkName = llGetLinkName(index);
 if (linkName == "TP HUD for landmarks")
 {
 llSetLinkPrimitiveParamsFast(index,
 [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1,
 PRIM_COLOR, 3, <0.0, 1.0, 0.0>, 1,
 // green and opaque floattext
 PRIM_TEXT, "click green button to close\n"
 + "or select TP destination", <0.0, 1.0, 0.0>, 1]);
 }
 else if (linkName == "tp1")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, white, 1,
 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]);
 }
 else if (linkName == "tp2")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, orange, 1,
 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]);
 }
 else if (linkName == "tp3")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, white, 1,
 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]);
 }
 else if (linkName == "tp4")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, orange, 1,
 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]);
 }
 else if (linkName == "tp5")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, white, 1,
 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]);
 }
 else if (linkName == "tp6")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, orange, 1,
 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]);
 }
 else if (linkName == "tp7")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, white, 1,
 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]);
 }
 else if (linkName == "tp8")
 {
 llSetLinkPrimitiveParamsFast(index, [
 PRIM_COLOR, ALL_SIDES, orange, 1,
 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]);
 }
 }
 while (++index <= numOfPrims);
 }
 else
 {
 rotation currentRot = llGetRot();
 integer numOfPrims = llGetNumberOfPrims();
 integer index = 1;// root of linkset
 do
 {
 string linkName = llGetLinkName(index);
 if (linkName == "TP HUD for landmarks")
 {
 llSetLinkPrimitiveParamsFast(index,
 [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1,
 PRIM_COLOR, 3, <1.0, 0.0, 0.0>, 1,
 // red and opaque floattext
 PRIM_TEXT, "<~!~ TP HUD ~!~>", <1.0, 0.0, 0.0>, 1]);
 }
 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,
 PRIM_POSITION, ZERO_VECTOR*currentRot,
 PRIM_SIZE, <0.01, 0.01, 0.01>,
 // black and transparent floattext
 PRIM_TEXT, "", ZERO_VECTOR, 0]);
 }
 }
 while (++index <= numOfPrims);
 }
}
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);
 // request teleport perms and controls perms for no-script area hack
 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);
 }
 // no-script area hack
 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;
 }
}