<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://osimdev.org/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenSimulator_Internals%2FWalkthroughs%2FAvatar_Rezzes_Inventory</id>
	<title>OpenSimulator Internals/Walkthroughs/Avatar Rezzes Inventory - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://osimdev.org/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenSimulator_Internals%2FWalkthroughs%2FAvatar_Rezzes_Inventory"/>
	<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Walkthroughs/Avatar_Rezzes_Inventory&amp;action=history"/>
	<updated>2026-08-04T15:37:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Walkthroughs/Avatar_Rezzes_Inventory&amp;diff=88&amp;oldid=prev</id>
		<title>Jwbshaw: first</title>
		<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Walkthroughs/Avatar_Rezzes_Inventory&amp;diff=88&amp;oldid=prev"/>
		<updated>2026-07-07T13:14:30Z</updated>

		<summary type="html">&lt;p&gt;first&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= OpenSimulator Internals/Walkthroughs/Avatar Rezzes Inventory =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Traces what happens in code, connectors, and database when an avatar rezzes an object from inventory into the world.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 1. Client Sends RezObject ==&lt;br /&gt;
&lt;br /&gt;
 OpenSim/Region/Framework/Scenes/Scene.cs -- RezObject()&lt;br /&gt;
&lt;br /&gt;
# Viewer sends RezObject packet with itemID, ray start/end, and rez flags.&lt;br /&gt;
# Scene.RezObject() calls IInventoryAccessModule.RezObject().&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 2. Item and Asset Fetched ==&lt;br /&gt;
&lt;br /&gt;
 BasicInventoryAccessModule -- RezObject()&lt;br /&gt;
&lt;br /&gt;
# Calls InventoryService.GetItem(agentID, itemID) -- reads inventoryitems table.&lt;br /&gt;
# Validates item exists and is owned by agent.&lt;br /&gt;
# Calls AssetService.Get(assetID) -- fetches object XML asset.&lt;br /&gt;
# If asset null or empty: sends alert to client, returns null.&lt;br /&gt;
&lt;br /&gt;
For HG foreign users (HGInventoryAccessModule):&lt;br /&gt;
* If IsForeignUser: calls m_assMapper.Get(item.AssetID, agentID, foreignAssetServer) before asset fetch -- pulls asset from foreign grid if not cached locally.&lt;br /&gt;
&lt;br /&gt;
; DB reads:&lt;br /&gt;
* inventoryitems -- SELECT by item UUID&lt;br /&gt;
* assets -- SELECT by asset UUID&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 3. Deserialise and Position ==&lt;br /&gt;
&lt;br /&gt;
 BasicInventoryAccessModule -- RezObject() continued&lt;br /&gt;
&lt;br /&gt;
# Calls Scene.GetObjectsToRez() -- deserialises XML into List&amp;lt;SceneObjectGroup&amp;gt; and position offsets.&lt;br /&gt;
#* Single object: SceneObjectSerializer.FromOriginalXmlFormat().&lt;br /&gt;
#* Coalesced: CoalescedSceneObjectsSerializer.FromXml().&lt;br /&gt;
# Calls Scene.GetNewRezLocation() -- raycasts from RayStart to RayEnd against physics scene to find surface position.&lt;br /&gt;
# Checks CanRezObject permission at target position.&lt;br /&gt;
# If no-copy item fails perm check: sends SendBulkUpdateInventory to restore item to client display.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 4. Ownership and Permissions Applied ==&lt;br /&gt;
&lt;br /&gt;
 BasicInventoryAccessModule -- DoPreRezWhenFromItem()&lt;br /&gt;
&lt;br /&gt;
# Sets rootPart.Name and Description from inventory item (single object only).&lt;br /&gt;
# Applies ObjectSlamSale if flagged.&lt;br /&gt;
# Sets FromFolderID on SOG.&lt;br /&gt;
# If ownership change (new owner or Slam flag):&lt;br /&gt;
#* Changes OwnerID on all parts, sets LastOwnerID, calls Inventory.ChangeInventoryOwner().&lt;br /&gt;
#* Calls ApplyNextOwnerPermissions() -- applies NextOwnerMask to BasePermissions.&lt;br /&gt;
#* Applies any ObjectOverwrite flags from item.&lt;br /&gt;
# If same owner: sets FromUserInventoryItemID if item is copyable (links rezzed object back to inventory item for &amp;quot;save changes&amp;quot; support).&lt;br /&gt;
# Calls TrimPermissions() and InvalidateDeepEffectivePerms().&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 5. Object Added to Scene ==&lt;br /&gt;
&lt;br /&gt;
 BasicInventoryAccessModule -- RezObject() continued&lt;br /&gt;
&lt;br /&gt;
# group.ResetIDs() -- assigns new UUIDs to all parts.&lt;br /&gt;
# Clears attachment data (ClearPartAttachmentData()).&lt;br /&gt;
# Sets IsSelected if RezSelected flag.&lt;br /&gt;
# Sets AbsolutePosition from ray result.&lt;br /&gt;
# Calls Scene.AddNewSceneObject(group, true, false) -- adds to scene graph, schedules persistence.&lt;br /&gt;
# Calls CreateScriptInstances(0, true, DefaultScriptEngine, 1) -- starts scripts with on_rez state source.&lt;br /&gt;
# Calls ResumeScripts().&lt;br /&gt;
# Schedules full update to clients.&lt;br /&gt;
&lt;br /&gt;
; DB writes:&lt;br /&gt;
* prims -- INSERT: new prim rows for each part&lt;br /&gt;
* primshapes -- INSERT: shape data for each part&lt;br /&gt;
* primitems -- INSERT: task inventory for each part&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 6. No-Copy Item Removed from Inventory ==&lt;br /&gt;
&lt;br /&gt;
 BasicInventoryAccessModule -- DoPostRezWhenFromItem()&lt;br /&gt;
&lt;br /&gt;
# If item.CurrentPermissions has no Copy bit: calls InventoryService.DeleteItems(owner, [itemID]).&lt;br /&gt;
# Item is consumed on rez.&lt;br /&gt;
&lt;br /&gt;
; DB writes (no-copy only):&lt;br /&gt;
* inventoryitems -- DELETE: item removed&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 7. HG Asset Push (HG users only) ==&lt;br /&gt;
&lt;br /&gt;
Not applicable on standard rez. HG asset push (ExportAsset) is triggered on CopyToInventory, not on rez.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Summary: DB Tables Touched ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Table !! Operation !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| inventoryitems || SELECT || Fetch item record&lt;br /&gt;
|-&lt;br /&gt;
| assets || SELECT || Fetch object XML&lt;br /&gt;
|-&lt;br /&gt;
| prims || INSERT || New object in region&lt;br /&gt;
|-&lt;br /&gt;
| primshapes || INSERT || Shape data&lt;br /&gt;
|-&lt;br /&gt;
| primitems || INSERT || Task inventory per part&lt;br /&gt;
|-&lt;br /&gt;
| inventoryitems || DELETE || No-copy items only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Edge Cases ==&lt;br /&gt;
&lt;br /&gt;
Attachment rez (from RezAttachments or RezSingleAttachmentFromInventory): uses same RezObject() path but attachment=true. AddNewSceneObject() is called without script start (scripts start later in AttachToAgent). See [[OpenSimulator Internals/Walkthroughs/Avatar Rez In Region]].&lt;br /&gt;
&lt;br /&gt;
Coalesced object: multiple SOGs deserialised from one asset, each positioned using the stored offsets from CoalescedSceneObjectsSerializer. Each gets its own DB rows.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenSimulator Internals/Walkthroughs]]&lt;br /&gt;
* [[OpenSimulator Internals/Code Map/InventoryAccessModule]]&lt;br /&gt;
* [[OpenSimulator Internals/Walkthroughs/Avatar Acquires Inventory]]&lt;br /&gt;
* [[OpenSimulator Internals/Walkthroughs/Avatar Derezzes Object]]&lt;br /&gt;
* [[OpenSimulator Internals/Walkthroughs/Avatar Rezzes Box]]&lt;/div&gt;</summary>
		<author><name>Jwbshaw</name></author>
	</entry>
</feed>