Difference between revisions of "LlGetParcelPrimOwners"
Miki Gymnast (talk | contribs) |
|||
Line 6: | Line 6: | ||
|func_footnote=Requires owner-like permissions for the parcel. | |func_footnote=Requires owner-like permissions for the parcel. | ||
|spec | |spec | ||
|caveats=*The object | |caveats= | ||
* The object has the same permisions to view prim parcel owners as its owner. | |||
* Only works when the when the owner is in the sim | |||
** If the object is deeded, it will always work regardless of the previous owner's status | |||
|constants | |constants | ||
|examples= | |examples= | ||
<lsl> | <lsl> | ||
// Script by | // 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 | 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 | default | ||
{ | { | ||
state_entry() | 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 ); | |||
} | } | ||
}</lsl> | }</lsl> |
Revision as of 02:33, 30 June 2009
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: list llGetParcelPrimOwners( vector pos );324 | Function ID |
2.0 | Forced 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.
- The object has the same permisions to view prim parcel owners as its owner.
- Only works when the when the owner is in the sim
- If the object is deeded, it will always work regardless of the previous owner's status
Examples
<lsl> // 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 ); }}</lsl>