Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Special pages
Open Simulator Technical Help
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
OpenSimulator Internals/Walkthroughs/Avatar Acquires Inventory
(section)
Page
Discussion
English
Read
Edit
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
View history
General
What links here
Related changes
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
= OpenSimulator Internals/Walkthroughs/Avatar Acquires Inventory = == Overview == Traces what happens in code, connectors, and database when an avatar acquires an object into inventory. Covers three cases: # Taking a copyable object from the world (Take Copy). # Taking a no-copy object from the world (Take / derez). # Buying an object from another avatar or vendor (buy object). Avatar-to-avatar direct inventory transfer (Give Inventory) is a separate flow not covered here. ---- == Case 1: Take Copy (copyable object) == Avatar right-clicks an object they have copy permission on and selects Take Copy. === 1. Client Sends DeRezObject === OpenSim/Region/Framework/Scenes/Scene.cs -- DeRezObjects() # Viewer sends DeRezObject packet with action = TakeCopy. # Scene.DeRezObjects() fires. # Permission check: CanTakeObject() for the SOG. # If passing: calls IInventoryAccessModule.CopyToInventory(DeRezAction.TakeCopy, folderID, objlist, remoteClient, false). # Object remains in scene -- Take Copy does not delete it. === 2. Object Serialised to Asset === BasicInventoryAccessModule -- CopyBundleToInventory() # Suspends keyframe motion. # Records current world position/rotation. # Serialises SOG to XML via SceneObjectSerializer.ToOriginalXmlFormat() (single object) or CoalescedSceneObjectsSerializer (multiple selected). # Restores position. # Calls CreateItemForObject(TakeCopy): #* Destination folder: Object folder (FolderType.Object). #* Owner: remoteClient.AgentId. # Calls AddPermissions() -- same-owner path: copies current perms, preserves folded bits, applies NextOwnerMask to NextPermissions. # Creates asset: UUID.Random(), AssetType.Object, stores via AssetService.Store(). # Calls Scene.AddInventoryItem() β InventoryService.AddItem(). # Sends SendInventoryItemCreateUpdate() to client. ; DB writes: * assets -- INSERT: serialised object XML * inventoryitems -- INSERT: new item in Object folder === 3. HG Asset Post (HG users only) === HGInventoryAccessModule -- ExportAsset() If avatar is a foreign HG user and OutboundPermission=true: * m_assMapper.Post(assetID, agentID, foreignAssetServer) -- HTTP POST to push asset to foreign grid. ---- == Case 2: Take (no-copy object, or owner taking back own object) == Avatar takes a no-copy object, or picks up their own placed object. === 1. Client Sends DeRezObject === # Viewer sends DeRezObject packet with action = Take. # Same permission check path. # Calls IInventoryAccessModule.CopyToInventory(DeRezAction.Take, folderID, objlist, remoteClient, false). === 2. Object Serialised (same as Take Copy) === CopyBundleToInventory() with Take: * Destination folder: original FromFolderID if owner taking back own item and folder still valid; otherwise Object folder. * Asset created and stored, inventory item inserted. === 3. Object Removed from Scene === DoPostRezWhenFromItem(): * If item is no-copy (CurrentPermissions & Copy == 0): InventoryService.DeleteItems() removes item from inventory first (item was previously there for the no-copy object). Scene.DeRezObjects() also: * Calls DeleteSceneObject() -- removes SOG from scene graph, removes from SimulationDataService (prims table). ; DB writes: * assets -- INSERT: serialised object XML * inventoryitems -- INSERT: new item (or UPDATE if SaveToExisting) * inventoryitems -- DELETE: original no-copy item if applicable * prims/primshapes -- DELETE: object removed from region storage ---- == Case 3: Buy Object == Avatar buys an object set for sale (right-click β Buy). === 1. Client Sends ObjectBuy === OpenSim/Region/Framework/Scenes/Scene.cs -- ProcessObjectBuy() (via IBuySellModule) # Viewer sends ObjectBuy packet with price. # IBuySellModule.BuyObject() called. # Checks sale type and price. # If sale type is Copy: calls IInventoryAccessModule.CopyToInventory(DeRezAction.TakeCopy) -- same as Take Copy path above. Object stays in scene. # If sale type is Original: calls IInventoryAccessModule.CopyToInventory(DeRezAction.Take). Object leaves scene. # If sale type is Contents: copies contents of the object's inventory to buyer's inventory, not the object itself (separate path via task inventory). Money transfer (if price > 0): * IBuySellModule calls IMoneyModule.ObjectBuy() -- money transfer between accounts. This is grid-specific; base OpenSim has no money module by default. ; DB writes (object sale): * Same as Take or Take Copy depending on sale type. ---- == Permissions Applied on Acquire == AddPermissions() is the key method. Two paths: New owner (buyer or taker who is not the original owner) and PropagatePermissions=true: * effectivePerms = intersection of all parts' CurrentAndFoldedNextPermissions(). * Applies PermissionsUtil.ApplyNoModFoldedPermissions(). * basePerms = effectivePerms & RootPart.NextOwnerMask. * Fixes and folds: PermissionsUtil.FixAndFoldPermissions(). * Sets ObjectSlamPerm flag -- permissions applied again on rez. Same owner (taking back own object): * effectivePerms = intersection of current perms. * NextPermissions = RootPart.NextOwnerMask & effectivePerms. * No slam flag. ---- == Summary: DB Tables Touched == {| class="wikitable" ! Table !! Operation !! Case |- | assets || INSERT || All cases: new serialised object asset |- | inventoryitems || INSERT || All cases: new inventory item |- | inventoryitems || DELETE || No-copy Take: removes existing item |- | prims/primshapes/primitems || DELETE || Take (no-copy) or Take (own object): removes from region |} ---- == HG Suitcase Note == When a local user is abroad (HG), ProcessInventoryForHypergriding() has renamed their non-suitcase folders to "(Unavailable)". Items they acquire while abroad go into My Suitcase (the only accessible folder). On return home, ProcessInventoryForComingHome() restores the full inventory view. Foreign users acquiring objects: ExportAsset() posts the asset to their home grid's asset server if OutboundPermission=true. ---- == See Also == * [[OpenSimulator Internals/Walkthroughs]] * [[OpenSimulator Internals/Code Map/InventoryAccessModule]] * [[OpenSimulator Internals/Walkthroughs/Avatar Rezzes Inventory]] * [[OpenSimulator Internals/Walkthroughs/Avatar Removes From Inventory]] * [[OpenSimulator Internals/Walkthroughs/Avatar Rezzes Box]] * [[OpenSimulator Internals/Walkthroughs/Avatar Derezzes Object]]
Summary:
Please note that all contributions to Open Simulator Technical Help may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Open Simulator Technical Help:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Search
Search
Editing
OpenSimulator Internals/Walkthroughs/Avatar Acquires Inventory
(section)
Add topic