Difference between revisions of "Changed"

From Second Life Wiki
Jump to navigation Jump to search
(Unambiguous note serving to advise to check what change has occurred.)
(replace bizarre "feeling" terminology with copypasta from Strife's caveat to llGetAnimation.)
Line 18: Line 18:
|mode
|mode
|notes=
|notes=
*Always check what '''change''' has occurred with a condition eg. <code>if(change & CHANGED_INVENTORY){DoStuff();}</code> or your script will react to all and every change it "feels".
*Always test the value of '''change''', e.g. <code>if(change & CHANGED_INVENTORY){DoStuff();}</code>. New return values and cases could conceivably be added at any time and this list may not in-fact be complete. Scripts should be written under the assumption that they may receive a value they won't recognize.
*See [[llGetOwner]] for a full discussion on " (change & CHANGED_OWNER) "
*See [[llGetOwner]] for a full discussion on " (change & CHANGED_OWNER) "
*If leaving a [[state]] from within a changed event that registers a change just before the [[state]] change, on return to that state the changed event will trigger. For example -
*If leaving a [[state]] from within a changed event that registers a change just before the [[state]] change, on return to that state the changed event will trigger. For example -

Revision as of 14:43, 23 July 2011

Description

Event: changed( integer change ){ ; }

Various changes to the object/prim trigger this event.

• integer change bit field of CHANGED_* flags

Multiple changes can be represented in a single event, so use bitwise arithmetic.

Flag Description Scope
CHANGED_INVENTORY 0x001 Prim inventory has changed[1]. prim
CHANGED_COLOR 0x002 Prim color or alpha parameters have changed. prim
CHANGED_SHAPE 0x004 Prim shape has changed. prim
CHANGED_SCALE 0x008 Prim scale has changed. prim
CHANGED_TEXTURE 0x010 Prim texture parameters have changed. prim
CHANGED_LINK 0x020 The number of prims making up the object or avatars seated on the object have changed. object
CHANGED_ALLOWED_DROP 0x040 A user other than the owner (or the owner if the object is no-mod) has added inventory to the prim. prim
CHANGED_OWNER 0x080 The object has changed owners. object
CHANGED_REGION 0x100 The object has changed region. object
CHANGED_TELEPORT 0x200 The avatar to whom this object is attached has teleported. object
CHANGED_REGION_START 0x400 The region this object is in has just come online. region
CHANGED_MEDIA 0x800 Prim Media has changed. prim
CHANGED_RENDER_MATERIAL 0x1000 Render Material has changed. Caveat: This parameter will be supported in the upcoming GLTF Materials project. Currently it will only work in supported testing areas with a supported test viewer. prim

Caveats


Examples

<lsl>default {

   changed(integer change)
   {
       //note that it's & and not &&... it's bitwise!
       if (change & CHANGED_INVENTORY)         
       {
           llOwnerSay("The inventory has changed.");
       }
       if (change & CHANGED_COLOR) 
       {
           llOwnerSay("The color or alpha changed.");
       }
       if (change & CHANGED_SHAPE) 
       {
           llOwnerSay("The prims shape has changed.");
       }
       if (change & CHANGED_SCALE) 
       {
           llOwnerSay("The prims size has changed.");
       }
       if (change & CHANGED_TEXTURE) 
       {
           llOwnerSay("The prims texture or texture attributes have changed.");
       }
       if (change & CHANGED_LINK) 
       {
           llOwnerSay("The number of links have changed.");
       }
       if (change & CHANGED_ALLOWED_DROP) 
       {
           llOwnerSay("The inventory has changed as a result of a user without mod permissions "+
                      "dropping an item on the prim and it being allowed by the script.");
       }
       if (change & CHANGED_OWNER) 
       {
           llOwnerSay("The owner of the object has changed.");
       }
       if (change & CHANGED_REGION) 
       {
           llOwnerSay("The region the object is in has changed.");
       }
       if (change & CHANGED_TELEPORT) 
       {
           llOwnerSay("The object has been teleported while attached.");
       }
       if (change & CHANGED_REGION_START) 
       {
           llOwnerSay("The regions has just restarted.");
       }
   }

}</lsl>For the same action to be called for multiple changes we can use the following syntax.<lsl>default {

   changed(integer change)
   {
       if(change & (CHANGED_OWNER

Notes

  • Always test the value of change, e.g. if(change & CHANGED_INVENTORY){DoStuff();}. New return values and cases could conceivably be added at any time and this list may not in-fact be complete. Scripts should be written under the assumption that they may receive a value they won't recognize.
  • See llGetOwner for a full discussion on " (change & CHANGED_OWNER) "
  • If leaving a state from within a changed event that registers a change just before the state change, on return to that state the changed event will trigger. For example -

<lsl>default {

   changed(integer change)
   {
       if(change & CHANGED_LINK)
       {
           integer links = 0;
           if(llGetObjectPrimCount(llGetKey()) < (links = llGetNumberOfPrims()))
           {
               llUnSit(llGetLinkKey(links));
               state whatever;
           }
           else
           llOwnerSay("Some kind of linking or unlinking has changed me but, I am not being sat on.");
           // This will be chatted after returning to the default state.
       }
   }

} state whatever {

   state_entry()
   {
       llSetTimerEvent(10.0);
   }
   timer()
   {
       state default;
   }

}</lsl>

Deep Notes

Footnotes

  1. ^ CHANGED_INVENTORY won't be triggered if the inventory change was caused by a script function or a user taking advantage of llAllowInventoryDrop

Signature

event void changed( integer change );