An item was dropped (into this object's inventory) that was only allowed by the llAllowInventoryDropfunction. This allows the object to identify items dropped by anyone who doesn't have modify permissions on the object.

CHANGED_OWNER

0x80

The ownership of the object changed. This value is passed when an object is deeded to a group, when an object is purchased, or when a newly-purchased object is rezzed.

These values are bitwise and can be ORed or ANDed together.
Two flags can show up in the same event trigger; it has been seen when resizing an object with the "Stretch Textures" box unchecked so the texture scale (repeats) changes as the prim is resized. Also, the CHANGED_REGION and CHANGED_TELEPORT seem to come in tandem.

With this in mind, always write "if (change & CHANGED_LINK)" rather than "if (change == CHANGED_LINK)" so that the contents of your event will be triggered in all cases. Likewise, using IF/ELSEs (as in "else if (change & CHANGED_SCALE)") could theoretically result in only one of the triggers being counted. If you stick to with IF statements only, your changed event will need to perform a check for each IF statement, but it will catch all triggers in the very rare event of a simultaneous trigger.

Notes:

The change parameter describes only what type of change happened, not the difference between the original and changed versions of the object. If you need to determine exactly what changed, the script must store the relevant properties and compare the values from before and after the change.

When an avatar sits on an object, they seem to become part of the linkset.

A changed() event is raised with CHANGED_LINK as the parameter when an avatarsits on an object or un-sits. To find out what happened, use llAvatarOnSitTarget which returns the NULL_KEY if no avatar is sitting on the object, or the key of the avatar that is sitting at the sit target.

in the original object when a user takes the object or a copy of the object.

in the newly-rezzed copy when the user rezzes the object for the first time. (on_rez() is still triggered first.) This occurs whether or not the object was copied or purchased.

when an object is deeded to a group.

in the original object when the user buys the contents of an object. It is still triggered in the copy when the new owner rezzes it.

CHANGED_REGION

in the root prim of an attachment when the user teleports to a new sim/region or crosses into a new sim directly.

in the root prim of an object that moves into a new region.

in a child prim of an attachment when the user teleports to a new region.

in a child prim of an object that moves into a new region.

after taking the object into inventory, moving/teleporting to a new region and rezzing it there - it is only triggered if the object moves into a new region while it is rezzed

CHANGED_TELEPORT

in the root prim of an attachment when the user teleports to a new sim, or a location within the current sim. This happens whether they teleport manually, or using one of the teleport functions.

in a child prim of an attachment when the user teleports to a different location.

in any prim in an attachment when the user sits on an object that uses the llSitTarget "sit teleport" trick.

in any prim in an unattached object.

in an attachment, after teleporting to no-script land, not even being entered into the event queue. This means it will not be triggered after teleporting to a region where scripts are allowed, only the event for that teleport will be triggered.

(As of Second Life 1.16.0 (5) this is not accurate. Teleporting into no-script land will cause the event to trigger once you move onto script-enabled land, as though you had just teleported.)

Q & A

Q:How do I find out when my object has changed position or rotation?A:You can't, not by using changed(). The moving_start() and moving_end() event handlers are triggered when the object is moved. To find out when the object is rotated, your best option is to use a timer. (Unless, of course, your object is an attachment, in which case, it will never merely rotate, but will change position constantly, triggering moving_start() and moving_end().)

Q:Regarding bitwise operations: it says above that scale and textures "have been seen" changing at the same time. Does that mean that both CHANGED_TEXTURE and CHANGED_SCALE will always be triggered while scaling a texture with an object?A:Not necessarily, it just means that they occasionally will be triggered together. You can't predict when this will happen, or even if it will. Make your code able to deal with all possibilities. Assumptions will often produce code that fails, with little indication as to why. As it says above, always write "if (change & CHANGED_LINK)" rather than "if (change == CHANGED_LINK)" so that the contents of your event will be triggered in all cases.

Q:Is there a way to detect when a user buys an object?A:Yes. Specifying CHANGED_OWNER for change will let you filter the results of changed(). See the details section for specifics.To detect when a user pays an object, you want the money() event handler.

Q:Is there a way to be notified via an event when a script is added or removed from the object's inventory?A:No. Your only option is to use a timer to regularly compare the current inventory to a list of preexisting scripts.A: "The above answer is wrong. Use CHANGED_INVENTORY to compare the current inventory to a list of preexisting scripts, not a timer."A: "Both answers are correct. You can detect when something gets added with a changed event, but NOT when it gets removed. It needs a timer to detect removals."