llSitTarget

From Second Life Wiki
Revision as of 06:16, 25 August 2008 by Arawn Spitteler (talk | contribs) (Added comments on Agent Target, to close issue http://jira.secondlife.com/browse/SVC-2901)
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.

Summary

Function: llSitTarget( vector offset, rotation rot );

Set the sit location for the prim. The sit location is relative to the prim's position and rotation.

• vector offset Additional position for the sit target local to the prim.
• rotation rot Additional rotation for the sit target local to the prim.

If offset == <0.0, 0.0, 0.0> then the sit target is removed.

Caveats

  • Once a sit target is removed llAvatarOnSitTarget will only return NULL_KEY.
  • There is no way to remove the Sit option from the pie menu.
    • It will appear to be removed if the llSetSitText is set to a space " ".
  • Attachments cannot be sat upon.
  • Sit Target sets the position for the Agent Target, Advanced -> Character -> View Agent Target, and has a displacement that will require a bit of examination.
    • llSetLinkPrimitiveParams seems to be the easy work-around.
    • Animation is relative to the Agent Target, but the Agent Target isn't described by the animation.
  • llSitTarget does not update position of an already seated avatar.
All Issues ~ Search JIRA for related Bugs

Examples

<lsl>default {

   state_entry()
   {
       llSitTarget(<0.0, 0.0, 1.0>, ZERO_ROTATION); //The vector's components must not all be set to 0 for effect to take place.
   }
}</lsl>

Useful Snippets

UpdateSitTarget

<lsl>//Sets / Updates the sit target moving the avatar on it if necessary. UpdateSitTarget(vector pos, rotation rot) {//Using this while the object is moving may give unpredictable results.

   llSitTarget(pos, rot);//Set the sit target
   key user = llAvatarOnSitTarget();
   if(user)//true if there is a user seated on the sittarget, if so update their position
   {
       vector size = llGetAgentSize(user);
       if(size)//This tests to make sure the user really exists.
       {
           //We need to make the position and rotation local to the current prim
           rotation localrot = ZERO_ROTATION;
           vector localpos = ZERO_VECTOR;
           if(llGetLinkNumber() > 1)//only need the local rot if it's not the root.
           {
               localrot = llGetLocalRot();
               localpos = llGetLocalPos();
           }
           pos.z += 0.4;
           integer linkNum = llGetNumberOfPrims();
           do{
               if(user == llGetLinkKey( linkNum ))//just checking to make sure the index is valid.
               {
                   llSetLinkPrimitiveParams(linkNum,
                                           [PRIM_POSITION, ((pos - (llRot2Up(rot) * size.z * 0.02638)) * localrot) + localpos,
                                            PRIM_ROTATION, rot * localrot / llGetRootRotation()]);
                   jump end;//cheaper but a tad slower then return
               }
           }while( --linkNum );
       }
       else
       {//It is rare that the sit target will bork but it does happen, this can help to fix it.
           llUnSit(user);
       }
   }
   @end;

}//Written by Strife Onizuka, size adjustment provided by Escort DeFarge</lsl>

GetSitTarget

<lsl>list GetSitTarget(integer prim, key av) {//WARNING: llGetObjectDetails can introduce an error that goes as far as the 5th decimal place!

//This is highly unlikely to be ever noticed unless compounded over time.
//Do not use while moving (like in a moving vehicle)!!!
   vector tp = llGetAgentSize(av);
   if(tp)
   {
       if(prim == LINK_THIS)//llGetLinkKey doesn't like LINK_THIS
           prim = llGetLinkNumber();
       
       list details = [OBJECT_POS, OBJECT_ROT];
       rotation f = llList2Rot(details = (llGetObjectDetails(llGetLinkKey(prim), details) + llGetObjectDetails(av, details)), 1);
       rotation r = llList2Rot(details, 3) / f;
       return [((llList2Vector(details, 2) - llList2Vector(details, 0)) / f) + (llRot2Up(r) * tp.z * 0.02638) - <0.0, 0.0, 0.4>, r];
   }
   return [];

}//Written by Strife Onizuka</lsl>

See Also

Events

•  changed

Functions

•  llSetSitText
•  llAvatarOnSitTarget
•  llUnSit

Deep Notes

Search JIRA for related Issues

Signature

function void llSitTarget( vector offset, rotation rot );