LlGetParcelPrimOwners

From Second Life Wiki

Second Life Wiki > LSL Portal > Built-in Functions > LlGetParcelPrimOwners
Jump to: navigation, search

Template:Needs Translation/LSL/de Template:Needs Translation/LSL/es Template:Needs Translation/LSL/el Template:Needs Translation/LSL/he Template:Needs Translation/LSL/it Template:Needs Translation/LSL/ko Template:Needs Translation/LSL/nl Template:Needs Translation/LSL/hu Template:Needs Translation/LSL/no Template:Needs Translation/LSL/da Template:Needs Translation/LSL/sv Template:Needs Translation/LSL/tr Template:Needs Translation/LSL/pl Template:Needs Translation/LSL/pt Template:Needs Translation/LSL/ru Template:Needs Translation/LSL/uk Template:Needs Translation/LSL/zh-Hans Template:Needs Translation/LSL/zh-Hant

Contents

Summary

Function: list llGetParcelPrimOwners( vector pos );
324 Function ID
2.0 Delay
10.0 Energy

Returns a list of all residents who own objects on the parcel at pos and with individual prim counts.
The list is formatted as [ key agentKey1, integer agentCount1, key agentKey2, integer agentCount2, ... ], and sorted by agent key with a maximum of 100 strides.

• vector pos

Requires owner-like permissions for the parcel.

Caveats

  • This function causes the script to sleep for 2.0 seconds.
  • If the object owner is the same as the parcel owner (including if the object and parcel are both group owned) it will get all object owners.
  • If not and the parcel is group owned:
    • If the resident has the 'return group owned objects' power, return a list of just the group if there are any group owned objects on the parcel.
    • If the resident has the 'return group set objects' power return a list of all owners who have objects set to the group on the parcel
    • If the resident has the 'return non-group objects' power return a list of all owners of objects that don't fall into the above
  • If none of the above cases match, an empty list will be returned

Search JIRA for related Bugs

Examples

 
// Script by Falados Kapuskas
 
// The object has the same permisions to view prim parcel owners
// as its owner (In About Land >> Objects >> Object Owners )
 
// Example: If you can't return group object, you won't see group objects
// If you can't return any objects, an empty list will be returned.
// If the prim is deeded to the right group, it should always get a full list
 
// Note: Only works when the when the owner is in the Sim
//       Deeded objects always work (group is always online?)
 
// -- SETTINGS (Edit These!) -- //
 
integer REFRESH_TIMER = 600;            // Refresh Time (in seconds)
vector  PARCEL_POS    = <128,128,0>;    // A Region coordinate of a point in the parcel
integer PAGE_SIZE     = 8;              // Number of owners to display per page on the prim
integer DATA_TIMEOUT  = 10;             // Number of seconds to wait before giving up on dataserver events
 
// -- END SETTINGS -- //
 
list gQueryKeys;
list gQueryIndex;
list gNames;
list gPrims;
 
key gDataserver_Name;
 
integer gPageNumber;
integer gPageMax;
 
//Updates the internal list of prim owners
//Returns TRUE if there were prim owners
//Returns FALSE if the prim owner list was empty
integer UpdateOwnerList()
{
    list owner_prim = llGetParcelPrimOwners(PARCEL_POS);
    //Empty List either means no prims in the parcel
    //Or we couldn't get the list.  The latter is more likely
    if( owner_prim == [] ) 
    {
        llSetText("[ERROR]\n Couldn't get Parcel Prim Owners",<1,0,0>,1.0);
        return FALSE;
    }
    integer i;
    integer n = llGetListLength(owner_prim) / 2;
 
    //Reset the lists
    gPrims = [];
    gNames = [];
    gQueryKeys = [];
    gQueryIndex = [];
 
 
    for( i = 0; i < n; ++i)
    {
        key owner = llList2Key(owner_prim,i*2);
        string name = llKey2Name(owner);
        if( name == "" ) { //Not in the sim
 
            //Add to the query list
            gNames += ["[Unknown]"];
            gQueryIndex += [llGetListLength(gNames) - 1];
            gQueryKeys += [owner];
        } else {
            gNames += [name];
        }
        gPrims += llList2Integer(owner_prim,i*2+1);
    }
    gPageNumber = 0;
    gPageMax = llCeil( (float)llGetListLength(gNames) / PAGE_SIZE );
    return TRUE;
}
 
 
// Shows the prim owners starting at index 9*page
// Returns TRUE if there are more pages
// Returns FALSE otherwise
integer ShowPrimOwners(integer page)
{
    integer len = llGetListLength(gNames);
    integer offset = len-page*PAGE_SIZE;
    if(  offset < 0 )
    {
        return FALSE;
    }
    integer i;
 
 
    integer end = (integer)( llListStatistics(LIST_STAT_MIN,[len,(page+1)*PAGE_SIZE]) );
    string text;
    for( i = PAGE_SIZE*page; i < end; ++i)
    {
        text += llList2String(gNames,i) + " - " + (string)llList2Integer(gPrims,i) + "\n";
    }
    llSetText(text,<1,1,1>,1.0);
    return TRUE;
} 
 
// Set-up phase 
default
{
    state_entry()
    {
        llSetText("",<1,1,1>,1.0);
        if(UpdateOwnerList())
        {
            if( gQueryKeys == [] )
            {
                state display;
            } else {
                state lookup;
            }
        }
    }
    // If there is an error, touch to reset
    touch_start(integer i){llResetScript();}
}
 
// Display the list
// Allow page flipping via touch
state display 
{
    state_entry()
    {
        ShowPrimOwners(gPageNumber);
        llSetTimerEvent(REFRESH_TIMER);
    }
    touch_start(integer i)
    {
        if( !ShowPrimOwners(++gPageNumber) )
        {
            gPageNumber = 0;
            ShowPrimOwners(0);
        }
    }
    timer()
    {
        state default;
    }
}
 
// Look up all names for people that are not in the sim
// Go to the display state when finished
state lookup
{
    state_entry()
    {
        if( gQueryKeys == [] ) state display;
        llSetTimerEvent(DATA_TIMEOUT);
        gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );
    }
    dataserver( key request_id, string data)
    {
        if( request_id == gDataserver_Name )
        {
            llSetText("Loading Names .. " + (string)llGetListLength(gQueryKeys),<1,.5,0>,1.0);
            if( llStringTrim(data,STRING_TRIM) != "" )
            {
                integer i = llList2Integer(gQueryIndex,0);
                gNames = llListReplaceList(gNames,[data],i,i);
            }
            gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
            gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
 
            if( gQueryKeys != [] )
            {
                llSetTimerEvent(DATA_TIMEOUT);
                gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );
            } else {
                state display;
            }
        }
    }
    timer()
    {
        //Skip it, move on
        gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
        gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
        gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME ); 
    }
}

Deep Notes

This article wasn't helpful for you? Maybe the related article at the LSL Wiki is able to bring enlightenment.
Personal tools
In other languages