<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sempuki</id>
		<title>OpenSimulator - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sempuki"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Special:Contributions/Sempuki"/>
		<updated>2026-05-12T00:42:17Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-11T14:29:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
== InventoryManager ==&lt;br /&gt;
CAPS (Used)&lt;br /&gt;
    &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptAgentInventory&amp;quot;&lt;br /&gt;
== ParcelManager ==&lt;br /&gt;
CAPS (Used)&lt;br /&gt;
    &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
== AgentManager ==&lt;br /&gt;
CAPS (Used)&lt;br /&gt;
    &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
== GridManager ==&lt;br /&gt;
CAPS (Used)&lt;br /&gt;
    &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
== Login ==  &lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
   &amp;quot;login_to_server&amp;quot; &lt;br /&gt;
== Caps ==&lt;br /&gt;
CAPS (Requested)&lt;br /&gt;
    &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
    &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
    &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
    &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
    &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
    &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
    &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
    &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
    &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
    &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
    &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
    &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
    &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
    &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
    &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
    &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
    &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
    &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
    &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
    &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
    &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
    &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
    &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
    &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
    &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
    &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
    &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
    &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
    &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
    &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
= OpenSim =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== Rest ===&lt;br /&gt;
==== RegionPlugin ====&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    POST &amp;quot;/admin/regions/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/regions/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/regions/&amp;lt;region-UUID&amp;gt;&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/regioninfo/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== InventoryServices  ====&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    GET &amp;quot;/admin/inventory/firstname lastname&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== AppearanceServices  ====&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
==== AssetServices ====&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== Caps ====&lt;br /&gt;
CAPS (Exposed)&lt;br /&gt;
    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
==== Grid Client ====&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;map_block&amp;quot;&lt;br /&gt;
    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Auth Client ====&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
==== Cache ====&lt;br /&gt;
REST (Used)&lt;br /&gt;
    GET &amp;quot;&amp;lt;AssetServerUrl&amp;gt;/assets/&amp;lt;AssetID&amp;gt;&amp;quot;&lt;br /&gt;
    POST &amp;quot;&amp;lt;AssetServerUrl&amp;gt;/assets&amp;quot;&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 Grid Services ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;check&amp;quot;&lt;br /&gt;
    &amp;quot;land_data&amp;quot;&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;map_block&amp;quot;&lt;br /&gt;
    &amp;quot;land_data&amp;quot;&lt;br /&gt;
    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== OSG1 User Services ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
==== OSG1 User Data Plugin ====&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
    &amp;quot;get_presence_info_bulk&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
    &amp;quot;check&amp;quot;&lt;br /&gt;
    &amp;quot;land_data&amp;quot;&lt;br /&gt;
    &amp;quot;link_region&amp;quot;&lt;br /&gt;
    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;land_data&amp;quot;&lt;br /&gt;
    &amp;quot;link_region&amp;quot;&lt;br /&gt;
    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
LLSD&lt;br /&gt;
    &amp;quot;/MAP/MapItems/&amp;lt;RegionID&amp;gt;&amp;quot;&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
LLSD&lt;br /&gt;
    &amp;quot;/agent&amp;quot;        # agent domain message&lt;br /&gt;
    &amp;quot;/&amp;quot;             # region domain seed&lt;br /&gt;
    &amp;quot;/&amp;lt;RegionName&amp;gt;&amp;quot; # region domain seed&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
    &amp;quot;grid_instant_message&amp;quot;&lt;br /&gt;
    &amp;quot;region_startup&amp;quot;&lt;br /&gt;
    &amp;quot;region_shutdown&amp;quot;&lt;br /&gt;
    &amp;quot;agent_location&amp;quot;&lt;br /&gt;
    &amp;quot;agent_leaving&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;map_block&amp;quot;&lt;br /&gt;
    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;process_region_shutdown&amp;quot;&lt;br /&gt;
    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
==== Rest ====&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
==== User ====&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
    &amp;quot;map_block&amp;quot;&lt;br /&gt;
    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
REST (Used)&lt;br /&gt;
   GET &amp;quot;http://&amp;lt;region_ip&amp;gt;:&amp;lt;region_port&amp;gt;/simstatus&amp;quot; &lt;br /&gt;
=== Manager ===&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;manager_login&amp;quot;&lt;br /&gt;
    &amp;quot;shutdown&amp;quot;&lt;br /&gt;
=== Messaging Server ===&lt;br /&gt;
XMLRPC (Used)&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
    &amp;quot;presence_update&amp;quot;&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
== Total Exposed ==&lt;br /&gt;
=== OpenSim ===&lt;br /&gt;
REST (Exposed)&lt;br /&gt;
    POST &amp;quot;/admin/regions/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/regions/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/regions/&amp;lt;region-UUID&amp;gt;&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/regioninfo/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/admin/inventory/firstname lastname&amp;quot;&lt;br /&gt;
    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
CAPS (Exposed)&lt;br /&gt;
    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
XMLRPC (Exposed)&lt;br /&gt;
    &amp;quot;check&amp;quot;&lt;br /&gt;
    &amp;quot;land_data&amp;quot;&lt;br /&gt;
    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
    &amp;quot;link_region&amp;quot;&lt;br /&gt;
    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
    &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;map_block&amp;quot;&lt;br /&gt;
    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
    &amp;quot;voice_chat_server_address_request&amp;quot;&lt;br /&gt;
    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
LLSD&lt;br /&gt;
    &amp;quot;/MAP/MapItems/&amp;lt;RegionID&amp;gt;&amp;quot;&lt;br /&gt;
    &amp;quot;/agent&amp;quot;        # agent domain message&lt;br /&gt;
    &amp;quot;/&amp;quot;             # region domain seed&lt;br /&gt;
    &amp;quot;/&amp;lt;RegionName&amp;gt;&amp;quot; # region domain seed&lt;br /&gt;
== Total Used ==&lt;br /&gt;
=== OpenSim ===&lt;br /&gt;
REST (Used)&lt;br /&gt;
    GET &amp;quot;http://&amp;lt;region_ip&amp;gt;:&amp;lt;region_port&amp;gt;/simstatus&amp;quot; &lt;br /&gt;
    GET &amp;quot;&amp;lt;AssetServerUrl&amp;gt;/assets/&amp;lt;AssetID&amp;gt;&amp;quot;&lt;br /&gt;
    POST &amp;quot;&amp;lt;AssetServerUrl&amp;gt;/assets&amp;quot;&lt;br /&gt;
XMLRPC&lt;br /&gt;
    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
    &amp;quot;map_block&amp;quot;&lt;br /&gt;
    &amp;quot;land_data&amp;quot;&lt;br /&gt;
    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
    &amp;quot;get_presence_info_bulk&amp;quot;&lt;br /&gt;
    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
    &amp;quot;link_region&amp;quot;&lt;br /&gt;
    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
    &amp;quot;grid_instant_message&amp;quot;&lt;br /&gt;
    &amp;quot;region_startup&amp;quot;&lt;br /&gt;
    &amp;quot;region_shutdown&amp;quot;&lt;br /&gt;
    &amp;quot;agent_location&amp;quot;&lt;br /&gt;
    &amp;quot;agent_leaving&amp;quot;&lt;br /&gt;
    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
    &amp;quot;manager_login&amp;quot;&lt;br /&gt;
    &amp;quot;shutdown&amp;quot;&lt;br /&gt;
    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
    &amp;quot;presence_update&amp;quot;&lt;br /&gt;
    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
    &amp;quot;process_region_shutdown&amp;quot;&lt;br /&gt;
    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
    &amp;quot;hg_verify_auth_key&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T17:04:01Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* OpenSim/ModreX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== Rest ===&lt;br /&gt;
==== RegionPlugin ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
==== InventoryServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AppearanceServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AssetServices ====&lt;br /&gt;
                REST&lt;br /&gt;
&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
                CAPS&lt;br /&gt;
                    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
                    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
                    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
                    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
                LLSD&lt;br /&gt;
                    &amp;quot;/MAP/MapItems/&amp;lt;RegionID&amp;gt;&amp;quot;&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
                LLSD&lt;br /&gt;
                    &amp;quot;/agent&amp;quot;        # agent domain message&lt;br /&gt;
                    &amp;quot;/&amp;quot;             # region domain seed&lt;br /&gt;
                    &amp;quot;/&amp;lt;RegionName&amp;gt;&amp;quot; # region domain seed&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T13:10:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* CoreModules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim/ModreX =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== Rest ===&lt;br /&gt;
==== RegionPlugin ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
==== InventoryServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AppearanceServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AssetServices ====&lt;br /&gt;
                REST&lt;br /&gt;
&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
                CAPS&lt;br /&gt;
                    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
                    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
                    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
                    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
                LLSD&lt;br /&gt;
                    &amp;quot;/MAP/MapItems/&amp;lt;RegionID&amp;gt;&amp;quot;&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
                LLSD&lt;br /&gt;
                    &amp;quot;/agent&amp;quot;        # agent domain message&lt;br /&gt;
                    &amp;quot;/&amp;quot;             # region domain seed&lt;br /&gt;
                    &amp;quot;/&amp;lt;RegionName&amp;gt;&amp;quot; # region domain seed&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T12:57:25Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Grid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim/ModreX =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== Rest ===&lt;br /&gt;
==== RegionPlugin ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
==== InventoryServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AppearanceServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AssetServices ====&lt;br /&gt;
                REST&lt;br /&gt;
&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
                CAPS&lt;br /&gt;
                    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
                    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
                    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
                    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
==== EventQueue ====&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T12:48:18Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Grid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim/ModreX =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== Rest ===&lt;br /&gt;
==== RegionPlugin ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
==== InventoryServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AppearanceServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AssetServices ====&lt;br /&gt;
                REST&lt;br /&gt;
&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
                CAPS&lt;br /&gt;
                    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
                    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
                    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
                    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
==== EventQueue ====&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T12:47:22Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* ApplicationPlugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim/ModreX =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== Rest ===&lt;br /&gt;
==== RegionPlugin ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
==== InventoryServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AppearanceServices  ====&lt;br /&gt;
                REST&lt;br /&gt;
==== AssetServices ====&lt;br /&gt;
                REST&lt;br /&gt;
&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
                CAPS&lt;br /&gt;
                    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
                    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
                    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
                    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
==== EventQueue ====&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
=== GridServer.Modules ===&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T12:44:31Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* OpenSim */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim/ModreX =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== RegionPlugin ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
=== InventoryServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
=== AppearanceServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
=== AssetServices ===&lt;br /&gt;
                REST&lt;br /&gt;
== Framework ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
                CAPS&lt;br /&gt;
                    &amp;quot;SEED&amp;quot; &amp;quot;CAPS/0000/&amp;quot;&lt;br /&gt;
                    &amp;quot;MapLayer&amp;quot; &amp;quot;CAPS/0001/&amp;quot;&lt;br /&gt;
                    &amp;quot;NewFileAgentInventory&amp;quot; &amp;quot;CAPS/0002/&amp;quot;&lt;br /&gt;
                    &amp;quot;RequestTextureDownload&amp;quot; &amp;quot;CAPS/0003/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateNotecardAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgentInventory&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptAgent&amp;quot; &amp;quot;CAPS/0004/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTaskInventory&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;UpdateScriptTask&amp;quot; &amp;quot;CAPS/0005/&amp;quot;&lt;br /&gt;
                    &amp;quot;FetchInventoryDescendents&amp;quot; &amp;quot;CAPS/0006/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
==== EventQueue ====&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
=== GridServer.Modules ===&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T12:11:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* InventoryServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== RegionPlugin ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
=== InventoryServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
=== AppearanceServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
=== AssetServices ===&lt;br /&gt;
                REST&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
==== EventQueue ====&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;GetInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;UpdateFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;MoveFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;PurgeFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;DeleteItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;QueryFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;CreateInventory/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewFolder/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;NewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;AddNewItem/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;GetItems/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;ActiveGestures/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;RootFolders/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== GridServer.Modules ===&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T11:51:14Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim =&lt;br /&gt;
== ApplicationPlugin ==&lt;br /&gt;
=== RegionPlugin ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
=== InventoryServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
=== AppearanceServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
=== AssetServices ===&lt;br /&gt;
                REST&lt;br /&gt;
== Region ==&lt;br /&gt;
=== Communications ===&lt;br /&gt;
==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
=== CoreModules ===&lt;br /&gt;
==== World ====&lt;br /&gt;
==== EventQueue ====&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
==== InterGrid ====&lt;br /&gt;
==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
== Grid ==&lt;br /&gt;
=== InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
=== GridServer.Modules ===&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
=== GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
=== UserServer.Modules ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
== Client ==&lt;br /&gt;
=== Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T11:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenMetaverse =&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= OpenSim =&lt;br /&gt;
    == ApplicationPlugin ==&lt;br /&gt;
        === RegionPlugin ===&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
        === InventoryServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
        === AppearanceServices  ===&lt;br /&gt;
                REST&lt;br /&gt;
        === AssetServices ===&lt;br /&gt;
                REST&lt;br /&gt;
    == Region ==&lt;br /&gt;
        === Communications ===&lt;br /&gt;
            ==== OGS1 ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
            ==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
        === CoreModules ===&lt;br /&gt;
            ==== World ====&lt;br /&gt;
            ==== EventQueue ====&lt;br /&gt;
            ==== Hypergrid ====&lt;br /&gt;
            ==== InterGrid ====&lt;br /&gt;
            ==== Avatar ====&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
            ==== Scripting ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
            ==== Framework ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
            ==== Hypergrid ====&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
    == Grid ==&lt;br /&gt;
        === InventoryServer ===&lt;br /&gt;
                REST&lt;br /&gt;
        === GridServer.Modules ===&lt;br /&gt;
        === UserServer.Modules ===&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
        === GridServier.Modules ===&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
        === UserServer.Modules ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
    == Client ==&lt;br /&gt;
        === Linden ===&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T11:42:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenMetaverse&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
OpenSim/ModreX&lt;br /&gt;
    ApplicationPlugin &lt;br /&gt;
        RegionPlugin&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
        InventoryServices &lt;br /&gt;
                REST&lt;br /&gt;
        AppearanceServices &lt;br /&gt;
                REST&lt;br /&gt;
        AssetServices&lt;br /&gt;
                REST&lt;br /&gt;
    Region&lt;br /&gt;
        Communications&lt;br /&gt;
            OGS1&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
            Hypergrid&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
        CoreModules&lt;br /&gt;
            World&lt;br /&gt;
            EventQueue&lt;br /&gt;
            Hypergrid&lt;br /&gt;
            InterGrid&lt;br /&gt;
            Avatar&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
            Scripting&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
            Framework&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
            Hypergrid&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
    Grid&lt;br /&gt;
        InventoryServer&lt;br /&gt;
                REST&lt;br /&gt;
        GridServer.Modules&lt;br /&gt;
        UserServer.Modules&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                    DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
        GridServier.Modules&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
        UserServer.Modules&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
    Client&lt;br /&gt;
        Linden&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim</id>
		<title>Known Web Interfaces within OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Known_Web_Interfaces_within_OpenSim"/>
				<updated>2009-05-08T11:40:29Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: New page: OpenMetaverse         CAPS Requested             &amp;quot;ChatSessionRequest&amp;quot;             &amp;quot;CopyInventoryFromNotecard&amp;quot;             &amp;quot;DispatchRegionInfo&amp;quot;             &amp;quot;EstateChangeInfo&amp;quot;             &amp;quot;E...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenMetaverse&lt;br /&gt;
        CAPS Requested&lt;br /&gt;
            &amp;quot;ChatSessionRequest&amp;quot;&lt;br /&gt;
            &amp;quot;CopyInventoryFromNotecard&amp;quot;&lt;br /&gt;
            &amp;quot;DispatchRegionInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EstateChangeInfo&amp;quot;&lt;br /&gt;
            &amp;quot;EventQueueGet&amp;quot;&lt;br /&gt;
            &amp;quot;FetchInventory&amp;quot;&lt;br /&gt;
            &amp;quot;WebFetchInventoryDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLib&amp;quot;&lt;br /&gt;
            &amp;quot;FetchLibDescendents&amp;quot;&lt;br /&gt;
            &amp;quot;GroupProposalBallot&amp;quot;&lt;br /&gt;
            &amp;quot;HomeLocation&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayer&amp;quot;&lt;br /&gt;
            &amp;quot;MapLayerGod&amp;quot;&lt;br /&gt;
            &amp;quot;NewFileAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelPropertiesUpdate&amp;quot;&lt;br /&gt;
            &amp;quot;ParcelVoiceInfoRequest&amp;quot;&lt;br /&gt;
            &amp;quot;ProvisionVoiceAccountRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RemoteParcelRequest&amp;quot;&lt;br /&gt;
            &amp;quot;RequestTextureDownload&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatRequest&amp;quot;&lt;br /&gt;
            &amp;quot;SearchStatTracking&amp;quot;&lt;br /&gt;
            &amp;quot;SendPostcard&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReport&amp;quot;&lt;br /&gt;
            &amp;quot;SendUserReportWithScreenshot&amp;quot;&lt;br /&gt;
            &amp;quot;ServerReleaseNotes&amp;quot;&lt;br /&gt;
            &amp;quot;StartGroupProposal&amp;quot;&lt;br /&gt;
            &amp;quot;UntrustedSimulatorMessage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentInformation&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateAgentLanguage&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardAgentInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptAgent&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateGestureTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateNotecardTaskInventory&amp;quot;&lt;br /&gt;
            &amp;quot;UpdateScriptTask&amp;quot;&lt;br /&gt;
            &amp;quot;UploadBakedTexture&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStartAuction&amp;quot;&lt;br /&gt;
            &amp;quot;ViewerStats&amp;quot;&lt;br /&gt;
&lt;br /&gt;
OpenSim/ModreX&lt;br /&gt;
    ApplicationPlugin &lt;br /&gt;
        RegionPlugin&lt;br /&gt;
            REST&lt;br /&gt;
                POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
                GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                GET &amp;quot;regionsinfo/&amp;quot;&lt;br /&gt;
        InventoryServices &lt;br /&gt;
            REST&lt;br /&gt;
        AppearanceServices &lt;br /&gt;
            REST&lt;br /&gt;
        AssetServices&lt;br /&gt;
            REST&lt;br /&gt;
    Region&lt;br /&gt;
        Communications&lt;br /&gt;
            OGS1&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
            Hypergrid&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;check&amp;quot;&lt;br /&gt;
                    &amp;quot;land_data&amp;quot;&lt;br /&gt;
                    &amp;quot;link_region&amp;quot;&lt;br /&gt;
                    &amp;quot;expect_hg_user&amp;quot;&lt;br /&gt;
        CoreModules&lt;br /&gt;
            World&lt;br /&gt;
            EventQueue&lt;br /&gt;
            Hypergrid&lt;br /&gt;
            InterGrid&lt;br /&gt;
            Avatar&lt;br /&gt;
                REST&lt;br /&gt;
                    POST &amp;quot;CAPS/OA/&amp;lt;ID&amp;gt;&amp;quot; # ObjectAdd&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;presence_update_bulk&amp;quot;&lt;br /&gt;
                    &amp;quot;terminate_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;balanceUpdateRequest&amp;quot;&lt;br /&gt;
                    &amp;quot;userAlert&amp;quot;&lt;br /&gt;
                    &amp;quot;getCurrencyQuote&amp;quot;&lt;br /&gt;
                    &amp;quot;buyCurrency&amp;quot;&lt;br /&gt;
                    &amp;quot;preflightBuyLandPrep&amp;quot;&lt;br /&gt;
                    &amp;quot;buyLandPrep&amp;quot;&lt;br /&gt;
            Scripting&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                &amp;quot;llRemoteData&amp;quot;&lt;br /&gt;
            Framework&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
            Hypergrid&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
    Grid&lt;br /&gt;
        InventoryServer&lt;br /&gt;
            REST&lt;br /&gt;
        GridServer.Modules&lt;br /&gt;
        UserServer.Modules&lt;br /&gt;
                GET &amp;quot;/users/&amp;quot;&lt;br /&gt;
                DELETE &amp;quot;/usersessions/&amp;quot;&lt;br /&gt;
                GET &amp;quot;/get_grid_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        GridServier.Modules&lt;br /&gt;
            Rest&lt;br /&gt;
                REST&lt;br /&gt;
                    GET &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;sims/&amp;quot;&lt;br /&gt;
                    GET &amp;quot;regions/&amp;quot;&lt;br /&gt;
                    POST &amp;quot;regions/&amp;quot;&lt;br /&gt;
            User&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;simulator_login&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_data_request&amp;quot;&lt;br /&gt;
                    &amp;quot;simulator_after_region_moved&amp;quot;&lt;br /&gt;
                    &amp;quot;map_block&amp;quot;&lt;br /&gt;
                    &amp;quot;search_for_region_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;register_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;deregister_messageserver&amp;quot;&lt;br /&gt;
                    &amp;quot;add_new_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;remove_user_friend&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_friend_perms&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_friend_list&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_login&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_new_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;hg_verify_auth_key&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_name&amp;quot;&lt;br /&gt;
                    &amp;quot;get_user_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_picker_avatar&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_current_region&amp;quot;&lt;br /&gt;
                    &amp;quot;logout_of_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;get_agent_by_uuid&amp;quot;&lt;br /&gt;
                    &amp;quot;update_user_profile&amp;quot;&lt;br /&gt;
                    &amp;quot;get_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;update_avatar_appearance&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;br /&gt;
                    &amp;quot;set_login_params&amp;quot;&lt;br /&gt;
                    &amp;quot;check_auth_session&amp;quot;&lt;br /&gt;
        UserServer.Modules&lt;br /&gt;
                XMLRPC&lt;br /&gt;
                    &amp;quot;get_grid_info&amp;quot;&lt;br /&gt;
    Client&lt;br /&gt;
        Linden&lt;br /&gt;
            XMLRPC&lt;br /&gt;
                    &amp;quot;expect_user&amp;quot;&lt;br /&gt;
                    &amp;quot;logoff_user&amp;quot;&lt;br /&gt;
                    &amp;quot;login_to_simulator&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Developer_Documentation</id>
		<title>Developer Documentation</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Developer_Documentation"/>
				<updated>2009-05-08T11:36:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
==== General ====&lt;br /&gt;
* [[Development Team]] &amp;amp;mdash; OpenSim is brought to you by...&lt;br /&gt;
* [[OpenSim:Introduction_and_Definitions]] &amp;amp;mdash; A work in progress describing the high level components of OpenSim&lt;br /&gt;
* [[OpenSim: TechRef]] &amp;amp;mdash; A technical description of the simulator operation.&lt;br /&gt;
* [[Grid Architecture Diagram]]&lt;br /&gt;
* [[OpenSim: Screenshots]] &amp;amp;mdash; Various OpenSim screenshots.&lt;br /&gt;
* [http://docs.opensimulator.org/index.html The OpenSim API]&lt;br /&gt;
&lt;br /&gt;
==== Development ====&lt;br /&gt;
* [[Hacking OpenSim for fun and profit]] &amp;amp;mdash; A starters guide for programming OpenSim.&lt;br /&gt;
* [[Coding standards]] &amp;amp;mdash; Coding conventions for developers.&lt;br /&gt;
* [[Automated Testing]] &amp;amp;mdash; How to write tests for OpenSim.&lt;br /&gt;
* [[Branches]] &amp;amp;mdash; An overview of the repository branches and what they are for.&lt;br /&gt;
* [[Monodevelop]] &amp;amp;mdash; How to use the [[monodevelop]] IDE for editing C# solutions.&lt;br /&gt;
* [[Creating New Solution]] &amp;amp;mdash; How to create new solution according to OpenSim conventions.&lt;br /&gt;
&lt;br /&gt;
==== Services ====&lt;br /&gt;
&lt;br /&gt;
* [http://opensimulator.org/mantis Mantis Bug Tracking] &amp;amp;mdash; Mantis is the issue tracking tool of OpenSimulator.&lt;br /&gt;
* [http://www.opensimulator.org:8085/browse/OPENSIM-TRUNK Bamboo Continuous Integration] &amp;amp;mdash; Bamboo builds the source base continuously and runts unit tests.&lt;br /&gt;
* [http://forge.opensimulator.org/gf/ OpenSimulator GForge] &amp;amp;mdash; Project hosting for OpenSimulator related projects.&lt;br /&gt;
&lt;br /&gt;
==== Client Stacks ====&lt;br /&gt;
* [[Sim Throttles]] &amp;amp;mdash; Information on how OpenSim handles throttling of packets to the client.&lt;br /&gt;
&lt;br /&gt;
==== Database ====&lt;br /&gt;
* [[Database Documentation]] &amp;amp;mdash; A map of grid and region instances used in OpenSim&lt;br /&gt;
* [[MonoSqlite]] &amp;amp;mdash; How the database model currently works.&lt;br /&gt;
* [[LSL:PrimitiveParams]] &amp;amp;mdash; Notes on converting SL Edit GUI values and LSL PrimitiveParams to OpenSim PrimitiveBaseShape fields&lt;br /&gt;
* [[NHibernate Performance Testing]] &amp;amp;mdash; SQLite and MySQL performance tests with NHibernate.&lt;br /&gt;
&lt;br /&gt;
==== File formats ====&lt;br /&gt;
* [[OpenSim Region Archive Format]] - Opensim ARchive (OAR) region archive file format.&lt;br /&gt;
&lt;br /&gt;
==== Grid ====&lt;br /&gt;
* [[Asset Server problems]] - list of known problems with the asset server&lt;br /&gt;
* [[Teleports]] - some diagrams about OGP and Hypergrid teleport sequences&lt;br /&gt;
&lt;br /&gt;
==== Integration ====&lt;br /&gt;
* [[Webinterface]] &amp;amp;mdash; How to mashup with the web.&lt;br /&gt;
* [[RemoteAdmin]] &amp;amp;mdash; How to use the remote admin plug-in.&lt;br /&gt;
* [[REST]] &amp;amp;mdash; Information about the REST interface to assets, inventory, etc.&lt;br /&gt;
* [[Known Web Interfaces within OpenSim]] &amp;amp;mdash; The set of CAPS, XMLRPC, or REST entry points in the project.&lt;br /&gt;
&lt;br /&gt;
==== Modules ====&lt;br /&gt;
* [[RegionModules]] &amp;amp;mdash; The various modules that are used in the RegionServer and how to write new ones.&lt;br /&gt;
* [[How to create a dynamic plugin]] - A tutorial for using PluginLoader&lt;br /&gt;
* [[Getting Started with Region Modules]] - This brief tutorial is intended to get people started with developing applications with/for opensim using region modules and the opensim API.&lt;br /&gt;
* [[Web Statistics Module]] - The web statistics module documentation and counter wish list.&lt;br /&gt;
&lt;br /&gt;
==== Permissions ====&lt;br /&gt;
* [[OpenSim:Permissions(Server)]]   &amp;amp;mdash; Permissions system as implemented on the region server.&lt;br /&gt;
* [[OpenSim: Permissions]] &amp;amp;mdash; Notes on how object permissions are handled on the client.&lt;br /&gt;
&lt;br /&gt;
==== Physics ====&lt;br /&gt;
* [[PhysicsEngines]]   &amp;amp;mdash; Options for physics engines in OpenSim.&lt;br /&gt;
&lt;br /&gt;
==== Protocols ====&lt;br /&gt;
* [[Metaverse Exchange Protocol]] &amp;amp;mdash; MXP is alternative protocol for secondlife protocol.&lt;br /&gt;
&lt;br /&gt;
==== Regions ====&lt;br /&gt;
* [[OpenSim: Permissions]] &amp;amp;mdash; Notes on object permissions &amp;amp; definition of the ObjectFlags variable.&lt;br /&gt;
* [[OpenSim Load Balancing and Region Splitting]] - Instructions for using load balancing and region splitting features.&lt;br /&gt;
&lt;br /&gt;
==== Threading ====&lt;br /&gt;
* [[OpenSim: Threading strategy]] &amp;amp;mdash; How threading is implemented and handled.&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
* [[Scripting_Documentation]] &amp;amp;mdash; How to use scripts and what limitations apply.&lt;br /&gt;
* [[LSL_Status/Functions|LSL Implemented]]   &amp;amp;mdash; A list of LSL-functions that are available in OpenSim.&lt;br /&gt;
* [[OSSL]] &amp;amp;mdash; Some information about the OpenSimulator Scripting Language, and how to implement an OSSL function&lt;br /&gt;
* [[OpenSim.Region.ScriptEngine]] &amp;amp;mdash; How the ScriptEngine looks internally.&lt;br /&gt;
&lt;br /&gt;
==== Search ====&lt;br /&gt;
* [[OpenSim.Region.DataSnapshot]] - Shiny new data gathering/search system&lt;br /&gt;
* [[ImageService]] - Shiny new region module for serving search-related images&lt;br /&gt;
&lt;br /&gt;
==== Testing ====&lt;br /&gt;
* [[Automated_Testing]] &amp;amp;mdash; Writing Automated tests for OpenSim.&lt;br /&gt;
* [[Debugging Unit Tests]] &amp;amp;mdash; Debugging unit tests.&lt;br /&gt;
* [[OpenSim: Debugging - profiler dumps]] &amp;amp;mdash; Dumps of OpenSim profiles to aid in tracking memory leaks.&lt;br /&gt;
* [[Prim_Linking_Testing]] &amp;amp;mdash; Test cases for in world link/unlinking of prims.&lt;br /&gt;
&lt;br /&gt;
==Proposals==&lt;br /&gt;
&lt;br /&gt;
* [[Opensim: 0.5 Release Target Discussion]]&lt;br /&gt;
* [[Opensim: 0.6 Release Target Discussion]]&lt;br /&gt;
* [[Opensim: Future Release Discussion]]&lt;br /&gt;
&lt;br /&gt;
* [[A better SimCrossing]] - A work in progress about implementing a smooth simcrossing&lt;br /&gt;
* [[OpenID]] - Proposal for using OpenID in OpenSim&lt;br /&gt;
* [[AssetServerProposal]] - Proposal for a distributed asset server&lt;br /&gt;
* [[Creating profiles not used for login]] - RFC for alternative ways of creating profiles that will never be used for login&lt;br /&gt;
&lt;br /&gt;
==== Proposed projects ====&lt;br /&gt;
&lt;br /&gt;
* [[OpenWiredux: Taking the next step]]&lt;br /&gt;
* [[Using SNMP in OpenSim]]&lt;br /&gt;
&lt;br /&gt;
==Communication==&lt;br /&gt;
&lt;br /&gt;
A good first point of contact is the OpenSim IRC, on irc.freenode.net channels #opensim / #opensim-dev. The OpenSim developers hold [[office hours]] once a week in-world on Tuesdays at &amp;quot;Wright Plaza&amp;quot; on OSGrid. There is a &amp;quot;Test Hour&amp;quot; on Saturdays, also generally on &amp;quot;Wright Plaza&amp;quot;. Both these weekly events are held at 1900UTC. Check on the #opensim IRC channel on Freenode just before each of these events if there is any confusion.&lt;br /&gt;
&lt;br /&gt;
There is also a mailman email distribution list available at https://lists.berlios.de/mailman/listinfo/opensim-dev&lt;br /&gt;
&lt;br /&gt;
==Interest Groups==&lt;br /&gt;
* [[OpenSim Quality Focus Group]] - A proposed group for developers interested in improving the quality of OpenSim as we head towards beta status.&lt;br /&gt;
&lt;br /&gt;
==SVN Access==&lt;br /&gt;
You can browse the source code for OpenSim [http://opensimulator.org/cgi-bin/viewvc.cgi using a web browser] or via SVN.&lt;br /&gt;
* Anonymous Checkout - see [[Download]]&lt;br /&gt;
* Developer Checkout&lt;br /&gt;
 svn co svn+ssh://USERNAME@opensimulator.org/var/svn/opensim/trunk&lt;br /&gt;
&lt;br /&gt;
==Submitting Patches==&lt;br /&gt;
&lt;br /&gt;
Please review [[Submitting_code_to_OpenSim]]&lt;br /&gt;
&lt;br /&gt;
==Recent SVN Commits==&lt;br /&gt;
&amp;lt;rss&amp;gt;http://cia.vc/stats/project/opensim/.rss|max=5|title=none&amp;lt;/rss&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Main]]&lt;br /&gt;
[[Category:Getting Started]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&amp;lt;cleanpage title=hide cats=hide /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/ModRex</id>
		<title>ModRex</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/ModRex"/>
				<updated>2009-05-06T13:17:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''This software is still pre-alpha. Don't use it, unless you don't mind compiling/debugging it yourself''&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
[[image:modrex.jpg|250px|thumb|left|ModRex with mesh support, running on Linux]]&lt;br /&gt;
ModRex is a joint effort between RealXtend and OpenSim developers to make it&lt;br /&gt;
possible to join the RealXtend viewer to the OpenSim codebase. The RealXtend&lt;br /&gt;
viewer employs the open source [http://www.ogre3d.org OGRE game engine]&lt;br /&gt;
and differs from the Linden Lab viewer (LLviewer) in several ways. The most distinct&lt;br /&gt;
difference is in the new rendering potential offered by OGRE. When using&lt;br /&gt;
RealXtend as a viewer for OpenSim, one obtains real-time shadows, improved&lt;br /&gt;
lighting simulation, and more importantly, the [http://www.youtube.com/watch?v=yEXqiv2_kbE&amp;amp;feature=channel_page OGRE mesh]. The mesh is hierarchical&lt;br /&gt;
(multiple meshes and sub-meshes) and can include a skeleton for defining avatar motion and dynamics.&lt;br /&gt;
&lt;br /&gt;
ModRex is important to the OpenSim community mainly because, like the base&lt;br /&gt;
opensim code base itself, the RealXtend viewer is open source and breaks away&lt;br /&gt;
from some of the key contraints imposed by the LLviewer, such as inability to&lt;br /&gt;
create meshes, shadows, realistic avatars, and advanced lighting effects. ModRex&lt;br /&gt;
while not part of the viewer, is the glue that connects the viewer to the opensim&lt;br /&gt;
trunk code.&lt;br /&gt;
&lt;br /&gt;
and a  to illustrate some of the mesh and lighting effects in the viewer:&lt;br /&gt;
&lt;br /&gt;
To use ModRex, you need the following: &lt;br /&gt;
* [http://www.realxtend.org/page.php?pg=downloads RealXtend viewer]&lt;br /&gt;
* [http://forge.opensimulator.org/gf/project/modrex/ ModRex]&lt;br /&gt;
* [OpenSim-SVN (rev. 8814+)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://forge.opensimulator.org/gf/project/modrex/ Source Code]&lt;br /&gt;
* [http://rexdeveloper.org/wiki/index.php?title=Features_supported_currently ModRex Features/Status]&lt;br /&gt;
* [http://www.realxtend.org Main RealXtend]&lt;br /&gt;
* [http://rexdeveloper.org/wiki/index.php?title=Main_Page Rex Developer]&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===Linux===&lt;br /&gt;
In our setup we will be using standalone OpenSim instances, utilizing modrex. Each OpenSim instance will have it's own database. &lt;br /&gt;
&lt;br /&gt;
 mkdir /opt/opensim opt/opensim/sim1 /opt/opensim/authentication /opt/opensim/avatarstorage /opt/opensim/builds /opt/opensim/moo&lt;br /&gt;
 cd /opt/opensim/builds/8800&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk . &lt;br /&gt;
 sh runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
 mkdir modrex&lt;br /&gt;
 cd modrex&lt;br /&gt;
 svn checkout http://forge.opensimulator.org/svn/modrex/trunk .&lt;br /&gt;
 sh runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
 cp -R /opt/opensim/builds/8800/modrex/ModularRex/RexParts/RexPython/Resources/* /opt/opensim/builds/8800/bin/ScriptEngines&lt;br /&gt;
 cd /opt/opensim/builds/8800/bin&lt;br /&gt;
 cp OpenSim.ini.example OpenSim.ini&lt;br /&gt;
* edit OpenSim.ini, and add this:&lt;br /&gt;
 ;disable the default eventqueue&lt;br /&gt;
 EventQueue = false&lt;br /&gt;
 ;This goes where the physics are setup&lt;br /&gt;
 physics=RexOpenDynamicsEngine&lt;br /&gt;
 [realXtend]&lt;br /&gt;
 FirstPort = 7000&lt;br /&gt;
 voice_server_url = http://mydomain.org&lt;br /&gt;
 rex_python = true&lt;br /&gt;
 RexEventQueue = true&lt;br /&gt;
 enabled = true&lt;br /&gt;
 ;db_connectionstring = &amp;quot;SQLiteDialect;SQLite20Driver;Data Source=RexObjects.db;Version=3&amp;quot;&lt;br /&gt;
 db_connectionstring = &amp;quot;MySQLDialect;MySqlDataDriver;Data Source=localhost;Database=opensim;User ID=root;Password=mypw;&amp;quot;&lt;br /&gt;
* Copy the modrex enabled OpenSimulator to the production dir&lt;br /&gt;
 cp -R /opt/opensim/builds/8800/bin/* /opt/opensim/sim1&lt;br /&gt;
* Download and build the authentication service&lt;br /&gt;
 svn co https://realxtendserver.svn.sourceforge.net/svnroot/realxtendserver/authentication/tags/0.4 /opt/opensim/authentication&lt;br /&gt;
 cd /opt/opensim/authentication&lt;br /&gt;
 mono bin/Prebuild.exe /target nant&lt;br /&gt;
 nant&lt;br /&gt;
* Create a mysql database &amp;quot;authentication&amp;quot; or point to WiXTD's(experimental) database&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono Authentication.exe &lt;br /&gt;
* Setup authentication&lt;br /&gt;
 MySql_SqlHandler.dll (or SQLite_SqlHandler.dll. MySql_SqlHandler.dll gives not implemented messages but seems to work ok)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(AuthenticationEngine=AuthenticationEngine.dll)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(logging enabled=False)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(def. region x 1000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(def. region y 1000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(avatarstorageurl 172.16.1.65:10000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(default gridurl 172.16.1.65:9000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(default dns)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbserver 127.0.0.1)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbname authentication)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbuser root)&lt;br /&gt;
 *******(dbpw for root)&lt;br /&gt;
 172.16.1.65 (httpsettings LAN-IP)&lt;br /&gt;
''The authentication daemon should run by now''&lt;br /&gt;
* Create a user in the authentication screenconsole&lt;br /&gt;
 create user&lt;br /&gt;
&lt;br /&gt;
* Download and build the avatarstorage service&lt;br /&gt;
 svn co https://realxtendserver.svn.sourceforge.net/svnroot/realxtendserver/avatarstorage/tags/0.4 /opt/opensim/avatarstorage&lt;br /&gt;
 cd /opt/opensim/avatarstorage&lt;br /&gt;
 bin/Prebuild.exe /target nant&lt;br /&gt;
 nant&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono AvatarStorage.exe&lt;br /&gt;
* Setup avatarstorage&lt;br /&gt;
 MySql_SqlHandler.dll&lt;br /&gt;
 &amp;lt;enter&amp;gt;(AuthenticationEngine.dll)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(Inventory True)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(PersonalInventoryService.dll)&lt;br /&gt;
 PersonalInventory.SQLITE.dll&lt;br /&gt;
 &amp;lt;enter&amp;gt;(logging_enabled False)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbserver 127.0.0.1)&lt;br /&gt;
 avatarstorage (dbname)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbuser root)&lt;br /&gt;
 ********(dbpw root)&lt;br /&gt;
 172.16.1.65 (httpsettings LAN-IP)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(http port 10000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(ssl False)&lt;br /&gt;
''The avatarstorage daemon should run by now''&lt;br /&gt;
* You can use this [[rex serverscript]] to manage and start the services(uses screen), or install WiXTD and Moo...&lt;br /&gt;
Most important screen-commands are:&lt;br /&gt;
 screen -list (shows screen sessions)&lt;br /&gt;
 screen -r screenname (attaches to the screensession)&lt;br /&gt;
 ctrl-a + d (detaches from the screensession)&lt;br /&gt;
&lt;br /&gt;
the 'Account' part is the first part in your rex-username(account@myauthenticationdaemonuri)&lt;br /&gt;
* Check in the Simulator console if everything started the way it's supposed to&lt;br /&gt;
&lt;br /&gt;
''Once the three services are running, an initial user was made, fire up the realXtend client from [[RealXtend_Viewer_Linux|wine]] and login with your credentials.''&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
The following procedure is used to set up modrex:&lt;br /&gt;
&lt;br /&gt;
* Modrex uses the latest subversion (latest build) of OpenSim. Download opensim using svn checkout of the trunk code. This procedure used Microsoft Visual C# 2008. To differentiate the checkout from other opensim builds that you may have, call it opensim_modrex, for example. Then, you will remember that this build requires the RealXtend viewer. We'll assume you have your opensim implementation stored in C:\opensim_modrex.&lt;br /&gt;
* Prebuild (i.e., running Prebuild2008) and compile as you would do normally just to make sure that this build of opensim is executing. Start up opensim and make sure that you can view the region using the LLviewer.&lt;br /&gt;
* Create a new folder such as C:\modrex, and then get the latest version of modrex into this folder. Modrex is obtained using a version of svn, such as TortoiseSVN. The checkout URL is http://forge.opensimulator.org/svn/modrex. You will need to enter &amp;quot;anonymous&amp;quot; when asked to check out modrex. Make note of the revision of modrex after all files have been downloaded, just for reference in case you encounter difficulties and need to report a concern or bug.&lt;br /&gt;
* Copy the folders located in C:\modrex\trunk to C:\opensim_modrex\opensim&lt;br /&gt;
* Run the prebuild (if using VC # 2005) or prebuild2008 (if using VC# 2008) that is now located  under C:\opensim_modrex\opensim\ModularRex.&lt;br /&gt;
* Go to your c:\opensim_modrex, launch VC# on the OpenSim solution, and enter 3 projects to the existing OpenSim solution (right-mouse click on the solution name, Add-&amp;gt;Existing Project): ModularRex (found in C:\opensim_modrex\opensim\ModularRex), ModularRex.Nhibernate (found in C:\opensim_modrex\opensim\ModularRex\Nhibernate), and ModularRex.RexFramework (found in C:\opensim_modrex\opensim\ModularRex\RexFramework).&lt;br /&gt;
* Re-build the opensim solution. There should not be any errors. This, in turn, will add new region modules especially for the RealXtend viewer/OpenSim connection inside of C:\opensim_modrex\bin.&lt;br /&gt;
* Make sure to copy OpenSim.ini.example to OpenSim.ini. Inside of this new ini file (c:\opensim_modrex\bin\OpenSim.ini), add the following section: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realXtend]&lt;br /&gt;
db_connectionstring = &amp;quot;SQLiteDialect;SQLite20Driver;Data Source=RexObjects.db;Version=3&amp;quot;&lt;br /&gt;
# Assuming you are running modrex ver 99 or later, add the following and turn off the OpenSim EventQueue &lt;br /&gt;
RexEventQueue=True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In the [Startup] section, set EventQueue=False&lt;br /&gt;
&lt;br /&gt;
* We are almost ready to run the viewer, except that the current incarnation of modrex requires authentication and avatar storage to be run separately in addition to opensim. Therefore, the way to run modrex, is to (1) Start the Authentication server, (2) Start the Avatar Storage server, and finally to (3) run opensim. The server is located in the general web page as the client viewer [http://realxtend.org/page.php?pg=downloads here]. This procedure was based on the latest binary server available. The  authentication server and avatar storage servers are .exe files located in the primary server download. Do not run the server, only Authentication and Avatar Storage. Use the Authentication window to add new users as required.&lt;br /&gt;
* Launch opensim.exe. This will now run opensim, access the new Modrex region modules inside of C:\opensim_modrex\bin, and start up your opensim server.&lt;br /&gt;
* Launch the RealXtend viewer and enter your username, password, and connection. Your username, in contrast to Opensim user names, will be one string such as &amp;quot;testuser&amp;quot;. If the domain of your server is myserver.com, then you log in as &amp;quot;testuser@myserver.com&amp;quot; entered in the &amp;quot;User Name&amp;quot; field. Enter the password. For &amp;quot;Connect To:&amp;quot;, enter  your server: myserver.com. Then, press &amp;quot;Connect&amp;quot; in the viewer.&lt;br /&gt;
* You should be inside of your opensim world but using the RealXtend viewer. Caveats and Bugs are located below.&lt;br /&gt;
* The RealXtend viewer can run python scripts. To enable python, first add the following line in the [startup] section of OpenSim.ini:  rex_python=true. Then, you must copy the following two directories: C:\opensim_modrex\opensim\ModularRex\RexParts\RexPython\Resources\Lib and PythonScript to C:\opensim_modrex\bin\ScriptEngines. [http://www.youtube.com/watch?v=vlTE7onElVE&amp;amp;feature=channel_page Here] is an example using a python script that postprocesses the main window rendering with OGRE-based effects.&lt;br /&gt;
* If you ever wish to use the LLviewer on the region you have created, temporarily move the RealXtend region modules under C:\opensim_modrex\bin out of there, and launch LLviewer. These modules are all prefixed with &amp;quot;ModularRex.&amp;quot;. Move the region modules back to continue with the RealXtend viewer. Note that RealXtend-specific artifacts (mesh, shadows) will not appear in LLviewer.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
* Some parts of the LLViewer interface do not yet exist in the RealXtend viewer. This is related to ModRex not allowing the viewer to set or retrieve certain data.&lt;br /&gt;
* Inter-mesh collisions not yet implemented, although avatar w/ primitive collisions work&lt;br /&gt;
* Shift-copied Objects may loose their texture after a sim restart&lt;br /&gt;
&lt;br /&gt;
==Recent Fixes==&lt;br /&gt;
* Multiregion Support with RexQueue&lt;br /&gt;
* Multiple standalones on one machine supported&lt;br /&gt;
* NHibernate-db supports mysql, sqlite and mssql2005. Meshes are persistent&lt;br /&gt;
* Mesh collisions with primitives work&lt;br /&gt;
* Python scripting works for the most part (some functions are not working yet)&lt;br /&gt;
* Shift-copy keeps mesh as primdata&lt;br /&gt;
* OpenSim library useable now&lt;br /&gt;
* Avatar is stored, but appearance changes only after viewer restart&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/ModRex</id>
		<title>ModRex</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/ModRex"/>
				<updated>2009-05-06T12:05:22Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''This software is still pre-alpha. Don't use it, unless you don't mind compiling/debugging it yourself''&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
[[image:modrex.jpg|250px|thumb|left|ModRex with mesh support, running on Linux]]&lt;br /&gt;
ModRex is a joint effort between RealXtend and OpenSim developers to make it&lt;br /&gt;
possible to join the RealXtend viewer to the OpenSim codebase. The RealXtend&lt;br /&gt;
viewer employs the open source [http://www.ogre3d.org OGRE game engine]&lt;br /&gt;
and differs from the Linden Lab viewer (LLviewer) in several ways. The most distinct&lt;br /&gt;
difference is in the new rendering potential offered by OGRE. When using&lt;br /&gt;
RealXtend as a viewer for OpenSim, one obtains real-time shadows, improved&lt;br /&gt;
lighting simulation, and more importantly, the [http://www.youtube.com/watch?v=yEXqiv2_kbE&amp;amp;feature=channel_page OGRE mesh]. The mesh is hierarchical&lt;br /&gt;
(multiple meshes and sub-meshes) and can include a skeleton for defining avatar motion and dynamics.&lt;br /&gt;
&lt;br /&gt;
ModRex is important to the OpenSim community mainly because, like the base&lt;br /&gt;
opensim code base itself, the RealXtend viewer is open source and breaks away&lt;br /&gt;
from some of the key contraints imposed by the LLviewer, such as inability to&lt;br /&gt;
create meshes, shadows, realistic avatars, and advanced lighting effects. ModRex&lt;br /&gt;
while not part of the viewer, is the glue that connects the viewer to the opensim&lt;br /&gt;
trunk code.&lt;br /&gt;
&lt;br /&gt;
and a  to illustrate some of the mesh and lighting effects in the viewer:&lt;br /&gt;
&lt;br /&gt;
To use ModRex, you need the following: &lt;br /&gt;
* [http://www.realxtend.org/page.php?pg=downloads RealXtend viewer]&lt;br /&gt;
* [http://forge.opensimulator.org/gf/project/modrex/ ModRex]&lt;br /&gt;
* [OpenSim-SVN (rev. 8814+)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://forge.opensimulator.org/gf/project/modrex/ Source Code]&lt;br /&gt;
* [http://rexdeveloper.org/wiki/index.php?title=Features_supported_currently ModRex Features/Status]&lt;br /&gt;
* [http://www.realxtend.org Main RealXtend]&lt;br /&gt;
* [http://rexdeveloper.org/wiki/index.php?title=Main_Page Rex Developer]&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===Linux===&lt;br /&gt;
In our setup we will be using standalone OpenSim instances, utilizing modrex. Each OpenSim instance will have it's own database. &lt;br /&gt;
&lt;br /&gt;
 mkdir /opt/opensim opt/opensim/sim1 /opt/opensim/authentication /opt/opensim/avatarstorage /opt/opensim/builds /opt/opensim/moo&lt;br /&gt;
 cd /opt/opensim/builds/8800&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk . &lt;br /&gt;
 sh runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
 mkdir modrex&lt;br /&gt;
 cd modrex&lt;br /&gt;
 svn checkout http://forge.opensimulator.org/svn/modrex/trunk .&lt;br /&gt;
 sh runprebuild.sh&lt;br /&gt;
 nant -buildfile:ModularRex.build&lt;br /&gt;
 cp -R /opt/opensim/builds/8800/modrex/ModularRex/RexParts/RexPython/Resources/* /opt/opensim/builds/8800/bin/ScriptEngines&lt;br /&gt;
 cd /opt/opensim/builds/8800/bin&lt;br /&gt;
 cp OpenSim.ini.example OpenSim.ini&lt;br /&gt;
* edit OpenSim.ini, and add this:&lt;br /&gt;
 ;disable the default eventqueue&lt;br /&gt;
 EventQueue = false&lt;br /&gt;
 ;This goes where the physics are setup&lt;br /&gt;
 physics=RexOpenDynamicsEngine&lt;br /&gt;
 [realXtend]&lt;br /&gt;
 FirstPort = 7000&lt;br /&gt;
 voice_server_url = http://mydomain.org&lt;br /&gt;
 rex_python = true&lt;br /&gt;
 RexEventQueue = true&lt;br /&gt;
 enabled = true&lt;br /&gt;
 ;db_connectionstring = &amp;quot;SQLiteDialect;SQLite20Driver;Data Source=RexObjects.db;Version=3&amp;quot;&lt;br /&gt;
 db_connectionstring = &amp;quot;MySQLDialect;MySqlDataDriver;Data Source=localhost;Database=opensim;User ID=root;Password=mypw;&amp;quot;&lt;br /&gt;
* Copy the modrex enabled OpenSimulator to the production dir&lt;br /&gt;
 cp -R /opt/opensim/builds/8800/bin/* /opt/opensim/sim1&lt;br /&gt;
* Download and build the authentication service&lt;br /&gt;
 svn co https://realxtendserver.svn.sourceforge.net/svnroot/realxtendserver/authentication/tags/0.4 /opt/opensim/authentication&lt;br /&gt;
 cd /opt/opensim/authentication&lt;br /&gt;
 mono bin/Prebuild.exe /target nant&lt;br /&gt;
 nant&lt;br /&gt;
* Create a mysql database &amp;quot;authentication&amp;quot; or point to WiXTD's(experimental) database&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono Authentication.exe &lt;br /&gt;
* Setup authentication&lt;br /&gt;
 MySql_SqlHandler.dll (or SQLite_SqlHandler.dll. MySql_SqlHandler.dll gives not implemented messages but seems to work ok)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(AuthenticationEngine=AuthenticationEngine.dll)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(logging enabled=False)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(def. region x 1000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(def. region y 1000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(avatarstorageurl 172.16.1.65:10000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(default gridurl 172.16.1.65:9000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(default dns)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbserver 127.0.0.1)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbname authentication)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbuser root)&lt;br /&gt;
 *******(dbpw for root)&lt;br /&gt;
 172.16.1.65 (httpsettings LAN-IP)&lt;br /&gt;
''The authentication daemon should run by now''&lt;br /&gt;
* Create a user in the authentication screenconsole&lt;br /&gt;
 create user&lt;br /&gt;
&lt;br /&gt;
* Download and build the avatarstorage service&lt;br /&gt;
 svn co https://realxtendserver.svn.sourceforge.net/svnroot/realxtendserver/avatarstorage/tags/0.4 /opt/opensim/avatarstorage&lt;br /&gt;
 cd /opt/opensim/avatarstorage&lt;br /&gt;
 bin/Prebuild.exe /target nant&lt;br /&gt;
 nant&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono AvatarStorage.exe&lt;br /&gt;
* Setup avatarstorage&lt;br /&gt;
 MySql_SqlHandler.dll&lt;br /&gt;
 &amp;lt;enter&amp;gt;(AuthenticationEngine.dll)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(Inventory True)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(PersonalInventoryService.dll)&lt;br /&gt;
 PersonalInventory.SQLITE.dll&lt;br /&gt;
 &amp;lt;enter&amp;gt;(logging_enabled False)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbserver 127.0.0.1)&lt;br /&gt;
 avatarstorage (dbname)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbuser root)&lt;br /&gt;
 ********(dbpw root)&lt;br /&gt;
 172.16.1.65 (httpsettings LAN-IP)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(http port 10000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(ssl False)&lt;br /&gt;
''The avatarstorage daemon should run by now''&lt;br /&gt;
* You can use this [[rex serverscript]] to manage and start the services(uses screen), or install WiXTD and Moo...&lt;br /&gt;
Most important screen-commands are:&lt;br /&gt;
 screen -list (shows screen sessions)&lt;br /&gt;
 screen -r screenname (attaches to the screensession)&lt;br /&gt;
 ctrl-a + d (detaches from the screensession)&lt;br /&gt;
&lt;br /&gt;
the 'Account' part is the first part in your rex-username(account@myauthenticationdaemonuri)&lt;br /&gt;
* Check in the Simulator console if everything started the way it's supposed to&lt;br /&gt;
&lt;br /&gt;
''Once the three services are running, an initial user was made, fire up the realXtend client from [[RealXtend_Viewer_Linux|wine]] and login with your credentials.''&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
The following procedure is used to set up modrex:&lt;br /&gt;
&lt;br /&gt;
* Modrex uses the latest subversion (latest build) of OpenSim. Download opensim using svn checkout of the trunk code. This procedure used Microsoft Visual C# 2008. To differentiate the checkout from other opensim builds that you may have, call it opensim_modrex, for example. Then, you will remember that this build requires the RealXtend viewer. We'll assume you have your opensim implementation stored in C:\opensim_modrex.&lt;br /&gt;
* Prebuild (i.e., running Prebuild2008) and compile as you would do normally just to make sure that this build of opensim is executing. Start up opensim and make sure that you can view the region using the LLviewer.&lt;br /&gt;
* Create a new folder such as C:\modrex, and then get the latest version of modrex into this folder. Modrex is obtained using a version of svn, such as TortoiseSVN. The checkout URL is http://forge.opensimulator.org/svn/modrex. You will need to enter &amp;quot;anonymous&amp;quot; when asked to check out modrex. Make note of the revision of modrex after all files have been downloaded, just for reference in case you encounter difficulties and need to report a concern or bug.&lt;br /&gt;
* Copy the folders located in C:\modrex\trunk to C:\opensim_modrex\opensim&lt;br /&gt;
* Run the prebuild (if using VC # 2005) or prebuild2008 (if using VC# 2008) that is now located  under C:\opensim_modrex\opensim\ModularRex.&lt;br /&gt;
* Go to your c:\opensim_modrex, launch VC# on the OpenSim solution, and enter 3 projects to the existing OpenSim solution (right-mouse click on the solution name, Add-&amp;gt;Existing Project): ModularRex (found in C:\opensim_modrex\opensim\ModularRex), ModularRex.Nhibernate (found in C:\opensim_modrex\opensim\ModularRex\Nhibernate), and ModularRex.RexFramework (found in C:\opensim_modrex\opensim\ModularRex\RexFramework).&lt;br /&gt;
* Re-build the opensim solution. There should not be any errors. This, in turn, will add new region modules especially for the RealXtend viewer/OpenSim connection inside of C:\opensim_modrex\bin.&lt;br /&gt;
* Make sure to copy OpenSim.ini.example to OpenSim.ini. Inside of this new ini file (c:\opensim_modrex\bin\OpenSim.ini), add the following section: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realXtend]&lt;br /&gt;
db_connectionstring = &amp;quot;SQLiteDialect;SQLite20Driver;Data Source=RexObjects.db;Version=3&amp;quot;&lt;br /&gt;
# Assuming you are running modrex ver 99 or later, add the following and turn off the OpenSim EventQueue &lt;br /&gt;
RexEventQueue=True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In the [Startup] section, set EventQueue=False&lt;br /&gt;
&lt;br /&gt;
* We are almost ready to run the viewer, except that the current incarnation of modrex requires authentication and avatar storage to be run separately in addition to opensim. Therefore, the way to run modrex, is to (1) Start the Authentication server, (2) Start the Avatar Storage server, and finally to (3) run opensim. The server is located in the general web page as the client viewer [http://realxtend.org/page.php?pg=downloads here]. This procedure was based on the latest binary server available. The  authentication server and avatar storage servers are .exe files located in the primary server download. Do not run the server, only Authentication and Avatar Storage. Use the Authentication window to add new users as required.&lt;br /&gt;
* Launch opensim.exe. This will now run opensim, access the new Modrex region modules inside of C:\opensim_modrex\bin, and start up your opensim server.&lt;br /&gt;
* Launch the RealXtend viewer and enter your username, password, and connection. Your username, in contrast to Opensim user names, will be one string such as &amp;quot;testuser&amp;quot;. If the domain of your server is myserver.com, then you log in as &amp;quot;testuser@myserver.com&amp;quot; entered in the &amp;quot;User Name&amp;quot; field. Enter the password. For &amp;quot;Connect To:&amp;quot;, enter  your server: myserver.com. Then, press &amp;quot;Connect&amp;quot; in the viewer.&lt;br /&gt;
* You should be inside of your opensim world but using the RealXtend viewer. Caveats and Bugs are located below.&lt;br /&gt;
* The RealXtend viewer can run python scripts. To enable python, first add the following line in the [startup] section of OpenSim.ini:  rex_python=true. Then, you must copy the following two directories: C:\opensim_modrex\opensim\ModularRex\RexParts\RexPython\Resources\Lib and PythonScript to C:\opensim_modrex\bin\ScriptEngines. [http://www.youtube.com/watch?v=vlTE7onElVE&amp;amp;feature=channel_page Here] is an example using a python script that postprocesses the main window rendering with OGRE-based effects.&lt;br /&gt;
* If you ever wish to use the LLviewer on the region you have created, temporarily move the RealXtend region modules under C:\opensim_modrex\bin out of there, and launch LLviewer. These modules are all prefixed with &amp;quot;ModularRex.&amp;quot;. Move the region modules back to continue with the RealXtend viewer. Note that RealXtend-specific artifacts (mesh, shadows) will not appear in LLviewer.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
* Some parts of the LLViewer interface do not yet exist in the RealXtend viewer. This is related to ModRex not allowing the viewer to set or retrieve certain data.&lt;br /&gt;
* Inter-mesh collisions not yet implemented, although avatar w/ primitive collisions work&lt;br /&gt;
* Shift-copied Objects may loose their texture after a sim restart&lt;br /&gt;
&lt;br /&gt;
==Recent Fixes==&lt;br /&gt;
* Multiregion Support with RexQueue&lt;br /&gt;
* Multiple standalones on one machine supported&lt;br /&gt;
* NHibernate-db supports mysql, sqlite and mssql2005. Meshes are persistent&lt;br /&gt;
* Mesh collisions with primitives work&lt;br /&gt;
* Python scripting works for the most part (some functions are not working yet)&lt;br /&gt;
* Shift-copy keeps mesh as primdata&lt;br /&gt;
* OpenSim library useable now&lt;br /&gt;
* Avatar is stored, but appearance changes only after viewer restart&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/ModRex</id>
		<title>ModRex</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/ModRex"/>
				<updated>2009-05-06T12:04:48Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''This software is still pre-alpha. Don't use it, unless you don't mind compiling/debugging it yourself''&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
[[image:modrex.jpg|250px|thumb|left|ModRex with mesh support, running on Linux]]&lt;br /&gt;
ModRex is a joint effort between RealXtend and OpenSim developers to make it&lt;br /&gt;
possible to join the RealXtend viewer to the OpenSim codebase. The RealXtend&lt;br /&gt;
viewer employs the open source [http://www.ogre3d.org OGRE game engine]&lt;br /&gt;
and differs from the Linden Lab viewer (LLviewer) in several ways. The most distinct&lt;br /&gt;
difference is in the new rendering potential offered by OGRE. When using&lt;br /&gt;
RealXtend as a viewer for OpenSim, one obtains real-time shadows, improved&lt;br /&gt;
lighting simulation, and more importantly, the [http://www.youtube.com/watch?v=yEXqiv2_kbE&amp;amp;feature=channel_page OGRE mesh]. The mesh is hierarchical&lt;br /&gt;
(multiple meshes and sub-meshes) and can include a skeleton for defining avatar motion and dynamics.&lt;br /&gt;
&lt;br /&gt;
ModRex is important to the OpenSim community mainly because, like the base&lt;br /&gt;
opensim code base itself, the RealXtend viewer is open source and breaks away&lt;br /&gt;
from some of the key contraints imposed by the LLviewer, such as inability to&lt;br /&gt;
create meshes, shadows, realistic avatars, and advanced lighting effects. ModRex&lt;br /&gt;
while not part of the viewer, is the glue that connects the viewer to the opensim&lt;br /&gt;
trunk code.&lt;br /&gt;
&lt;br /&gt;
and a  to illustrate some of the mesh and lighting effects in the viewer:&lt;br /&gt;
&lt;br /&gt;
To use ModRex, you need the following: &lt;br /&gt;
* [http://www.realxtend.org/page.php?pg=downloads RealXtend viewer]&lt;br /&gt;
* [http://forge.opensimulator.org/gf/project/modrex/ ModRex]&lt;br /&gt;
* [OpenSim-SVN (rev. 8814+)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://forge.opensimulator.org/gf/project/modrex/ Source Code]&lt;br /&gt;
* [http://rexdeveloper.org/wiki/index.php?title=Features_supported_currently ModRex Features/Status]&lt;br /&gt;
* [http://www.realxtend.org Main RealXtend]&lt;br /&gt;
* [http://rexdeveloper.org/wiki/index.php?title=Main_Page Rex Developer]&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===Linux===&lt;br /&gt;
In our setup we will be using standalone OpenSim instances, utilizing modrex. Each OpenSim instance will have it's own database. &lt;br /&gt;
&lt;br /&gt;
 mkdir /opt/opensim opt/opensim/sim1 /opt/opensim/authentication /opt/opensim/avatarstorage /opt/opensim/builds /opt/opensim/moo&lt;br /&gt;
 cd /opt/opensim/builds/8800&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk . &lt;br /&gt;
 sh runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
 mkdir modrex&lt;br /&gt;
 cd modrex&lt;br /&gt;
 svn checkout http://forge.opensimulator.org/svn/modrex/trunk .&lt;br /&gt;
./runprebuild.sh&lt;br /&gt;
 nant -buildfile:ModularRex.build&lt;br /&gt;
 cp -R /opt/opensim/builds/8800/modrex/ModularRex/RexParts/RexPython/Resources/* /opt/opensim/builds/8800/bin/ScriptEngines&lt;br /&gt;
 cd /opt/opensim/builds/8800/bin&lt;br /&gt;
 cp OpenSim.ini.example OpenSim.ini&lt;br /&gt;
* edit OpenSim.ini, and add this:&lt;br /&gt;
 ;disable the default eventqueue&lt;br /&gt;
 EventQueue = false&lt;br /&gt;
 ;This goes where the physics are setup&lt;br /&gt;
 physics=RexOpenDynamicsEngine&lt;br /&gt;
 [realXtend]&lt;br /&gt;
 FirstPort = 7000&lt;br /&gt;
 voice_server_url = http://mydomain.org&lt;br /&gt;
 rex_python = true&lt;br /&gt;
 RexEventQueue = true&lt;br /&gt;
 enabled = true&lt;br /&gt;
 ;db_connectionstring = &amp;quot;SQLiteDialect;SQLite20Driver;Data Source=RexObjects.db;Version=3&amp;quot;&lt;br /&gt;
 db_connectionstring = &amp;quot;MySQLDialect;MySqlDataDriver;Data Source=localhost;Database=opensim;User ID=root;Password=mypw;&amp;quot;&lt;br /&gt;
* Copy the modrex enabled OpenSimulator to the production dir&lt;br /&gt;
 cp -R /opt/opensim/builds/8800/bin/* /opt/opensim/sim1&lt;br /&gt;
* Download and build the authentication service&lt;br /&gt;
 svn co https://realxtendserver.svn.sourceforge.net/svnroot/realxtendserver/authentication/tags/0.4 /opt/opensim/authentication&lt;br /&gt;
 cd /opt/opensim/authentication&lt;br /&gt;
 mono bin/Prebuild.exe /target nant&lt;br /&gt;
 nant&lt;br /&gt;
* Create a mysql database &amp;quot;authentication&amp;quot; or point to WiXTD's(experimental) database&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono Authentication.exe &lt;br /&gt;
* Setup authentication&lt;br /&gt;
 MySql_SqlHandler.dll (or SQLite_SqlHandler.dll. MySql_SqlHandler.dll gives not implemented messages but seems to work ok)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(AuthenticationEngine=AuthenticationEngine.dll)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(logging enabled=False)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(def. region x 1000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(def. region y 1000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(avatarstorageurl 172.16.1.65:10000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(default gridurl 172.16.1.65:9000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(default dns)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbserver 127.0.0.1)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbname authentication)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbuser root)&lt;br /&gt;
 *******(dbpw for root)&lt;br /&gt;
 172.16.1.65 (httpsettings LAN-IP)&lt;br /&gt;
''The authentication daemon should run by now''&lt;br /&gt;
* Create a user in the authentication screenconsole&lt;br /&gt;
 create user&lt;br /&gt;
&lt;br /&gt;
* Download and build the avatarstorage service&lt;br /&gt;
 svn co https://realxtendserver.svn.sourceforge.net/svnroot/realxtendserver/avatarstorage/tags/0.4 /opt/opensim/avatarstorage&lt;br /&gt;
 cd /opt/opensim/avatarstorage&lt;br /&gt;
 bin/Prebuild.exe /target nant&lt;br /&gt;
 nant&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono AvatarStorage.exe&lt;br /&gt;
* Setup avatarstorage&lt;br /&gt;
 MySql_SqlHandler.dll&lt;br /&gt;
 &amp;lt;enter&amp;gt;(AuthenticationEngine.dll)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(Inventory True)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(PersonalInventoryService.dll)&lt;br /&gt;
 PersonalInventory.SQLITE.dll&lt;br /&gt;
 &amp;lt;enter&amp;gt;(logging_enabled False)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbserver 127.0.0.1)&lt;br /&gt;
 avatarstorage (dbname)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(dbuser root)&lt;br /&gt;
 ********(dbpw root)&lt;br /&gt;
 172.16.1.65 (httpsettings LAN-IP)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(http port 10000)&lt;br /&gt;
 &amp;lt;enter&amp;gt;(ssl False)&lt;br /&gt;
''The avatarstorage daemon should run by now''&lt;br /&gt;
* You can use this [[rex serverscript]] to manage and start the services(uses screen), or install WiXTD and Moo...&lt;br /&gt;
Most important screen-commands are:&lt;br /&gt;
 screen -list (shows screen sessions)&lt;br /&gt;
 screen -r screenname (attaches to the screensession)&lt;br /&gt;
 ctrl-a + d (detaches from the screensession)&lt;br /&gt;
&lt;br /&gt;
the 'Account' part is the first part in your rex-username(account@myauthenticationdaemonuri)&lt;br /&gt;
* Check in the Simulator console if everything started the way it's supposed to&lt;br /&gt;
&lt;br /&gt;
''Once the three services are running, an initial user was made, fire up the realXtend client from [[RealXtend_Viewer_Linux|wine]] and login with your credentials.''&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
The following procedure is used to set up modrex:&lt;br /&gt;
&lt;br /&gt;
* Modrex uses the latest subversion (latest build) of OpenSim. Download opensim using svn checkout of the trunk code. This procedure used Microsoft Visual C# 2008. To differentiate the checkout from other opensim builds that you may have, call it opensim_modrex, for example. Then, you will remember that this build requires the RealXtend viewer. We'll assume you have your opensim implementation stored in C:\opensim_modrex.&lt;br /&gt;
* Prebuild (i.e., running Prebuild2008) and compile as you would do normally just to make sure that this build of opensim is executing. Start up opensim and make sure that you can view the region using the LLviewer.&lt;br /&gt;
* Create a new folder such as C:\modrex, and then get the latest version of modrex into this folder. Modrex is obtained using a version of svn, such as TortoiseSVN. The checkout URL is http://forge.opensimulator.org/svn/modrex. You will need to enter &amp;quot;anonymous&amp;quot; when asked to check out modrex. Make note of the revision of modrex after all files have been downloaded, just for reference in case you encounter difficulties and need to report a concern or bug.&lt;br /&gt;
* Copy the folders located in C:\modrex\trunk to C:\opensim_modrex\opensim&lt;br /&gt;
* Run the prebuild (if using VC # 2005) or prebuild2008 (if using VC# 2008) that is now located  under C:\opensim_modrex\opensim\ModularRex.&lt;br /&gt;
* Go to your c:\opensim_modrex, launch VC# on the OpenSim solution, and enter 3 projects to the existing OpenSim solution (right-mouse click on the solution name, Add-&amp;gt;Existing Project): ModularRex (found in C:\opensim_modrex\opensim\ModularRex), ModularRex.Nhibernate (found in C:\opensim_modrex\opensim\ModularRex\Nhibernate), and ModularRex.RexFramework (found in C:\opensim_modrex\opensim\ModularRex\RexFramework).&lt;br /&gt;
* Re-build the opensim solution. There should not be any errors. This, in turn, will add new region modules especially for the RealXtend viewer/OpenSim connection inside of C:\opensim_modrex\bin.&lt;br /&gt;
* Make sure to copy OpenSim.ini.example to OpenSim.ini. Inside of this new ini file (c:\opensim_modrex\bin\OpenSim.ini), add the following section: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realXtend]&lt;br /&gt;
db_connectionstring = &amp;quot;SQLiteDialect;SQLite20Driver;Data Source=RexObjects.db;Version=3&amp;quot;&lt;br /&gt;
# Assuming you are running modrex ver 99 or later, add the following and turn off the OpenSim EventQueue &lt;br /&gt;
RexEventQueue=True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In the [Startup] section, set EventQueue=False&lt;br /&gt;
&lt;br /&gt;
* We are almost ready to run the viewer, except that the current incarnation of modrex requires authentication and avatar storage to be run separately in addition to opensim. Therefore, the way to run modrex, is to (1) Start the Authentication server, (2) Start the Avatar Storage server, and finally to (3) run opensim. The server is located in the general web page as the client viewer [http://realxtend.org/page.php?pg=downloads here]. This procedure was based on the latest binary server available. The  authentication server and avatar storage servers are .exe files located in the primary server download. Do not run the server, only Authentication and Avatar Storage. Use the Authentication window to add new users as required.&lt;br /&gt;
* Launch opensim.exe. This will now run opensim, access the new Modrex region modules inside of C:\opensim_modrex\bin, and start up your opensim server.&lt;br /&gt;
* Launch the RealXtend viewer and enter your username, password, and connection. Your username, in contrast to Opensim user names, will be one string such as &amp;quot;testuser&amp;quot;. If the domain of your server is myserver.com, then you log in as &amp;quot;testuser@myserver.com&amp;quot; entered in the &amp;quot;User Name&amp;quot; field. Enter the password. For &amp;quot;Connect To:&amp;quot;, enter  your server: myserver.com. Then, press &amp;quot;Connect&amp;quot; in the viewer.&lt;br /&gt;
* You should be inside of your opensim world but using the RealXtend viewer. Caveats and Bugs are located below.&lt;br /&gt;
* The RealXtend viewer can run python scripts. To enable python, first add the following line in the [startup] section of OpenSim.ini:  rex_python=true. Then, you must copy the following two directories: C:\opensim_modrex\opensim\ModularRex\RexParts\RexPython\Resources\Lib and PythonScript to C:\opensim_modrex\bin\ScriptEngines. [http://www.youtube.com/watch?v=vlTE7onElVE&amp;amp;feature=channel_page Here] is an example using a python script that postprocesses the main window rendering with OGRE-based effects.&lt;br /&gt;
* If you ever wish to use the LLviewer on the region you have created, temporarily move the RealXtend region modules under C:\opensim_modrex\bin out of there, and launch LLviewer. These modules are all prefixed with &amp;quot;ModularRex.&amp;quot;. Move the region modules back to continue with the RealXtend viewer. Note that RealXtend-specific artifacts (mesh, shadows) will not appear in LLviewer.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
* Some parts of the LLViewer interface do not yet exist in the RealXtend viewer. This is related to ModRex not allowing the viewer to set or retrieve certain data.&lt;br /&gt;
* Inter-mesh collisions not yet implemented, although avatar w/ primitive collisions work&lt;br /&gt;
* Shift-copied Objects may loose their texture after a sim restart&lt;br /&gt;
&lt;br /&gt;
==Recent Fixes==&lt;br /&gt;
* Multiregion Support with RexQueue&lt;br /&gt;
* Multiple standalones on one machine supported&lt;br /&gt;
* NHibernate-db supports mysql, sqlite and mssql2005. Meshes are persistent&lt;br /&gt;
* Mesh collisions with primitives work&lt;br /&gt;
* Python scripting works for the most part (some functions are not working yet)&lt;br /&gt;
* Shift-copy keeps mesh as primdata&lt;br /&gt;
* OpenSim library useable now&lt;br /&gt;
* Avatar is stored, but appearance changes only after viewer restart&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-31T02:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Mono.Addin concepts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
For more information, please read the [http://www.mono-project.com/Mono.Addins_FAQ Mono.Addins FAQ]&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system.&lt;br /&gt;
&lt;br /&gt;
A more detailed (and '''''authoritative'''''!) explanation can be found [http://www.mono-project.com/Mono.Addins_FAQ#Using_Mono.Addins here] and [http://www.mono-project.com/Introduction_to_Mono.Addins here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
A service that can be split into producer/consumer role is called an ''extension''. An extension consists of an ''extension point'' which is essentially a text &amp;quot;path&amp;quot; that give a hierarchical name to the service a consumer requires, and an ''extension node'' which represents an object that can provide that service. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin extension node claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the producer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that look like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-31T02:24:12Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Mono.Addin concepts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
For more information, please read the [http://www.mono-project.com/Mono.Addins_FAQ Mono.Addins FAQ]&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system.&lt;br /&gt;
&lt;br /&gt;
A more detailed (and ''authoritative''!) explanation can be found [http://www.mono-project.com/Mono.Addins_FAQ#Using_Mono.Addins here] and [http://www.mono-project.com/Introduction_to_Mono.Addins here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
A service that can be split into producer/consumer role is called an ''extension''. An extension consists of an ''extension point'' which is essentially a text &amp;quot;path&amp;quot; that give a hierarchical name to the service a consumer requires, and an ''extension node'' which represents an object that can provide that service. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin extension node claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the producer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that look like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-31T02:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Why Mono.Addins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
For more information, please read the [http://www.mono-project.com/Mono.Addins_FAQ Mono.Addins FAQ]&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
A service that can be split into producer/consumer role is called an ''extension''. An extension consists of an ''extension point'' which is essentially a text &amp;quot;path&amp;quot; that give a hierarchical name to the service a consumer requires, and an ''extension node'' which represents an object that can provide that service. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin extension node claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the producer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that look like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-30T04:29:30Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Loading Named Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
A service that can be split into producer/consumer role is called an ''extension''. An extension consists of an ''extension point'' which is essentially a text &amp;quot;path&amp;quot; that give a hierarchical name to the service a consumer requires, and an ''extension node'' which represents an object that can provide that service. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin extension node claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the producer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that look like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-30T04:24:53Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* How to make your own plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
A service that can be split into producer/consumer role is called an ''extension''. An extension consists of an ''extension point'' which is essentially a text &amp;quot;path&amp;quot; that give a hierarchical name to the service a consumer requires, and an ''extension node'' which represents an object that can provide that service. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin extension node claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the producer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-30T03:12:22Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Separating Male and Female */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
A service that can be split into producer/consumer role is called an ''extension''. An extension consists of an ''extension point'' which is essentially a text &amp;quot;path&amp;quot; that give a hierarchical name to the service a consumer requires, and an ''extension node'' which represents an object that can provide that service. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin extension node claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the provider for the consumer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-29T09:39:10Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Loading Named Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
The common reference point that addins and hosts use to identify each other is called an ''extension point'', which is essentially a hierarchical text &amp;quot;path&amp;quot;. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the provider for the consumer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;LartCorp.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;Corp.LartMatic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-29T09:29:05Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
The common reference point that addins and hosts use to identify each other is called an ''extension point'', which is essentially a hierarchical text &amp;quot;path&amp;quot;. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.LartPlugin&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the provider for the consumer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All loaded plugins can now be found in &amp;quot;loader.Plugins&amp;quot; and used as necessary.&lt;br /&gt;
&lt;br /&gt;
If that looks like a lot of work, consider that outside of the normal work of splitting a class into interface and implementation, its really mostly just boilerplate, and can be accomplished by just comparing how things are currently implemented within OpenSim.&lt;br /&gt;
&lt;br /&gt;
== Filtering and Constraining ==&lt;br /&gt;
&lt;br /&gt;
When you ask to load an extension point, you are potentially bringing a lot of assemblies into memory. Before you do that, you will most likely want to have a say about how many assemblies you expect, and which one you need.&lt;br /&gt;
&lt;br /&gt;
You can do this by assigning a IPluginConstraint or IPluginFilter to an extension point.&lt;br /&gt;
&lt;br /&gt;
An IPluginConstraint is applied each time Load() is called on an extension point, but the behavior of the constraint is up to the implementor. It is assumed that a constraint will ask something of Mono.Addins, and throw an exception if it is not happy with the answer.&lt;br /&gt;
&lt;br /&gt;
=== Loading Critical Plugins ===&lt;br /&gt;
&lt;br /&gt;
For some applications we expect precisely a certain amount of plugins to be loaded. Often exactly one. PluginCountConstraint implements precisely this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int n = 1;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginCountConstraint (n));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the above code is run, and more or less than n plugin could be loaded, the constraint will throw a PluginConstraintViolatedException.&lt;br /&gt;
&lt;br /&gt;
=== Loading Named Plugins ===&lt;br /&gt;
&lt;br /&gt;
Often the reason why more than one plugin is available to load is because we wish to afford choice to the user as to which plugin he prefers, exposed in a configuration file. We read from the file the user's preference, and want to only load the desired plugin.&lt;br /&gt;
&lt;br /&gt;
If we have some addin manifests that like these:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;LartCorp&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Addin id=&amp;quot;OpenSim.Lart&amp;quot; version=&amp;quot;0.1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Runtime&amp;gt;&lt;br /&gt;
        &amp;lt;Import assembly=&amp;quot;OpenSim.Lart.dll&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Runtime&amp;gt;&lt;br /&gt;
    &amp;lt;Dependencies&amp;gt;&lt;br /&gt;
        &amp;lt;Addin id=&amp;quot;OpenSim&amp;quot; version=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;Extension path = &amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Plugin provider=&amp;quot;OpenLart&amp;quot; type=&amp;quot;OpenSim.LartPlugin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Extension&amp;gt;&lt;br /&gt;
&amp;lt;/Addin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And loading code that looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PluginLoader &amp;lt;ILart&amp;gt; loader = new PluginLoader();&lt;br /&gt;
loader.AddConstraint (&amp;quot;/OpenSim/LartMe&amp;quot;, new PluginProviderFilter (&amp;quot;LartCorp&amp;quot;));&lt;br /&gt;
loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the &amp;quot;LartCorp&amp;quot; plugin will be loaded.&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-29T09:12:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
The common reference point that addins and hosts use to identify each other is called an ''extension point'', which is essentially a hierarchical text &amp;quot;path&amp;quot;. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;br /&gt;
&lt;br /&gt;
The way to tell a host manifest from an addin manifest is that host manifests will *always* contain an ''isroot=true'' attribute in the &amp;lt;Addin&amp;gt; tag. However this is complicated by the fact that an addin can act as host for another addin in a recursive manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Building a model ===&lt;br /&gt;
&lt;br /&gt;
When the PluginLoader is first created within the host, Mono.Addins will search the directory the host was executed and search for all files that end in *.addin.xml. It uses the information to build a ''registry'' about the addins in addin-db-${VERSION}/ directory. The purpose of the registry is to collect all information once, then lazily load assemblies into memory only at the last moment when it is precisely known exactly which class is required by the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to make your own plugin ==&lt;br /&gt;
&lt;br /&gt;
# Decide on the service you wish to separate into provider and consumer. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
# Create an extension point to identify that service. Ex: &amp;quot;/OpenSim/LartMe&amp;quot;&lt;br /&gt;
# Create an consumer interface that has the methods needed, and derive it from OpenSim.Framework.IPlugin. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
## If that interface needs a constructor that takes parameters, you will also have to create a class derived from PluginInitialzerBase that can act as a [http://en.wikipedia.org/wiki/Closure_(computer_science) closure] for calling a parameterized constructor. See IApplicationPlugin for an example. Ex: &amp;quot;OpenSim.LartInitializer&amp;quot;&lt;br /&gt;
# Write a provider class that implements that interface. Ex: &amp;quot;OpenSim.Lart&amp;quot;&lt;br /&gt;
# Write a host manifest. See OpenSim.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin@isroot=true&lt;br /&gt;
## Ensure that /Addin@id is set to a unique name. Ex: &amp;quot;LartMe&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for each assembly that either hosts the application (host.EXE) or defines an addin consumer interface (Lart.dll) used by the host&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@name is set to &amp;quot;Plugin&amp;quot;. This is a custom derived node type (OpenSim.Framework.PluginExtensionNode).&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@type is set to &amp;quot;OpenSim.Framework.PluginExtensionNode&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint/ExtensionNode@objectType is set to the fully qualified name of the consumer interface found in the above assembly import. Ex: &amp;quot;OpenSim.ILart&amp;quot;&lt;br /&gt;
# Write a addin manifest. See LoadRegionsPlugin.addin.xml as an example.&lt;br /&gt;
## Ensure that /Addin/Runtime/Import@assembly exists for the assembly that implements the producer class.&lt;br /&gt;
## Ensure that /Addin/Dependencies/Addin@id exists and is the same as the id of the host manifest. Ex: &amp;quot;Lart&amp;quot;&lt;br /&gt;
## Ensure that /Addin/ExtensionPoint@path is set and is the same as that of the host manifest. Ex: &amp;quot;&amp;lt;ExtensionPoint path=&amp;quot;/OpenSim/LartMe&amp;quot;&amp;gt;...&amp;quot;&lt;br /&gt;
## Ensure that /Addin/Extension/Plugin@type is set to the fully qualified name of the implementing provider class. Ex: &amp;quot;OpenSim.Lart&amp;quot;&lt;br /&gt;
## Optionally, if you wish to discriminate on &amp;quot;provider&amp;quot; you can set /Addin/Extension/Plugin@provider&lt;br /&gt;
# When you need to load the provider for the consumer, create a PluginLoader of the type defined by the consumer interface. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; ();&amp;quot;&lt;br /&gt;
## If the provider requires a Initializer, it should be passed to the PluginLoader constructor. All plugins will be initialized using this initializer. Ex: &amp;quot;new PluginLoader &amp;lt;ILart&amp;gt; (new LartInitializer (&amp;quot;l4rt&amp;quot;));&amp;quot;&lt;br /&gt;
# Call PluginLoader.Load using the required extension point. Ex: &amp;quot;loader.Load (&amp;quot;/OpenSim/LartMe&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface ILart : IPlugin&lt;br /&gt;
{&lt;br /&gt;
  void LartMe();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
public class Lart : ILart&lt;br /&gt;
{&lt;br /&gt;
  void LartMe () { // mystery }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-29T08:23:24Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Current state of Plugin loading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however as of this writing it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why Mono.Addins ==&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* lazily loads assemblies only when finally necessary&lt;br /&gt;
* tracks module dependencies&lt;br /&gt;
* allows customize the addin manifest XML&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;br /&gt;
&lt;br /&gt;
== Mono.Addin concepts ==&lt;br /&gt;
&lt;br /&gt;
Although effort has been made to make PluginLoader independent of the module loading mechanism, there are some concepts that should be understood when learning how to learn the system:&lt;br /&gt;
&lt;br /&gt;
=== Separating Male and Female ===&lt;br /&gt;
&lt;br /&gt;
A good system provides a means of loosely coupling two connected parts with a common interface so that one can be changed easily without affecting the other.&lt;br /&gt;
&lt;br /&gt;
The assembly that consumes a service is called a ''host'', and the provider of a service is called an ''addin''.&lt;br /&gt;
&lt;br /&gt;
The common reference point that addins and hosts use to identify each other is called an ''extension point'', which is essentially a hierarchical text &amp;quot;path&amp;quot;. If a host asks for the addin(s) corresponding to extension point &amp;quot;/Foo&amp;quot;, and an addin claims to implement &amp;quot;/Foo&amp;quot;, then the two can be joined to make a functioning whole.&lt;br /&gt;
&lt;br /&gt;
All OpenSim extension points start at the root &amp;quot;/OpenSim&amp;quot;. If you wished to create a new service &amp;quot;Foo&amp;quot;, you might choose to name it &amp;quot;/OpenSim/Foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In operation the consumer of a service, the host, requests that the system load all addins that claim to extend an extension point, and a list is returned to the consumer, who can choose to load any subset of those providers, the addins, into memory.&lt;br /&gt;
&lt;br /&gt;
=== Describing an Addin ===&lt;br /&gt;
&lt;br /&gt;
Clearly metadata must be associated with both host and addin, in our case this is an XML file that has the extension *.addin.xml, called a ''manifest''. &lt;br /&gt;
&lt;br /&gt;
In practice, the host manifest and addin manifest are so similar as to be almost exactly the same. The principle difference is that host manifests tell Mono.Addins where to find abstract interfaces, and addin manifests tell Mono.Addins where to find concrete implementations of those interfaces.&lt;br /&gt;
&lt;br /&gt;
The manifest has 3 critical parts&lt;br /&gt;
# Name and Version information &amp;lt;br&amp;gt; this is used to check inter-addin dependencies&lt;br /&gt;
# Filename of assemblies where the consumer interfaces or provider implementations can be found &amp;lt;br&amp;gt; this is needed to know which assemblies must be searched&lt;br /&gt;
# Extension Point path and Fully Qualified .NET Class Name of the consumer interface or provider implementation &amp;lt;br&amp;gt; this is needed to load the actual classes into memory&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-23T04:57:05Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Current state of Plugin loading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.Region.Application.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
* logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
* automatically handles module sharing across application domains&lt;br /&gt;
* provides support for downloading assemblies from remote repositories&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin</id>
		<title>How to create a dynamic plugin</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/How_to_create_a_dynamic_plugin"/>
				<updated>2008-07-23T04:56:46Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: New page: == Current state of Plugin loading ==  The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules poss...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current state of Plugin loading ==&lt;br /&gt;
&lt;br /&gt;
The .NET runtime system has always made reflecting and introspecting of assemblies at runtime very easy to do, making dynamic loading of modules possible with very little effort.&lt;br /&gt;
&lt;br /&gt;
This has unfortunately lead to a situation in OpenSim where historically module loading was hard-coded and done by hand, using copy-and-paste code. Clearly this is a suboptimal situation.&lt;br /&gt;
&lt;br /&gt;
Effort was made to find a reusable, cross-platform dynamic assembly loader that could be used as-is, instead of reinventing our own. The only current candidate is Mono.Addins. MS's .NET runtime has its own Addin class, however it is not yet implemented in Mono.&lt;br /&gt;
&lt;br /&gt;
A class called PluginLoader has been created to thinly wrap Mono.Addins, and the assemblies loaded by this class have been standardized on the IPlugin interface hierarchy. With the exception of RegionModules, all dynamically loaded assemblies should be called Plugins, and inherit from this base class.&lt;br /&gt;
&lt;br /&gt;
Currently the following interfaces have been converted to IPlugin:&lt;br /&gt;
# OpenSim.Region.Application.IApplicationPlugin&lt;br /&gt;
# OpenSim.Grid.GridServer.IGridPlugin&lt;br /&gt;
# OpenSim.Data.IGridDataPlugin&lt;br /&gt;
# OpenSim.Data.ILogDataPlugin&lt;br /&gt;
&lt;br /&gt;
And the following Assemblies are being loaded by PluginLoader:&lt;br /&gt;
# OpenSim.ApplicationPlugins.LoadRegions.LoadRegionsPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Regions.RestRegionPlugin&lt;br /&gt;
# OpenSim.ApplicationPlugins.Rest.Inventory.RestHandler&lt;br /&gt;
# OpenSim.ApplicationPlugins.RemoteController.RemoteAdminPlugin&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLGridData&lt;br /&gt;
# OpenSim.Data.MySQL.MySQLLogData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mono.Addins offers features outside of being upstream maintained by the Mono project:&lt;br /&gt;
- logically splits up module interfaces from implementations in a cross platform way through the use of text-based &amp;quot;extension points&amp;quot; and &amp;quot;addin manifests&amp;quot;&lt;br /&gt;
- automatically handles module sharing across application domains&lt;br /&gt;
- provides support for downloading assemblies from remote repositories&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Developer_Documentation</id>
		<title>Developer Documentation</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Developer_Documentation"/>
				<updated>2008-07-23T04:42:54Z</updated>
		
		<summary type="html">&lt;p&gt;Sempuki: /* Developer Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
You can view the current [[Top 10 Bugs|top 10 bugs]] blocking forward development.&lt;br /&gt;
&lt;br /&gt;
* [[Hacking OpenSim for fun and profit]] &amp;amp;mdash; A starters guide for programming OpenSim&lt;br /&gt;
* [[Database Documentation]] &amp;amp;mdash; A map of grid and region instances used in OpenSim&lt;br /&gt;
* [[OpenSim: Debugging - profiler dumps]] &amp;amp;mdash; Dumps of OpenSim profiles to aid in tracking memory leaks.&lt;br /&gt;
* [[OpenSim: Testing]] &amp;amp;mdash; What is tested.&lt;br /&gt;
* [[OpenSim: TechRef]] &amp;amp;mdash; A technical description of the simulator operation.&lt;br /&gt;
* [[Opensim: 0.5 Release Target Discussion]]&lt;br /&gt;
* [[Opensim: 0.6 Release Target Discussion]]&lt;br /&gt;
* [[Opensim: Future Release Discussion]]&lt;br /&gt;
* [[OpenSim: Class Diagrams]]&lt;br /&gt;
* [[Grid Architecture Diagram]]&lt;br /&gt;
* [[OpenSim: Scripting]] &amp;amp;mdash; How to use scripts and what limitations apply.&lt;br /&gt;
* [[Webinterface]] &amp;amp;mdash; How to mashup with the web.&lt;br /&gt;
* [[RemoteAdmin]] &amp;amp;mdash; How to use the remote admin plug-in.&lt;br /&gt;
* [[OpenSim: Prim Inventory Persistence]] &amp;amp;mdash; Information on the current state of prim inventory persistence.&lt;br /&gt;
* [[LSL_Status/Functions|LSL Implemented]]   &amp;amp;mdash; A list of LSL-functions that are available in OpenSim.&lt;br /&gt;
* [[PhysicsEngines]]   &amp;amp;mdash; Options for physics engines in OpenSim.&lt;br /&gt;
* [[MonoSqlite]] &amp;amp;mdash; How the database model currently works.&lt;br /&gt;
* [[Monodevelop]] &amp;amp;mdash; How to use the [[monodevelop]] IDE for editing C# solutions.&lt;br /&gt;
* [[Scripting Documentation]] - Everything you need to know about OpenSim scripting&lt;br /&gt;
* [[LSL:PrimitiveParams]] Notes on converting SL Edit GUI values and LSL PrimitiveParams to OpenSim PrimitiveBaseShape fields&lt;br /&gt;
* [[OpenSim.Region.ScriptEngine]] &amp;amp;mdash; How the ScriptEngine looks internally.&lt;br /&gt;
* [[RegionModules]] &amp;amp;mdash; The various modules that are used in the RegionServer and how to write new ones.&lt;br /&gt;
* [[OpenSim: Screenshots]] &amp;amp;mdash; Various OpenSim screenshots.&lt;br /&gt;
* [[OpenSim: Threading strategy]] &amp;amp;mdash; How threading is implemented and handled.&lt;br /&gt;
* [[OpenSim: Permissions]] &amp;amp;mdash; Notes on object permissions &amp;amp; definition of the ObjectFlags variable.&lt;br /&gt;
* [[OpenSim Load Balancing and Region Splitting]] - Instructions for using load balancing and region splitting features.&lt;br /&gt;
* [[Asset Server problems]] - list of known problems with the asset server&lt;br /&gt;
* [[OpenID]] - Proposal for using OpenID in OpenSim&lt;br /&gt;
* [[OpenSim.Region.DataSnapshot]] - Shiny new data gathering/search system&lt;br /&gt;
* [[How to create a dynamic plugin]] - A tutorial for using PluginLoader&lt;br /&gt;
&lt;br /&gt;
==Communication==&lt;br /&gt;
&lt;br /&gt;
A good first point of contact is the OpenSim IRC, on irc.freenode.net channels #opensim / #opensim-dev. The OpenSim developers hold [[office hours]] once a week in-world on Tuesdays at &amp;quot;Wright Plaza&amp;quot; on OSGrid. There is a &amp;quot;Test Hour&amp;quot; on Saturdays, also generally on &amp;quot;Wright Plaza&amp;quot;. Both these weekly events are held at 1900UTC. Check on the #opensim IRC channel on Freenode just before each of these events if there is any confusion.&lt;br /&gt;
&lt;br /&gt;
==SVN Access==&lt;br /&gt;
You can browse the source code for OpenSim [http://opensimulator.org/cgi-bin/viewcvs.cgi using a web browser] or via SVN.&lt;br /&gt;
* Anonymous Checkout&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk&lt;br /&gt;
* Developer Checkout&lt;br /&gt;
 svn co svn+ssh://USERNAME@opensimulator.org/var/svn/opensim/trunk&lt;br /&gt;
&lt;br /&gt;
==Recent SVN Commits==&lt;br /&gt;
&amp;lt;rss&amp;gt;http://cia.vc/stats/project/opensim/.rss|max=5|title=none&amp;lt;/rss&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Main]]&lt;br /&gt;
[[Category:Getting Started]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&amp;lt;cleanpage title=hide cats=hide /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sempuki</name></author>	</entry>

	</feed>