Difference between revisions of "LlGetParcelPrimOwners"

From Second Life Wiki
Jump to navigation Jump to search
(LI)
m (check no prims case)
Line 44: Line 44:
// Script by Falados Kapuskas
// Script by Falados Kapuskas
// Fix added by dominic Pyara
// Fix added by dominic Pyara
 
// The object has the same permisions to view prim parcel owners
// The object has the same permisions to view prim parcel owners
// as its owner (In About Land >> Objects >> Object Owners )
// as its owner (In About Land >> Objects >> Object Owners )
 
// Example: If you can't return group object, you won't see group objects
// 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 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
// If the prim is deeded to the right group, it should always get a full list
 
// Note: Only works on group owned land when the object owner is in the Sim
// Note: Only works on group owned land when the object owner is in the Sim
//      Deeded objects always work (group is always online?)
//      Deeded objects always work (group is always online?)
 
// -- SETTINGS (Edit These!) -- //
// -- SETTINGS (Edit These!) -- //
 
integer REFRESH_TIMER = 600;            // Refresh Time (in seconds)
integer REFRESH_TIMER = 10;            // Refresh Time (in seconds)
vector  PARCEL_POS    = <128,128,0>;    // A Region coordinate of a point in the parcel
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 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
integer DATA_TIMEOUT  = 10;            // Number of seconds to wait before giving up on dataserver events
 
// -- END SETTINGS -- //
// -- END SETTINGS -- //
 
list gQueryKeys;
list gQueryKeys;
list gQueryIndex;
list gQueryIndex;
list gNames;
list gNames;
list gPrims;
list gPrims;
 
key gDataserver_Name;
key gDataserver_Name;
 
integer gPageNumber;
integer gPageNumber;
integer gPageMax;
integer gPageMax;
Line 79: Line 79:
integer UpdateOwnerList()
integer UpdateOwnerList()
{
{
     list owner_prim = llGetParcelPrimOwners(PARCEL_POS);
     list owner_prim;
    //Empty List either means no prims in the parcel
    if ( llGetParcelPrimCount(PARCEL_POS, PARCEL_COUNT_TOTAL, FALSE) > 0 )
    //Or we couldn't get the list.  The latter is more likely
    {
    if( owner_prim == [] )  
        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;
        }
    }
    else
     {
     {
        llSetText("[ERROR]\n Couldn't get Parcel Prim Owners",<1,0,0>,1.0);
            llSetText("No objects rezzed on parcel",<1,1,0>,1.0);
        return FALSE;
            return FALSE;      
     }
     }
     integer i;
     integer i;
     integer n = llGetListLength(owner_prim) / 2;
     integer n = llGetListLength(owner_prim) / 2;
   
     //Reset the lists
     //Reset the lists
     gPrims = [];
     gPrims = [];
Line 95: Line 104:
     gQueryKeys = [];
     gQueryKeys = [];
     gQueryIndex = [];
     gQueryIndex = [];
   
   
     for( i = 0; i < n; ++i)
     for( i = 0; i < n; ++i)
     {
     {
Line 102: Line 111:
         string name = llKey2Name(owner);
         string name = llKey2Name(owner);
         if( name == "" ) { //Not in the sim
         if( name == "" ) { //Not in the sim
       
             //Add to the query list
             //Add to the query list
             gNames += ["[Unknown]"];
             gNames += ["[Unknown]"];
Line 116: Line 125:
     return TRUE;
     return TRUE;
}
}
 
 
// Shows the prim owners starting at index 9*page
// Shows the prim owners starting at index 9*page
// Returns TRUE if there are more pages
// Returns TRUE if there are more pages
Line 130: Line 139:
     }
     }
     integer i;
     integer i;
   
 
     integer end = (integer)( llListStatistics(LIST_STAT_MIN,[len,(page+1)*PAGE_SIZE]) );
     integer end = (integer)( llListStatistics(LIST_STAT_MIN,[len,(page+1)*PAGE_SIZE]) );
     string text;
     string text;
Line 141: Line 150:
     return TRUE;
     return TRUE;
}  
}  
 
// Set-up phase  
// Set-up phase  
default
default
Line 161: Line 170:
     touch_start(integer i){llResetScript();}
     touch_start(integer i){llResetScript();}
}
}
 
// Display the list
// Display the list
// Allow page flipping via touch
// Allow page flipping via touch
Line 184: Line 193:
     }
     }
}
}
 
// Look up all names for people that are not in the sim
// Look up all names for people that are not in the sim
// Go to the display state when finished
// Go to the display state when finished
Line 207: Line 216:
             gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
             gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
             gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
             gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
           
             if( gQueryKeys != [] )
             if( gQueryKeys != [] )
             {
             {

Revision as of 03:56, 23 December 2013

Summary

Function: list llGetParcelPrimOwners( vector pos );

Returns a list of all residents who own objects on the parcel at pos and with individual land impact used.
The list is formatted as [ key agentKey1, integer agentImpact1, key agentKey2, integer agentImpact2, ... ], and sorted by agent key with a maximum of 100 strides.

• vector pos position in region coordinates

Requires owner-like permissions for the parcel.

Specification

Ownership

  • If the parcel owner and object owner are the same (including if the object and parcel are both group owned):
    • All object owners are returned.
  • If the parcel is group owned but the object is owned by a member of the group, the function return depends upon what powers they have been granted:
    • If resident has the 'return group owned objects' power:
      • The return list includes the group and the LI of objects it owns on the parcel.
    • If the resident has the 'return group set objects' power:
      • The return list includes all owners who have objects set to the group on the parcel
    • If the resident has the 'return non-group objects' power
      • The return list includes all owners of objects that don't fall into the above two categories.
  • If none of the above cases match, an empty list will be returned.
Pseudocode
Pseudocode written in Javascript

<javascript> if(parcel_owner == object_owner)

   return all;

var r = []; if((parcel_owner is Group) && (object_owner in parcel_owner.members)) {

 if("return group owned objects" in parcel_owner.members[object_owner].powers)
   r = r.concat(group_owned_stride);
 if("return group set objects" in parcel_owner.members[object_owner].powers)
   r = r.concat(group_set_strides);
 if("return non-group objects" in parcel_owner.members[object_owner].powers)
   r = r.concat(non_group_strides);

} return r; </javascript>

Caveats

  • This function causes the script to sleep for 2.0 seconds.
  • Function WILL NOT work on group owned land if the owner of the object where this function resides is not currently online and connected to the sim (although now seems to be working for land owner on privately owned land even when the owner is not around).
    • These limitation can be overcome by deeding the object to a group the object owner is one of the owners of.
    • Remember to take a copy before deeding because you cannot undeed something.
All Issues ~ Search JIRA for related Bugs

Examples

<lsl> // Script by Falados Kapuskas // Fix added by dominic Pyara

// 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 on group owned land when the object owner is in the Sim // Deeded objects always work (group is always online?)

// -- SETTINGS (Edit These!) -- //

integer REFRESH_TIMER = 10; // 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;
   if ( llGetParcelPrimCount(PARCEL_POS, PARCEL_COUNT_TOTAL, FALSE) > 0 )
   {
       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;
       }
   }
   else
   {
           llSetText("No objects rezzed on parcel",<1,1,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);
           if( gQueryKeys != [] )
           {
               llSetTimerEvent(DATA_TIMEOUT);
               gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );
           } else {
               state display;
           } 
   }
}</lsl>

Deep Notes

Search JIRA for related Issues

Signature

function list llGetParcelPrimOwners( vector pos );