Difference between revisions of "LlGetAgentList"

From Second Life Wiki
Jump to navigation Jump to search
m (reduced indentation in second example script to 4-space, some minor reformatting and added a comment to make change of reference clear)
(Corrected 2nd example which had been left in a non-compilable state by last editor, Removed dangerous use of do...while. Avoided defining a key each loop iteration.)
Line 58: Line 58:
</lsl>
</lsl>
<lsl>
<lsl>
//  Orders new list based off distance
//  Orders new list based on distance
//  and returns then on touch_start
//  and returns names and distances on touch


default
default
Line 65: Line 65:
     touch_start(integer num_detected)
     touch_start(integer num_detected)
     {
     {
        list keys = llGetAgentList(AGENT_LIST_REGION, []);
list keys = llGetAgentList(AGENT_LIST_REGION, []);
        list newkeys;
integer numberOfKeys = llGetListLength(keys);
 
list newkeys;
        integer totalNumber = llGetListLength(keys);
integer i;
        integer i;
         key thisAvKey;
         do
         for (i = 0; i < numberOfKeys; i++)
         {
{
            key thisAvKey = llList2Key(keys,i);
    thisAvKey = llList2Key(keys,i);
            newkeys += llVecDist(llGetPos(),
    newkeys += llVecDist(llGetPos(),
                            llList2Vector(llGetObjectDetails(thisAvKey, [OBJECT_POS]), 0));
llList2Vector(llGetObjectDetails(thisAvKey, [OBJECT_POS]), 0));
            newkeys += thisAvKey;
    newkeys += thisAvKey;
        }
}
        while (++i < numberOfKeys);
newkeys = llListSort(newkeys, 2, FALSE);   // Sort strided list by descending distance
 
for (i = 0; i < (numberOfKeys * 2); i += 2)
        newkeys = llListSort(newkeys, 2, FALSE);
{
 
    llOwnerSay(llGetDisplayName(llList2Key(newkeys,i+1))
        totalNumber = llGetListLength(newkeys);//  reference changed!
+ " ["+(string)llRound(llList2Float(newkeys, i)) + "m]");
        i = 0;
}
        do
        {
            llOwnerSay(llGetDisplayName(llList2Key(newkeys,i+1))
                    + " ["+(string)llRound(llList2Float(newkeys, i)) + "m]");
        }
        while ((i = i + 2) < totalNumber);
     }
     }
}
}

Revision as of 06:03, 9 December 2012

Summary

Function: list llGetAgentList( integer scope, list options );

Requests a list of agents currently in the region, limited by the scope parameter.
Returns a list [key id0, key id1, ..., key idn] or [string error_msg] - returns avatar keys for all agents in the region limited to the area(s) specified by scope

• integer scope
AGENT_LIST_* flag specifies the selection scope
  • AGENT_LIST_PARCEL - returns only agents on the same parcel where the script is running.
  • AGENT_LIST_PARCEL_OWNER - returns only agents on any parcel in the region where the parcel owner is the same as the owner of the parcel under the scripted object.
  • AGENT_LIST_REGION - returns any/all agents in the region.
• list options Unused.

Caveats

  • There is no guaranteed understandable order or randomness to the list returned.
  • Will only return up to 100 agents.
All Issues ~ Search JIRA for related Bugs

Examples

KBcaution.png Important: To check if an avatar is in the same sim, please check whether llGetAgentSize does NOT return ZERO_VECTOR. It's much faster and easier than calling llGetAgentList and running through the list to compare a given key with each list item.
KBcaution.png Important: As of now, this function does not have a delimiter for its option list. This means, the function MIGHT return up to a hundred avatar keys. You'll need a lot of free memory to be able to store those keys, be warned of possible STACK_HEAP_COLLISION_ERRORs.

<lsl> //Displays up to 100 avatar key: name pairs detected in the entire region

default {

   touch_start(integer total_number)
   {
       list avatarsInRegion = llGetAgentList(AGENT_LIST_REGION, []);
       integer numOfAvatars = llGetListLength(avatarsInRegion);
       // if no avatars, abort avatar listing process and give a short notice
       if (!numOfAvatars)
       {
           // PUBLIC_CHANNEL has the integer value 0
           llSay(PUBLIC_CHANNEL, "No avatars found within the region!");
           return;
       }
       integer index;
       while (index < numOfAvatars)
       {
           key id = llList2Key(avatarsInRegion, index);
           string name = llKey2Name(id);
           llOwnerSay(name + " [ " + (string)id + " ]");
           ++index;
       }
   }

} </lsl> <lsl> // Orders new list based on distance // and returns names and distances on touch

default {

   touch_start(integer num_detected)
   {

list keys = llGetAgentList(AGENT_LIST_REGION, []); integer numberOfKeys = llGetListLength(keys); list newkeys; integer i;

       key thisAvKey;
       for (i = 0; i < numberOfKeys; i++)

{ thisAvKey = llList2Key(keys,i); newkeys += llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(thisAvKey, [OBJECT_POS]), 0)); newkeys += thisAvKey; } newkeys = llListSort(newkeys, 2, FALSE); // Sort strided list by descending distance for (i = 0; i < (numberOfKeys * 2); i += 2) { llOwnerSay(llGetDisplayName(llList2Key(newkeys,i+1)) + " ["+(string)llRound(llList2Float(newkeys, i)) + "m]"); }

   }

}

</lsl>

See Also

Deep Notes

History

All Issues

~ Search JIRA for related Issues
   llGetAgentList() with scope AGENT_LIST_PARCEL or AGENT_LIST_PARCEL_OWNER returns empty list when attached to avatar
   llGetNumberOfAgents() function to return an integer count of agents
   AGENT_LIST_MAX_RESULTS option for llGetAgentList()

Signature

function list llGetAgentList( integer scope, list options );