Add a new function to allow objects to take back into their inventory a rezzed object.
Something like:
void llTakeObject(key id, string name)
or (if dataserver event is to be used):
key llTakeObject(key id, string name)
Where id is the UUID of the object to take and name is the proposed inventory name.
The empty string "" for the name can be used to signify the taken object's name should be used.
In either case, the renaming of a duplicate would still apply.
This function would be restricted to only taking objects that:
a) were created by llRezObject, llRezAtRoot or llRezObjectWithParams
b) hasn't changed owner
Taking an object will take some time, so a script would use the change event's CHANGED_INVENTORY to know when the item was in the inventory.
Alternatively a dataserver event could also be raised.
This function would be useful for enabling rezzers to support rezzing out no-copy objects. The rezzer would be able to take back the no-copy object when asked to derez.
It could also be used to rez out a no-transfer object that can be interacted with by a user and then taken back, obviating the need to have a transfer object that the user has to take to their inventory and then drag onto the original object (I've seen cases where people drag the wrong thing into objects, and worse where multiple items got accidently included in the drag).