Jump to content

OpenSimulator Internals/Walkthroughs/Avatar Removes From Inventory

From Open Simulator Technical Help
Revision as of 13:15, 7 July 2026 by Jwbshaw (talk | contribs) (first)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

OpenSimulator Internals/Walkthroughs/Avatar Removes From Inventory

[edit]

Overview

[edit]

Traces what happens when an avatar deletes an item from inventory, moves it to trash, or purges the trash folder. Also covers the Return Object path (estate/parcel manager returning an object to owner's Lost and Found).


Case 1: Delete Item (Move to Trash)

[edit]

Avatar selects an item and deletes it (moves to Trash folder).

1. Client Sends RemoveInventoryItem

[edit]
OpenSim/Region/Framework/Scenes/Scene.cs -- RemoveInventoryItem()
  1. Viewer sends RemoveInventoryItem packet.
  2. Scene.RemoveInventoryItem() calls InventoryService.DeleteItems(agentID, [itemID]) if permitted.

Wait -- DeleteItems moves to trash in v2 protocol or deletes directly depending on implementation. In OpenSim's XInventoryService, DeleteItems() marks the item deleted (moves to system trash folder or removes depending on config).

DB writes
  • inventoryitems -- UPDATE or DELETE depending on server config

Case 2: Purge Folder (Empty Trash)

[edit]

Avatar right-clicks Trash folder and selects Empty Trash.

1. Client Sends PurgeInventoryDescendents

[edit]
  1. Viewer sends PurgeInventoryDescendents packet with folderID = Trash folder UUID.
  2. Scene.HandlePurgeInventoryDescendents() calls InventoryService.PurgeFolder(folder).
  3. ROBUST XInventoryService: deletes all items and subfolders recursively from inventoryitems and inventoryfolders tables.
DB writes
  • inventoryitems -- DELETE: all items in folder and subfolders
  • inventoryfolders -- DELETE: all subfolders (not the trash folder itself)

Case 3: Delete Object from World (DeRez to Trash)

[edit]

Avatar right-clicks object in world and selects Delete (not Take).

1. Client Sends DeRezObject with action=Delete

[edit]
BasicInventoryAccessModule -- CopyToInventory(DeRezAction.Delete)
  1. If deleting own object: destination folder = Trash (FolderType.Trash).
  2. If deleting another's object (estate manager): destination = owner's Lost and Found (FolderType.LostAndFound).
  3. CopyBundleToInventory() runs: serialises object, creates asset, inserts inventory item in appropriate folder.
  4. Scene.DeleteSceneObject() removes object from scene and region storage.
DB writes
  • assets -- INSERT: serialised object XML
  • inventoryitems -- INSERT: item in Trash or LostAndFound
  • prims/primshapes/primitems -- DELETE: object removed from region

Case 4: Return Object (Parcel/Estate Manager)

[edit]

Estate manager or parcel owner returns an object to its owner's inventory.

1. Return Triggered

[edit]
OpenSim/Region/Framework/Scenes/Scene.cs -- returnObjects()
  1. Parcel manager calls returnObjects() for objects on the parcel.
  2. Calls IInventoryAccessModule.CopyToInventory(DeRezAction.Return, UUID.Zero, objlist, null, false).
    • remoteClient is null -- return is server-initiated.
    • Destination folder: owner's Lost and Found (FolderType.LostAndFound).
  3. AddPermissions() with null remoteClient: same-owner path, perms preserved.
  4. Asset created, item inserted.
  5. Scene.AddReturn() queues a notification message to the owner.
  6. Scene.DeleteSceneObject() removes from scene.

On next backup cycle, Scene.Backup() processes m_returns:

  • Sends GridInstantMessage to the owner: "Your object X was returned from parcel Y in region Z due to [reason]."
DB writes
  • assets -- INSERT: serialised object XML
  • inventoryitems -- INSERT: item in Lost and Found
  • prims/primshapes/primitems -- DELETE

Summary: DB Tables Touched

[edit]
Case Table Operation
Delete item inventoryitems UPDATE/DELETE
Purge folder inventoryitems, inventoryfolders DELETE recursive
Delete object assets, inventoryitems INSERT; prims DELETE
Return object assets, inventoryitems INSERT; prims DELETE

See Also

[edit]