| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- // Ferd Frederix
- integer debug = 0;
- float TIME = 6.0;
- integer channel; // listener from other prim
- integer listener; // channel handle
- float oldDist;
- vector StartSeatedRotation = <0, 0, 0>; // animation start rotation
- vector StopSeatedRotation = <0, 0, 180>; // animation stop rotation
- vector StartSeatedOffset = <0, 0, 0.5>; // where we sit to start
- vector StopSeatedOffset = <.5, 0, 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
- BootUp(integer newchannel)
- {
- oldDist = 0;
- channel = newchannel;
-
- if (debug) llOwnerSay("Channel=" + (string) channel);
- listener = llListen(channel,"","","");
-
- 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(channel,"reset");
-
- llSetTimerEvent(30); // die when the door shuts
-
- }
- MovePrim(float dir)
- {
-
- vector vPosOffset = <dir, 0.0, 0.0>; //-- 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()
- { //R&D by Keknehv Psaltery, 05/25/2006
- //with a little poking by Strife, and a bit more
- //some more munging by Talarus Luan
- //Final cleanup by Keknehv Psaltery
- //Changed jump value to 411 (4096 ceiling) by Jesse Barnett
- // Compute the number of jumps necessary
- // rotated by Ferd Frederix
- //llSitTarget(destpos, ROT);//Set the sit target
- integer jumps = (integer)(llVecDist(DestPosition, llGetPos()) / 10.0) + 1;
- // Try and avoid stack/heap collisions
- if (jumps > 411)
- jumps = 411;
- list rules = [ PRIM_POSITION, DestPosition ]; //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) );
- if ( llVecDist( llGetPos(), DestPosition ) > .001 ) //Failsafe
- while ( --jumps )
- llSetPos( DestPosition );
-
-
- DestRotation = llEuler2Rot( StopSeatedRotation * DEG_TO_RAD) * DestRotation ; // maybe rotate
- //DestRotation = llGetRot() * DestRotation ; // maybe rotate
-
- llSetRot(DestRotation); // set dest rotation
- llWhisper(channel,"open");
- llSleep(1.0);
-
- }
- default
- {
- state_entry()
- {
- BootUp((integer) llGetObjectDesc());
- }
-
- changed (integer what)
- {
- if (what & CHANGED_LINK)
- {
- if (debug) llOwnerSay("changed");
- AvatarKey = llAvatarOnSitTarget();
- if (AvatarKey != NULL_KEY)
- {
- if (DestPosition != <0,0,0>)
- {
- if (debug) llOwnerSay("request perms");
- llRequestPermissions(AvatarKey,PERMISSION_TRIGGER_ANIMATION );
- }
- else
- {
- llOwnerSay("Did not locate a second door by the same number!");
- llUnSit(AvatarKey);
- }
- }
-
- }
- 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)
- {
- BootUp(p);
- }
- timer()
- {
- llSetTimerEvent(0);
- if (! debug)
- llDie();
-
-
- }
-
- listen(integer channel,string name, key id, string message)
- {
- if(debug) llOwnerSay("Heard:" + message);
- 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());
- if (dist > oldDist)
- {
- DestRotation = DestRotationproto;;
- DestPosition = DestPositionproto;
- oldDist = dist;
- }
- 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 (debug) llOwnerSay("Set Pos:" + (string) DestPosition + " rot:" + (string) DestRotation);
-
- }
- }
|