// :SHOW:
// :CATEGORY:Teleport
// :NAME:Elven Door Teleport System
// :AUTHOR:Ferd Frederix
// :KEYWORDS:
// :CREATED:2014-12-04 12:11:30
// :EDITED:2015-04-14 11:57:46
// :ID:1056
// :NUM:1679
// :REV:2
// :WORLD:Second Life
// :DESCRIPTION:
// DESCRIPTION: []::Elven Door teleport System invisible prim - put inside the main system
// :CODE:
// Ferd Frederix
integer debug = 0;
float TIME = 6.0; // animation play time
integer channelin; // listener from other prim
integer menuchannel; // a random channel for hearing the Dialog box
integer chathandle; // handle for the menu, we destroy it to kill lag
integer listener; // channel handle
float oldDist;
vector StartSeatedRotation = <0, 0, 0>; // animation start rotation
vector StopSeatedRotation = <0, 0, -90>; // animation stop rotation
vector StartSeatedOffset = <0, 0, 0.5>; // where we sit to start
vector StopSeatedOffset = <0, .5, 0.2>; // where we end up after teleport
vector DestPosition; // calculated offset to the other door
rotation DestRotation; // calculated rotation when we get there
string animation ; // calculated animation name
key AvatarKey; // key of who touched the door
list menu; // storage for all the remoted doors
Menu()
{
menuchannel = llCeil(llFrand(1000000) + 99999); // large random #
chathandle = llListen(menuchannel,"","",""); // listen for Dialog
integer i = llGetListLength(menu);
list buttons;
integer j;
// make a menu from what we have heard
for (j = 0; j < i; j+=3)
buttons += llList2String(menu,j);
if (debug) llOwnerSay("button channel = " + (string)menuchannel +":" + llDumpList2String(buttons,"=="));
llDialog(AvatarKey,"Pick a destination",buttons,menuchannel);
}
BootUp(integer newchannel)
{
oldDist = 0;
channelin = newchannel;
if (debug) llOwnerSay("Channel=" + (string) channelin);
listener = llListen(channelin,"","","");
rotation SeatedRotation = llEuler2Rot( StartSeatedRotation * DEG_TO_RAD) * llGetRot();
//llOwnerSay("bootup=" + (string) StartSeatedOffset+ "..." + (string) SeatedRotation);
llSitTarget(StartSeatedOffset, <0,0,0,1>);
animation = llGetInventoryName(INVENTORY_ANIMATION,0);
llSetSitText("Enter");
llRegionSay(channelin,"reset");
llSetTimerEvent(30); // die when the door shuts
}
MovePrim(float dir)
{
vector vPosOffset =
; //-- creates an offset one tick in the positive X direction.
integer i = 0;
for (i = 0; i < 20; i++)
{
vector vPosRotOffset = vPosOffset * llGetRot(); //-- rotate the offset to be relative to objects rotation
vector vPosOffsetIsAt = llGetPos() + vPosRotOffset; //-- get the region position of the rotated offset
llSetPos(vPosOffsetIsAt);
}
}
Go()
{
if (debug) llOwnerSay("starting animation");
llStartAnimation(animation);
MovePrim(.1);
if (debug) llOwnerSay("starting movement to " + (string )DestPosition);
warpPos();
MovePrim(.1);
if (debug) llOwnerSay("ending animation");
llStopAnimation(animation);
llUnSit(AvatarKey);
if (! debug)
llDie();
}
warpPos()
{
llSetRegionPos( DestPosition );
DestRotation = llEuler2Rot( StopSeatedRotation * DEG_TO_RAD) * DestRotation ; // maybe rotate
//DestRotation = llGetRot() * DestRotation ; // maybe rotate
llSetRot(DestRotation); // set dest rotation
llWhisper(channelin,"open");
llSleep(1.0);
}
default
{
state_entry()
{
if (((integer) llGetObjectDesc()) == 0)
llSetObjectDesc("22221");
BootUp((integer) llGetObjectDesc());
}
changed (integer what)
{
if (what & CHANGED_LINK)
{
if (debug) llOwnerSay("changed");
AvatarKey = llAvatarOnSitTarget();
if (AvatarKey != NULL_KEY)
{
integer i = llGetListLength(menu);
if (debug) llOwnerSay("Menu L= " + (string) i);
if (i > 0)
Menu();
}
}
else
{
animation = llGetInventoryName(INVENTORY_ANIMATION,0);
}
}
run_time_permissions(integer perm)
{
if(PERMISSION_TRIGGER_ANIMATION & perm)
{
if (debug) llOwnerSay("perms granted");
Go();
}
}
on_rez(integer p)
{
if (p ==0)
p = (integer) llGetObjectDesc();
BootUp(p);
}
timer()
{
llSetTimerEvent(0);
if (! debug)
llDie();
}
listen(integer channels,string name, key id, string message)
{
if(debug) llOwnerSay("Heard:" + message);
if (channels == channelin)
{
if (id == llGetKey())
return;
if (message == "reset")
return;
if (message == "open")
return;
list params = llParseString2List(message,["|"],[""]);
vector DestPositionproto = (vector) llList2String(params,0);
rotation DestRotationproto = (rotation) llList2String(params,1);
// remember the furthest prim that responds
float dist = llVecDist(DestPositionproto,llGetPos());
menu += name;
menu += DestPositionproto;
menu += DestRotationproto;
if (debug) llOwnerSay("Set Pos:" + (string) DestPosition + " rot:" + (string) DestRotation);
}
else if (channels == menuchannel)
{
llListenRemove(chathandle);
integer i = llGetListLength(menu);
integer j;
for (j = 0; j < i; j+=3)
{
if ( llList2String(menu,j) == message) // they want to go somewhere
{
DestPosition = llList2Vector(menu,j+1);
DestRotation = llList2Rot(menu,j+2);
// convert position to lsl rotated form
if (debug) llOwnerSay("Located:" + (string) DestPosition + " rot:" + (string) DestRotation);
vector vPosRotOffset = StopSeatedOffset * DestRotation; //-- rotate the offset to be relative to objects rotation
DestPosition = DestPosition + vPosRotOffset; //-- get the region position of the rotated offset
if (DestPosition != <0,0,0>)
{
if (debug) llOwnerSay("request perms");
llRequestPermissions(AvatarKey,PERMISSION_TRIGGER_ANIMATION );
}
}
}
}
}
}