Difference between revisions of "LlAvatarOnSitTarget"

From Second Life Wiki
Jump to navigation Jump to search
m (minor update)
(14 intermediate revisions by 7 users not shown)
Line 3: Line 3:
|return_type=key
|return_type=key
|return_text=that is the [[UUID]] of the user seated on the prim.
|return_text=that is the [[UUID]] of the user seated on the prim.
|func_footnote=If the prim lacks a sit target or there is no avatar sitting on the prim, then {{LSL Const|NULL_KEY|key|"00000000-0000-0000-0000-000000000000"|c=Evaluates to false in conditionals just like invalid keys.}} is returned.
|func_footnote=If the prim lacks a [[llSitTarget|sit target]] or there is no avatar sitting on the prim, then {{LSL Constant/NULL_KEY}} is returned.
|caveats=*A prim does not have a sit target unless [[llSitTarget]] has been called with a '''nonzero''' vector as the first argument.
|caveats=*A prim does not have a sit target unless [[llSitTarget]] has been called with a '''nonzero''' vector as the first argument.
*If the prim lacks a sit target or the avatar is seated upon a different prim, the only way to determine how many and which avatars are seated upon the object is to scan the link set{{Footnote|To scan a link set using a function such as [[llGetLinkKey]] (see [[llGetNumberOfPrims#Useful_Snippets|llGetNumberOfPrims]] for an examples).|To scan a link set using a function such as llGetLinkKey (see llGetNumberOfPrims for an examples).}}.
*If the prim lacks a sit target or the avatar is seated upon a different prim, the only way to determine how many and which avatars are seated upon the object is to scan the link set (for an example of this, see [[llGetNumberOfPrims#Useful_Snippets|llGetNumberOfPrims]]).
|spec
|spec
|examples=<lsl>default
|examples=<source lang="lsl2">default
{
{
     state_entry()
     state_entry()
Line 15: Line 15:
     }
     }


     changed(integer change) {
     changed(integer change)
         if (change & CHANGED_LINK) {  
    {
         if (change & CHANGED_LINK)
        {  
             key av = llAvatarOnSitTarget();
             key av = llAvatarOnSitTarget();
             if (av) {//evaluated as true if not NULL_KEY or invalid
             if (av) // evaluated as true if key is valid and not NULL_KEY
            {
                 llSay(0, "Hello " + llKey2Name(av) + ", thank you for sitting down");
                 llSay(0, "Hello " + llKey2Name(av) + ", thank you for sitting down");
             }
             }
         }
         }
     }
     }
}</lsl>
}</source>
|helpers=<lsl>//Gets the link number of a seated avatar
|helpers=<source lang="lsl2">//Gets the link number of a seated avatar
integer GetAgentLinkNumber(key avatar)
integer GetAgentLinkNumber(key avatar)
{
{
     integer linkNum = 1 + llGetNumberOfPrims();
     integer link_num = llGetNumberOfPrims();
     key linkKey;
     while (link_num > 1) // Check only child prims.
    //Next we get the linkKey and make sure it's not null, if it's null we are done.
     {
     while((linkKey = llGetLinkKey( --linkNum )))//is the key valid?
        if (llGetLinkKey(link_num) == avatar) // If it is the avatar we want
        if(avatar == linkKey)//is it the avatar we want?
        {
             return linkNum;//It's the avatar we want so return.
             return link_num; // then return the link number
     //avatar wasn't not found
        }
     //return a number that isn't a LINK_* flag not a valid link number either.
        --link_num; // else go on with next child.
     return 0x7FFFFFFF;//max int.
    }
}//Written by Strife Onizuka</lsl>
     // Avatar wasn't found
     return FALSE; // 0 (zero) for easy testing.
}</source>
<source lang="lsl2">//It's sometimes useful to use a state change
//useful when the prim is linked to an other prim
//and useful with a dialog box
default
{
    state_entry() 
    {
        //"Sit target is a prim property."
        llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION);
    }
   
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key av_sit = llAvatarOnSitTarget();
            if (av_sit)
            {
                //Someone is on the sit target.
                state sitting;
            }
        }
    }
}
 
state sitting
{
    state_entry()
    {
        //Open a dialog box when an avatar is sitting on the prim
        key av_menu = llAvatarOnSitTarget();
        llListen(-99, "", av_menu, "Yes");
        llDialog(av_menu, "\nDo you like this example?", ["Yes", "No" ] , -99);
    }
   
     changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key av_unsit = llAvatarOnSitTarget();
            if (av_unsit == NULL_KEY)
            {
                //No one is on the sit target.
                //"On state change all listens are removed automatically."
                state default;
            }
        }
    }
 
    listen(integer chan, string name, key id, string msg)
    {
        // If the user clicked the "Yes" button
        llWhisper(0, "Thank you");
    }
}</source>
|related
|related
|also_tests
|also_tests
|also_events={{LSL DefineRow||[[changed]]|}}
|also_events={{LSL DefineRow||[[changed]]|}}
|also_functions={{LSL DefineRow||[[llSitTarget]]|}}
|also_functions=
{{LSL DefineRow||[[llAvatarOnLinkSitTarget]]|}}
{{LSL DefineRow||[[llSitTarget]]|}}
{{LSL DefineRow||[[llLinkSitTarget]]|}}
{{LSL DefineRow||[[llGetLinkKey]]}}
{{LSL DefineRow||[[llGetLinkKey]]}}
|also_articles={{LSL DefineRow||[[CHANGED_LINK]]|}}
|also_articles={{LSL DefineRow||[[CHANGED_LINK]]|}}
|notes=The position of an avatar on a sit target can be determined with the use of [[llGetObjectDetails]] (see [[llSitTarget#Useful_Snippets|llSitTarget]] for an example).
|notes=The position of an avatar on a sit target can be determined with the use of [[llGetObjectDetails]] (see [[llSitTarget#Useful_Snippets|llSitTarget]] for an example).
{{Footnotes}}
|cat1=Avatar
|cat1=Avatar
|cat2=Prim
|cat2=Prim

Revision as of 19:19, 14 January 2017

Summary

Function: key llAvatarOnSitTarget( );

Returns a key that is the UUID of the user seated on the prim.

If the prim lacks a sit target or there is no avatar sitting on the prim, then NULL_KEY is returned.

Caveats

  • A prim does not have a sit target unless llSitTarget has been called with a nonzero vector as the first argument.
  • If the prim lacks a sit target or the avatar is seated upon a different prim, the only way to determine how many and which avatars are seated upon the object is to scan the link set (for an example of this, see llGetNumberOfPrims).
All Issues ~ Search JIRA for related Bugs

Examples

default
{
    state_entry()
    {
        // set sit target, otherwise this will not work 
        llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION);
    }

    changed(integer change)
    {
        if (change & CHANGED_LINK)
        { 
            key av = llAvatarOnSitTarget();
            if (av) // evaluated as true if key is valid and not NULL_KEY
            {
                llSay(0, "Hello " + llKey2Name(av) + ", thank you for sitting down");
            }
        }
    }
}

Useful Snippets

//Gets the link number of a seated avatar
integer GetAgentLinkNumber(key avatar)
{
    integer link_num = llGetNumberOfPrims();
    while (link_num > 1) // Check only child prims.
    {
        if (llGetLinkKey(link_num) == avatar) // If it is the avatar we want
        {
            return link_num; // then return the link number
        }
        --link_num; // else go on with next child.
    }
    // Avatar wasn't found
    return FALSE; // 0 (zero) for easy testing.
}
//It's sometimes useful to use a state change
//useful when the prim is linked to an other prim
//and useful with a dialog box
default
{
    state_entry()  
    {
        //"Sit target is a prim property."
        llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION);
    }
    
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        { 
            key av_sit = llAvatarOnSitTarget();
            if (av_sit) 
            {
                //Someone is on the sit target.
                state sitting;
            }
        }
    }
}

state sitting
{
    state_entry()
    {
        //Open a dialog box when an avatar is sitting on the prim
        key av_menu = llAvatarOnSitTarget();
        llListen(-99, "", av_menu, "Yes");
        llDialog(av_menu, "\nDo you like this example?", ["Yes", "No" ] , -99);
    }
    
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        { 
            key av_unsit = llAvatarOnSitTarget();
            if (av_unsit == NULL_KEY) 
            {
                //No one is on the sit target.
                //"On state change all listens are removed automatically."
                state default;
            }
        }
    }

    listen(integer chan, string name, key id, string msg)
    {
        // If the user clicked the "Yes" button
        llWhisper(0, "Thank you");
    }
}

Notes

The position of an avatar on a sit target can be determined with the use of llGetObjectDetails (see llSitTarget for an example).

See Also

Events

•  changed

Functions

•  llAvatarOnLinkSitTarget
•  llSitTarget
•  llLinkSitTarget
•  llGetLinkKey

Articles

•  CHANGED_LINK

Deep Notes

Search JIRA for related Issues

Signature

function key llAvatarOnSitTarget();