<?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%2FSimulator_Services</id>
	<title>OpenSimulator Internals/Simulator Services - 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%2FSimulator_Services"/>
	<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Simulator_Services&amp;action=history"/>
	<updated>2026-08-04T14:55:39Z</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/Simulator_Services&amp;diff=116&amp;oldid=prev</id>
		<title>Jwbshaw: first</title>
		<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Simulator_Services&amp;diff=116&amp;oldid=prev"/>
		<updated>2026-07-09T05:45:02Z</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;= Simulator Services =&lt;br /&gt;
&lt;br /&gt;
Simulator services run inside OpenSim.exe and are scoped to the simulator process,&lt;br /&gt;
not the grid. They are distinct from [[OpenSimulator_Internals/ROBUST_Services|ROBUST services]],&lt;br /&gt;
which run in ROBUST.exe and serve the entire grid.&lt;br /&gt;
&lt;br /&gt;
Each simulator service follows the same local/remote connector pattern used by&lt;br /&gt;
grid services: a local connector handles in-process calls; a remote connector&lt;br /&gt;
makes HTTP calls to another simulator. See&lt;br /&gt;
[[OpenSimulator_Internals/Connector_Architecture|Connector Architecture]] for the&lt;br /&gt;
general pattern.&lt;br /&gt;
&lt;br /&gt;
Config key for all three services is in the &amp;lt;code&amp;gt;[Modules]&amp;lt;/code&amp;gt; section of&lt;br /&gt;
&amp;lt;code&amp;gt;OpenSim.ini&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Land Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Interface:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;ILandService&amp;lt;/code&amp;gt; (OpenSim.Services.Interfaces)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Config key:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;LandServices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Retrieves parcel land data by region handle and coordinates. Used when a simulator&lt;br /&gt;
needs land data for a region it does not itself host -- for example, to resolve&lt;br /&gt;
access rules at a region border before a crossing completes.&lt;br /&gt;
&lt;br /&gt;
=== Interface ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ILandService&amp;lt;/code&amp;gt; exposes a single method:&lt;br /&gt;
&lt;br /&gt;
 LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess)&lt;br /&gt;
&lt;br /&gt;
=== Connectors ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connector !! Class !! Used when&lt;br /&gt;
|-&lt;br /&gt;
| Local || &amp;lt;code&amp;gt;LocalLandServicesConnector&amp;lt;/code&amp;gt; || Destination region is hosted by this simulator. Walks the local scene list, matches by world coordinates, returns &amp;lt;code&amp;gt;LandData&amp;lt;/code&amp;gt; plus access level and dwell count.&lt;br /&gt;
|-&lt;br /&gt;
| Remote || &amp;lt;code&amp;gt;RemoteLandServicesConnector&amp;lt;/code&amp;gt; || Destination region is on another simulator. Tries local first; falls back to HTTP call via &amp;lt;code&amp;gt;LandServicesConnector&amp;lt;/code&amp;gt; base class.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* The local connector iterates &amp;lt;code&amp;gt;m_Scenes&amp;lt;/code&amp;gt; and matches by world coordinate&lt;br /&gt;
  bounds, not by region UUID. This matters for varregions where a single scene&lt;br /&gt;
  covers a range of coordinates.&lt;br /&gt;
* Dwell count is retrieved via &amp;lt;code&amp;gt;IDwellModule&amp;lt;/code&amp;gt; if present; not part of&lt;br /&gt;
  the core land data.&lt;br /&gt;
* Returns &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if no local scene matches and no remote call is&lt;br /&gt;
  configured.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Library Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Interface:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;ILibraryService&amp;lt;/code&amp;gt; (OpenSim.Services.Interfaces)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementation:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;OpenSim.Services.InventoryService.LibraryService&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Config section:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;[LibraryService]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Provides the shared library inventory -- the read-only content visible to all&lt;br /&gt;
users under the Library folder. Backed by XML files on the local filesystem,&lt;br /&gt;
not the database.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
 [LibraryService]&lt;br /&gt;
 DefaultLibrary = inventory/Libraries.xml&lt;br /&gt;
 LibraryName = OpenSim Library&lt;br /&gt;
&lt;br /&gt;
Both keys are optional; the values above are the defaults.&lt;br /&gt;
&lt;br /&gt;
=== Interface ===&lt;br /&gt;
&lt;br /&gt;
 InventoryFolderImpl LibraryRootFolder { get; }&lt;br /&gt;
 Dictionary&amp;lt;UUID, InventoryFolderImpl&amp;gt; GetAllFolders()&lt;br /&gt;
 InventoryItemBase GetItem(UUID itemID)&lt;br /&gt;
 InventoryItemBase[] GetMultipleItems(UUID[] itemIDs)&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* Not a region module. Instantiated as a &amp;lt;code&amp;gt;ServiceBase&amp;lt;/code&amp;gt; directly by&lt;br /&gt;
  the service infrastructure. No &amp;lt;code&amp;gt;[Modules]&amp;lt;/code&amp;gt; config key.&lt;br /&gt;
* Singleton per process: static instance, initialized once regardless of how&lt;br /&gt;
  many regions the simulator hosts.&lt;br /&gt;
* Loaded from XML files under the &amp;lt;code&amp;gt;inventory/&amp;lt;/code&amp;gt; directory at startup.&lt;br /&gt;
  Root folder UUID is a fixed constant (&amp;lt;code&amp;gt;00000112-000f-0000-0000-000100bba000&amp;lt;/code&amp;gt;);&lt;br /&gt;
  all library UUIDs are fixed and do not vary between installations.&lt;br /&gt;
* No remote connector. No ROBUST equivalent. Library content is local to each&lt;br /&gt;
  simulator.&lt;br /&gt;
* The source explicitly notes this is a stopgap: &amp;quot;basically a hack to give us&lt;br /&gt;
  an Inventory library while we don&amp;#039;t have an inventory server.&amp;quot; Architecturally&lt;br /&gt;
  it should be a grid service with shared content across simulators; it has&lt;br /&gt;
  never been converted.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Simulation Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Interface:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;ISimulationService&amp;lt;/code&amp;gt; (OpenSim.Services.Interfaces)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Config key:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;SimulationServices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Handles simulator-to-simulator communication: creating and updating agents on&lt;br /&gt;
remote simulators, moving objects across region boundaries, and closing agents&lt;br /&gt;
when they leave. Used for teleports, region crossings, child agent maintenance,&lt;br /&gt;
and object crossings.&lt;br /&gt;
&lt;br /&gt;
This is not a ROBUST service. It runs entirely between simulators.&lt;br /&gt;
&lt;br /&gt;
=== Interface ===&lt;br /&gt;
&lt;br /&gt;
Agent operations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CreateAgent(source, destination, aCircuit, flags, ctx, out reason)&amp;lt;/code&amp;gt; || Creates a new agent circuit on the destination simulator. Entry point for teleport and login-to-region.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UpdateAgent(destination, AgentData, ctx)&amp;lt;/code&amp;gt; || Full child agent update: position, appearance, animation state.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UpdateAgent(destination, AgentPosition)&amp;lt;/code&amp;gt; || Lightweight position-only update for child agents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;QueryAccess(destination, agentID, homeURI, viaTeleport, position, features, ctx, out reason)&amp;lt;/code&amp;gt; || Checks whether the destination will accept this agent. Called before &amp;lt;code&amp;gt;CreateAgent&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ReleaseAgent(originRegion, agentID, uri)&amp;lt;/code&amp;gt; || Destination notifies origin that the client has connected. Origin clears its teleport-pending state.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CloseAgent(destination, agentID, auth_token)&amp;lt;/code&amp;gt; || Closes an agent circuit on the destination simulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Object operations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CreateObject(destination, newPosition, sog, isLocalCall)&amp;lt;/code&amp;gt; || Sends a scene object to the destination simulator. Used for prim crossings and object teleport. If &amp;lt;code&amp;gt;isLocalCall&amp;lt;/code&amp;gt; is true, the object is cloned before transfer; if false, it is used as received from the wire.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Connectors ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connector !! Class !! Used when&lt;br /&gt;
|-&lt;br /&gt;
| Local || &amp;lt;code&amp;gt;LocalSimulationConnectorModule&amp;lt;/code&amp;gt; || Destination region is hosted by this simulator. Dispatches directly to the target &amp;lt;code&amp;gt;Scene&amp;lt;/code&amp;gt; by UUID lookup.&lt;br /&gt;
|-&lt;br /&gt;
| Remote || &amp;lt;code&amp;gt;RemoteSimulationConnectorModule&amp;lt;/code&amp;gt; || Destination region is on another simulator. Tries local first; falls back to HTTP via &amp;lt;code&amp;gt;SimulationServiceConnector&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* The local connector maintains a &amp;lt;code&amp;gt;Dictionary&amp;amp;lt;UUID, Scene&amp;amp;gt;&amp;lt;/code&amp;gt; keyed&lt;br /&gt;
  by region UUID. &amp;lt;code&amp;gt;GetScene()&amp;lt;/code&amp;gt; has a fallback that returns the first&lt;br /&gt;
  available scene if the requested UUID is not found -- this masks bugs and is&lt;br /&gt;
  noted as a known issue in the source.&lt;br /&gt;
* &amp;lt;code&amp;gt;QueryAccess&amp;lt;/code&amp;gt; enforces a version check: if the requesting simulator&lt;br /&gt;
  is running protocol version below 0.3 and the destination is a varregion&lt;br /&gt;
  (non-256x256), the request is denied. Older viewers crash on varregions.&lt;br /&gt;
* &amp;lt;code&amp;gt;RemoteSimulationConnectorModule&amp;lt;/code&amp;gt; wraps a&lt;br /&gt;
  &amp;lt;code&amp;gt;LocalSimulationConnectorModule&amp;lt;/code&amp;gt; instance as its local backend.&lt;br /&gt;
  All calls try local first, then fall through to HTTP only if the destination&lt;br /&gt;
  is confirmed not-local via &amp;lt;code&amp;gt;IsLocalRegion()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;CreateAgent&amp;lt;/code&amp;gt; may be null if the user logged&lt;br /&gt;
  in directly or arrived from an older simulator that does not send it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenSimulator_Internals/ROBUST_Services|ROBUST Services]]&lt;br /&gt;
* [[OpenSimulator_Internals/Connector_Architecture|Connector Architecture]]&lt;br /&gt;
* [[OpenSimulator_Internals/Walkthroughs/Avatar_Transfer_Between_Regions|Walkthrough: Avatar Transfer Between Regions]]&lt;br /&gt;
* [[OpenSimulator_Internals/Walkthroughs/Avatar_Goes_HG|Walkthrough: Avatar Goes HG]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenSimulator Internals]]&lt;/div&gt;</summary>
		<author><name>Jwbshaw</name></author>
	</entry>
</feed>