Difference between revisions of "Changed"

From Second Life Wiki
Jump to navigation Jump to search
(Altered text making reference to a list and cases not specific to this article. Clarified meaning of "won't recognise". Beware when copy pasting that the addition suits its new home.)
(Remove redundancy, grammar errors, inaccuracies)
Line 18: Line 18:
|mode
|mode
|notes=
|notes=
*Always test the value of '''change''', e.g. <code>if(change & CHANGED_INVENTORY){DoStuff();}</code> unless you want your script to act upon any change that triggers it.
*Always test the value of '''change''' unless you want your script to act upon any change that triggers it.
**Also: New return values (i.e. new flags and/or '''change''' scenarios) could conceivably be added by LL at any time so, scripts should be written under the assumption that they may (in the future) receive a value not reasonably expected at the time of writing. For future proof scripts simply use bitwise conditions as in the examples on this page.
**New CHANGED_* flags, bugs and bug fixes could conceivably be added by LL at any time. Scripts should be written under the assumption that they will receive ''changed'' events not expected at the time or place of writing. For future proof scripts, use bitwise conditions as in the examples.
*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 15:26, 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 unless you want your script to act upon any change that triggers it.
    • New CHANGED_* flags, bugs and bug fixes could conceivably be added by LL at any time. Scripts should be written under the assumption that they will receive changed events not expected at the time or place of writing. For future proof scripts, use bitwise conditions as in the examples.
  • 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 );