llGetOwner

From Second Life Wiki
Revision as of 06:53, 10 April 2012 by Madpeter Zond (talk | contribs) (added note about llGetOwner returning unexpected values)
Jump to navigation Jump to search

Summary

Function: key llGetOwner( );
0.0 Forced Delay
10.0 Energy

Returns a key that is the object owner's UUID.

Caveats

  • When the owner of an object changes, code that depends on this function's return value will not automatically update for the new owner or be automatically re-evaluated.
    • This requires the reregistration of listens and requesting of permissions from the new owner as needed.
      • This is not limited to listens and permissions but anything that caches the return value, it is up to the programmer to work around this limitation.
    • Detection of owner change can be achieved with the changed event in conjunction with the CHANGED_OWNER flag (see the second example) or by storing the old value and periodically (e.g. in on_rez) checking if it has changed. Both techniques are valid though the latter will not detect the sale of the object if it is sold with "sell original" in-world and not picked up.
  • When the object is deeded to a group, the UUID returned is that of the group.
  • When the owner is offline the region can lose the owner uuid and return NULL_KEY or (Loading)... in some rare cases.

Examples

<lsl>llOwnerSay( (string)llGetOwner()); // speaks in chat the "key" (UUID code) of the avatar. llOwnerSay( llKey2Name(llGetOwner())); // speaks in chat the name of the owner if in the sim.</lsl>

<lsl>default {

   state_entry()
   {
       llInstantMessage(llGetOwner(), "Only you can hear me. Isn't that eerie.");
   }
   changed(integer change)
   {
       if (change & CHANGED_OWNER)
           llResetScript();
   }
}</lsl>

Notes

To retrieve the owners name while the owner is in the region use llKey2Name, llRequestAgentData should be used when the owner is not in the region.

The one problem many coders come up against is that previously-activated events referring to the owner don't automatically change when the owner changes. The most often-seen result is a listen registered to owner will continue to listen to the PREVIOUS owner rather than the CURRENT owner. It is often confused as a bug in llGetOwner or llListen it is not in fact a bug but part of the design. There are several ways of working around this problem. The easy solution is to reset the script when owner changes or it is rezzed. The easy solution is not always the right solution.

There are two ways to detect if the owner has changed, the most reliable is to use the changed event. <lsl>changed(integer change) {

   if (change & CHANGED_OWNER)//if owner changes, reset the script.
       llResetScript();

}</lsl>

In many applications resetting the script when the object is rezzed is an adequate and easy solution. <lsl>on_rez(integer start_param) { //when the object is rezzed, reset the script.

   llResetScript();

}</lsl>

Resetting the script is not appropriate if the script needs to keep it's data when it's ownership is transfered or if script startup is slow, in these situations listens will need to be re-keyed to the new owner along with any other owner specific code, like who the script is supposed to be animating.

The on_rez and changed events can be harnessed to reinitialize owner specific code every time the object is rezzed or changes owner.

<lsl>integer listen_handle;

init() {

   key owner = llGetOwner();
   llListenRemove(listen_handle);
   listen_handle = llListen(0, "", owner, "");
   llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);

}

default {

   state_entry()
   {
       init();
       //insert additional startup code here that doesn't need to run each rez/owner change
       //for example, reading settings from a notecard
   }
   on_rez(integer start)
   {
       init();
   }
   changed(integer change)
   {
       if (change & CHANGED_OWNER)
           init();
   }
   run_time_permissions(integer perm)
   {//always use the run_time_permissions event with llRequestPermissions, never assume
       if(perm & PERMISSION_TRIGGER_ANIMATION)
       {
           //setup your animation code here, start your timers, etc.
           llOwnerSay("I have animation permissions");
       }
   }

}</lsl>

See Also

Functions

•  llGetCreator
•  llGetOwnerKey
•  llDetectedOwner

Deep Notes

Signature

function key llGetOwner();