<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.osgrid.org/index.php?action=history&amp;feed=atom&amp;title=LlGetParcelPrimOwners</id>
	<title>LlGetParcelPrimOwners - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.osgrid.org/index.php?action=history&amp;feed=atom&amp;title=LlGetParcelPrimOwners"/>
	<link rel="alternate" type="text/html" href="http://wiki.osgrid.org/index.php?title=LlGetParcelPrimOwners&amp;action=history"/>
	<updated>2026-10-25T11:12:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://wiki.osgrid.org/index.php?title=LlGetParcelPrimOwners&amp;diff=171&amp;oldid=prev</id>
		<title>Osgridadmin: Created page with &quot;==Function: list llGetParcelPrimOwners( vector pos );== Returns a list of all residents who own objects on the parcel at pos and with individual prim counts.&lt;br&gt; The list is f...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.osgrid.org/index.php?title=LlGetParcelPrimOwners&amp;diff=171&amp;oldid=prev"/>
		<updated>2017-12-31T22:59:13Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Function: list llGetParcelPrimOwners( vector pos );== Returns a list of all residents who own objects on the parcel at pos and with individual prim counts.&amp;lt;br&amp;gt; The list is f...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Function: list llGetParcelPrimOwners( vector pos );==&lt;br /&gt;
Returns a list of all residents who own objects on the parcel at pos and with individual prim counts.&amp;lt;br&amp;gt;&lt;br /&gt;
The list is formatted as [ key agentKey1, integer agentCount1, key agentKey2, integer agentCount2, ... ], and sorted by agent key with a maximum of 100 strides.&amp;lt;br&amp;gt;&lt;br /&gt;
• vector 	pos 		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
Requires owner-like permissions for the parcel.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Caveats&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• This function causes the script to sleep for 2.0 seconds.&amp;lt;br&amp;gt;&lt;br /&gt;
• 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.&amp;lt;br&amp;gt;&lt;br /&gt;
• If not and the parcel is group owned:&amp;lt;br&amp;gt;&lt;br /&gt;
-• If the resident has the &amp;#039;return group owned objects&amp;#039; power, return a list of just the group if there are any group owned objects on the parcel.&amp;lt;br&amp;gt;&lt;br /&gt;
-• If the resident has the &amp;#039;return group set objects&amp;#039; power return a list of all owners who have objects set to the group on the parcel&amp;lt;br&amp;gt;&lt;br /&gt;
-• If the resident has the &amp;#039;return non-group objects&amp;#039; power return a list of all owners of objects that don&amp;#039;t fall into the above &amp;lt;br&amp;gt;&lt;br /&gt;
• If none of the above cases match, an empty list will be returned &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Examples&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt; &lt;br /&gt;
// Script by Falados Kapuskas&lt;br /&gt;
 &lt;br /&gt;
// The object has the same permisions to view prim parcel owners&lt;br /&gt;
// as its owner (In About Land &amp;gt;&amp;gt; Objects &amp;gt;&amp;gt; Object Owners )&lt;br /&gt;
 &lt;br /&gt;
// Example: If you can&amp;#039;t return group object, you won&amp;#039;t see group objects&lt;br /&gt;
// If you can&amp;#039;t return any objects, an empty list will be returned.&lt;br /&gt;
// If the prim is deeded to the right group, it should always get a full list&lt;br /&gt;
 &lt;br /&gt;
// Note: Only works when the when the owner is in the Sim&lt;br /&gt;
//       Deeded objects always work (group is always online?)&lt;br /&gt;
 &lt;br /&gt;
// -- SETTINGS (Edit These!) -- //&lt;br /&gt;
 &lt;br /&gt;
integer REFRESH_TIMER = 600;            // Refresh Time (in seconds)&lt;br /&gt;
vector  PARCEL_POS    = &amp;lt;128,128,0&amp;gt;;    // A Region coordinate of a point in the parcel&lt;br /&gt;
integer PAGE_SIZE     = 8;              // Number of owners to display per page on the prim&lt;br /&gt;
integer DATA_TIMEOUT  = 10;             // Number of seconds to wait before giving up on dataserver events&lt;br /&gt;
 &lt;br /&gt;
// -- END SETTINGS -- //&lt;br /&gt;
 &lt;br /&gt;
list gQueryKeys;&lt;br /&gt;
list gQueryIndex;&lt;br /&gt;
list gNames;&lt;br /&gt;
list gPrims;&lt;br /&gt;
 &lt;br /&gt;
key gDataserver_Name;&lt;br /&gt;
 &lt;br /&gt;
integer gPageNumber;&lt;br /&gt;
integer gPageMax;&lt;br /&gt;
 &lt;br /&gt;
//Updates the internal list of prim owners&lt;br /&gt;
//Returns TRUE if there were prim owners&lt;br /&gt;
//Returns FALSE if the prim owner list was empty&lt;br /&gt;
integer UpdateOwnerList()&lt;br /&gt;
{&lt;br /&gt;
    list owner_prim = llGetParcelPrimOwners(PARCEL_POS);&lt;br /&gt;
    //Empty List either means no prims in the parcel&lt;br /&gt;
    //Or we couldn&amp;#039;t get the list.  The latter is more likely&lt;br /&gt;
    if( owner_prim == [] ) &lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;[ERROR]\n Couldn&amp;#039;t get Parcel Prim Owners&amp;quot;,&amp;lt;1,0,0&amp;gt;,1.0);&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    integer i;&lt;br /&gt;
    integer n = llGetListLength(owner_prim) / 2;&lt;br /&gt;
 &lt;br /&gt;
    //Reset the lists&lt;br /&gt;
    gPrims = [];&lt;br /&gt;
    gNames = [];&lt;br /&gt;
    gQueryKeys = [];&lt;br /&gt;
    gQueryIndex = [];&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    for( i = 0; i &amp;lt; n; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        key owner = llList2Key(owner_prim,i*2);&lt;br /&gt;
        string name = llKey2Name(owner);&lt;br /&gt;
        if( name == &amp;quot;&amp;quot; ) { //Not in the sim&lt;br /&gt;
 &lt;br /&gt;
            //Add to the query list&lt;br /&gt;
            gNames += [&amp;quot;[Unknown]&amp;quot;];&lt;br /&gt;
            gQueryIndex += [llGetListLength(gNames) - 1];&lt;br /&gt;
            gQueryKeys += [owner];&lt;br /&gt;
        } else {&lt;br /&gt;
            gNames += [name];&lt;br /&gt;
        }&lt;br /&gt;
        gPrims += llList2Integer(owner_prim,i*2+1);&lt;br /&gt;
    }&lt;br /&gt;
    gPageNumber = 0;&lt;br /&gt;
    gPageMax = llCeil( (float)llGetListLength(gNames) / PAGE_SIZE );&lt;br /&gt;
    return TRUE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// Shows the prim owners starting at index 9*page&lt;br /&gt;
// Returns TRUE if there are more pages&lt;br /&gt;
// Returns FALSE otherwise&lt;br /&gt;
integer ShowPrimOwners(integer page)&lt;br /&gt;
{&lt;br /&gt;
    integer len = llGetListLength(gNames);&lt;br /&gt;
    integer offset = len-page*PAGE_SIZE;&lt;br /&gt;
    if(  offset &amp;lt; 0 )&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    integer i;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    integer end = (integer)( llListStatistics(LIST_STAT_MIN,[len,(page+1)*PAGE_SIZE]) );&lt;br /&gt;
    string text;&lt;br /&gt;
    for( i = PAGE_SIZE*page; i &amp;lt; end; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        text += llList2String(gNames,i) + &amp;quot; - &amp;quot; + (string)llList2Integer(gPrims,i) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    llSetText(text,&amp;lt;1,1,1&amp;gt;,1.0);&lt;br /&gt;
    return TRUE;&lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
// Set-up phase &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;&amp;quot;,&amp;lt;1,1,1&amp;gt;,1.0);&lt;br /&gt;
        if(UpdateOwnerList())&lt;br /&gt;
        {&lt;br /&gt;
            if( gQueryKeys == [] )&lt;br /&gt;
            {&lt;br /&gt;
                state display;&lt;br /&gt;
            } else {&lt;br /&gt;
                state lookup;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // If there is an error, touch to reset&lt;br /&gt;
    touch_start(integer i){llResetScript();}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Display the list&lt;br /&gt;
// Allow page flipping via touch&lt;br /&gt;
state display &lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        ShowPrimOwners(gPageNumber);&lt;br /&gt;
        llSetTimerEvent(REFRESH_TIMER);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        if( !ShowPrimOwners(++gPageNumber) )&lt;br /&gt;
        {&lt;br /&gt;
            gPageNumber = 0;&lt;br /&gt;
            ShowPrimOwners(0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Look up all names for people that are not in the sim&lt;br /&gt;
// Go to the display state when finished&lt;br /&gt;
state lookup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        if( gQueryKeys == [] ) state display;&lt;br /&gt;
        llSetTimerEvent(DATA_TIMEOUT);&lt;br /&gt;
        gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );&lt;br /&gt;
    }&lt;br /&gt;
    dataserver( key request_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if( request_id == gDataserver_Name )&lt;br /&gt;
        {&lt;br /&gt;
            llSetText(&amp;quot;Loading Names .. &amp;quot; + (string)llGetListLength(gQueryKeys),&amp;lt;1,.5,0&amp;gt;,1.0);&lt;br /&gt;
            if( llStringTrim(data,STRING_TRIM) != &amp;quot;&amp;quot; )&lt;br /&gt;
            {&lt;br /&gt;
                integer i = llList2Integer(gQueryIndex,0);&lt;br /&gt;
                gNames = llListReplaceList(gNames,[data],i,i);&lt;br /&gt;
            }&lt;br /&gt;
            gQueryKeys = llDeleteSubList(gQueryKeys,0,0);&lt;br /&gt;
            gQueryIndex = llDeleteSubList(gQueryIndex,0,0);&lt;br /&gt;
 &lt;br /&gt;
            if( gQueryKeys != [] )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(DATA_TIMEOUT);&lt;br /&gt;
                gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );&lt;br /&gt;
            } else {&lt;br /&gt;
                state display;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Skip it, move on&lt;br /&gt;
        gQueryKeys = llDeleteSubList(gQueryKeys,0,0);&lt;br /&gt;
        gQueryIndex = llDeleteSubList(gQueryIndex,0,0);&lt;br /&gt;
        gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME ); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osgridadmin</name></author>
	</entry>
</feed>