<?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=Rtkwebman</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=Rtkwebman"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Special:Contributions/Rtkwebman"/>
		<updated>2026-04-21T12:07:06Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/wiki/Automated_Testing</id>
		<title>Automated Testing</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Automated_Testing"/>
				<updated>2009-03-05T03:36:59Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As OpenSim matures, we are extremely interested in adding more automated verification into the OpenSim source tree.  Test exist not only to prevent bugs from creeping in, but also to provide fair warning that the behavior of the system has changed, and tests may need updating.&lt;br /&gt;
&lt;br /&gt;
In OpenSim today we use NUnit tests.  Our conventions are:&lt;br /&gt;
# Tests should '''not''' exist inside runtime assemblies, as this makes nunit a production requirement&lt;br /&gt;
# Tests should be in .Tests.dll assemblies.  For instance, the tests for OpenSim.Data.SQLite.dll should be in the OpenSim.Data.SQLite.Tests.dll assembly.  This allows for easy removal of test assemblies in products.&lt;br /&gt;
# Tests should be as close to the code as possible, but not intermingled.  So the tests for OpenSim/Data/SQLite should be in OpenSim/Data/SQLite/Tests/.  Through the use of the '''Exclude''' keyword in prebuild.xml you can ensure that directory is part of OpenSim.Data.SQLite.Tests.dll and not OpenSim.Data.SQLite.dll. See exclude clarification in writing unit tests section.&lt;br /&gt;
# Tests testing a class should be grouped into a test class file called xxxTest.cs, where xxx is the name of the class that is being tested.&lt;br /&gt;
# Tests should be able to run safely in a production environment.  That means that care must be taken not to damage data on the machine that it is being run.&lt;br /&gt;
# Tests should be deterministic in other words repeatable. Avoid randomness in tests. See good and bad testing practices below.&lt;br /&gt;
&lt;br /&gt;
== Core Functionality Missing Unit Tests ==&lt;br /&gt;
&lt;br /&gt;
This is a list of functionality which is not covered by unit tests and is identified as highly desireable test target:&lt;br /&gt;
&lt;br /&gt;
# Database Modules (These are mysql tables)&lt;br /&gt;
## region ban&lt;br /&gt;
## land&lt;br /&gt;
## landaccesslist&lt;br /&gt;
&lt;br /&gt;
== Good / Bad Test practices ==&lt;br /&gt;
Creating good tests is an art, not a science.  Tests are useful by how many bugs they find or how many bugs they avoid.  Things you should think about in creating good tests is:&lt;br /&gt;
* Throwing edge cases, like 0, &amp;quot;&amp;quot;, or Null at parameters.  This ensures that people functions are hardened against incomplete data.  Many of our crashes come from the lack of this hardening showing up at just the wrong time.&lt;br /&gt;
* Use stateful testing to build up complex scenarios.  This is more useful than just cursory get / set calls.&lt;br /&gt;
* Random tests are not a good idea. We need test results to be deterministic. In other words tests need to be repeatable. If you want to test for a range it is good idea to make separate tests for min and max values. Random values in fields can fail randomly. When something goes wrong for example in database schema the developer will not necessarily notice if the stored values are random. On the other hand its hard to troubleshoot randomly failing tests as you dont know which specific value caused the failure.&lt;br /&gt;
&lt;br /&gt;
== Writing Tests ==&lt;br /&gt;
Writing a new unit test is pretty easy, and very helpful in increasing the stability of opensim by nailing down bugs.  I'm going to present an example here of SQLite Asset testing to show how simple such a test case is to write.  The actual in tree SQLite Asset tests are a little different because the code was factored out so that it was easily applied to any database driver, so don't be concerned with the fact that what you see here isn't in the tree.&lt;br /&gt;
&lt;br /&gt;
Exclude clarification: Make sure your master project (not the test project) has an entry for files like the following so that the test code is not included in the master project dll:&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;Files&amp;gt;&lt;br /&gt;
        &amp;lt;Match pattern=&amp;quot;*.cs&amp;quot; recurse=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Exclude name=&amp;quot;Tests&amp;quot; pattern=&amp;quot;Tests&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Match&amp;gt;&lt;br /&gt;
      &amp;lt;/Files&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NUnit Conventions ===&lt;br /&gt;
An NUnit test suite:&lt;br /&gt;
* is a class with a default constructor (takes no arguments)&lt;br /&gt;
* has public methods that are tests&lt;br /&gt;
* uses annotations to determine what are tests&lt;br /&gt;
* runs it's tests in '''alphabetical order by method name'''&lt;br /&gt;
&lt;br /&gt;
An NUnit test method:&lt;br /&gt;
* must be public&lt;br /&gt;
* must return void&lt;br /&gt;
* must take no arguments&lt;br /&gt;
* is successful if no exception or assert is thrown while running it&lt;br /&gt;
&lt;br /&gt;
The run order is important if you want to have early tests that setup some complicated state (like creating objects), and have later tests remove or update that state.  For that reason I find it very helpful to name all test methods '''Txxx_somename''' where '''xxx''' is a number between 000 and 999.  That guaruntees no surprises in run order.&lt;br /&gt;
&lt;br /&gt;
==== Setup / Teardown ====&lt;br /&gt;
In the case of testing something like the database layer, we have to actually attempt to store / retrieve things from a database.  Following from rule #4 of good tests, we want to make sure not to touch the production databases to run our tests, so during startup we generate a temporary file name which is guaranteed not to be an existing file on the system, and use that as our database file name.  By running db.Initialize() the OpenSim migration code will correctly populate that database with the latest schema.&lt;br /&gt;
&lt;br /&gt;
Once we are done with the tests we want to make sure we aren't leaving garbage temp files on the user's system.  So we remove that file we created.&lt;br /&gt;
&lt;br /&gt;
During setup we also create a set of state variables, such as 3 uuids, 3 strings, and a data block.  You could have always just stuck these inline, but variables are there for a reason, so use them.&lt;br /&gt;
&lt;br /&gt;
==== Asserts ====&lt;br /&gt;
You will see scattered through the code '''Assert.That(...)'''.  These will throw an exception if the condition is not valid.  This format of assertions is called the [http://www.nunit.org/index.php?p=constraintModel&amp;amp;r=2.4 Contraint Model] in NUnit, and provides a large number of tests with the flavor of:&lt;br /&gt;
* Assert.That(foo, Is.Null)&lt;br /&gt;
* Assert.That(foo, Is.Not.Null)&lt;br /&gt;
* Assert.That(foo, Is.True)&lt;br /&gt;
* Assert.That(foo, Is.EqualTo(bar))&lt;br /&gt;
* Assert.That(foo, Text.Matches( &amp;quot;*bar*&amp;quot; ))&lt;br /&gt;
&lt;br /&gt;
Of note, Is.EqualTo uses the Equals function of foo, so this can only be used on objects that are IComparable.  Most of the OpenSim base objects are not, so you'll have to compare fields manually in tests.&lt;br /&gt;
&lt;br /&gt;
For the complete set of conditions you can use see [http://www.nunit.org/index.php?p=constraintModel&amp;amp;r=2.4 the Contraint Model NUnit documentation].  While there is another syntax for tests, the Constraint Model is preferred as it is far more human readable.&lt;br /&gt;
&lt;br /&gt;
=== Simple Negative Tests ===&lt;br /&gt;
Test T001 is an example of a simple negative test.  We assume a new database will not have any of those assets in them.  While the value of this test may look low, it does provide a baseline in ensuring that the database connection is there, that these return false correctly, and that no other exception is thrown.  Negative tests are a good way to force bounds conditions and ensure that not only does it  ''return what you expect'' it also ''doesn't return what you don't expect''.  Thought of another way, it ensures your code is somewhat defensive in nature, not coughing on bad or unexpected data.&lt;br /&gt;
&lt;br /&gt;
=== Simple Positive Tests ===&lt;br /&gt;
T010 is an example of a simple positive test.  In it we create and store 3 assets (ensuring no exceptions), then load those 3 assets back from the database and ensure the fields are correct.  Because AssetBase is not IComparible we just check the ID and Name fields with equals tests.  If any of the Asserts fail, the whole test fails.&lt;br /&gt;
&lt;br /&gt;
=== Stateful Tests ===&lt;br /&gt;
T011 is an example of a stateful test, because it requires the state created by T010 (i.e. the creation of those 3 objects).  In order to test any kind of complicated scenario you will find that you need to use stateful tests to build up various amounts of state (testing along the way), then manipulating and possibly tearing it down.  Without doing this you can't do truly deep testing of function in any complex environment.  This example isn't very stateful (I tried to pick an easy example), but it should give you some ideas.&lt;br /&gt;
&lt;br /&gt;
=== Speculative Tests ===&lt;br /&gt;
Speculative tests are tests that might or might not apply in a given situation.  MySQL testing in the OpenSim tree is done by speculative testing, the tests will only run if there is a properly configured database, otherwise they will not be run.  If you execute '''Assert.Ignore()''' in a '''Test''' the test will end and be ignored.  If you run '''Assert.Ignore()''' in the '''TestFixtureSetup''' all tests in the test fixture will be skipped and ignored.&lt;br /&gt;
&lt;br /&gt;
Speculative testing lets you create tests that require certain preconditions to be met which you can't guarantee on all platforms/configuration, and are an important part of deep testing.&lt;br /&gt;
&lt;br /&gt;
=== An Example Test - SQLite Assets ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.IO;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using NUnit.Framework;&lt;br /&gt;
using NUnit.Framework.SyntaxHelpers;&lt;br /&gt;
using OpenSim.Framework;&lt;br /&gt;
using OpenSim.Data.Tests;&lt;br /&gt;
using OpenSim.Data.SQLite;&lt;br /&gt;
using OpenSim.Region.Environment.Scenes;&lt;br /&gt;
using OpenMetaverse;&lt;br /&gt;
&lt;br /&gt;
namespace OpenSim.Data.SQLite.Tests&lt;br /&gt;
{&lt;br /&gt;
    [TestFixture]&lt;br /&gt;
    public class SQLiteAssetTest&lt;br /&gt;
    {&lt;br /&gt;
        public string file;&lt;br /&gt;
        public string connect;&lt;br /&gt;
        public AssetDataBase db;&lt;br /&gt;
        public UUID uuid1;&lt;br /&gt;
        public UUID uuid2;&lt;br /&gt;
        public UUID uuid3;&lt;br /&gt;
        public string name1;&lt;br /&gt;
        public string name2;&lt;br /&gt;
        public string name3;&lt;br /&gt;
        public byte[] asset1;&lt;br /&gt;
        &lt;br /&gt;
        [TestFixtureSetUp]&lt;br /&gt;
        public void Init()&lt;br /&gt;
        {&lt;br /&gt;
            uuid1 = UUID.Random();&lt;br /&gt;
            uuid2 = UUID.Random();&lt;br /&gt;
            uuid3 = UUID.Random();&lt;br /&gt;
            name1 = &amp;quot;asset one&amp;quot;;&lt;br /&gt;
            name2 = &amp;quot;asset two&amp;quot;;&lt;br /&gt;
            name3 = &amp;quot;asset three&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            asset1 = new byte[100];&lt;br /&gt;
            asset1.Initialize();&lt;br /&gt;
            file = Path.GetTempFileName() + &amp;quot;.db&amp;quot;;&lt;br /&gt;
            connect = &amp;quot;URI=file:&amp;quot; + file + &amp;quot;,version=3&amp;quot;;&lt;br /&gt;
            db = new SQLiteAssetData();&lt;br /&gt;
            db.Initialise(connect);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        [TestFixtureTearDown]&lt;br /&gt;
        public void Cleanup()&lt;br /&gt;
        {&lt;br /&gt;
            db.Dispose();&lt;br /&gt;
            System.IO.File.Delete(file);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        [Test]&lt;br /&gt;
        public void T001_LoadEmpty()&lt;br /&gt;
        {&lt;br /&gt;
            Assert.That(db.ExistsAsset(uuid1), Is.False);&lt;br /&gt;
            Assert.That(db.ExistsAsset(uuid2), Is.False);&lt;br /&gt;
            Assert.That(db.ExistsAsset(uuid3), Is.False);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        [Test]&lt;br /&gt;
        public void T010_StoreSimpleAsset()&lt;br /&gt;
        {&lt;br /&gt;
            AssetBase a1 = new AssetBase(uuid1, name1);&lt;br /&gt;
            AssetBase a2 = new AssetBase(uuid2, name2);&lt;br /&gt;
            AssetBase a3 = new AssetBase(uuid3, name3);&lt;br /&gt;
            a1.Data = asset1;&lt;br /&gt;
            a2.Data = asset1;&lt;br /&gt;
            a3.Data = asset1;&lt;br /&gt;
            &lt;br /&gt;
            db.CreateAsset(a1);&lt;br /&gt;
            db.CreateAsset(a2);&lt;br /&gt;
            db.CreateAsset(a3);&lt;br /&gt;
&lt;br /&gt;
            AssetBase a1a = db.FetchAsset(uuid1);&lt;br /&gt;
            Assert.That(a1a.ID, Is.EqualTo(uuid1));&lt;br /&gt;
            Assert.That(a1a.Name, Is.EqualTo(name1));&lt;br /&gt;
&lt;br /&gt;
            AssetBase a2a = db.FetchAsset(uuid2);&lt;br /&gt;
            Assert.That(a2a.ID, Is.EqualTo(uuid2));&lt;br /&gt;
            Assert.That(a2a.Name, Is.EqualTo(name2));&lt;br /&gt;
&lt;br /&gt;
            AssetBase a3a = db.FetchAsset(uuid3);&lt;br /&gt;
            Assert.That(a3a.ID, Is.EqualTo(uuid3));&lt;br /&gt;
            Assert.That(a3a.Name, Is.EqualTo(name3));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        [Test]&lt;br /&gt;
        public void T011_ExistsSimpleAsset()&lt;br /&gt;
        {&lt;br /&gt;
            Assert.That(db.ExistsAsset(uuid1), Is.True);&lt;br /&gt;
            Assert.That(db.ExistsAsset(uuid2), Is.True);&lt;br /&gt;
            Assert.That(db.ExistsAsset(uuid3), Is.True);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see 4 of the important annotations here:&lt;br /&gt;
* TestFixture - this class is a test suite&lt;br /&gt;
* TestFixtureSetup - this code is always run before any of the tests are executed&lt;br /&gt;
* TestFixtureTearDown - this code is always run after the tests are done executing, even if they fail.&lt;br /&gt;
* Test - this method is a test&lt;br /&gt;
&lt;br /&gt;
== Adding Tests to the Tree ==&lt;br /&gt;
As we said previously all tests for assembly OpenSim.Foo (in directory OpenSim/Foo) should:&lt;br /&gt;
* be in assembly OpenSim.Foo.Tests.dll&lt;br /&gt;
* not be in the OpenSim.Foo.dll assembly&lt;br /&gt;
* be in OpenSim/Foo/Tests directory&lt;br /&gt;
&lt;br /&gt;
Also, if you have created a new test assembly you must add references to it in both ''.nant/local.include'' and ''.nant/bamboo.build'' to ensure that the assembly is added to the automated bamboo runs as well as the nant test target.&lt;br /&gt;
&lt;br /&gt;
== Executing Tests ==&lt;br /&gt;
&lt;br /&gt;
=== Bamboo ===&lt;br /&gt;
On every commit to opensim all the tests are run on a [http://opensimulator.org:8085 Bamboo build server on opensimulator.org].  The process takes about 5 minutes to build, test, and report the results back out on #opensim-dev via the osmantis bot.&lt;br /&gt;
&lt;br /&gt;
=== Nant ===&lt;br /&gt;
You can manually run all the tests for OpenSim on your system by running '''nant test''' as a nant target.  This will run all the tests that are in the tree, though some speculative tests might be ignored if your platform does not have the right features or configuration to run these tests.&lt;br /&gt;
&lt;br /&gt;
=== NUnit Console ===&lt;br /&gt;
If you only want to run tests for one assembly you can do that using the NUnit Console.  On Linux just run '''nunit-console2 OpenSim.Foo.Tests.dll''' and it will run only the tests for OpenSim.Foo.Tests.dll.  If you are only making changes to 1 dll and just want a quick sanity check, this is the fastest way to do that.&lt;br /&gt;
&lt;br /&gt;
=== Debugging Tests ===&lt;br /&gt;
There is a special page dedicated to this. See [[Debugging Unit Tests]].&lt;br /&gt;
&lt;br /&gt;
== Learning More ==&lt;br /&gt;
You should definitely read the documentation at the [http://www.nunit.org/index.php?p=documentation NUnit homepage] if you want to know more about testing.  It's a very good reference for all the APIs in NUnit that you can use for creating tests.&lt;br /&gt;
&lt;br /&gt;
== Code Coverage ==&lt;br /&gt;
&lt;br /&gt;
A prototype has been included using monocov, which has a profile built-in in mono. Instructions for using monocov can be found on the Mono homepage, in [http://www.mono-project.com/Code_Coverage Code Coverage] section. Unfortunately nunit2 and nant do not support code coverage with monocov (only some other proprietary code coverages), so there is no &amp;lt;monocov&amp;gt; tag. The solution was to implement it using many nunit-console and on &amp;lt;exec&amp;gt; tags. &lt;br /&gt;
&lt;br /&gt;
ATTENTION: Code coverage only works with mono 1.2.x , any other version will most likely not work. Code coverage development is being put on hold for now until it supports newer mono versions.&lt;br /&gt;
&lt;br /&gt;
=== Running ===&lt;br /&gt;
&lt;br /&gt;
Download [http://primates.ximian.com/~lupus/monocov-0.2.tar.gz monocov] and [http://prdownloads.sourceforge.net/nunit/NUnit-2.4.8-net-2.0.zip?download nunit-console] if your nunit-console does not work. To test if it works (my Ubuntu's Hardy version did not), just run one of the tests with nunit-console.&lt;br /&gt;
&lt;br /&gt;
Install monocov (./configure, ./make install, there could be some minor conflicts, I had to add to the compiling line -I/usr/include/mono-1.0/) and make sure the working nunit-console.exe is in /usr/lib/nunit/nunit-console.exe. Now just run nant test-cov and it will generate .cov files and HTML directories in the cov directory. The .cov files can be seen by running monocov on them, and have the same information as the HTML directories.&lt;br /&gt;
&lt;br /&gt;
== Testing Todo ==&lt;br /&gt;
&lt;br /&gt;
=== Coverage ===&lt;br /&gt;
&lt;br /&gt;
A prototype has been done and documented. Now we must keep a look if monocov will evolve to support newer mono versions.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Testing]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Manual_Test_Script</id>
		<title>Manual Test Script</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Manual_Test_Script"/>
				<updated>2009-03-05T03:35:06Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: The need for testing is great so let's participate!  Need a table here with columns for Step Number, Task, Result, etc...   Category:Testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The need for testing is great so let's participate!&lt;br /&gt;
&lt;br /&gt;
Need a table here with columns for Step Number, Task, Result, etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Testing]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:Testing</id>
		<title>Category:Testing</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:Testing"/>
				<updated>2009-03-05T03:24:56Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: As OpenSim matures the need for proper testing increases too. Please take the time to place your ideas and concepts for improving the OpenSim Testing program in this category. Scripts both...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As OpenSim matures the need for proper testing increases too. Please take the time to place your ideas and concepts for improving the OpenSim Testing program in this category. Scripts both manual and automated are welcome!&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid_Meetings</id>
		<title>Hypergrid Meetings</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid_Meetings"/>
				<updated>2009-02-13T19:40:36Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[HG Meeting 2009/02/06]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid_Lists</id>
		<title>Hypergrid Lists</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid_Lists"/>
				<updated>2009-02-13T19:40:07Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hypergrid Lists ==&lt;br /&gt;
&lt;br /&gt;
Draft 1:&lt;br /&gt;
&lt;br /&gt;
A new feature for hypergrids that is currently being worked on, is support for shared online lists of hypergrid links. So there could be various lists of a set of hypergrid enabled regions that all share a similar theme. And hopefully a lot of these lists will enable a user to add their own region data to that list.&lt;br /&gt;
&lt;br /&gt;
Basically these lists will be a xml file, listing all the regions and the relevant data required for a hypergrid link; like their hostName and port number. Each region will also have a assigned &amp;quot;virtual location&amp;quot; within a 0,0 - 99,99 map area (the size of this area could change at a later data).&lt;br /&gt;
&lt;br /&gt;
A user can then tell their own hypergrid enabled region to load that hypergrid list, by telling it the url of that list. &lt;br /&gt;
&lt;br /&gt;
They user will also need to tell their own region how to deal with the location of those regions. So you can define a Hypergrid area, that is 99,99 region spaces in size, anywhere on your region's map. And then as your region loads that list, it will translate the link locations from the list (those assigned positions within that 0,0-99,99 area) into that hypergrid area. So if you had set the hypergrid area to start at location 2200, 2200. Then the link for the region that had a assigned list position of 2,2, will appear at 2202,2202 on your map.&lt;br /&gt;
&lt;br /&gt;
The following image (not to scale) gives a basic overview, the regions on your home grid are the green squares and the orange area is the hypergrid area that you want the hypergrid regions to be in. &lt;br /&gt;
&lt;br /&gt;
[[Image:HyperGrid-Area.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The StartXLoc,StartYloc are the coordinates for the start of the hypergrid area that you need to set.&lt;br /&gt;
&lt;br /&gt;
So there are two things that need to be done to load such a list. &lt;br /&gt;
&lt;br /&gt;
First set the Start location for that hypergrid area using the console command: link-mapping &amp;lt;startXloc&amp;gt; &amp;lt;startYloc&amp;gt; &lt;br /&gt;
&lt;br /&gt;
So for our example it would be: link-mapping 2200 2200&lt;br /&gt;
&lt;br /&gt;
Next the region needs to be told to load the list by providing it with the url, using the console command : link-region &amp;lt;url&amp;gt; [excludeList]&lt;br /&gt;
&lt;br /&gt;
That would result in the region fetching that xml file and creating all the links for the regions in that list. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
However there are currently two problems with this.&lt;br /&gt;
&lt;br /&gt;
The first being that if the details for your own region was in that list, it would try to create a link to itself. So this is where the excludeList parameter (mentioned above ) comes in.&lt;br /&gt;
&lt;br /&gt;
The details for each region in a list includes a &amp;quot;Section Name&amp;quot; which can be anything as long as it has no spaces and each region has a unique one. This is the name that you need to include in the excludelist, so that you region knows to ignore that data. &lt;br /&gt;
&lt;br /&gt;
So if my region had a section name of &amp;quot;Hyper-Gateway1&amp;quot; in the list, I would need to use the command: link-region &amp;lt;url of list&amp;gt; excludeList:Hyper-Gateway1&lt;br /&gt;
&lt;br /&gt;
How the section names are actually set will depend on how and where the list is hosted. And as there are no such lists at the time of writing, its not possible to give instructions on how to find that name. But hopefully each list will have some instructions on either setting your own section name or how to find it if they assign one for you.&lt;br /&gt;
&lt;br /&gt;
The second problem is that due to a bug in the viewer, teleports can only happen between regions that are within 4096,4096 map spaces of each other. As you should know from reading the rest of this page, Hypergrid regions have two map locations, their real location where they are on their home region. And the &amp;quot;virtual map location&amp;quot; somewhere within your hypergrid area, which is really just a local link to the real location. &lt;br /&gt;
&lt;br /&gt;
For this bug, its the real location that matters. So when trying to teleport to a hypergrid region, there can't be more than a 4096,4096 difference between the location that you are currently on and the real location of the hypergrid region.&lt;br /&gt;
&lt;br /&gt;
To get around this, the list can include details of a region's real location. And then currently when a list is loaded, your region will check that this real location is within the 4096,4096 range of its potential &amp;quot;virtual map location&amp;quot;. If it is outside that limit, then no link will be created for that region. &lt;br /&gt;
&lt;br /&gt;
This is all done automatically so there is nothing the user has to do.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Public_Hypergrid_Nodes</id>
		<title>Public Hypergrid Nodes</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Public_Hypergrid_Nodes"/>
				<updated>2009-02-13T19:39:28Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a list of hypergrid-ready nodes that you can use for testing your installation and for linking your world. Please add your public node here if you wish to help build a web of opensims!&lt;br /&gt;
&lt;br /&gt;
For the time being, and until the security concerns are addressed, we advise you to be careful about who you link to. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
![[Hypergrid|link-region server and port]]&lt;br /&gt;
!Organization&lt;br /&gt;
!Description&lt;br /&gt;
!Grid Location&lt;br /&gt;
|-&lt;br /&gt;
|'''osl2.nac.uci.edu 9006'''&lt;br /&gt;
|University of California, Irvine&lt;br /&gt;
|The &amp;quot;UCI Welcome&amp;quot; region connected to OSGrid. It is run by Diva (Crista Lopes) on a machine owned by the University of California, Irvine. You can link to it as a way to link to OSGrid.&lt;br /&gt;
|OSGrid is centered at 10,000, 10,000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''osl3.nac.uci.edu 9000'''&lt;br /&gt;
|University of California, Irvine&lt;br /&gt;
|The &amp;quot;UC Irvine&amp;quot; region connected to OSGrid, neighboring Wright Plaza. You can link to it as a way to link to OSGrid.&lt;br /&gt;
|OSGrid is centered at 10,000, 10,000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''ucigrid02.nacs.uci.edu 9000'''&lt;br /&gt;
|University of California, Irvine&lt;br /&gt;
|The UCI Grid&lt;br /&gt;
|UCIGrid is centered at 8,888, 8,888&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''ucigrid04.nacs.uci.edu 9003'''&lt;br /&gt;
|University of California, Irvine&lt;br /&gt;
|The UCI Grid, region &amp;quot;Gateway 3000&amp;quot;. Link your lower-1,000's grid to this node in order to bridge to grids in the 10,000's.&lt;br /&gt;
|This node is positioned at 3,000, 3,000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''ucigrid04.nacs.uci.edu 9007'''&lt;br /&gt;
|University of California, Irvine&lt;br /&gt;
|The UCI Grid, region &amp;quot;Gateway 7000&amp;quot;. Link your 10,000's grid to this node in order to bridge to grids in the lower-1,000's.&lt;br /&gt;
|This node is positioned at 7,000, 7,000. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''grid.cyberlandia.net 9000'''&lt;br /&gt;
|Cyberlandia&lt;br /&gt;
|The &amp;quot;Cyberlandia Gw&amp;quot; region. http://www.cyberlandia.net Metaverso italiano 3D, more to 250 region and 1000 users. You can link to it as a way to link to Cyberlandia. &lt;br /&gt;
|Cyberlandia is centered at ???&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''hypergrid.cyberlandia.net 9000'''&lt;br /&gt;
|Cyberlandia &lt;br /&gt;
|The &amp;quot;Osgrid Gw&amp;quot; region connected to Cyberlandia grid http://www.cyberlandia.net. Search on map &amp;quot;Cyberlandia grid&amp;quot; You can link to it as a way to link to OSGrid.  &lt;br /&gt;
|OSGrid is centered at 10,000, 10,000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''regionsde.ralf-haifisch.biz 9000'''&lt;br /&gt;
|Ralf Haifisch on osgrid&lt;br /&gt;
|The &amp;quot;Sharkland Tropical&amp;quot; region connected to OSGrid. German welcome aerea, Freebie aerea, region rental, pretty tropical regions  &lt;br /&gt;
|Centered at 10000,10000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''joomla-italia.net 9000'''&lt;br /&gt;
|Social Network Italia&lt;br /&gt;
|The &amp;quot;SNI City&amp;quot; region connected to SNI (Social Network Italia) grid http://www.opensim-italia.net. This grid is connected with Osgrid,Collateral World,Francogrid and Darwin  &lt;br /&gt;
|Centered at ???&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''collateral.opensim-italia.net 9000'''&lt;br /&gt;
|Part of Social Network Italia&lt;br /&gt;
|Collateral World &lt;br /&gt;
|Centered at ???&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''88.191.79.199 9050'''&lt;br /&gt;
|Francogrid&lt;br /&gt;
|Francogrid node, connected to &amp;quot;City&amp;quot;, behind the welcome land of Francogrid &amp;quot;Orion&amp;quot; &lt;br /&gt;
|Centered at 1000 1000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''94.23.8.158 9999'''&lt;br /&gt;
|Le Monde de Darwin&lt;br /&gt;
|The Lost World of Darwin http://www.LeMondedeDarwin.com. [[Image:hypergrid.jpg|200px]]&lt;br /&gt;
|Centered at ???&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''sg.k-grid.com 9000'''&lt;br /&gt;
|K-Grid&lt;br /&gt;
|The Kool grid for the Kool KidZ . Feel free to visit us. The main Gateway is located at 3700,3700 so take that in account before any HyperJump. Adress updated 02/07/09  &lt;br /&gt;
|This node is located at 3700,3700 &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''metropolis.hypergrid.org 9000'''&lt;br /&gt;
|METROPOLIS-Grid&lt;br /&gt;
|The Region &amp;quot;Center-World&amp;quot; connected to the METROPOLIS-Grid http://metropolis.hypergrid.org . German Grid with a lot of free Content and free SIM-hosting. Connected via HG to the most of the Grids listed here &lt;br /&gt;
|Centered at 6000,6000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''ascent.bluewallgroup.com 9910'''&lt;br /&gt;
|BlueWall Group&lt;br /&gt;
|This region is in a good proximity @ (6000,6000) for intermediate jumps to OSGrid from grids in the (2000,2000) range, or any region within 4096 units. [[Image:Hypernaut 001.png|150px|none|thumb|Get your Hypernaut here :)]]&lt;br /&gt;
|Centered at 6000,6000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''sim.thestudyofracialism.org 9000'''&lt;br /&gt;
|Backintyme Publishing&lt;br /&gt;
|TSOR1 is a stand-alone sim owned by Backintyme Publishing. It connects to most of the other downrange sites listed here. The sim is intended for an SL study/discussion group's eventual migration from SL to OS.&lt;br /&gt;
|Centered at 4000,4000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''pc.backintyme.com 9100'''&lt;br /&gt;
|Backintyme Publishing&lt;br /&gt;
|TSOR2 is a small teleport relay island, also owned by Backintyme Publishing, intended for jumps to the vicinity of OSGrid. It is linked to most of the uprange sites listed here.&lt;br /&gt;
|Centered at 8000,8000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''24.248.172.208 9005'''&lt;br /&gt;
|'''MyOpenGrid'''&lt;br /&gt;
|Myopengrid is connected to osl2.nac.uci.edu &amp;quot;Osgrid Gateway&amp;quot; and 88.191.79.199 9050 &amp;quot;Franco Grid&amp;quot;&lt;br /&gt;
|Centered at 7000,7000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''cuonsim1.de 9300'''&lt;br /&gt;
|Cuon-Grid&lt;br /&gt;
|Cuon-Grid is a little grid and has some Main Sims with linux themes, server are in Germany. To login in to the grid use this http://sim-linuxmain.org:8081/CuonGrid/index.html. There are free sims for testing. &lt;br /&gt;
|Centered at 10,000, 10,000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''metaversesims.net 9000'''&lt;br /&gt;
|Metaverse Sims&lt;br /&gt;
|Standalone mode - 6 regions - linked to several other grids. [[Image:Mtvs09010101.jpg|200px]]&lt;br /&gt;
|Centered at 9000, 9000&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
|-&lt;br /&gt;
|'''ellis.pseudospace.net 9000'''&lt;br /&gt;
|Pseudospace Central Gateway &amp;amp; Welcome Center &lt;br /&gt;
|Pseudospace is a free to play, public access OpenSimulator grid created to provide role players with an immersive environment by which they may play, socialize, and build within.  This is a mature grid which may contain adult content and situations, only those who are 18 or older may enter.&lt;br /&gt;
&lt;br /&gt;
Please be advised, that we are currently under heavy construction. Feel free to look around, but mind the mess and the occasional flying prims! If you have any questions or concerns please feel free to email john(at)pseudospace(dot)net.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All user content such as skins, attachments, textures, etc. are provided for free using a share and share alike, create for the sake of creativity methodology.  All such assets are kept within the content library on Ellis Island and are freely copyable / distributable unless the &amp;quot;No Transfer&amp;quot; option is enabled which simply means that the asset may not be copied off of the grid.  Individual contributions to the grid's content library are greatly welcomed and may be done so by leaving a copyable box containing your contribution on one of the shelves located inside the Ellis Library.&lt;br /&gt;
&lt;br /&gt;
| 9000 9000&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''ellis.pseudospace.net 9009'''&lt;br /&gt;
|Pseudospace Lost Gateway &lt;br /&gt;
|Gateway on Pseudospace grid for regions within the 5000x5000 range. - See above description for grid info.&lt;br /&gt;
| 5000 5000&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''grid4us.net 9020'''&lt;br /&gt;
|Grid4Us&lt;br /&gt;
|German Grid that is linked to OSGrid and Francogrid.&lt;br /&gt;
|Centered at 8500,8500&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
|-&lt;br /&gt;
|'''87.230.89.74 9000 '''&lt;br /&gt;
|SCHWARZE WELT&lt;br /&gt;
| inworld location of www.schwarze-welle.de , the maybe biggest dark music streaming readio&lt;br /&gt;
| 100000 10000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
|-&lt;br /&gt;
|'''peak.sciencesim.com 9001'''&lt;br /&gt;
|ScienceSim&lt;br /&gt;
|[http://www.sciencesim.com/ ScienceSim] is a virtual world created for the high performance computing community for scientific visualizations, a number of interesting real world terrains (Mt St Helens and Yellowstone Park) and some astronomical simulations. And some useful, BSD-licensed content.&lt;br /&gt;
| Centered at 10000,10000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''meanduland.com 9124'''&lt;br /&gt;
|Meanduland&lt;br /&gt;
|[http://www.meanduland.com] is a residentual only sim offering beautiful regions with low lag and friendly neighbors. Located on the hypergrid to allow easy access to OSGrid. Links to the most popular OS grids available in our Welcome Island. This grid is up 24/7 and all are welcome to drop in and and look around. If you have trouble connecting, please contact Frank Northmead or Ayana Northmead and let us know so we can help fix the problem.&lt;br /&gt;
| Centered at 8000,8000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''alpha.bubblecloud.org 9000'''&lt;br /&gt;
|Bubble Cloud&lt;br /&gt;
|The alpha 00 is the entrance area to bubble cloud grid. Bubble cloud is test grid where anyone can experiment. If you build something please do it in medieval fantasy setting for others to enjoy.&lt;br /&gt;
|Centered at 10,000, 10,000&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''opensim.mydyn.de 9090'''&lt;br /&gt;
|OpenSIM.de&lt;br /&gt;
|[http://www.opensim.de OpenSim.de], 2 Server (Linux/Windows), hypergrided standalones, 16 Regions, German Users (Deutsche Benutzer), Live-Support, IRC-Gateway, Wiki, FAQ, Howto´s, Downloads. Connected to most of the Grids and some hypergrided standalones.&lt;br /&gt;
|Centered at 1000,1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T19:35:24Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Hyperlinks and Agent Transfers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;[[Banning_Foreign_Users_in_Hypergrid|foreign user]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T19:33:39Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* What is the hypergrid? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;foreign user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T19:31:55Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Installing and Running Hypergrid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Hypergrid#Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;foreign user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Installing_and_Running_Hypergrid</id>
		<title>Installing and Running Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Installing_and_Running_Hypergrid"/>
				<updated>2009-02-13T19:31:31Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: === Installing ===  # Checkout OpenSim, prebuild and build as normal. #  #* If you're running your opensim in grid mode with the UGAIM servers on other machines, you're done. If you're run...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Installing ===&lt;br /&gt;
&lt;br /&gt;
# Checkout OpenSim, prebuild and build as normal.&lt;br /&gt;
# &lt;br /&gt;
#* If you're running your opensim in grid mode with the UGAIM servers on other machines, you're done. If you're running in standalone and you want it to be network-able, or if you have your grid on loopback (127.0.0.1) change all the [Network] server addresses to &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;lt;external_host_name&amp;gt;:&amp;lt;http_port&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;. See below.&lt;br /&gt;
# Run opensim like this: &amp;lt;nowiki&amp;gt;[mono] OpenSim.exe -hypergrid=true&amp;lt;/nowiki&amp;gt;. To make sure the hypergrid is running type this on your console: '''link-region'''. If you don't hear anything back, the hypergrid is not properly installed.&lt;br /&gt;
'''[mono] OpenSim.exe -hypergrid=true'''&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a standalone:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:9300&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:9300&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:9300&lt;br /&gt;
 inventory_server_url = http://example.com:9300&lt;br /&gt;
 messaging_server_url = http://example.com:9300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a grided opensim:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:8001&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:8002&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:8003&lt;br /&gt;
 inventory_server_url = http://example.com:8004&lt;br /&gt;
 ; Port 8005 reserved&lt;br /&gt;
 messaging_server_url = http://example.com:8006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Make sure you have a 'home' set. If your home region doesn't exist, the hyperlink TPs may not work. To set your home, go to one of your local regions and &amp;quot;Set Home&amp;quot; from the viewer.&lt;br /&gt;
&lt;br /&gt;
=== Linking regions ===&lt;br /&gt;
&lt;br /&gt;
==== Method 1 ====&lt;br /&gt;
&lt;br /&gt;
On the console, type for example:&lt;br /&gt;
&lt;br /&gt;
link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; osl2.nac.uci.edu:9006&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the http_listener_port of the simulator where the region is running you want to link to&lt;br /&gt;
&lt;br /&gt;
You can link to a specific region within an instance, by using the name of the region at the end, for example:&lt;br /&gt;
&lt;br /&gt;
link-region 997 997 osl2.nac.uci.edu:9006:UCI Welcome&lt;br /&gt;
&lt;br /&gt;
==== Method 2 ====&lt;br /&gt;
&lt;br /&gt;
There is also some initial support for reading the links from a xml file.&lt;br /&gt;
&lt;br /&gt;
Use the console command: link-region &amp;lt;URI&amp;gt; [&amp;lt;excludeList&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
The uri can be either the path of a local xml file or a xml document on a http server.&lt;br /&gt;
&lt;br /&gt;
The format of the xml file is:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region1&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and have no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-xloc&amp;quot; Value=&amp;quot;10222&amp;quot;/&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-yloc&amp;quot; Value=&amp;quot;10265&amp;quot; /&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region2&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Note] The section names can be anything you want, but they all should be different and have no spaces in the name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ExcludeList:&lt;br /&gt;
&lt;br /&gt;
The exclude list is a single string paramater with the format: excludeList:&amp;lt;SectionName&amp;gt;[;&amp;lt;SectionName&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
This means that while reading from the xml file any sections that are listed in the excludeList will be ignored and no HyperGrid link created for them.&lt;br /&gt;
&lt;br /&gt;
This could allow, link lists to be created on a webserver that everyone could add their own regions to, and then they just make sure they add their own section name(s) to the exclude list on their own region(s). &lt;br /&gt;
&lt;br /&gt;
So for example, someone might create a editable online list for the up coming OpenSimulator's 2nd birthday. Which might look something like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;OSGrid-Party&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;UCIGrid-Party&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I could then add my own region to the list with the section name &amp;quot;MW-Party&amp;quot;. Then when I startup that region that I want to be part of this hypergrid, I use the command: &amp;quot;link-region &amp;lt;URI of xml file&amp;gt; excludeList:MW-Party&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This is so that my region doesn't try to create a hyper link to itself.&lt;br /&gt;
&lt;br /&gt;
==== Method 3 (dynamic) ====&lt;br /&gt;
&lt;br /&gt;
Starting in r8193, if you're in an HG-enabled region, you'll be able &lt;br /&gt;
to dynamically link sims, and TP there, in any one of these ways (and &lt;br /&gt;
probably more). All you need to know is the target addresse, e.g. from the&lt;br /&gt;
list below.&lt;br /&gt;
&lt;br /&gt;
 1) Type for example secondlife://ucigrid04.nacs.uci.edu:9007/ in the &lt;br /&gt;
 chat box, pull up the chat history and click on that link&lt;br /&gt;
&lt;br /&gt;
 2) Pull up the map and search for things like &lt;br /&gt;
 ucigrid04.nacs.uci.edu:9007&lt;br /&gt;
&lt;br /&gt;
 3) Using the embedded browser visit pages that have links like &lt;br /&gt;
 secondlife://ucigrid04.nacs.uci.edu:9007/ (there's one up at&lt;br /&gt;
 http://www.ics.uci.edu/~lopes/hypergrid/test.html)&lt;br /&gt;
&lt;br /&gt;
Again, you can link to a specific region within an instance by adding the name of that region at the end, like this:&lt;br /&gt;
secondlife://ucigrid04.nacs.uci.edu:9007:Gateway 7000/&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Due to a viewer [https://jira.secondlife.com/browse/SVC-2941 bug], you can only TP between regions that are no more than 4096 cells apart in any dimension. What this means in practice is that if you want to link to OSGrid, you must have your own regions reachable from the (10,000; 10,000) point on the map, which is where OSGrid is centered. Place your regions somewhere in the 8,000s or the 12,000s.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T19:29:49Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Development Meetings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Hypergrid#Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;foreign user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installing and Running Hypergrid ==&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
&lt;br /&gt;
# Checkout OpenSim, prebuild and build as normal.&lt;br /&gt;
# &lt;br /&gt;
#* If you're running your opensim in grid mode with the UGAIM servers on other machines, you're done. If you're running in standalone and you want it to be network-able, or if you have your grid on loopback (127.0.0.1) change all the [Network] server addresses to &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;lt;external_host_name&amp;gt;:&amp;lt;http_port&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;. See below.&lt;br /&gt;
# Run opensim like this: &amp;lt;nowiki&amp;gt;[mono] OpenSim.exe -hypergrid=true&amp;lt;/nowiki&amp;gt;. To make sure the hypergrid is running type this on your console: '''link-region'''. If you don't hear anything back, the hypergrid is not properly installed.&lt;br /&gt;
'''[mono] OpenSim.exe -hypergrid=true'''&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a standalone:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:9300&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:9300&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:9300&lt;br /&gt;
 inventory_server_url = http://example.com:9300&lt;br /&gt;
 messaging_server_url = http://example.com:9300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a grided opensim:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:8001&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:8002&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:8003&lt;br /&gt;
 inventory_server_url = http://example.com:8004&lt;br /&gt;
 ; Port 8005 reserved&lt;br /&gt;
 messaging_server_url = http://example.com:8006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Make sure you have a 'home' set. If your home region doesn't exist, the hyperlink TPs may not work. To set your home, go to one of your local regions and &amp;quot;Set Home&amp;quot; from the viewer.&lt;br /&gt;
&lt;br /&gt;
=== Linking regions ===&lt;br /&gt;
&lt;br /&gt;
==== Method 1 ====&lt;br /&gt;
&lt;br /&gt;
On the console, type for example:&lt;br /&gt;
&lt;br /&gt;
link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; osl2.nac.uci.edu:9006&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the http_listener_port of the simulator where the region is running you want to link to&lt;br /&gt;
&lt;br /&gt;
You can link to a specific region within an instance, by using the name of the region at the end, for example:&lt;br /&gt;
&lt;br /&gt;
link-region 997 997 osl2.nac.uci.edu:9006:UCI Welcome&lt;br /&gt;
&lt;br /&gt;
==== Method 2 ====&lt;br /&gt;
&lt;br /&gt;
There is also some initial support for reading the links from a xml file.&lt;br /&gt;
&lt;br /&gt;
Use the console command: link-region &amp;lt;URI&amp;gt; [&amp;lt;excludeList&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
The uri can be either the path of a local xml file or a xml document on a http server.&lt;br /&gt;
&lt;br /&gt;
The format of the xml file is:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region1&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and have no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-xloc&amp;quot; Value=&amp;quot;10222&amp;quot;/&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-yloc&amp;quot; Value=&amp;quot;10265&amp;quot; /&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region2&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Note] The section names can be anything you want, but they all should be different and have no spaces in the name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ExcludeList:&lt;br /&gt;
&lt;br /&gt;
The exclude list is a single string paramater with the format: excludeList:&amp;lt;SectionName&amp;gt;[;&amp;lt;SectionName&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
This means that while reading from the xml file any sections that are listed in the excludeList will be ignored and no HyperGrid link created for them.&lt;br /&gt;
&lt;br /&gt;
This could allow, link lists to be created on a webserver that everyone could add their own regions to, and then they just make sure they add their own section name(s) to the exclude list on their own region(s). &lt;br /&gt;
&lt;br /&gt;
So for example, someone might create a editable online list for the up coming OpenSimulator's 2nd birthday. Which might look something like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;OSGrid-Party&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;UCIGrid-Party&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I could then add my own region to the list with the section name &amp;quot;MW-Party&amp;quot;. Then when I startup that region that I want to be part of this hypergrid, I use the command: &amp;quot;link-region &amp;lt;URI of xml file&amp;gt; excludeList:MW-Party&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This is so that my region doesn't try to create a hyper link to itself.&lt;br /&gt;
&lt;br /&gt;
==== Method 3 (dynamic) ====&lt;br /&gt;
&lt;br /&gt;
Starting in r8193, if you're in an HG-enabled region, you'll be able &lt;br /&gt;
to dynamically link sims, and TP there, in any one of these ways (and &lt;br /&gt;
probably more). All you need to know is the target addresse, e.g. from the&lt;br /&gt;
list below.&lt;br /&gt;
&lt;br /&gt;
 1) Type for example secondlife://ucigrid04.nacs.uci.edu:9007/ in the &lt;br /&gt;
 chat box, pull up the chat history and click on that link&lt;br /&gt;
&lt;br /&gt;
 2) Pull up the map and search for things like &lt;br /&gt;
 ucigrid04.nacs.uci.edu:9007&lt;br /&gt;
&lt;br /&gt;
 3) Using the embedded browser visit pages that have links like &lt;br /&gt;
 secondlife://ucigrid04.nacs.uci.edu:9007/ (there's one up at&lt;br /&gt;
 http://www.ics.uci.edu/~lopes/hypergrid/test.html)&lt;br /&gt;
&lt;br /&gt;
Again, you can link to a specific region within an instance by adding the name of that region at the end, like this:&lt;br /&gt;
secondlife://ucigrid04.nacs.uci.edu:9007:Gateway 7000/&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Due to a viewer [https://jira.secondlife.com/browse/SVC-2941 bug], you can only TP between regions that are no more than 4096 cells apart in any dimension. What this means in practice is that if you want to link to OSGrid, you must have your own regions reachable from the (10,000; 10,000) point on the map, which is where OSGrid is centered. Place your regions somewhere in the 8,000s or the 12,000s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T19:27:47Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Banning Foreign Users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Hypergrid#Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;foreign user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installing and Running Hypergrid ==&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
&lt;br /&gt;
# Checkout OpenSim, prebuild and build as normal.&lt;br /&gt;
# &lt;br /&gt;
#* If you're running your opensim in grid mode with the UGAIM servers on other machines, you're done. If you're running in standalone and you want it to be network-able, or if you have your grid on loopback (127.0.0.1) change all the [Network] server addresses to &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;lt;external_host_name&amp;gt;:&amp;lt;http_port&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;. See below.&lt;br /&gt;
# Run opensim like this: &amp;lt;nowiki&amp;gt;[mono] OpenSim.exe -hypergrid=true&amp;lt;/nowiki&amp;gt;. To make sure the hypergrid is running type this on your console: '''link-region'''. If you don't hear anything back, the hypergrid is not properly installed.&lt;br /&gt;
'''[mono] OpenSim.exe -hypergrid=true'''&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a standalone:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:9300&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:9300&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:9300&lt;br /&gt;
 inventory_server_url = http://example.com:9300&lt;br /&gt;
 messaging_server_url = http://example.com:9300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a grided opensim:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:8001&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:8002&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:8003&lt;br /&gt;
 inventory_server_url = http://example.com:8004&lt;br /&gt;
 ; Port 8005 reserved&lt;br /&gt;
 messaging_server_url = http://example.com:8006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Make sure you have a 'home' set. If your home region doesn't exist, the hyperlink TPs may not work. To set your home, go to one of your local regions and &amp;quot;Set Home&amp;quot; from the viewer.&lt;br /&gt;
&lt;br /&gt;
=== Linking regions ===&lt;br /&gt;
&lt;br /&gt;
==== Method 1 ====&lt;br /&gt;
&lt;br /&gt;
On the console, type for example:&lt;br /&gt;
&lt;br /&gt;
link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; osl2.nac.uci.edu:9006&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the http_listener_port of the simulator where the region is running you want to link to&lt;br /&gt;
&lt;br /&gt;
You can link to a specific region within an instance, by using the name of the region at the end, for example:&lt;br /&gt;
&lt;br /&gt;
link-region 997 997 osl2.nac.uci.edu:9006:UCI Welcome&lt;br /&gt;
&lt;br /&gt;
==== Method 2 ====&lt;br /&gt;
&lt;br /&gt;
There is also some initial support for reading the links from a xml file.&lt;br /&gt;
&lt;br /&gt;
Use the console command: link-region &amp;lt;URI&amp;gt; [&amp;lt;excludeList&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
The uri can be either the path of a local xml file or a xml document on a http server.&lt;br /&gt;
&lt;br /&gt;
The format of the xml file is:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region1&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and have no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-xloc&amp;quot; Value=&amp;quot;10222&amp;quot;/&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-yloc&amp;quot; Value=&amp;quot;10265&amp;quot; /&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region2&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Note] The section names can be anything you want, but they all should be different and have no spaces in the name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ExcludeList:&lt;br /&gt;
&lt;br /&gt;
The exclude list is a single string paramater with the format: excludeList:&amp;lt;SectionName&amp;gt;[;&amp;lt;SectionName&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
This means that while reading from the xml file any sections that are listed in the excludeList will be ignored and no HyperGrid link created for them.&lt;br /&gt;
&lt;br /&gt;
This could allow, link lists to be created on a webserver that everyone could add their own regions to, and then they just make sure they add their own section name(s) to the exclude list on their own region(s). &lt;br /&gt;
&lt;br /&gt;
So for example, someone might create a editable online list for the up coming OpenSimulator's 2nd birthday. Which might look something like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;OSGrid-Party&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;UCIGrid-Party&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I could then add my own region to the list with the section name &amp;quot;MW-Party&amp;quot;. Then when I startup that region that I want to be part of this hypergrid, I use the command: &amp;quot;link-region &amp;lt;URI of xml file&amp;gt; excludeList:MW-Party&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This is so that my region doesn't try to create a hyper link to itself.&lt;br /&gt;
&lt;br /&gt;
==== Method 3 (dynamic) ====&lt;br /&gt;
&lt;br /&gt;
Starting in r8193, if you're in an HG-enabled region, you'll be able &lt;br /&gt;
to dynamically link sims, and TP there, in any one of these ways (and &lt;br /&gt;
probably more). All you need to know is the target addresse, e.g. from the&lt;br /&gt;
list below.&lt;br /&gt;
&lt;br /&gt;
 1) Type for example secondlife://ucigrid04.nacs.uci.edu:9007/ in the &lt;br /&gt;
 chat box, pull up the chat history and click on that link&lt;br /&gt;
&lt;br /&gt;
 2) Pull up the map and search for things like &lt;br /&gt;
 ucigrid04.nacs.uci.edu:9007&lt;br /&gt;
&lt;br /&gt;
 3) Using the embedded browser visit pages that have links like &lt;br /&gt;
 secondlife://ucigrid04.nacs.uci.edu:9007/ (there's one up at&lt;br /&gt;
 http://www.ics.uci.edu/~lopes/hypergrid/test.html)&lt;br /&gt;
&lt;br /&gt;
Again, you can link to a specific region within an instance by adding the name of that region at the end, like this:&lt;br /&gt;
secondlife://ucigrid04.nacs.uci.edu:9007:Gateway 7000/&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Due to a viewer [https://jira.secondlife.com/browse/SVC-2941 bug], you can only TP between regions that are no more than 4096 cells apart in any dimension. What this means in practice is that if you want to link to OSGrid, you must have your own regions reachable from the (10,000; 10,000) point on the map, which is where OSGrid is centered. Place your regions somewhere in the 8,000s or the 12,000s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Banning_Foreign_Users_in_Hypergrid</id>
		<title>Banning Foreign Users in Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Banning_Foreign_Users_in_Hypergrid"/>
				<updated>2009-02-13T19:27:25Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Banning Foreign Users ===&lt;br /&gt;
&lt;br /&gt;
Even though the current viewers are incapable of dealing with foreign users, it is possible to ban specific foreign users from your estates. For now, you have to do it on the backend, i.e. directly editing the database and reviewing the log. Not easy for the faint of heart, but any sys admin should be able to do this with their eyes shut. What follows are instructions for adding a foreign user to the estate's ban list. &lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is to find out the UUID and IP address of the user you want to ban. For that you need to look at OpenSim.log. Search for log messages like this:&lt;br /&gt;
&lt;br /&gt;
 2009-01-23 03:45:11,995 INFO  - OpenSim.Region.Communications.Hypergrid.HGGridServicesGridMode [HGrid]: Incoming HGrid Agent&lt;br /&gt;
 Annoying.Person http://problematic.domain.org:9002&lt;br /&gt;
 2009-01-23 03:45:11,995 DEBUG - OpenSim.Region.Environment.Scenes.Scene [CONNECTION BEGIN]: Region Gateway 3000 told of incoming client&lt;br /&gt;
 Annoying.Person http://problematic.domain.org:9002 c3c9ecbf-bfb3-43eb-8dce-140afad7995f (circuit code 1896255323)&lt;br /&gt;
&lt;br /&gt;
In this case, the information you need is: UUID = c3c9ecbf-bfb3-43eb-8dce-140afad7995f and IPAddress = problematic.domain.org&lt;br /&gt;
&lt;br /&gt;
Next, let's add this foreign user to the ban list. Note that the estate information and ban lists are kept at the region server, not in the UGAIM. If you are using local storage for your regions, this information is stored in bin/OpenSim.db. So, open that DB with whatever tool you use to access your DBs. The instructions here assume a local sqlite database; if you're using MySql or other DB technologies for the regions' storage, the instructions are almost identical, but may need adjustments.&lt;br /&gt;
&lt;br /&gt;
SqlLite usually comes with a common Linux installation. In Linux, just type:&lt;br /&gt;
&lt;br /&gt;
  $ sqlite3 OpenSim.db&lt;br /&gt;
&lt;br /&gt;
In Windows, you need to get it from [http://www.sqlite.org/download.html here]. Once installed, run it on your OpenSim.db, like this, for example (on a command shell):&lt;br /&gt;
&lt;br /&gt;
  $ C:/Opt/SQLite3/sqlite3.exe OpenSim.db&lt;br /&gt;
&lt;br /&gt;
Once you are connected to the database, you can explore as much as you want. What follows are the concrete interactions you need for adding that foreign user into an estate ban list. Change the data for your situation.&lt;br /&gt;
&lt;br /&gt;
 [opensim@ucigrid04 bin]$ sqlite3 OpenSim.db&lt;br /&gt;
   SQLite version 3.3.6&lt;br /&gt;
   Enter &amp;quot;.help&amp;quot; for instructions&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
   estate_groups    estate_users     migrations       regionban&lt;br /&gt;
   estate_managers  estateban        primitems        regionsettings&lt;br /&gt;
   estate_map       land             prims            terrain&lt;br /&gt;
   estate_settings  landaccesslist   primshapes&lt;br /&gt;
 sqlite&amp;gt; .schema estateban&lt;br /&gt;
   CREATE TABLE estateban (&lt;br /&gt;
      EstateID int(10) NOT NULL,&lt;br /&gt;
      bannedUUID varchar(36) NOT NULL,&lt;br /&gt;
      bannedIp varchar(16) NOT NULL,&lt;br /&gt;
      bannedIpHostMask varchar(16) NOT NULL,&lt;br /&gt;
      bannedNameMask varchar(64) default NULL&lt;br /&gt;
   );&lt;br /&gt;
   CREATE INDEX estate_ban_estate_id on estateban(EstateID);&lt;br /&gt;
 sqlite&amp;gt; select EstateID, EstateName from estate_settings;&lt;br /&gt;
   100|My Estate&lt;br /&gt;
   101|My Estate&lt;br /&gt;
   102|My Estate&lt;br /&gt;
   103|My Estate&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (100, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (101, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (102, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (103, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; select * from estateban;&lt;br /&gt;
   100|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   101|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   102|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   103|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
 sqlite&amp;gt; .quit&lt;br /&gt;
&lt;br /&gt;
Once this data is entered you need to restart OpenSim, so that it gets loaded.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hypergrid]]&lt;br /&gt;
[[Category:Security]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Banning_Foreign_Users_in_Hypergrid</id>
		<title>Banning Foreign Users in Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Banning_Foreign_Users_in_Hypergrid"/>
				<updated>2009-02-13T19:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hypergrid]]&lt;br /&gt;
[[Category:Security]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Banning_Foreign_Users_in_Hypergrid</id>
		<title>Banning Foreign Users in Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Banning_Foreign_Users_in_Hypergrid"/>
				<updated>2009-02-13T19:24:44Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: Category:Hypergid Category:Security&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hypergid]]&lt;br /&gt;
[[Category:Security]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T19:14:59Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Security Concerns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Hypergrid#Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;foreign user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installing and Running Hypergrid ==&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
&lt;br /&gt;
# Checkout OpenSim, prebuild and build as normal.&lt;br /&gt;
# &lt;br /&gt;
#* If you're running your opensim in grid mode with the UGAIM servers on other machines, you're done. If you're running in standalone and you want it to be network-able, or if you have your grid on loopback (127.0.0.1) change all the [Network] server addresses to &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;lt;external_host_name&amp;gt;:&amp;lt;http_port&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;. See below.&lt;br /&gt;
# Run opensim like this: &amp;lt;nowiki&amp;gt;[mono] OpenSim.exe -hypergrid=true&amp;lt;/nowiki&amp;gt;. To make sure the hypergrid is running type this on your console: '''link-region'''. If you don't hear anything back, the hypergrid is not properly installed.&lt;br /&gt;
'''[mono] OpenSim.exe -hypergrid=true'''&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a standalone:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:9300&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:9300&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:9300&lt;br /&gt;
 inventory_server_url = http://example.com:9300&lt;br /&gt;
 messaging_server_url = http://example.com:9300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a grided opensim:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:8001&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:8002&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:8003&lt;br /&gt;
 inventory_server_url = http://example.com:8004&lt;br /&gt;
 ; Port 8005 reserved&lt;br /&gt;
 messaging_server_url = http://example.com:8006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Make sure you have a 'home' set. If your home region doesn't exist, the hyperlink TPs may not work. To set your home, go to one of your local regions and &amp;quot;Set Home&amp;quot; from the viewer.&lt;br /&gt;
&lt;br /&gt;
=== Linking regions ===&lt;br /&gt;
&lt;br /&gt;
==== Method 1 ====&lt;br /&gt;
&lt;br /&gt;
On the console, type for example:&lt;br /&gt;
&lt;br /&gt;
link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; osl2.nac.uci.edu:9006&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the http_listener_port of the simulator where the region is running you want to link to&lt;br /&gt;
&lt;br /&gt;
You can link to a specific region within an instance, by using the name of the region at the end, for example:&lt;br /&gt;
&lt;br /&gt;
link-region 997 997 osl2.nac.uci.edu:9006:UCI Welcome&lt;br /&gt;
&lt;br /&gt;
==== Method 2 ====&lt;br /&gt;
&lt;br /&gt;
There is also some initial support for reading the links from a xml file.&lt;br /&gt;
&lt;br /&gt;
Use the console command: link-region &amp;lt;URI&amp;gt; [&amp;lt;excludeList&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
The uri can be either the path of a local xml file or a xml document on a http server.&lt;br /&gt;
&lt;br /&gt;
The format of the xml file is:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region1&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and have no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-xloc&amp;quot; Value=&amp;quot;10222&amp;quot;/&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-yloc&amp;quot; Value=&amp;quot;10265&amp;quot; /&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region2&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Note] The section names can be anything you want, but they all should be different and have no spaces in the name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ExcludeList:&lt;br /&gt;
&lt;br /&gt;
The exclude list is a single string paramater with the format: excludeList:&amp;lt;SectionName&amp;gt;[;&amp;lt;SectionName&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
This means that while reading from the xml file any sections that are listed in the excludeList will be ignored and no HyperGrid link created for them.&lt;br /&gt;
&lt;br /&gt;
This could allow, link lists to be created on a webserver that everyone could add their own regions to, and then they just make sure they add their own section name(s) to the exclude list on their own region(s). &lt;br /&gt;
&lt;br /&gt;
So for example, someone might create a editable online list for the up coming OpenSimulator's 2nd birthday. Which might look something like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;OSGrid-Party&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;UCIGrid-Party&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I could then add my own region to the list with the section name &amp;quot;MW-Party&amp;quot;. Then when I startup that region that I want to be part of this hypergrid, I use the command: &amp;quot;link-region &amp;lt;URI of xml file&amp;gt; excludeList:MW-Party&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This is so that my region doesn't try to create a hyper link to itself.&lt;br /&gt;
&lt;br /&gt;
==== Method 3 (dynamic) ====&lt;br /&gt;
&lt;br /&gt;
Starting in r8193, if you're in an HG-enabled region, you'll be able &lt;br /&gt;
to dynamically link sims, and TP there, in any one of these ways (and &lt;br /&gt;
probably more). All you need to know is the target addresse, e.g. from the&lt;br /&gt;
list below.&lt;br /&gt;
&lt;br /&gt;
 1) Type for example secondlife://ucigrid04.nacs.uci.edu:9007/ in the &lt;br /&gt;
 chat box, pull up the chat history and click on that link&lt;br /&gt;
&lt;br /&gt;
 2) Pull up the map and search for things like &lt;br /&gt;
 ucigrid04.nacs.uci.edu:9007&lt;br /&gt;
&lt;br /&gt;
 3) Using the embedded browser visit pages that have links like &lt;br /&gt;
 secondlife://ucigrid04.nacs.uci.edu:9007/ (there's one up at&lt;br /&gt;
 http://www.ics.uci.edu/~lopes/hypergrid/test.html)&lt;br /&gt;
&lt;br /&gt;
Again, you can link to a specific region within an instance by adding the name of that region at the end, like this:&lt;br /&gt;
secondlife://ucigrid04.nacs.uci.edu:9007:Gateway 7000/&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Due to a viewer [https://jira.secondlife.com/browse/SVC-2941 bug], you can only TP between regions that are no more than 4096 cells apart in any dimension. What this means in practice is that if you want to link to OSGrid, you must have your own regions reachable from the (10,000; 10,000) point on the map, which is where OSGrid is centered. Place your regions somewhere in the 8,000s or the 12,000s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Banning Foreign Users ===&lt;br /&gt;
&lt;br /&gt;
Even though the current viewers are incapable of dealing with foreign users, it is possible to ban specific foreign users from your estates. For now, you have to do it on the backend, i.e. directly editing the database and reviewing the log. Not easy for the faint of heart, but any sys admin should be able to do this with their eyes shut. What follows are instructions for adding a foreign user to the estate's ban list. &lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is to find out the UUID and IP address of the user you want to ban. For that you need to look at OpenSim.log. Search for log messages like this:&lt;br /&gt;
&lt;br /&gt;
 2009-01-23 03:45:11,995 INFO  - OpenSim.Region.Communications.Hypergrid.HGGridServicesGridMode [HGrid]: Incoming HGrid Agent&lt;br /&gt;
 Annoying.Person http://problematic.domain.org:9002&lt;br /&gt;
 2009-01-23 03:45:11,995 DEBUG - OpenSim.Region.Environment.Scenes.Scene [CONNECTION BEGIN]: Region Gateway 3000 told of incoming client&lt;br /&gt;
 Annoying.Person http://problematic.domain.org:9002 c3c9ecbf-bfb3-43eb-8dce-140afad7995f (circuit code 1896255323)&lt;br /&gt;
&lt;br /&gt;
In this case, the information you need is: UUID = c3c9ecbf-bfb3-43eb-8dce-140afad7995f and IPAddress = problematic.domain.org&lt;br /&gt;
&lt;br /&gt;
Next, let's add this foreign user to the ban list. Note that the estate information and ban lists are kept at the region server, not in the UGAIM. If you are using local storage for your regions, this information is stored in bin/OpenSim.db. So, open that DB with whatever tool you use to access your DBs. The instructions here assume a local sqlite database; if you're using MySql or other DB technologies for the regions' storage, the instructions are almost identical, but may need adjustments.&lt;br /&gt;
&lt;br /&gt;
SqlLite usually comes with a common Linux installation. In Linux, just type:&lt;br /&gt;
&lt;br /&gt;
  $ sqlite3 OpenSim.db&lt;br /&gt;
&lt;br /&gt;
In Windows, you need to get it from [http://www.sqlite.org/download.html here]. Once installed, run it on your OpenSim.db, like this, for example (on a command shell):&lt;br /&gt;
&lt;br /&gt;
  $ C:/Opt/SQLite3/sqlite3.exe OpenSim.db&lt;br /&gt;
&lt;br /&gt;
Once you are connected to the database, you can explore as much as you want. What follows are the concrete interactions you need for adding that foreign user into an estate ban list. Change the data for your situation.&lt;br /&gt;
&lt;br /&gt;
 [opensim@ucigrid04 bin]$ sqlite3 OpenSim.db&lt;br /&gt;
   SQLite version 3.3.6&lt;br /&gt;
   Enter &amp;quot;.help&amp;quot; for instructions&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
   estate_groups    estate_users     migrations       regionban&lt;br /&gt;
   estate_managers  estateban        primitems        regionsettings&lt;br /&gt;
   estate_map       land             prims            terrain&lt;br /&gt;
   estate_settings  landaccesslist   primshapes&lt;br /&gt;
 sqlite&amp;gt; .schema estateban&lt;br /&gt;
   CREATE TABLE estateban (&lt;br /&gt;
      EstateID int(10) NOT NULL,&lt;br /&gt;
      bannedUUID varchar(36) NOT NULL,&lt;br /&gt;
      bannedIp varchar(16) NOT NULL,&lt;br /&gt;
      bannedIpHostMask varchar(16) NOT NULL,&lt;br /&gt;
      bannedNameMask varchar(64) default NULL&lt;br /&gt;
   );&lt;br /&gt;
   CREATE INDEX estate_ban_estate_id on estateban(EstateID);&lt;br /&gt;
 sqlite&amp;gt; select EstateID, EstateName from estate_settings;&lt;br /&gt;
   100|My Estate&lt;br /&gt;
   101|My Estate&lt;br /&gt;
   102|My Estate&lt;br /&gt;
   103|My Estate&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (100, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (101, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (102, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (103, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; select * from estateban;&lt;br /&gt;
   100|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   101|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   102|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   103|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
 sqlite&amp;gt; .quit&lt;br /&gt;
&lt;br /&gt;
Once this data is entered you need to restart OpenSim, so that it gets loaded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid_Security</id>
		<title>Hypergrid Security</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid_Security"/>
				<updated>2009-02-13T19:14:29Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: == Security Concerns ==  There is a wide-spread assumption that open grids such as OSGrid and new forms of grids such as the hypergrid are inherently insecure, and that it will be impossib...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Security Concerns ==&lt;br /&gt;
&lt;br /&gt;
There is a wide-spread assumption that open grids such as OSGrid and new forms of grids such as the hypergrid are inherently insecure, and that it will be impossible to develop a &amp;quot;goods-based&amp;quot; economy on top of them; only walled-gardens can be secured. This is both true and false. While it is true with the current state of things, open grids, whatever their form, can be made as secure as the web. The first step towards that is to define exactly what the security threats are, and how they affect (or not) open and closed grids. So, let's spell them out, and face them head-on. This will help put our feet on the ground so that we start developing appropriate solutions.&lt;br /&gt;
&lt;br /&gt;
=== Malicious Clients ===&lt;br /&gt;
&lt;br /&gt;
==== CopyBots ====&lt;br /&gt;
&lt;br /&gt;
Everyone knows about the infamous [http://en.wikipedia.org/wiki/CopyBot CopyBot]. Using libraries such as [http://www.libsecondlife.org/wiki/Main_Page LibSL] (now known as OpenMetaverse) it is possible to develop clients for opensim servers that do unorthodox things such as bypassing the permissions system to copy people's assets. Bots written by griefers can do lots of other nasty things.&lt;br /&gt;
&lt;br /&gt;
Malicious bots are a problem for all opensim administrators, including walled-garden grids. They can be prevented, to a certain extent, by exo-technical solutions such as Terms of Service and real-world lawsuits. Technically speaking, the only way to keep intruders out is to run opensim inside a firewall, pretty much like all other pieces of client/server software out there. If that's an acceptable solution for your case, you should do it.&lt;br /&gt;
&lt;br /&gt;
Unfortunately firewalls also keep the public out, and most opensim operators, even the ones running walled-garden grids, want to reach out to the public. In this case, opensim operators may develop additional technical obstacles for bots, similar to those we see on the Web. For example, make sure agents are being run by real people by giving them a human-challenge during the login/TP process, etc.&lt;br /&gt;
&lt;br /&gt;
Every obstacle to malicious clients lowers the risk of an intruder attack. However keep this in mind: no matter how many obstacles one builds, a sufficiently skilled and motivated attacker will be able to overcome them to penetrate opensims connected to the public internet. This affects hypergrid nodes as much as walled-garden grids. In fact, it's more pervasive than that: it affects '''all''' servers (opensim, web, etc.) connected to the public internet. Fighting malicious intruders is a fact of a connected world. Fortunately, those attacks don't happen very often, or the Web would have been dead by now.&lt;br /&gt;
&lt;br /&gt;
==== Web Clients ====&lt;br /&gt;
&lt;br /&gt;
CopyBots are the most well-known bots for opensim-based virtual worlds, but these virtual worlds are also susceptible to attacks by regular web clients. With the current state of things, it is actually easier to copy assets with a web-based client than with a libsl-based one. The weakness is that asset servers are connected to the public internet, and the protocol for interacting with them is public. &lt;br /&gt;
&lt;br /&gt;
OpenSim has some minimal guards in place to fence against these kinds of attacks. Specifically, when the inventory server receives a request for an item, it checks the session identifier of the requester. Web clients aren't logged in, so they are refused service. I don't want to expand much more on this, so not to make life easy for attackers, but let's just say that opensim has the necessary mechanisms in place to fence off web-based attackers.&lt;br /&gt;
&lt;br /&gt;
=== Malicious Hosts ===&lt;br /&gt;
&lt;br /&gt;
==== Actively Malicious Hosts ====&lt;br /&gt;
&lt;br /&gt;
The new security threat introduced by openness, one that does not exist in closed grids, is the possibility of a user to visit a region that is running malicious code. In the current state of opensim, a malicious host can do serious damage to the user's assets. Let's see how.&lt;br /&gt;
&lt;br /&gt;
Assume you have your assets in your hypergrided-standalone opensim, and you go visit another opensim that happens to be running malicious code. Here is a non-exhaustive list of vulnerabilities that you are exposed to:&lt;br /&gt;
&lt;br /&gt;
* The host has your session id, so it can request your inventory items on your behalf and store copies in its local asset server. To add insult to injury, a malicious host could simply wipe out your inventory after having copied it.&lt;br /&gt;
* Even if the malicious host doesn't access your items by itself, every time you access items in your inventory while you are in that region, those items are cached in the region's local cache, and can be stored persistently by the malicious host.&lt;br /&gt;
&lt;br /&gt;
Malicious hosts can do a lot more damage, but those two are enough to illustrate this new kind of vulnerability affecting open grids. Note that this affects all open grids, i.e. those where arbitrary people can plug-in their opensims, and not just the hypergrid.&lt;br /&gt;
&lt;br /&gt;
Fortunately, there is a family of simple solutions to this problem that can be summarized as &amp;quot;protecting you from yourself.&amp;quot; That proposal is described [[Hypergrid Inventory Access|here]].&lt;br /&gt;
&lt;br /&gt;
==== Piracy ====&lt;br /&gt;
&lt;br /&gt;
A second new security threat affecting open grids is one pertaining to commerce of virtual goods. Suppose you put something out for sale on your hypergrided opensim. A foreign user comes and buys it. What that really means is that that user will physically get a copy of the assets moved to his/her asset server, which is different from your asset server. The permissions will be whatever you define them to be, and using the regular VW client, that user can only do what you defined he/she should could do with the object, as usual. However, if the user has direct backend access to the asset and inventory servers, that person can simply modify the permissions on his/her copy. This is commonly known as '''piracy'''.  (This is also a problem with programmers who have direct access to the cache that their client keeps; in this case, the only thing that needs to be done to enable piracy is for the user to actually see a texture/animation/in-world object.  This does NOT allow scripts to be copied, though, since the script is only interpreted on the server and is never sent for interpretation by the client.)&lt;br /&gt;
&lt;br /&gt;
This situation is the kernel of the belief that open grids are hopeless for a virtual-goods economy. DRM discussion aside, maybe they are hopeless. But then, everyone thought the web was hopeless for selling music, and look at the success of iTunes in spite of all the piracy that still exists out there. Who will be the equivalent of iTunes for virtual hair, skin and clothes?&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Hypergrid</id>
		<title>Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Hypergrid"/>
				<updated>2009-02-13T18:53:24Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The OpenSim Hypergrid==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is the hypergrid? ===&lt;br /&gt;
&amp;lt;!-- [[image:VWV.jpg|250px|thumb|Web of Virtual Worlds]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hypergrid is an extension to opensim that allows you to link your opensim to other opensims on the internet, and that supports seamless agent transfers among those opensims. It can be used both in standalone mode and in grid mode. The hypergrid is effectively supporting the emergence of a Web of virtual worlds. &lt;br /&gt;
&lt;br /&gt;
The basic idea for the hypergrid is that region/grid administrations can place hyperlinks on their map to hypergrided regions run by others. Once those hyperlinks are established, users interact with those regions in exactly the same way as they interact with local regions. Specifically, users can choose to teleport there. Once the user reaches the region behind the hyperlink, she is automatically interacting with a different virtual world without having to logout from the world where she came from, and while still having access to her inventory.&lt;br /&gt;
&lt;br /&gt;
The hypergrid started as a GForge project, but it is now included in the standard distribution of OpenSim. To run your OpenSim instance in hypergrid mode, please see [[Hypergrid#Installing_and_Running_Hypergrid|Installing and Running]].&lt;br /&gt;
&lt;br /&gt;
=== Virtual World Hyperlinks ===&lt;br /&gt;
[[image:hghyperlink.jpg|250px|thumb|A Virtual World Hyperlink]]&lt;br /&gt;
&lt;br /&gt;
We're all familiar with hypertext links on the Web. But what is a virtual world hyperlink?&lt;br /&gt;
&lt;br /&gt;
In the hypergrid model, we consider the 2D map of the virtual world as the equivalent of a web page. As such, a VW hyperlink is simply a region on that map. &lt;br /&gt;
&lt;br /&gt;
The default model of opensim-based virtual worlds already supports this concept of hyperlink, to some extent. When you teleport from one region to another via the map, chances are you are migrating your agent into a different opensim server. This migration is a glorified &amp;quot;agent transfer&amp;quot; that also exists, in rudimentary form, on the web when hypertext links are followed. The default model, however, imposes two very strong constraints on these hyperlinks: &lt;br /&gt;
# The entire map of regions is controlled by a central service known as the grid service, whose job is to provide a uniform view of the world to all of its regions.&lt;br /&gt;
# The only agents that can be transferred are those pertaining to users known to another central service, the user service; if the incoming user is not on that service's database, the agent transfer doesn't go through.&lt;br /&gt;
&lt;br /&gt;
The hypergrid simply removes these two constraints. &lt;br /&gt;
&lt;br /&gt;
First, it allows individual opensim instances to add &amp;quot;neighbors&amp;quot; to their local map, shifting the control of the map down from the grid server to individual opensim instances (although hyperlinks can also be served by grid servers if grid admins so wish). In doing so, the world becomes a lot more interesting and varied. The map that you see in one opensim instance may be completely different from the map that you see after you teleport via an hyperlink. As an opensim administrator, you are free to define what other opensims you want to see on your map.&lt;br /&gt;
&lt;br /&gt;
Second, it allows the transfer of agents pertaining to foreigner users, i.e. users who are registered elsewhere. Instead of assuming one central user service, the hypergrid assumes an arbitrarily large number of such services distributed all over the world. As such, when agents are transferred among hypergrided opensims, a lot more information is passed about the corresponding user. That information includes the collection of servers that the transferring user needs.&lt;br /&gt;
&lt;br /&gt;
=== Usage Scenarios ===&lt;br /&gt;
&lt;br /&gt;
The following are some usage scenarios. There isn't a clear separation between these scenarios, there's a large overlap between them. This is also not an exhaustive list. The purpose of these descriptions is to give you some starting ideas for how to use the hypergrid in practice. Please feel free to add other interesting scenarios to this list.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoA.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Personal Worlds'''&lt;br /&gt;
&lt;br /&gt;
This first scenario pertains to standalone opensims. Normally, standalones are completely disconnected from the internet. However, when run in hypergrid mode, standalones become network-able. As such, you can run your own world in your own computer, and link your world to whoever you want. For example, you can link to your friends' hypergrided opensims and to hypergrid gateways in open grids such as OSGrid. &lt;br /&gt;
&lt;br /&gt;
The great thing about this scenario is that all of your assets are stored on your computer, and not on somebody else's server. You can back them up using ordinary backend tools. The not so great thing about this scenario is that all of your assets are stored on your computer! If your disk goes berserk, you loose them. (so make sure you make external backups regularly)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoB.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Communities'''&lt;br /&gt;
&lt;br /&gt;
This second scenario is about communities, broadly construed. The idea here is that a group of people come together to support a small community grid, i.e. a common world where shared activities take place. But at the same time, the members of the community maintain their own standalone worlds. The standalones link to the community grid, and the community grid may link back to the individual members' worlds and other places of interest.&lt;br /&gt;
&lt;br /&gt;
The members' identities are probably the identities they have on their standalones, and their assets are also probably stored there. The assets present in the community regions, however, are stored on the grid asset server.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoC.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Grid Public Regions'''&lt;br /&gt;
&lt;br /&gt;
Walled-gardens are here to stay, and they serve many useful purposes. There is a hybrid mode for the hypergrid that some walled-garden grid operators may be interested in supporting. In this hybrid mode, most opensim instances on the grid run in normal, wall-garden mode, so no foreign visitors are allowed there - technically it is impossible to reach them. However, a few opensim instances on that grid can run in hypergrid mode, so that foreign visitors are allowed. This way, there is a gateway for grid-local users and arbitrary visitors to meet. This is also a good strategy for attracting new users to the grid, since random users are able to visit those gateway regions without having to sign up for an account upfront.&lt;br /&gt;
&lt;br /&gt;
This hybrid mode is very similar to what happens on the web. For example, anyone can visit Facebook's public pages without having to sign up for a Facebook account. However, only Facebook users can go further inside.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
[[image:topoD.jpg|400px|left]]&lt;br /&gt;
|&lt;br /&gt;
'''Level Games'''&lt;br /&gt;
&lt;br /&gt;
The normal version of OpenSim enforces a common map for all the regions on a grid. The hypergrid removes that constraint. As such, it becomes easy to design VW games where the world looks different depending of where the player is. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Security Concerns ==&lt;br /&gt;
&lt;br /&gt;
There is a wide-spread assumption that open grids such as OSGrid and new forms of grids such as the hypergrid are inherently insecure, and that it will be impossible to develop a &amp;quot;goods-based&amp;quot; economy on top of them; only walled-gardens can be secured. This is both true and false. While it is true with the current state of things, open grids, whatever their form, can be made as secure as the web. The first step towards that is to define exactly what the security threats are, and how they affect (or not) open and closed grids. So, let's spell them out, and face them head-on. This will help put our feet on the ground so that we start developing appropriate solutions.&lt;br /&gt;
&lt;br /&gt;
=== Malicious Clients ===&lt;br /&gt;
&lt;br /&gt;
==== CopyBots ====&lt;br /&gt;
&lt;br /&gt;
Everyone knows about the infamous [http://en.wikipedia.org/wiki/CopyBot CopyBot]. Using libraries such as [http://www.libsecondlife.org/wiki/Main_Page LibSL] (now known as OpenMetaverse) it is possible to develop clients for opensim servers that do unorthodox things such as bypassing the permissions system to copy people's assets. Bots written by griefers can do lots of other nasty things.&lt;br /&gt;
&lt;br /&gt;
Malicious bots are a problem for all opensim administrators, including walled-garden grids. They can be prevented, to a certain extent, by exo-technical solutions such as Terms of Service and real-world lawsuits. Technically speaking, the only way to keep intruders out is to run opensim inside a firewall, pretty much like all other pieces of client/server software out there. If that's an acceptable solution for your case, you should do it.&lt;br /&gt;
&lt;br /&gt;
Unfortunately firewalls also keep the public out, and most opensim operators, even the ones running walled-garden grids, want to reach out to the public. In this case, opensim operators may develop additional technical obstacles for bots, similar to those we see on the Web. For example, make sure agents are being run by real people by giving them a human-challenge during the login/TP process, etc.&lt;br /&gt;
&lt;br /&gt;
Every obstacle to malicious clients lowers the risk of an intruder attack. However keep this in mind: no matter how many obstacles one builds, a sufficiently skilled and motivated attacker will be able to overcome them to penetrate opensims connected to the public internet. This affects hypergrid nodes as much as walled-garden grids. In fact, it's more pervasive than that: it affects '''all''' servers (opensim, web, etc.) connected to the public internet. Fighting malicious intruders is a fact of a connected world. Fortunately, those attacks don't happen very often, or the Web would have been dead by now.&lt;br /&gt;
&lt;br /&gt;
==== Web Clients ====&lt;br /&gt;
&lt;br /&gt;
CopyBots are the most well-known bots for opensim-based virtual worlds, but these virtual worlds are also susceptible to attacks by regular web clients. With the current state of things, it is actually easier to copy assets with a web-based client than with a libsl-based one. The weakness is that asset servers are connected to the public internet, and the protocol for interacting with them is public. &lt;br /&gt;
&lt;br /&gt;
OpenSim has some minimal guards in place to fence against these kinds of attacks. Specifically, when the inventory server receives a request for an item, it checks the session identifier of the requester. Web clients aren't logged in, so they are refused service. I don't want to expand much more on this, so not to make life easy for attackers, but let's just say that opensim has the necessary mechanisms in place to fence off web-based attackers.&lt;br /&gt;
&lt;br /&gt;
=== Malicious Hosts ===&lt;br /&gt;
&lt;br /&gt;
==== Actively Malicious Hosts ====&lt;br /&gt;
&lt;br /&gt;
The new security threat introduced by openness, one that does not exist in closed grids, is the possibility of a user to visit a region that is running malicious code. In the current state of opensim, a malicious host can do serious damage to the user's assets. Let's see how.&lt;br /&gt;
&lt;br /&gt;
Assume you have your assets in your hypergrided-standalone opensim, and you go visit another opensim that happens to be running malicious code. Here is a non-exhaustive list of vulnerabilities that you are exposed to:&lt;br /&gt;
&lt;br /&gt;
* The host has your session id, so it can request your inventory items on your behalf and store copies in its local asset server. To add insult to injury, a malicious host could simply wipe out your inventory after having copied it.&lt;br /&gt;
* Even if the malicious host doesn't access your items by itself, every time you access items in your inventory while you are in that region, those items are cached in the region's local cache, and can be stored persistently by the malicious host.&lt;br /&gt;
&lt;br /&gt;
Malicious hosts can do a lot more damage, but those two are enough to illustrate this new kind of vulnerability affecting open grids. Note that this affects all open grids, i.e. those where arbitrary people can plug-in their opensims, and not just the hypergrid.&lt;br /&gt;
&lt;br /&gt;
Fortunately, there is a family of simple solutions to this problem that can be summarized as &amp;quot;protecting you from yourself.&amp;quot; That proposal is described [[Hypergrid Inventory Access|here]].&lt;br /&gt;
&lt;br /&gt;
==== Piracy ====&lt;br /&gt;
&lt;br /&gt;
A second new security threat affecting open grids is one pertaining to commerce of virtual goods. Suppose you put something out for sale on your hypergrided opensim. A foreign user comes and buys it. What that really means is that that user will physically get a copy of the assets moved to his/her asset server, which is different from your asset server. The permissions will be whatever you define them to be, and using the regular VW client, that user can only do what you defined he/she should could do with the object, as usual. However, if the user has direct backend access to the asset and inventory servers, that person can simply modify the permissions on his/her copy. This is commonly known as '''piracy'''.  (This is also a problem with programmers who have direct access to the cache that their client keeps; in this case, the only thing that needs to be done to enable piracy is for the user to actually see a texture/animation/in-world object.  This does NOT allow scripts to be copied, though, since the script is only interpreted on the server and is never sent for interpretation by the client.)&lt;br /&gt;
&lt;br /&gt;
This situation is the kernel of the belief that open grids are hopeless for a virtual-goods economy. DRM discussion aside, maybe they are hopeless. But then, everyone thought the web was hopeless for selling music, and look at the success of iTunes in spite of all the piracy that still exists out there. Who will be the equivalent of iTunes for virtual hair, skin and clothes?&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Hyperlinks and Agent Transfers ===&lt;br /&gt;
&lt;br /&gt;
When you establish a link between your opensim and another, a message is sent out to that other opensim requesting information about it; the required information includes the network information of that opensim host, and the coordinates of its first region on its local grid in the form of a region handle. For example, suppose you are linking node X.com:9000, placing it in your local map at 900, 900. That opensim runs one or more regions that likely are not in 900, 900 on their own map; suppose the first region of that opensim is at 1100, 1100. From your point of view, it doesn't matter what those other coordinates are, and you don't need to know -- that's the key to being able to decentralize the &amp;quot;world&amp;quot; as given by a 2D map; you want to place it in your map at 900, 900. The &amp;quot;true&amp;quot; position of that simulator only matters for the LL viewer, when there are teleports between your world and that other opensim. This mapping between coordinate systems is the essence of  hyperlinks for opensim; it's one simple but critical thing that the hypergrid implementation does. The mapping happens on the TeleportFinish event; instead of sending the local coordinates to the viewer, the hypergrid teleport wrapper sends the remote coordinates.&lt;br /&gt;
&lt;br /&gt;
When an agent teleports through that hyperlink the following happens. First, before InformRegionOfChildAgent, the local opensim notifies the remote opensim of this foreign user via the &amp;quot;expect_hg_user&amp;quot; method. That message sends along the addresses of all the servers that this user uses, i.e. user, inventory and asset servers. The remote opensim places an entry for that user in its local user profile cache but not in its user database; the foreign user information is non-persistent. After that, the teleport process is exactly the same as the normal teleport process; the only difference is that the region handles are switched between the remote region's hyperlink position on the local grid and its actual position on its grid. &lt;br /&gt;
&lt;br /&gt;
In summary, the two new concepts introduced by the hypergrid are the concept of an hyperlink and the concept of a &amp;quot;local user&amp;quot; vs. &amp;quot;foreign user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Inventory Access ===&lt;br /&gt;
&lt;br /&gt;
Inventory access from abroad is done by wrapping the existing scene-inventory interactions with additional code that gets or posts inventory assets from/to the user's asset server. When inventory is accessed, the hypergrid wrapper checks if the user is foreign and, if she is, the wrapper simply brings the necessary assets from the user's asset server to the local asset cache and server; from then on, the wrapper passes the control to the existing inventory access functions. When something is added to inventory, the hypergrid wrapper is notified via an event, and posts the assets to the user's asset server. A cache of the exchanged item identifiers is maintained so that they aren't brought back over and over again.&lt;br /&gt;
&lt;br /&gt;
The result is that hypergrided opensim instances end up interacting with several asset servers, instead of just one. That interaction is implemented in a straightforward manner by instantiating several GridAssetClient objects, instead of just one.&lt;br /&gt;
&lt;br /&gt;
=== The Hypergrid Classes ===&lt;br /&gt;
&lt;br /&gt;
Currently, the hypergrid is implemented outside of the OpenSim namespace, so that there is complete separation between what already exists and this new behavior. It has its own namespace, HyperGrid. In it, there are 4 sub-namespaces that follow directly the software architecture of OpenSim, namely:&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Framework''':&lt;br /&gt;
** ForeignUserProfileData extends UserProfileData by introducing information about the user's &amp;quot;home&amp;quot;, namely the home address, port and remoting port. The user's home is not that user's user service; it's the opensim that the user has defined to be her home. This is necessary for supporting the home jump (Ctrl-Shift-H).&lt;br /&gt;
** HGNetworkServersInfo follows the spirit of NetworkServersInfo, although it neither extends it nor uses it. For now, it's a utility class whose two main functions are to convert domain names of servers to IP addresses, and to uniformly provide the answer to the question bool IsLocalUser(...).&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Framework.Scenes.Hypergrid''':&lt;br /&gt;
** HGSceneCommunicationService extends SceneCommunicationService, overriding RequestTeleportToLocation. There are two very small but critical changes to the base method: (a) on the TeleportFinish event, we switch the region handles when the destination region is an hyperlink; (b) the connections at the end are always closed for hyperlink TPs.&lt;br /&gt;
** HGScene extends Scene, overriding TeleportClientHome(...). The only change to the base method is to stay away from the user server, for now, because the user service is still not completely wrapped up for foreign users. Once the user service is properly wrapped up, this class will become unnecessary.&lt;br /&gt;
** HGScene.Inventory is a partial class of HGScene, just like what happens in the OpenSim framework. This part of HGScene overrides some inventory-scene interaction methods, so that assets are fetched/posted from/to the user's asset server. Once that extra fetching/posting is done, these methods simply pass the ball to the base methods.&lt;br /&gt;
** HGAssetMapper: this is a new class specific to the hypergrid that manages the fetching and posting of assets between foreign regions where the user is and the user's asset server.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.Communications.HyperGrid''' is a mashup of OpenSim.Region.Communications.*. This is the place where most of the hypergrid extension lies. One of the reasons for this is that the hypergrid communications part is doing one additional thing: it is making standalones network-able.&lt;br /&gt;
** HGCommunicationsStandalone extends CommuniationsLocal. Just as its base, it is a hub for the several network services available in standalone mode. The main difference is that those services are extensions of what's in OpenSim.&lt;br /&gt;
** HGCommunicationsGridMode extends CommunicationsManager directly. Again, it's a hub for the network services available in grid mode, those services being extensions of OpenSim.&lt;br /&gt;
** The cluster HGGridServices (superclass), HGGridServicesStandalone and HGGridServicesGridMode (subclasses) implements the OpenSim interfaces IGridServices and IInterRegionCommunications. The 2 subclasses are wrappers for LocalBackEndServices and OGS1GridServices, respectively. There is one common pattern throughout these classes: check if the region to talk to is an hyperlink; if it's not, simply delegate the work to LocalBackEndServices/OGS1GridServices; if it is, push the work to the base class HGGridServices. HGGridServices, in turn, does the management of hyperlink regions, and defines two additional pieces of inter-region protocol:&lt;br /&gt;
*** region_uuid: for linking regions&lt;br /&gt;
*** expect_hg_user: similar to the existing expect_user interface, but with a lot more information about the user being passed around, namely all the user's servers (inventory, asset, user, home, etc.)&lt;br /&gt;
** HGInventoryService extends LocalInventoryService and implements ISecureInventoryService. This class is the most obvious mashup of the pack, mixing local service access for standalone users and remote inventory access for when users are out and about. Right now, there is a fair amount of selective copy-and-paste, to stay away from the ugliness coming from OGS1InventoryService and OGS1SecureInventoryService. HGInventoryService is always a ISecureInventoryService. Its methods all follow the same pattern: check if the user is a local standalone user; if it is, pass the work to the base method (in LocalInventoryService); if it's not perform secure remote access.&lt;br /&gt;
** HGUserServices wraps OSG1UserServices, but it's not functional yet.&lt;br /&gt;
&lt;br /&gt;
* '''OpenSim.Region.CoreModules.HyperGrid''' is a collection of 3 region modules:&lt;br /&gt;
** HGWorldMapModule extends WorldMapModule. It reuses almost everything from the base class. The only small change is in RequestMapBlocks, where it tries to send Offline mapblocks to the client.&lt;br /&gt;
** HGStandaloneInventoryService and HGStandaloneAssetService do what their names say. They are region modules that allow access to inventory and assets for standalones, when the standalone user is out and about. In spirit, there is a lot in common between these modules and the REST inventory/asset plugin. Unfortunately, that plugin could not be used because it defines a completely different interface than that used by existing inventory and asset servers, and the access for the hypergrid must use a consistent interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installing and Running Hypergrid ==&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
&lt;br /&gt;
# Checkout OpenSim, prebuild and build as normal.&lt;br /&gt;
# &lt;br /&gt;
#* If you're running your opensim in grid mode with the UGAIM servers on other machines, you're done. If you're running in standalone and you want it to be network-able, or if you have your grid on loopback (127.0.0.1) change all the [Network] server addresses to &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;lt;external_host_name&amp;gt;:&amp;lt;http_port&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;. See below.&lt;br /&gt;
# Run opensim like this: &amp;lt;nowiki&amp;gt;[mono] OpenSim.exe -hypergrid=true&amp;lt;/nowiki&amp;gt;. To make sure the hypergrid is running type this on your console: '''link-region'''. If you don't hear anything back, the hypergrid is not properly installed.&lt;br /&gt;
'''[mono] OpenSim.exe -hypergrid=true'''&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a standalone:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:9300&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:9300&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:9300&lt;br /&gt;
 inventory_server_url = http://example.com:9300&lt;br /&gt;
 messaging_server_url = http://example.com:9300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is an example of the Network settings for a grided opensim:&lt;br /&gt;
&lt;br /&gt;
 [Network]&lt;br /&gt;
 http_listener_port = 9300&lt;br /&gt;
 remoting_listener_port = 9895&lt;br /&gt;
 &lt;br /&gt;
 grid_server_url = http://example.com:8001&lt;br /&gt;
 grid_send_key = null&lt;br /&gt;
 grid_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 user_server_url = http://example.com:8002&lt;br /&gt;
 user_send_key = null&lt;br /&gt;
 user_recv_key = null&lt;br /&gt;
 &lt;br /&gt;
 asset_server_url = http://example.com:8003&lt;br /&gt;
 inventory_server_url = http://example.com:8004&lt;br /&gt;
 ; Port 8005 reserved&lt;br /&gt;
 messaging_server_url = http://example.com:8006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Make sure you have a 'home' set. If your home region doesn't exist, the hyperlink TPs may not work. To set your home, go to one of your local regions and &amp;quot;Set Home&amp;quot; from the viewer.&lt;br /&gt;
&lt;br /&gt;
=== Linking regions ===&lt;br /&gt;
&lt;br /&gt;
==== Method 1 ====&lt;br /&gt;
&lt;br /&gt;
On the console, type for example:&lt;br /&gt;
&lt;br /&gt;
link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; osl2.nac.uci.edu:9006&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the http_listener_port of the simulator where the region is running you want to link to&lt;br /&gt;
&lt;br /&gt;
You can link to a specific region within an instance, by using the name of the region at the end, for example:&lt;br /&gt;
&lt;br /&gt;
link-region 997 997 osl2.nac.uci.edu:9006:UCI Welcome&lt;br /&gt;
&lt;br /&gt;
==== Method 2 ====&lt;br /&gt;
&lt;br /&gt;
There is also some initial support for reading the links from a xml file.&lt;br /&gt;
&lt;br /&gt;
Use the console command: link-region &amp;lt;URI&amp;gt; [&amp;lt;excludeList&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
The uri can be either the path of a local xml file or a xml document on a http server.&lt;br /&gt;
&lt;br /&gt;
The format of the xml file is:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region1&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and have no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-xloc&amp;quot; Value=&amp;quot;10222&amp;quot;/&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;real-yloc&amp;quot; Value=&amp;quot;10265&amp;quot; /&amp;gt; //optional field that gives the region's real location on its home grid&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;Region2&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Note] The section names can be anything you want, but they all should be different and have no spaces in the name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ExcludeList:&lt;br /&gt;
&lt;br /&gt;
The exclude list is a single string paramater with the format: excludeList:&amp;lt;SectionName&amp;gt;[;&amp;lt;SectionName&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
This means that while reading from the xml file any sections that are listed in the excludeList will be ignored and no HyperGrid link created for them.&lt;br /&gt;
&lt;br /&gt;
This could allow, link lists to be created on a webserver that everyone could add their own regions to, and then they just make sure they add their own section name(s) to the exclude list on their own region(s). &lt;br /&gt;
&lt;br /&gt;
So for example, someone might create a editable online list for the up coming OpenSimulator's 2nd birthday. Which might look something like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Nini&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;OSGrid-Party&amp;quot;&amp;gt; &amp;lt;!-- can be any name but each section should have a different name and no spaces --&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;xloc&amp;quot; Value=&amp;quot;1002&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;yloc&amp;quot; Value=&amp;quot;1006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalPort&amp;quot; Value=&amp;quot;9006&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;externalHostName&amp;quot; Value=&amp;quot;osl2.nac.uci.edu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Key Name=&amp;quot;localName&amp;quot; Value=&amp;quot;OSGrid-Gateway&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
  &amp;lt;Section Name=&amp;quot;UCIGrid-Party&amp;quot;&amp;gt; &lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/Section&amp;gt;&lt;br /&gt;
 &amp;lt;/Nini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I could then add my own region to the list with the section name &amp;quot;MW-Party&amp;quot;. Then when I startup that region that I want to be part of this hypergrid, I use the command: &amp;quot;link-region &amp;lt;URI of xml file&amp;gt; excludeList:MW-Party&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This is so that my region doesn't try to create a hyper link to itself.&lt;br /&gt;
&lt;br /&gt;
==== Method 3 (dynamic) ====&lt;br /&gt;
&lt;br /&gt;
Starting in r8193, if you're in an HG-enabled region, you'll be able &lt;br /&gt;
to dynamically link sims, and TP there, in any one of these ways (and &lt;br /&gt;
probably more). All you need to know is the target addresse, e.g. from the&lt;br /&gt;
list below.&lt;br /&gt;
&lt;br /&gt;
 1) Type for example secondlife://ucigrid04.nacs.uci.edu:9007/ in the &lt;br /&gt;
 chat box, pull up the chat history and click on that link&lt;br /&gt;
&lt;br /&gt;
 2) Pull up the map and search for things like &lt;br /&gt;
 ucigrid04.nacs.uci.edu:9007&lt;br /&gt;
&lt;br /&gt;
 3) Using the embedded browser visit pages that have links like &lt;br /&gt;
 secondlife://ucigrid04.nacs.uci.edu:9007/ (there's one up at&lt;br /&gt;
 http://www.ics.uci.edu/~lopes/hypergrid/test.html)&lt;br /&gt;
&lt;br /&gt;
Again, you can link to a specific region within an instance by adding the name of that region at the end, like this:&lt;br /&gt;
secondlife://ucigrid04.nacs.uci.edu:9007:Gateway 7000/&lt;br /&gt;
&lt;br /&gt;
'''Important Note'''&lt;br /&gt;
&lt;br /&gt;
Due to a viewer [https://jira.secondlife.com/browse/SVC-2941 bug], you can only TP between regions that are no more than 4096 cells apart in any dimension. What this means in practice is that if you want to link to OSGrid, you must have your own regions reachable from the (10,000; 10,000) point on the map, which is where OSGrid is centered. Place your regions somewhere in the 8,000s or the 12,000s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Banning Foreign Users ===&lt;br /&gt;
&lt;br /&gt;
Even though the current viewers are incapable of dealing with foreign users, it is possible to ban specific foreign users from your estates. For now, you have to do it on the backend, i.e. directly editing the database and reviewing the log. Not easy for the faint of heart, but any sys admin should be able to do this with their eyes shut. What follows are instructions for adding a foreign user to the estate's ban list. &lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is to find out the UUID and IP address of the user you want to ban. For that you need to look at OpenSim.log. Search for log messages like this:&lt;br /&gt;
&lt;br /&gt;
 2009-01-23 03:45:11,995 INFO  - OpenSim.Region.Communications.Hypergrid.HGGridServicesGridMode [HGrid]: Incoming HGrid Agent&lt;br /&gt;
 Annoying.Person http://problematic.domain.org:9002&lt;br /&gt;
 2009-01-23 03:45:11,995 DEBUG - OpenSim.Region.Environment.Scenes.Scene [CONNECTION BEGIN]: Region Gateway 3000 told of incoming client&lt;br /&gt;
 Annoying.Person http://problematic.domain.org:9002 c3c9ecbf-bfb3-43eb-8dce-140afad7995f (circuit code 1896255323)&lt;br /&gt;
&lt;br /&gt;
In this case, the information you need is: UUID = c3c9ecbf-bfb3-43eb-8dce-140afad7995f and IPAddress = problematic.domain.org&lt;br /&gt;
&lt;br /&gt;
Next, let's add this foreign user to the ban list. Note that the estate information and ban lists are kept at the region server, not in the UGAIM. If you are using local storage for your regions, this information is stored in bin/OpenSim.db. So, open that DB with whatever tool you use to access your DBs. The instructions here assume a local sqlite database; if you're using MySql or other DB technologies for the regions' storage, the instructions are almost identical, but may need adjustments.&lt;br /&gt;
&lt;br /&gt;
SqlLite usually comes with a common Linux installation. In Linux, just type:&lt;br /&gt;
&lt;br /&gt;
  $ sqlite3 OpenSim.db&lt;br /&gt;
&lt;br /&gt;
In Windows, you need to get it from [http://www.sqlite.org/download.html here]. Once installed, run it on your OpenSim.db, like this, for example (on a command shell):&lt;br /&gt;
&lt;br /&gt;
  $ C:/Opt/SQLite3/sqlite3.exe OpenSim.db&lt;br /&gt;
&lt;br /&gt;
Once you are connected to the database, you can explore as much as you want. What follows are the concrete interactions you need for adding that foreign user into an estate ban list. Change the data for your situation.&lt;br /&gt;
&lt;br /&gt;
 [opensim@ucigrid04 bin]$ sqlite3 OpenSim.db&lt;br /&gt;
   SQLite version 3.3.6&lt;br /&gt;
   Enter &amp;quot;.help&amp;quot; for instructions&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
   estate_groups    estate_users     migrations       regionban&lt;br /&gt;
   estate_managers  estateban        primitems        regionsettings&lt;br /&gt;
   estate_map       land             prims            terrain&lt;br /&gt;
   estate_settings  landaccesslist   primshapes&lt;br /&gt;
 sqlite&amp;gt; .schema estateban&lt;br /&gt;
   CREATE TABLE estateban (&lt;br /&gt;
      EstateID int(10) NOT NULL,&lt;br /&gt;
      bannedUUID varchar(36) NOT NULL,&lt;br /&gt;
      bannedIp varchar(16) NOT NULL,&lt;br /&gt;
      bannedIpHostMask varchar(16) NOT NULL,&lt;br /&gt;
      bannedNameMask varchar(64) default NULL&lt;br /&gt;
   );&lt;br /&gt;
   CREATE INDEX estate_ban_estate_id on estateban(EstateID);&lt;br /&gt;
 sqlite&amp;gt; select EstateID, EstateName from estate_settings;&lt;br /&gt;
   100|My Estate&lt;br /&gt;
   101|My Estate&lt;br /&gt;
   102|My Estate&lt;br /&gt;
   103|My Estate&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (100, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (101, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (102, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; insert into estateban values (103, 'c3c9ecbf-bfb3-43eb-8dce-140afad7995f', 'problematic.domain.org', ' ', ' ');&lt;br /&gt;
 sqlite&amp;gt; select * from estateban;&lt;br /&gt;
   100|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   101|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   102|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
   103|c3c9ecbf-bfb3-43eb-8dce-140afad7995f|mecatreco.game-host.org||&lt;br /&gt;
 sqlite&amp;gt; .quit&lt;br /&gt;
&lt;br /&gt;
Once this data is entered you need to restart OpenSim, so that it gets loaded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Public Hypergrid Nodes ==&lt;br /&gt;
&lt;br /&gt;
Please see [[Public Hypergrid Nodes]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hypergrid Lists ==&lt;br /&gt;
Please see [[Hypergrid Lists]].&lt;br /&gt;
&lt;br /&gt;
== Manuals and Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* '''Unofficial Hypernauta's Basic Manual''': If you are a real beginner it can be for you. Talking about &amp;quot;personal&amp;quot; worlds created using domestic computers. [http://www.dmu.com/opensime LINK]&lt;br /&gt;
&lt;br /&gt;
== Development Meetings ==&lt;br /&gt;
&lt;br /&gt;
[[Hypergrid Meetings]]&lt;br /&gt;
[[Category:Hypergrid]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:Hypergrid</id>
		<title>Category:Hypergrid</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:Hypergrid"/>
				<updated>2009-02-13T18:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: Everything Hypergrid related!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Everything Hypergrid related!&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T17:05:33Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Basic Usage of Freeview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
== Creating a Media Screen in OpenSim ==&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
=== General Steps ===&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
=== Tips for Using Freeview ===&lt;br /&gt;
Need some info here.&lt;br /&gt;
&lt;br /&gt;
=== Freeview Code ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//XEngine:&lt;br /&gt;
//FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo&lt;br /&gt;
//Multifunctional Picture viewer and Video control script with webguide support&lt;br /&gt;
//This script is distributed for free and must stay that way. &lt;br /&gt;
&lt;br /&gt;
//              *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. ***&lt;br /&gt;
&lt;br /&gt;
//Help for using this script can be obtained at: http://www.slguide.com/help&lt;br /&gt;
&lt;br /&gt;
//Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom.&lt;br /&gt;
 &lt;br /&gt;
//Whats new:&lt;br /&gt;
//- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display&lt;br /&gt;
//- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init.&lt;br /&gt;
//- Renamed WebGuide to TV-Guide to reflect what this thing does better.&lt;br /&gt;
//- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes.&lt;br /&gt;
//- Additional minor help-tips and code improvements&lt;br /&gt;
&lt;br /&gt;
//Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
integer PICTURE_ROTATION_TIMER = 60;   //In whole seconds&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed&lt;br /&gt;
&lt;br /&gt;
key VIDEO_DEFAULT = &amp;quot;71b8ff26-087d-5f44-285b-d38df2e11a81&amp;quot;;  //Test pattern - Used as default video texture when one is missing in parcel media&lt;br /&gt;
key BLANK = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; //Blank texture - Used when there are no textures to display in Picture mode&lt;br /&gt;
string NOTECARD = &amp;quot;bookmarks&amp;quot;;  //Used to host URL bookmarks for video streams&lt;br /&gt;
&lt;br /&gt;
integer VIDEO_BRIGHT = TRUE;    //FULL_BRIGHT status for Video&lt;br /&gt;
integer PICTURE_BRIGHT = TRUE;  //FULL_BRIGHT status for Picture&lt;br /&gt;
&lt;br /&gt;
integer REMOTE_CHANNEL = 9238742;&lt;br /&gt;
&lt;br /&gt;
integer mode = 0;           //Freeview mode.&lt;br /&gt;
                            //Mode 0 - Power off&lt;br /&gt;
                            //Mode 1 - Picture viewer&lt;br /&gt;
                            //Mode 2 - Video&lt;br /&gt;
&lt;br /&gt;
integer listenHandle = -1;      //Dialog menu listen handler&lt;br /&gt;
integer listenUrl = -1;         //listen handler for channel 1 for when a URL is being added&lt;br /&gt;
integer listenTimer = -1;       //Timer variable for removing all listeners after 2 minutes of listener inactivity&lt;br /&gt;
integer listenRemote = -1;      //listen handler for the remote during initial setup&lt;br /&gt;
integer encryption = 0;&lt;br /&gt;
integer numberofnotecardlines = 0;  //Stores the current number of detected notecard lines.&lt;br /&gt;
integer notecardline = 0;       //Current notecard line&lt;br /&gt;
&lt;br /&gt;
integer loop_image = FALSE;     //Are we looping pictures with a timer? (picture mode)&lt;br /&gt;
integer current_texture = 0;    //Current texture number in inventory being displayed (picture mode)&lt;br /&gt;
integer chan;                   //llDialog listen channel&lt;br /&gt;
integer notecardcheck = 0;&lt;br /&gt;
key video_texture;              //Currently used video display texture for parcel media stream&lt;br /&gt;
&lt;br /&gt;
string moviename;&lt;br /&gt;
string tempmoviename;&lt;br /&gt;
key notecardkey = NULL_KEY;&lt;br /&gt;
key tempuser;                   //Temp key storge variable&lt;br /&gt;
string tempurl;                 //Temp string storge variable&lt;br /&gt;
&lt;br /&gt;
integer isGroup = TRUE;&lt;br /&gt;
key groupcheck = NULL_KEY;&lt;br /&gt;
key last_owner;&lt;br /&gt;
key XML_channel;&lt;br /&gt;
&lt;br /&gt;
pictures()      //Change mode to Picture Viewer&lt;br /&gt;
{&lt;br /&gt;
    //Initilize variables&lt;br /&gt;
    &lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, PICTURE_BRIGHT]);&lt;br /&gt;
&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
     &lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else    &lt;br /&gt;
        if(current_texture &amp;gt; check)&lt;br /&gt;
            //Set to first texture if available&lt;br /&gt;
            current_texture = 0;&lt;br /&gt;
            &lt;br /&gt;
    display_texture(current_texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
video()         //Change mode to Video&lt;br /&gt;
{&lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, VIDEO_BRIGHT, PRIM_TEXTURE, DISPLAY_ON_SIDE, &amp;quot;62dc73ca-265f-7ca0-0453-e2a6aa60bb6f&amp;quot;, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
    &lt;br /&gt;
    report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Stopped&amp;quot;);&lt;br /&gt;
    if(finditem(NOTECARD) != -1)&lt;br /&gt;
        tempuser = llGetNumberOfNotecardLines(NOTECARD);&lt;br /&gt;
    video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]),0);&lt;br /&gt;
    if(video_texture == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        video_texture = VIDEO_DEFAULT;&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE,VIDEO_DEFAULT]);&lt;br /&gt;
        llSay(0,&amp;quot;No parcel media texture found. Setting texture to default: &amp;quot;+(string)VIDEO_DEFAULT);&lt;br /&gt;
        if(llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetTexture(video_texture,DISPLAY_ON_SIDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    report(&amp;quot;Click to power on.&amp;quot;);&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_LOW, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;0.1,0.1,0.1&amp;gt;, 1.0,PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, FALSE, PRIM_TEXTURE, DISPLAY_ON_SIDE, BLANK, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer finditem(string name)   //Finds and returns an item's inventory number&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetInventoryNumber(INVENTORY_NOTECARD);i++)&lt;br /&gt;
        if(llGetInventoryName(INVENTORY_NOTECARD,i) == NOTECARD)&lt;br /&gt;
            return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
seturl(string url, key id)  //Set parcel media URL&lt;br /&gt;
{&lt;br /&gt;
    if(mode != 2)&lt;br /&gt;
    {&lt;br /&gt;
        video();&lt;br /&gt;
        mode = 2;&lt;br /&gt;
    }&lt;br /&gt;
    moviename = tempmoviename;&lt;br /&gt;
    if(moviename)&lt;br /&gt;
        moviename = &amp;quot; [&amp;quot;+moviename+&amp;quot;]&amp;quot;;&lt;br /&gt;
    tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
    string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0);&lt;br /&gt;
    if(oldurl != &amp;quot;&amp;quot;)&lt;br /&gt;
        llOwnerSay(&amp;quot;Setting new media URL. The old URL was: &amp;quot;+oldurl);&lt;br /&gt;
&lt;br /&gt;
    llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);&lt;br /&gt;
    if(id!=NULL_KEY)&lt;br /&gt;
        menu(id);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Playing&amp;quot;);&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
    if(isGroup)&lt;br /&gt;
        llSay(0,&amp;quot;New media URL set.&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;New media URL set: &amp;quot;+url);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string mediatype(string ext)    //Returns a string stating the filetype of a file based on file extension&lt;br /&gt;
{&lt;br /&gt;
    ext = llToLower(ext);&lt;br /&gt;
    if(ext == &amp;quot;swf&amp;quot;)&lt;br /&gt;
        return &amp;quot;Flash&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mov&amp;quot; || ext == &amp;quot;avi&amp;quot; || ext == &amp;quot;mpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;smil&amp;quot;)&lt;br /&gt;
        return &amp;quot;Video&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;jpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;gif&amp;quot; || ext == &amp;quot;png&amp;quot; || ext == &amp;quot;pict&amp;quot; || ext == &amp;quot;tga&amp;quot; || ext == &amp;quot;tiff&amp;quot; || ext == &amp;quot;sgi&amp;quot; || ext == &amp;quot;bmp&amp;quot;)&lt;br /&gt;
        return &amp;quot;Image&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;txt&amp;quot;)&lt;br /&gt;
        return &amp;quot;Text&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mp3&amp;quot; || ext == &amp;quot;wav&amp;quot;)&lt;br /&gt;
        return &amp;quot;Audio&amp;quot;;&lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
browse(key id)      //Image browser function for picture viewer mode&lt;br /&gt;
{&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    string header;&lt;br /&gt;
    if(check &amp;gt; 0)&lt;br /&gt;
        header = &amp;quot;(&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;) &amp;quot;+llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    else&lt;br /&gt;
        header = &amp;quot;No pictures found.&amp;quot;;&lt;br /&gt;
    llDialog(id,&amp;quot;** Monitor Control **\n Picture Viewer mode\n- Image browser\n- &amp;quot;+header,[&amp;quot;Back&amp;quot;,&amp;quot;Next&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    extendtimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
report(string str)&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectDesc(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extendtimer()       //Add another 2 minute to the Listen Removal timer (use when a Listen event is triggered)&lt;br /&gt;
{&lt;br /&gt;
    if(listenHandle == -1)&lt;br /&gt;
        listenHandle = llListen(chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    listenTimer = (integer)llGetTime() + 120;&lt;br /&gt;
    if(loop_image == FALSE)&lt;br /&gt;
        llSetTimerEvent(45);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
config(key id)      //Configuration menu&lt;br /&gt;
{&lt;br /&gt;
    extendtimer();&lt;br /&gt;
    llDialog(id,&amp;quot;Current media URL:\n&amp;quot;+llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0)+&amp;quot;\nTip: If the picture is abit off, try 'Align ON'&amp;quot;,[&amp;quot;Set URL&amp;quot;,&amp;quot;Align ON&amp;quot;,&amp;quot;Align OFF&amp;quot;,&amp;quot;Menu&amp;quot;,&amp;quot;Set Remote&amp;quot;],chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tell_remote(string str)&lt;br /&gt;
{&lt;br /&gt;
    llShout(REMOTE_CHANNEL,llXorBase64Strings(llStringToBase64((string)encryption + str), llStringToBase64((string)encryption)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu(key id)        //Dialog menus for all 3 modes&lt;br /&gt;
{&lt;br /&gt;
    list buttons = [];&lt;br /&gt;
    string title = &amp;quot;** Monitor control **&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    extendtimer();&lt;br /&gt;
&lt;br /&gt;
    if(mode != 0)&lt;br /&gt;
    {&lt;br /&gt;
        if(mode == 1)       //Pictures menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n  Picture Viewer mode&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Browse&amp;quot;];&lt;br /&gt;
            if(loop_image == FALSE)&lt;br /&gt;
                buttons+=[&amp;quot;Loop&amp;quot;];&lt;br /&gt;
            else&lt;br /&gt;
                buttons+=[&amp;quot;Unloop&amp;quot;];&lt;br /&gt;
            buttons+=[&amp;quot;Video&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Fix scale&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        else                //Video menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n Video display mode\n&amp;quot;+moviename+&amp;quot;\nTip:\nClick 'TV Guide' to view the Online bookmarks.&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Pictures&amp;quot;,&amp;quot;Configure&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Loop&amp;quot;,&amp;quot;Unload&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Stop&amp;quot;,&amp;quot;Pause&amp;quot;,&amp;quot;TV Guide&amp;quot;,&amp;quot;Bookmarks&amp;quot;,&amp;quot;Set URL&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        buttons += [&amp;quot;Pictures&amp;quot;,&amp;quot;Video&amp;quot;,&amp;quot;Help&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id,title,buttons,chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
display_texture(integer check)  //Display texture and set name in description (picture mode)&lt;br /&gt;
{                               //&amp;quot;Check&amp;quot; holds the number of textures in contents. The function uses &amp;quot;current_texture&amp;quot; to display.&lt;br /&gt;
    string name = llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    llSetTexture(name,DISPLAY_ON_SIDE);&lt;br /&gt;
    report(&amp;quot;Showing picture: &amp;quot;+name+&amp;quot; (&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
next()  //Change to next texture (picture mode)&lt;br /&gt;
{       //This function is used twice - by the menu and timer. Therefor, it is a dedicated function.&lt;br /&gt;
    current_texture++;&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if(check == current_texture)&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
    &lt;br /&gt;
    display_texture(check);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        chan = (integer)llFrand(1000) + 1000;   //Pick a random listen channel for the listener&lt;br /&gt;
        if(PICTURE_ROTATION_TIMER &amp;lt;= 0)         //Ensure the value is no less or equal 0&lt;br /&gt;
            PICTURE_ROTATION_TIMER = 1;&lt;br /&gt;
        llListenRemove(listenHandle);&lt;br /&gt;
        listenHandle = -1;&lt;br /&gt;
        last_owner = llGetOwner();&lt;br /&gt;
        groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
        off();&lt;br /&gt;
        llOpenRemoteDataChannel();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
        //Listen only to owner or group member. Edit this code to change access controls.&lt;br /&gt;
        if(llDetectedKey(0) != llGetOwner() &amp;amp;&amp;amp; llDetectedGroup(0) == FALSE)&lt;br /&gt;
            return;&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        if(llGetOwnerKey(llGetKey()) != last_owner)  //Sense if object has been deeded to group for Web Guide function&lt;br /&gt;
        {&lt;br /&gt;
            isGroup = TRUE;&lt;br /&gt;
            last_owner = llGetOwner();&lt;br /&gt;
            groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
            &lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Detected change in ownership. Attempting to obtain current parcel media texture...&amp;quot;);&lt;br /&gt;
                video();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        menu(llDetectedKey(0));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change == CHANGED_INVENTORY) //If inventory change&lt;br /&gt;
            if(mode == 1)   //If picture mode&lt;br /&gt;
            {&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    display_texture(check);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                if(mode == 2)   //If video mode&lt;br /&gt;
                    if(finditem(NOTECARD) != -1)    //And bookmarks notecard present&lt;br /&gt;
                        if(notecardkey != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                            tempuser = llGetNumberOfNotecardLines(NOTECARD);    //Reload number of lines&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(message == &amp;quot;Pictures&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
            pictures();&lt;br /&gt;
            mode = 1;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Video&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            video();&lt;br /&gt;
            mode = 2;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Power off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
            off();&lt;br /&gt;
            mode = 0;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Help&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Help documentation is available at: http://www.slguide.com/help&amp;quot;);&lt;br /&gt;
            if(isGroup)&lt;br /&gt;
            {&lt;br /&gt;
                if(id == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(0,&amp;quot;FreeView cannot load help pages while set to group without the remote.&amp;quot;);&lt;br /&gt;
                    llSay(0,&amp;quot;For further assistance, please consult: http://slguide.com/help&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    tell_remote(&amp;quot;HELP&amp;quot;+(string)id+(string)XML_channel);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llLoadURL(id,&amp;quot;Help pages for FreeView&amp;quot;,&amp;quot;http://www.slguide.com?c=&amp;quot;+(string)XML_channel+&amp;quot;&amp;amp;help=1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 1)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Browse&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                next();&lt;br /&gt;
                browse(id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Back&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                current_texture--;&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(current_texture &amp;lt; 0)&lt;br /&gt;
                    current_texture = check - 1;&lt;br /&gt;
                &lt;br /&gt;
                display_texture(check);&lt;br /&gt;
                &lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(PICTURE_ROTATION_TIMER);&lt;br /&gt;
                loop_image = TRUE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture will change every &amp;quot;+(string)PICTURE_ROTATION_TIMER+&amp;quot; seconds.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unloop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture loop disabled.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Fix scale&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Setting display texture to 1,1 repeats and 0,0 offset.&amp;quot;);&lt;br /&gt;
                llScaleTexture(1, 1, DISPLAY_ON_SIDE);&lt;br /&gt;
                llOffsetTexture(0, 0, DISPLAY_ON_SIDE);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 2)&lt;br /&gt;
        {&lt;br /&gt;
            if(channel == REMOTE_CHANNEL)&lt;br /&gt;
            {&lt;br /&gt;
                if(encryption == 0)&lt;br /&gt;
                    encryption = (integer)message;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = -1;&lt;br /&gt;
                llSay(0,&amp;quot;Remote configured (&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
                &lt;br /&gt;
            if(message == &amp;quot;TV Guide&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(isGroup)&lt;br /&gt;
                {&lt;br /&gt;
                    if(!encryption)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSay(0,&amp;quot;** Error - This FreeView object has been deeded to group. You must use a Remote control to open the TV Guide.&amp;quot;);&lt;br /&gt;
                        llSay(0,&amp;quot;You can set up the remote control from the Video -&amp;gt; Configuration menu. Please refer to the notecard for further assistance.&amp;quot;);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    tell_remote((string)id+(string)XML_channel+(string)llGetOwner());&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llLoadURL(id, &amp;quot;Come to the Guide to Start Your Viewer Playing!&amp;quot;, &amp;quot;http://slguide.com/index.php?v=&amp;quot; + (string)llGetKey() + &amp;quot;&amp;amp;c=&amp;quot; + (string)XML_channel + &amp;quot;&amp;amp;o=&amp;quot; + (string)llGetOwner() + &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            string header = &amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: &amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(message == &amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline--;&lt;br /&gt;
                if(notecardline &amp;lt; 0)&lt;br /&gt;
                    notecardline = numberofnotecardlines - 1;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next &amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline++;&lt;br /&gt;
                if(notecardline &amp;gt;= numberofnotecardlines)&lt;br /&gt;
                    notecardline = 0;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Use&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(tempurl == &amp;quot;** No URL specified! **&amp;quot;)&lt;br /&gt;
                    tempurl = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(tempurl,id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
                    &lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Configure&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                config(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Bookmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(notecardcheck != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No valid bookmark data found in notecard '&amp;quot;+NOTECARD+&amp;quot;'.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(finditem(NOTECARD) != -1)                &lt;br /&gt;
                {&lt;br /&gt;
                    tempuser = id;&lt;br /&gt;
                    if(numberofnotecardlines &amp;lt; notecardline)&lt;br /&gt;
                        notecardline = 0;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No notecard named &amp;quot;+NOTECARD+&amp;quot; found in contents.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(llGetLandOwnerAt(llGetPos()) != llGetOwner())    //If we do not have permissions to actually do the following functions&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return; //Abort&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(listenUrl != -1 &amp;amp;&amp;amp; channel == 1) //Incoming data from &amp;quot;Set URL&amp;quot; command (user spoke on channel 1)&lt;br /&gt;
            {&lt;br /&gt;
                llListenRemove(listenUrl);&lt;br /&gt;
                listenUrl = -1;&lt;br /&gt;
                tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(message,id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Play&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Playing&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Stop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Pause&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Paused&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unload&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            //URL , Auto-Scale, &lt;br /&gt;
            if(message == &amp;quot;Set URL&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                listenUrl = llListen(1,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id,&amp;quot;Please type the URL of your choice with /1 in thebegining. For example, /1 www.google.com&amp;quot;,[&amp;quot;Ok&amp;quot;],938);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,FALSE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Set Remote&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Configuring remote...&amp;quot;);&lt;br /&gt;
                encryption = 0;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = llListen(REMOTE_CHANNEL,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
                llSay(REMOTE_CHANNEL,&amp;quot;SETUP&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(queryid == groupcheck)       //Test if object is deeded to group&lt;br /&gt;
        {&lt;br /&gt;
            groupcheck = NULL_KEY;&lt;br /&gt;
            isGroup = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(queryid == tempuser) //If just checking number of notecard lines&lt;br /&gt;
        {&lt;br /&gt;
            numberofnotecardlines = (integer)data;&lt;br /&gt;
            notecardkey = llGetInventoryKey(NOTECARD);&lt;br /&gt;
            notecardcheck = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(notecardcheck != -1)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(data == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck++;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck = -1;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(data == &amp;quot;&amp;quot; &amp;amp;&amp;amp; notecardline &amp;lt; numberofnotecardlines)    //If user just pressed &amp;quot;enter&amp;quot; in bookmarks, skip&lt;br /&gt;
        {&lt;br /&gt;
            notecardline++;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(data == EOF)&lt;br /&gt;
        {&lt;br /&gt;
            notecardline = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list parsed = llParseString2List(data,[&amp;quot;|&amp;quot;,&amp;quot;| &amp;quot;,&amp;quot; |&amp;quot;,&amp;quot; | &amp;quot;],[]);    //Ensure no blank spaces before &amp;quot;http://&amp;quot;.&lt;br /&gt;
        string name = llList2String(parsed,0);&lt;br /&gt;
        tempurl = llList2String(parsed,1);&lt;br /&gt;
        if(tempurl == &amp;quot;&amp;quot;)&lt;br /&gt;
            tempurl = &amp;quot;** No URL specified! **&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
        tempmoviename = name;&lt;br /&gt;
                &lt;br /&gt;
        llDialog(tempuser,&amp;quot;Bookmarks notecard (&amp;quot;+(string)(notecardline+1)+&amp;quot;/&amp;quot;+(string)numberofnotecardlines+&amp;quot;)\n&amp;quot;+name+&amp;quot; (&amp;quot;+mediatype(llList2String(llParseString2List(tempurl,[&amp;quot;.&amp;quot;],[]),-1))+&amp;quot;)\n&amp;quot;+tempurl,[&amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;,&amp;quot;Use&amp;quot;,&amp;quot;Next &amp;gt;&amp;gt;&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval)&lt;br /&gt;
    {&lt;br /&gt;
        if (type == REMOTE_DATA_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            XML_channel = channel;&lt;br /&gt;
        } &lt;br /&gt;
        else if(type == REMOTE_DATA_REQUEST)&lt;br /&gt;
        {&lt;br /&gt;
            list media_info = llParseString2List(sval, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            tempmoviename = llList2String(media_info,0);&lt;br /&gt;
            seturl(llList2String(media_info,1),NULL_KEY);&lt;br /&gt;
            llRemoteDataReply(channel, message_id, sval, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime() &amp;gt; listenTimer)       //If listener time expired...&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listenHandle);   //Remove listeneres.&lt;br /&gt;
            llListenRemove(listenUrl);&lt;br /&gt;
            llListenRemove(listenRemote);&lt;br /&gt;
            listenHandle = -1;&lt;br /&gt;
            listenUrl = -1;&lt;br /&gt;
            listenRemote = -1;&lt;br /&gt;
            listenTimer = -1;&lt;br /&gt;
            if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all&lt;br /&gt;
                llSetTimerEvent(0.0);   //Remove timer&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(loop_image == TRUE &amp;amp;&amp;amp; mode == 1) //If we're looping pictures and and we're in picture mode...&lt;br /&gt;
            next(); //Next picture&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Additional Information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T04:37:36Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* General Steps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
== Creating a Media Screen in OpenSim ==&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
=== General Steps ===&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
=== Basic Usage of Freeview ===&lt;br /&gt;
Need some info here.&lt;br /&gt;
&lt;br /&gt;
=== Freeview Code ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//XEngine:&lt;br /&gt;
//FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo&lt;br /&gt;
//Multifunctional Picture viewer and Video control script with webguide support&lt;br /&gt;
//This script is distributed for free and must stay that way. &lt;br /&gt;
&lt;br /&gt;
//              *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. ***&lt;br /&gt;
&lt;br /&gt;
//Help for using this script can be obtained at: http://www.slguide.com/help&lt;br /&gt;
&lt;br /&gt;
//Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom.&lt;br /&gt;
 &lt;br /&gt;
//Whats new:&lt;br /&gt;
//- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display&lt;br /&gt;
//- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init.&lt;br /&gt;
//- Renamed WebGuide to TV-Guide to reflect what this thing does better.&lt;br /&gt;
//- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes.&lt;br /&gt;
//- Additional minor help-tips and code improvements&lt;br /&gt;
&lt;br /&gt;
//Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
integer PICTURE_ROTATION_TIMER = 60;   //In whole seconds&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed&lt;br /&gt;
&lt;br /&gt;
key VIDEO_DEFAULT = &amp;quot;71b8ff26-087d-5f44-285b-d38df2e11a81&amp;quot;;  //Test pattern - Used as default video texture when one is missing in parcel media&lt;br /&gt;
key BLANK = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; //Blank texture - Used when there are no textures to display in Picture mode&lt;br /&gt;
string NOTECARD = &amp;quot;bookmarks&amp;quot;;  //Used to host URL bookmarks for video streams&lt;br /&gt;
&lt;br /&gt;
integer VIDEO_BRIGHT = TRUE;    //FULL_BRIGHT status for Video&lt;br /&gt;
integer PICTURE_BRIGHT = TRUE;  //FULL_BRIGHT status for Picture&lt;br /&gt;
&lt;br /&gt;
integer REMOTE_CHANNEL = 9238742;&lt;br /&gt;
&lt;br /&gt;
integer mode = 0;           //Freeview mode.&lt;br /&gt;
                            //Mode 0 - Power off&lt;br /&gt;
                            //Mode 1 - Picture viewer&lt;br /&gt;
                            //Mode 2 - Video&lt;br /&gt;
&lt;br /&gt;
integer listenHandle = -1;      //Dialog menu listen handler&lt;br /&gt;
integer listenUrl = -1;         //listen handler for channel 1 for when a URL is being added&lt;br /&gt;
integer listenTimer = -1;       //Timer variable for removing all listeners after 2 minutes of listener inactivity&lt;br /&gt;
integer listenRemote = -1;      //listen handler for the remote during initial setup&lt;br /&gt;
integer encryption = 0;&lt;br /&gt;
integer numberofnotecardlines = 0;  //Stores the current number of detected notecard lines.&lt;br /&gt;
integer notecardline = 0;       //Current notecard line&lt;br /&gt;
&lt;br /&gt;
integer loop_image = FALSE;     //Are we looping pictures with a timer? (picture mode)&lt;br /&gt;
integer current_texture = 0;    //Current texture number in inventory being displayed (picture mode)&lt;br /&gt;
integer chan;                   //llDialog listen channel&lt;br /&gt;
integer notecardcheck = 0;&lt;br /&gt;
key video_texture;              //Currently used video display texture for parcel media stream&lt;br /&gt;
&lt;br /&gt;
string moviename;&lt;br /&gt;
string tempmoviename;&lt;br /&gt;
key notecardkey = NULL_KEY;&lt;br /&gt;
key tempuser;                   //Temp key storge variable&lt;br /&gt;
string tempurl;                 //Temp string storge variable&lt;br /&gt;
&lt;br /&gt;
integer isGroup = TRUE;&lt;br /&gt;
key groupcheck = NULL_KEY;&lt;br /&gt;
key last_owner;&lt;br /&gt;
key XML_channel;&lt;br /&gt;
&lt;br /&gt;
pictures()      //Change mode to Picture Viewer&lt;br /&gt;
{&lt;br /&gt;
    //Initilize variables&lt;br /&gt;
    &lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, PICTURE_BRIGHT]);&lt;br /&gt;
&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
     &lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else    &lt;br /&gt;
        if(current_texture &amp;gt; check)&lt;br /&gt;
            //Set to first texture if available&lt;br /&gt;
            current_texture = 0;&lt;br /&gt;
            &lt;br /&gt;
    display_texture(current_texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
video()         //Change mode to Video&lt;br /&gt;
{&lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, VIDEO_BRIGHT, PRIM_TEXTURE, DISPLAY_ON_SIDE, &amp;quot;62dc73ca-265f-7ca0-0453-e2a6aa60bb6f&amp;quot;, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
    &lt;br /&gt;
    report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Stopped&amp;quot;);&lt;br /&gt;
    if(finditem(NOTECARD) != -1)&lt;br /&gt;
        tempuser = llGetNumberOfNotecardLines(NOTECARD);&lt;br /&gt;
    video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]),0);&lt;br /&gt;
    if(video_texture == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        video_texture = VIDEO_DEFAULT;&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE,VIDEO_DEFAULT]);&lt;br /&gt;
        llSay(0,&amp;quot;No parcel media texture found. Setting texture to default: &amp;quot;+(string)VIDEO_DEFAULT);&lt;br /&gt;
        if(llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetTexture(video_texture,DISPLAY_ON_SIDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    report(&amp;quot;Click to power on.&amp;quot;);&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_LOW, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;0.1,0.1,0.1&amp;gt;, 1.0,PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, FALSE, PRIM_TEXTURE, DISPLAY_ON_SIDE, BLANK, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer finditem(string name)   //Finds and returns an item's inventory number&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetInventoryNumber(INVENTORY_NOTECARD);i++)&lt;br /&gt;
        if(llGetInventoryName(INVENTORY_NOTECARD,i) == NOTECARD)&lt;br /&gt;
            return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
seturl(string url, key id)  //Set parcel media URL&lt;br /&gt;
{&lt;br /&gt;
    if(mode != 2)&lt;br /&gt;
    {&lt;br /&gt;
        video();&lt;br /&gt;
        mode = 2;&lt;br /&gt;
    }&lt;br /&gt;
    moviename = tempmoviename;&lt;br /&gt;
    if(moviename)&lt;br /&gt;
        moviename = &amp;quot; [&amp;quot;+moviename+&amp;quot;]&amp;quot;;&lt;br /&gt;
    tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
    string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0);&lt;br /&gt;
    if(oldurl != &amp;quot;&amp;quot;)&lt;br /&gt;
        llOwnerSay(&amp;quot;Setting new media URL. The old URL was: &amp;quot;+oldurl);&lt;br /&gt;
&lt;br /&gt;
    llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);&lt;br /&gt;
    if(id!=NULL_KEY)&lt;br /&gt;
        menu(id);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Playing&amp;quot;);&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
    if(isGroup)&lt;br /&gt;
        llSay(0,&amp;quot;New media URL set.&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;New media URL set: &amp;quot;+url);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string mediatype(string ext)    //Returns a string stating the filetype of a file based on file extension&lt;br /&gt;
{&lt;br /&gt;
    ext = llToLower(ext);&lt;br /&gt;
    if(ext == &amp;quot;swf&amp;quot;)&lt;br /&gt;
        return &amp;quot;Flash&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mov&amp;quot; || ext == &amp;quot;avi&amp;quot; || ext == &amp;quot;mpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;smil&amp;quot;)&lt;br /&gt;
        return &amp;quot;Video&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;jpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;gif&amp;quot; || ext == &amp;quot;png&amp;quot; || ext == &amp;quot;pict&amp;quot; || ext == &amp;quot;tga&amp;quot; || ext == &amp;quot;tiff&amp;quot; || ext == &amp;quot;sgi&amp;quot; || ext == &amp;quot;bmp&amp;quot;)&lt;br /&gt;
        return &amp;quot;Image&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;txt&amp;quot;)&lt;br /&gt;
        return &amp;quot;Text&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mp3&amp;quot; || ext == &amp;quot;wav&amp;quot;)&lt;br /&gt;
        return &amp;quot;Audio&amp;quot;;&lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
browse(key id)      //Image browser function for picture viewer mode&lt;br /&gt;
{&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    string header;&lt;br /&gt;
    if(check &amp;gt; 0)&lt;br /&gt;
        header = &amp;quot;(&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;) &amp;quot;+llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    else&lt;br /&gt;
        header = &amp;quot;No pictures found.&amp;quot;;&lt;br /&gt;
    llDialog(id,&amp;quot;** Monitor Control **\n Picture Viewer mode\n- Image browser\n- &amp;quot;+header,[&amp;quot;Back&amp;quot;,&amp;quot;Next&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    extendtimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
report(string str)&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectDesc(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extendtimer()       //Add another 2 minute to the Listen Removal timer (use when a Listen event is triggered)&lt;br /&gt;
{&lt;br /&gt;
    if(listenHandle == -1)&lt;br /&gt;
        listenHandle = llListen(chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    listenTimer = (integer)llGetTime() + 120;&lt;br /&gt;
    if(loop_image == FALSE)&lt;br /&gt;
        llSetTimerEvent(45);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
config(key id)      //Configuration menu&lt;br /&gt;
{&lt;br /&gt;
    extendtimer();&lt;br /&gt;
    llDialog(id,&amp;quot;Current media URL:\n&amp;quot;+llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0)+&amp;quot;\nTip: If the picture is abit off, try 'Align ON'&amp;quot;,[&amp;quot;Set URL&amp;quot;,&amp;quot;Align ON&amp;quot;,&amp;quot;Align OFF&amp;quot;,&amp;quot;Menu&amp;quot;,&amp;quot;Set Remote&amp;quot;],chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tell_remote(string str)&lt;br /&gt;
{&lt;br /&gt;
    llShout(REMOTE_CHANNEL,llXorBase64Strings(llStringToBase64((string)encryption + str), llStringToBase64((string)encryption)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu(key id)        //Dialog menus for all 3 modes&lt;br /&gt;
{&lt;br /&gt;
    list buttons = [];&lt;br /&gt;
    string title = &amp;quot;** Monitor control **&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    extendtimer();&lt;br /&gt;
&lt;br /&gt;
    if(mode != 0)&lt;br /&gt;
    {&lt;br /&gt;
        if(mode == 1)       //Pictures menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n  Picture Viewer mode&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Browse&amp;quot;];&lt;br /&gt;
            if(loop_image == FALSE)&lt;br /&gt;
                buttons+=[&amp;quot;Loop&amp;quot;];&lt;br /&gt;
            else&lt;br /&gt;
                buttons+=[&amp;quot;Unloop&amp;quot;];&lt;br /&gt;
            buttons+=[&amp;quot;Video&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Fix scale&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        else                //Video menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n Video display mode\n&amp;quot;+moviename+&amp;quot;\nTip:\nClick 'TV Guide' to view the Online bookmarks.&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Pictures&amp;quot;,&amp;quot;Configure&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Loop&amp;quot;,&amp;quot;Unload&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Stop&amp;quot;,&amp;quot;Pause&amp;quot;,&amp;quot;TV Guide&amp;quot;,&amp;quot;Bookmarks&amp;quot;,&amp;quot;Set URL&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        buttons += [&amp;quot;Pictures&amp;quot;,&amp;quot;Video&amp;quot;,&amp;quot;Help&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id,title,buttons,chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
display_texture(integer check)  //Display texture and set name in description (picture mode)&lt;br /&gt;
{                               //&amp;quot;Check&amp;quot; holds the number of textures in contents. The function uses &amp;quot;current_texture&amp;quot; to display.&lt;br /&gt;
    string name = llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    llSetTexture(name,DISPLAY_ON_SIDE);&lt;br /&gt;
    report(&amp;quot;Showing picture: &amp;quot;+name+&amp;quot; (&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
next()  //Change to next texture (picture mode)&lt;br /&gt;
{       //This function is used twice - by the menu and timer. Therefor, it is a dedicated function.&lt;br /&gt;
    current_texture++;&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if(check == current_texture)&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
    &lt;br /&gt;
    display_texture(check);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        chan = (integer)llFrand(1000) + 1000;   //Pick a random listen channel for the listener&lt;br /&gt;
        if(PICTURE_ROTATION_TIMER &amp;lt;= 0)         //Ensure the value is no less or equal 0&lt;br /&gt;
            PICTURE_ROTATION_TIMER = 1;&lt;br /&gt;
        llListenRemove(listenHandle);&lt;br /&gt;
        listenHandle = -1;&lt;br /&gt;
        last_owner = llGetOwner();&lt;br /&gt;
        groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
        off();&lt;br /&gt;
        llOpenRemoteDataChannel();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
        //Listen only to owner or group member. Edit this code to change access controls.&lt;br /&gt;
        if(llDetectedKey(0) != llGetOwner() &amp;amp;&amp;amp; llDetectedGroup(0) == FALSE)&lt;br /&gt;
            return;&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        if(llGetOwnerKey(llGetKey()) != last_owner)  //Sense if object has been deeded to group for Web Guide function&lt;br /&gt;
        {&lt;br /&gt;
            isGroup = TRUE;&lt;br /&gt;
            last_owner = llGetOwner();&lt;br /&gt;
            groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
            &lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Detected change in ownership. Attempting to obtain current parcel media texture...&amp;quot;);&lt;br /&gt;
                video();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        menu(llDetectedKey(0));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change == CHANGED_INVENTORY) //If inventory change&lt;br /&gt;
            if(mode == 1)   //If picture mode&lt;br /&gt;
            {&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    display_texture(check);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                if(mode == 2)   //If video mode&lt;br /&gt;
                    if(finditem(NOTECARD) != -1)    //And bookmarks notecard present&lt;br /&gt;
                        if(notecardkey != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                            tempuser = llGetNumberOfNotecardLines(NOTECARD);    //Reload number of lines&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(message == &amp;quot;Pictures&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
            pictures();&lt;br /&gt;
            mode = 1;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Video&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            video();&lt;br /&gt;
            mode = 2;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Power off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
            off();&lt;br /&gt;
            mode = 0;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Help&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Help documentation is available at: http://www.slguide.com/help&amp;quot;);&lt;br /&gt;
            if(isGroup)&lt;br /&gt;
            {&lt;br /&gt;
                if(id == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(0,&amp;quot;FreeView cannot load help pages while set to group without the remote.&amp;quot;);&lt;br /&gt;
                    llSay(0,&amp;quot;For further assistance, please consult: http://slguide.com/help&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    tell_remote(&amp;quot;HELP&amp;quot;+(string)id+(string)XML_channel);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llLoadURL(id,&amp;quot;Help pages for FreeView&amp;quot;,&amp;quot;http://www.slguide.com?c=&amp;quot;+(string)XML_channel+&amp;quot;&amp;amp;help=1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 1)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Browse&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                next();&lt;br /&gt;
                browse(id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Back&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                current_texture--;&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(current_texture &amp;lt; 0)&lt;br /&gt;
                    current_texture = check - 1;&lt;br /&gt;
                &lt;br /&gt;
                display_texture(check);&lt;br /&gt;
                &lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(PICTURE_ROTATION_TIMER);&lt;br /&gt;
                loop_image = TRUE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture will change every &amp;quot;+(string)PICTURE_ROTATION_TIMER+&amp;quot; seconds.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unloop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture loop disabled.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Fix scale&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Setting display texture to 1,1 repeats and 0,0 offset.&amp;quot;);&lt;br /&gt;
                llScaleTexture(1, 1, DISPLAY_ON_SIDE);&lt;br /&gt;
                llOffsetTexture(0, 0, DISPLAY_ON_SIDE);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 2)&lt;br /&gt;
        {&lt;br /&gt;
            if(channel == REMOTE_CHANNEL)&lt;br /&gt;
            {&lt;br /&gt;
                if(encryption == 0)&lt;br /&gt;
                    encryption = (integer)message;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = -1;&lt;br /&gt;
                llSay(0,&amp;quot;Remote configured (&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
                &lt;br /&gt;
            if(message == &amp;quot;TV Guide&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(isGroup)&lt;br /&gt;
                {&lt;br /&gt;
                    if(!encryption)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSay(0,&amp;quot;** Error - This FreeView object has been deeded to group. You must use a Remote control to open the TV Guide.&amp;quot;);&lt;br /&gt;
                        llSay(0,&amp;quot;You can set up the remote control from the Video -&amp;gt; Configuration menu. Please refer to the notecard for further assistance.&amp;quot;);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    tell_remote((string)id+(string)XML_channel+(string)llGetOwner());&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llLoadURL(id, &amp;quot;Come to the Guide to Start Your Viewer Playing!&amp;quot;, &amp;quot;http://slguide.com/index.php?v=&amp;quot; + (string)llGetKey() + &amp;quot;&amp;amp;c=&amp;quot; + (string)XML_channel + &amp;quot;&amp;amp;o=&amp;quot; + (string)llGetOwner() + &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            string header = &amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: &amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(message == &amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline--;&lt;br /&gt;
                if(notecardline &amp;lt; 0)&lt;br /&gt;
                    notecardline = numberofnotecardlines - 1;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next &amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline++;&lt;br /&gt;
                if(notecardline &amp;gt;= numberofnotecardlines)&lt;br /&gt;
                    notecardline = 0;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Use&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(tempurl == &amp;quot;** No URL specified! **&amp;quot;)&lt;br /&gt;
                    tempurl = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(tempurl,id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
                    &lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Configure&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                config(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Bookmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(notecardcheck != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No valid bookmark data found in notecard '&amp;quot;+NOTECARD+&amp;quot;'.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(finditem(NOTECARD) != -1)                &lt;br /&gt;
                {&lt;br /&gt;
                    tempuser = id;&lt;br /&gt;
                    if(numberofnotecardlines &amp;lt; notecardline)&lt;br /&gt;
                        notecardline = 0;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No notecard named &amp;quot;+NOTECARD+&amp;quot; found in contents.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(llGetLandOwnerAt(llGetPos()) != llGetOwner())    //If we do not have permissions to actually do the following functions&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return; //Abort&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(listenUrl != -1 &amp;amp;&amp;amp; channel == 1) //Incoming data from &amp;quot;Set URL&amp;quot; command (user spoke on channel 1)&lt;br /&gt;
            {&lt;br /&gt;
                llListenRemove(listenUrl);&lt;br /&gt;
                listenUrl = -1;&lt;br /&gt;
                tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(message,id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Play&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Playing&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Stop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Pause&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Paused&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unload&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            //URL , Auto-Scale, &lt;br /&gt;
            if(message == &amp;quot;Set URL&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                listenUrl = llListen(1,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id,&amp;quot;Please type the URL of your choice with /1 in thebegining. For example, /1 www.google.com&amp;quot;,[&amp;quot;Ok&amp;quot;],938);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,FALSE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Set Remote&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Configuring remote...&amp;quot;);&lt;br /&gt;
                encryption = 0;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = llListen(REMOTE_CHANNEL,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
                llSay(REMOTE_CHANNEL,&amp;quot;SETUP&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(queryid == groupcheck)       //Test if object is deeded to group&lt;br /&gt;
        {&lt;br /&gt;
            groupcheck = NULL_KEY;&lt;br /&gt;
            isGroup = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(queryid == tempuser) //If just checking number of notecard lines&lt;br /&gt;
        {&lt;br /&gt;
            numberofnotecardlines = (integer)data;&lt;br /&gt;
            notecardkey = llGetInventoryKey(NOTECARD);&lt;br /&gt;
            notecardcheck = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(notecardcheck != -1)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(data == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck++;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck = -1;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(data == &amp;quot;&amp;quot; &amp;amp;&amp;amp; notecardline &amp;lt; numberofnotecardlines)    //If user just pressed &amp;quot;enter&amp;quot; in bookmarks, skip&lt;br /&gt;
        {&lt;br /&gt;
            notecardline++;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(data == EOF)&lt;br /&gt;
        {&lt;br /&gt;
            notecardline = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list parsed = llParseString2List(data,[&amp;quot;|&amp;quot;,&amp;quot;| &amp;quot;,&amp;quot; |&amp;quot;,&amp;quot; | &amp;quot;],[]);    //Ensure no blank spaces before &amp;quot;http://&amp;quot;.&lt;br /&gt;
        string name = llList2String(parsed,0);&lt;br /&gt;
        tempurl = llList2String(parsed,1);&lt;br /&gt;
        if(tempurl == &amp;quot;&amp;quot;)&lt;br /&gt;
            tempurl = &amp;quot;** No URL specified! **&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
        tempmoviename = name;&lt;br /&gt;
                &lt;br /&gt;
        llDialog(tempuser,&amp;quot;Bookmarks notecard (&amp;quot;+(string)(notecardline+1)+&amp;quot;/&amp;quot;+(string)numberofnotecardlines+&amp;quot;)\n&amp;quot;+name+&amp;quot; (&amp;quot;+mediatype(llList2String(llParseString2List(tempurl,[&amp;quot;.&amp;quot;],[]),-1))+&amp;quot;)\n&amp;quot;+tempurl,[&amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;,&amp;quot;Use&amp;quot;,&amp;quot;Next &amp;gt;&amp;gt;&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval)&lt;br /&gt;
    {&lt;br /&gt;
        if (type == REMOTE_DATA_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            XML_channel = channel;&lt;br /&gt;
        } &lt;br /&gt;
        else if(type == REMOTE_DATA_REQUEST)&lt;br /&gt;
        {&lt;br /&gt;
            list media_info = llParseString2List(sval, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            tempmoviename = llList2String(media_info,0);&lt;br /&gt;
            seturl(llList2String(media_info,1),NULL_KEY);&lt;br /&gt;
            llRemoteDataReply(channel, message_id, sval, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime() &amp;gt; listenTimer)       //If listener time expired...&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listenHandle);   //Remove listeneres.&lt;br /&gt;
            llListenRemove(listenUrl);&lt;br /&gt;
            llListenRemove(listenRemote);&lt;br /&gt;
            listenHandle = -1;&lt;br /&gt;
            listenUrl = -1;&lt;br /&gt;
            listenRemote = -1;&lt;br /&gt;
            listenTimer = -1;&lt;br /&gt;
            if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all&lt;br /&gt;
                llSetTimerEvent(0.0);   //Remove timer&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(loop_image == TRUE &amp;amp;&amp;amp; mode == 1) //If we're looping pictures and and we're in picture mode...&lt;br /&gt;
            next(); //Next picture&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Additional Information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:Media</id>
		<title>Category:Media</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:Media"/>
				<updated>2009-02-08T04:33:00Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: This category contains items related to using various media functions in OpenSim.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains items related to using various media functions in OpenSim.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T04:31:37Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
== Creating a Media Screen in OpenSim ==&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
=== General Steps ===&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
=== Freeview Code ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//XEngine:&lt;br /&gt;
//FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo&lt;br /&gt;
//Multifunctional Picture viewer and Video control script with webguide support&lt;br /&gt;
//This script is distributed for free and must stay that way. &lt;br /&gt;
&lt;br /&gt;
//              *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. ***&lt;br /&gt;
&lt;br /&gt;
//Help for using this script can be obtained at: http://www.slguide.com/help&lt;br /&gt;
&lt;br /&gt;
//Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom.&lt;br /&gt;
 &lt;br /&gt;
//Whats new:&lt;br /&gt;
//- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display&lt;br /&gt;
//- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init.&lt;br /&gt;
//- Renamed WebGuide to TV-Guide to reflect what this thing does better.&lt;br /&gt;
//- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes.&lt;br /&gt;
//- Additional minor help-tips and code improvements&lt;br /&gt;
&lt;br /&gt;
//Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
integer PICTURE_ROTATION_TIMER = 60;   //In whole seconds&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed&lt;br /&gt;
&lt;br /&gt;
key VIDEO_DEFAULT = &amp;quot;71b8ff26-087d-5f44-285b-d38df2e11a81&amp;quot;;  //Test pattern - Used as default video texture when one is missing in parcel media&lt;br /&gt;
key BLANK = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; //Blank texture - Used when there are no textures to display in Picture mode&lt;br /&gt;
string NOTECARD = &amp;quot;bookmarks&amp;quot;;  //Used to host URL bookmarks for video streams&lt;br /&gt;
&lt;br /&gt;
integer VIDEO_BRIGHT = TRUE;    //FULL_BRIGHT status for Video&lt;br /&gt;
integer PICTURE_BRIGHT = TRUE;  //FULL_BRIGHT status for Picture&lt;br /&gt;
&lt;br /&gt;
integer REMOTE_CHANNEL = 9238742;&lt;br /&gt;
&lt;br /&gt;
integer mode = 0;           //Freeview mode.&lt;br /&gt;
                            //Mode 0 - Power off&lt;br /&gt;
                            //Mode 1 - Picture viewer&lt;br /&gt;
                            //Mode 2 - Video&lt;br /&gt;
&lt;br /&gt;
integer listenHandle = -1;      //Dialog menu listen handler&lt;br /&gt;
integer listenUrl = -1;         //listen handler for channel 1 for when a URL is being added&lt;br /&gt;
integer listenTimer = -1;       //Timer variable for removing all listeners after 2 minutes of listener inactivity&lt;br /&gt;
integer listenRemote = -1;      //listen handler for the remote during initial setup&lt;br /&gt;
integer encryption = 0;&lt;br /&gt;
integer numberofnotecardlines = 0;  //Stores the current number of detected notecard lines.&lt;br /&gt;
integer notecardline = 0;       //Current notecard line&lt;br /&gt;
&lt;br /&gt;
integer loop_image = FALSE;     //Are we looping pictures with a timer? (picture mode)&lt;br /&gt;
integer current_texture = 0;    //Current texture number in inventory being displayed (picture mode)&lt;br /&gt;
integer chan;                   //llDialog listen channel&lt;br /&gt;
integer notecardcheck = 0;&lt;br /&gt;
key video_texture;              //Currently used video display texture for parcel media stream&lt;br /&gt;
&lt;br /&gt;
string moviename;&lt;br /&gt;
string tempmoviename;&lt;br /&gt;
key notecardkey = NULL_KEY;&lt;br /&gt;
key tempuser;                   //Temp key storge variable&lt;br /&gt;
string tempurl;                 //Temp string storge variable&lt;br /&gt;
&lt;br /&gt;
integer isGroup = TRUE;&lt;br /&gt;
key groupcheck = NULL_KEY;&lt;br /&gt;
key last_owner;&lt;br /&gt;
key XML_channel;&lt;br /&gt;
&lt;br /&gt;
pictures()      //Change mode to Picture Viewer&lt;br /&gt;
{&lt;br /&gt;
    //Initilize variables&lt;br /&gt;
    &lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, PICTURE_BRIGHT]);&lt;br /&gt;
&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
     &lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else    &lt;br /&gt;
        if(current_texture &amp;gt; check)&lt;br /&gt;
            //Set to first texture if available&lt;br /&gt;
            current_texture = 0;&lt;br /&gt;
            &lt;br /&gt;
    display_texture(current_texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
video()         //Change mode to Video&lt;br /&gt;
{&lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, VIDEO_BRIGHT, PRIM_TEXTURE, DISPLAY_ON_SIDE, &amp;quot;62dc73ca-265f-7ca0-0453-e2a6aa60bb6f&amp;quot;, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
    &lt;br /&gt;
    report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Stopped&amp;quot;);&lt;br /&gt;
    if(finditem(NOTECARD) != -1)&lt;br /&gt;
        tempuser = llGetNumberOfNotecardLines(NOTECARD);&lt;br /&gt;
    video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]),0);&lt;br /&gt;
    if(video_texture == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        video_texture = VIDEO_DEFAULT;&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE,VIDEO_DEFAULT]);&lt;br /&gt;
        llSay(0,&amp;quot;No parcel media texture found. Setting texture to default: &amp;quot;+(string)VIDEO_DEFAULT);&lt;br /&gt;
        if(llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetTexture(video_texture,DISPLAY_ON_SIDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    report(&amp;quot;Click to power on.&amp;quot;);&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_LOW, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;0.1,0.1,0.1&amp;gt;, 1.0,PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, FALSE, PRIM_TEXTURE, DISPLAY_ON_SIDE, BLANK, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer finditem(string name)   //Finds and returns an item's inventory number&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetInventoryNumber(INVENTORY_NOTECARD);i++)&lt;br /&gt;
        if(llGetInventoryName(INVENTORY_NOTECARD,i) == NOTECARD)&lt;br /&gt;
            return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
seturl(string url, key id)  //Set parcel media URL&lt;br /&gt;
{&lt;br /&gt;
    if(mode != 2)&lt;br /&gt;
    {&lt;br /&gt;
        video();&lt;br /&gt;
        mode = 2;&lt;br /&gt;
    }&lt;br /&gt;
    moviename = tempmoviename;&lt;br /&gt;
    if(moviename)&lt;br /&gt;
        moviename = &amp;quot; [&amp;quot;+moviename+&amp;quot;]&amp;quot;;&lt;br /&gt;
    tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
    string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0);&lt;br /&gt;
    if(oldurl != &amp;quot;&amp;quot;)&lt;br /&gt;
        llOwnerSay(&amp;quot;Setting new media URL. The old URL was: &amp;quot;+oldurl);&lt;br /&gt;
&lt;br /&gt;
    llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);&lt;br /&gt;
    if(id!=NULL_KEY)&lt;br /&gt;
        menu(id);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Playing&amp;quot;);&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
    if(isGroup)&lt;br /&gt;
        llSay(0,&amp;quot;New media URL set.&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;New media URL set: &amp;quot;+url);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string mediatype(string ext)    //Returns a string stating the filetype of a file based on file extension&lt;br /&gt;
{&lt;br /&gt;
    ext = llToLower(ext);&lt;br /&gt;
    if(ext == &amp;quot;swf&amp;quot;)&lt;br /&gt;
        return &amp;quot;Flash&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mov&amp;quot; || ext == &amp;quot;avi&amp;quot; || ext == &amp;quot;mpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;smil&amp;quot;)&lt;br /&gt;
        return &amp;quot;Video&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;jpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;gif&amp;quot; || ext == &amp;quot;png&amp;quot; || ext == &amp;quot;pict&amp;quot; || ext == &amp;quot;tga&amp;quot; || ext == &amp;quot;tiff&amp;quot; || ext == &amp;quot;sgi&amp;quot; || ext == &amp;quot;bmp&amp;quot;)&lt;br /&gt;
        return &amp;quot;Image&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;txt&amp;quot;)&lt;br /&gt;
        return &amp;quot;Text&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mp3&amp;quot; || ext == &amp;quot;wav&amp;quot;)&lt;br /&gt;
        return &amp;quot;Audio&amp;quot;;&lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
browse(key id)      //Image browser function for picture viewer mode&lt;br /&gt;
{&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    string header;&lt;br /&gt;
    if(check &amp;gt; 0)&lt;br /&gt;
        header = &amp;quot;(&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;) &amp;quot;+llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    else&lt;br /&gt;
        header = &amp;quot;No pictures found.&amp;quot;;&lt;br /&gt;
    llDialog(id,&amp;quot;** Monitor Control **\n Picture Viewer mode\n- Image browser\n- &amp;quot;+header,[&amp;quot;Back&amp;quot;,&amp;quot;Next&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    extendtimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
report(string str)&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectDesc(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extendtimer()       //Add another 2 minute to the Listen Removal timer (use when a Listen event is triggered)&lt;br /&gt;
{&lt;br /&gt;
    if(listenHandle == -1)&lt;br /&gt;
        listenHandle = llListen(chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    listenTimer = (integer)llGetTime() + 120;&lt;br /&gt;
    if(loop_image == FALSE)&lt;br /&gt;
        llSetTimerEvent(45);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
config(key id)      //Configuration menu&lt;br /&gt;
{&lt;br /&gt;
    extendtimer();&lt;br /&gt;
    llDialog(id,&amp;quot;Current media URL:\n&amp;quot;+llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0)+&amp;quot;\nTip: If the picture is abit off, try 'Align ON'&amp;quot;,[&amp;quot;Set URL&amp;quot;,&amp;quot;Align ON&amp;quot;,&amp;quot;Align OFF&amp;quot;,&amp;quot;Menu&amp;quot;,&amp;quot;Set Remote&amp;quot;],chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tell_remote(string str)&lt;br /&gt;
{&lt;br /&gt;
    llShout(REMOTE_CHANNEL,llXorBase64Strings(llStringToBase64((string)encryption + str), llStringToBase64((string)encryption)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu(key id)        //Dialog menus for all 3 modes&lt;br /&gt;
{&lt;br /&gt;
    list buttons = [];&lt;br /&gt;
    string title = &amp;quot;** Monitor control **&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    extendtimer();&lt;br /&gt;
&lt;br /&gt;
    if(mode != 0)&lt;br /&gt;
    {&lt;br /&gt;
        if(mode == 1)       //Pictures menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n  Picture Viewer mode&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Browse&amp;quot;];&lt;br /&gt;
            if(loop_image == FALSE)&lt;br /&gt;
                buttons+=[&amp;quot;Loop&amp;quot;];&lt;br /&gt;
            else&lt;br /&gt;
                buttons+=[&amp;quot;Unloop&amp;quot;];&lt;br /&gt;
            buttons+=[&amp;quot;Video&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Fix scale&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        else                //Video menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n Video display mode\n&amp;quot;+moviename+&amp;quot;\nTip:\nClick 'TV Guide' to view the Online bookmarks.&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Pictures&amp;quot;,&amp;quot;Configure&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Loop&amp;quot;,&amp;quot;Unload&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Stop&amp;quot;,&amp;quot;Pause&amp;quot;,&amp;quot;TV Guide&amp;quot;,&amp;quot;Bookmarks&amp;quot;,&amp;quot;Set URL&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        buttons += [&amp;quot;Pictures&amp;quot;,&amp;quot;Video&amp;quot;,&amp;quot;Help&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id,title,buttons,chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
display_texture(integer check)  //Display texture and set name in description (picture mode)&lt;br /&gt;
{                               //&amp;quot;Check&amp;quot; holds the number of textures in contents. The function uses &amp;quot;current_texture&amp;quot; to display.&lt;br /&gt;
    string name = llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    llSetTexture(name,DISPLAY_ON_SIDE);&lt;br /&gt;
    report(&amp;quot;Showing picture: &amp;quot;+name+&amp;quot; (&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
next()  //Change to next texture (picture mode)&lt;br /&gt;
{       //This function is used twice - by the menu and timer. Therefor, it is a dedicated function.&lt;br /&gt;
    current_texture++;&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if(check == current_texture)&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
    &lt;br /&gt;
    display_texture(check);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        chan = (integer)llFrand(1000) + 1000;   //Pick a random listen channel for the listener&lt;br /&gt;
        if(PICTURE_ROTATION_TIMER &amp;lt;= 0)         //Ensure the value is no less or equal 0&lt;br /&gt;
            PICTURE_ROTATION_TIMER = 1;&lt;br /&gt;
        llListenRemove(listenHandle);&lt;br /&gt;
        listenHandle = -1;&lt;br /&gt;
        last_owner = llGetOwner();&lt;br /&gt;
        groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
        off();&lt;br /&gt;
        llOpenRemoteDataChannel();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
        //Listen only to owner or group member. Edit this code to change access controls.&lt;br /&gt;
        if(llDetectedKey(0) != llGetOwner() &amp;amp;&amp;amp; llDetectedGroup(0) == FALSE)&lt;br /&gt;
            return;&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        if(llGetOwnerKey(llGetKey()) != last_owner)  //Sense if object has been deeded to group for Web Guide function&lt;br /&gt;
        {&lt;br /&gt;
            isGroup = TRUE;&lt;br /&gt;
            last_owner = llGetOwner();&lt;br /&gt;
            groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
            &lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Detected change in ownership. Attempting to obtain current parcel media texture...&amp;quot;);&lt;br /&gt;
                video();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        menu(llDetectedKey(0));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change == CHANGED_INVENTORY) //If inventory change&lt;br /&gt;
            if(mode == 1)   //If picture mode&lt;br /&gt;
            {&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    display_texture(check);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                if(mode == 2)   //If video mode&lt;br /&gt;
                    if(finditem(NOTECARD) != -1)    //And bookmarks notecard present&lt;br /&gt;
                        if(notecardkey != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                            tempuser = llGetNumberOfNotecardLines(NOTECARD);    //Reload number of lines&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(message == &amp;quot;Pictures&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
            pictures();&lt;br /&gt;
            mode = 1;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Video&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            video();&lt;br /&gt;
            mode = 2;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Power off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
            off();&lt;br /&gt;
            mode = 0;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Help&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Help documentation is available at: http://www.slguide.com/help&amp;quot;);&lt;br /&gt;
            if(isGroup)&lt;br /&gt;
            {&lt;br /&gt;
                if(id == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(0,&amp;quot;FreeView cannot load help pages while set to group without the remote.&amp;quot;);&lt;br /&gt;
                    llSay(0,&amp;quot;For further assistance, please consult: http://slguide.com/help&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    tell_remote(&amp;quot;HELP&amp;quot;+(string)id+(string)XML_channel);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llLoadURL(id,&amp;quot;Help pages for FreeView&amp;quot;,&amp;quot;http://www.slguide.com?c=&amp;quot;+(string)XML_channel+&amp;quot;&amp;amp;help=1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 1)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Browse&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                next();&lt;br /&gt;
                browse(id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Back&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                current_texture--;&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(current_texture &amp;lt; 0)&lt;br /&gt;
                    current_texture = check - 1;&lt;br /&gt;
                &lt;br /&gt;
                display_texture(check);&lt;br /&gt;
                &lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(PICTURE_ROTATION_TIMER);&lt;br /&gt;
                loop_image = TRUE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture will change every &amp;quot;+(string)PICTURE_ROTATION_TIMER+&amp;quot; seconds.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unloop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture loop disabled.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Fix scale&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Setting display texture to 1,1 repeats and 0,0 offset.&amp;quot;);&lt;br /&gt;
                llScaleTexture(1, 1, DISPLAY_ON_SIDE);&lt;br /&gt;
                llOffsetTexture(0, 0, DISPLAY_ON_SIDE);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 2)&lt;br /&gt;
        {&lt;br /&gt;
            if(channel == REMOTE_CHANNEL)&lt;br /&gt;
            {&lt;br /&gt;
                if(encryption == 0)&lt;br /&gt;
                    encryption = (integer)message;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = -1;&lt;br /&gt;
                llSay(0,&amp;quot;Remote configured (&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
                &lt;br /&gt;
            if(message == &amp;quot;TV Guide&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(isGroup)&lt;br /&gt;
                {&lt;br /&gt;
                    if(!encryption)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSay(0,&amp;quot;** Error - This FreeView object has been deeded to group. You must use a Remote control to open the TV Guide.&amp;quot;);&lt;br /&gt;
                        llSay(0,&amp;quot;You can set up the remote control from the Video -&amp;gt; Configuration menu. Please refer to the notecard for further assistance.&amp;quot;);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    tell_remote((string)id+(string)XML_channel+(string)llGetOwner());&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llLoadURL(id, &amp;quot;Come to the Guide to Start Your Viewer Playing!&amp;quot;, &amp;quot;http://slguide.com/index.php?v=&amp;quot; + (string)llGetKey() + &amp;quot;&amp;amp;c=&amp;quot; + (string)XML_channel + &amp;quot;&amp;amp;o=&amp;quot; + (string)llGetOwner() + &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            string header = &amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: &amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(message == &amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline--;&lt;br /&gt;
                if(notecardline &amp;lt; 0)&lt;br /&gt;
                    notecardline = numberofnotecardlines - 1;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next &amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline++;&lt;br /&gt;
                if(notecardline &amp;gt;= numberofnotecardlines)&lt;br /&gt;
                    notecardline = 0;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Use&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(tempurl == &amp;quot;** No URL specified! **&amp;quot;)&lt;br /&gt;
                    tempurl = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(tempurl,id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
                    &lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Configure&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                config(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Bookmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(notecardcheck != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No valid bookmark data found in notecard '&amp;quot;+NOTECARD+&amp;quot;'.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(finditem(NOTECARD) != -1)                &lt;br /&gt;
                {&lt;br /&gt;
                    tempuser = id;&lt;br /&gt;
                    if(numberofnotecardlines &amp;lt; notecardline)&lt;br /&gt;
                        notecardline = 0;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No notecard named &amp;quot;+NOTECARD+&amp;quot; found in contents.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(llGetLandOwnerAt(llGetPos()) != llGetOwner())    //If we do not have permissions to actually do the following functions&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return; //Abort&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(listenUrl != -1 &amp;amp;&amp;amp; channel == 1) //Incoming data from &amp;quot;Set URL&amp;quot; command (user spoke on channel 1)&lt;br /&gt;
            {&lt;br /&gt;
                llListenRemove(listenUrl);&lt;br /&gt;
                listenUrl = -1;&lt;br /&gt;
                tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(message,id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Play&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Playing&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Stop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Pause&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Paused&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unload&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            //URL , Auto-Scale, &lt;br /&gt;
            if(message == &amp;quot;Set URL&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                listenUrl = llListen(1,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id,&amp;quot;Please type the URL of your choice with /1 in thebegining. For example, /1 www.google.com&amp;quot;,[&amp;quot;Ok&amp;quot;],938);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,FALSE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Set Remote&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Configuring remote...&amp;quot;);&lt;br /&gt;
                encryption = 0;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = llListen(REMOTE_CHANNEL,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
                llSay(REMOTE_CHANNEL,&amp;quot;SETUP&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(queryid == groupcheck)       //Test if object is deeded to group&lt;br /&gt;
        {&lt;br /&gt;
            groupcheck = NULL_KEY;&lt;br /&gt;
            isGroup = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(queryid == tempuser) //If just checking number of notecard lines&lt;br /&gt;
        {&lt;br /&gt;
            numberofnotecardlines = (integer)data;&lt;br /&gt;
            notecardkey = llGetInventoryKey(NOTECARD);&lt;br /&gt;
            notecardcheck = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(notecardcheck != -1)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(data == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck++;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck = -1;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(data == &amp;quot;&amp;quot; &amp;amp;&amp;amp; notecardline &amp;lt; numberofnotecardlines)    //If user just pressed &amp;quot;enter&amp;quot; in bookmarks, skip&lt;br /&gt;
        {&lt;br /&gt;
            notecardline++;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(data == EOF)&lt;br /&gt;
        {&lt;br /&gt;
            notecardline = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list parsed = llParseString2List(data,[&amp;quot;|&amp;quot;,&amp;quot;| &amp;quot;,&amp;quot; |&amp;quot;,&amp;quot; | &amp;quot;],[]);    //Ensure no blank spaces before &amp;quot;http://&amp;quot;.&lt;br /&gt;
        string name = llList2String(parsed,0);&lt;br /&gt;
        tempurl = llList2String(parsed,1);&lt;br /&gt;
        if(tempurl == &amp;quot;&amp;quot;)&lt;br /&gt;
            tempurl = &amp;quot;** No URL specified! **&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
        tempmoviename = name;&lt;br /&gt;
                &lt;br /&gt;
        llDialog(tempuser,&amp;quot;Bookmarks notecard (&amp;quot;+(string)(notecardline+1)+&amp;quot;/&amp;quot;+(string)numberofnotecardlines+&amp;quot;)\n&amp;quot;+name+&amp;quot; (&amp;quot;+mediatype(llList2String(llParseString2List(tempurl,[&amp;quot;.&amp;quot;],[]),-1))+&amp;quot;)\n&amp;quot;+tempurl,[&amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;,&amp;quot;Use&amp;quot;,&amp;quot;Next &amp;gt;&amp;gt;&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval)&lt;br /&gt;
    {&lt;br /&gt;
        if (type == REMOTE_DATA_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            XML_channel = channel;&lt;br /&gt;
        } &lt;br /&gt;
        else if(type == REMOTE_DATA_REQUEST)&lt;br /&gt;
        {&lt;br /&gt;
            list media_info = llParseString2List(sval, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            tempmoviename = llList2String(media_info,0);&lt;br /&gt;
            seturl(llList2String(media_info,1),NULL_KEY);&lt;br /&gt;
            llRemoteDataReply(channel, message_id, sval, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime() &amp;gt; listenTimer)       //If listener time expired...&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listenHandle);   //Remove listeneres.&lt;br /&gt;
            llListenRemove(listenUrl);&lt;br /&gt;
            llListenRemove(listenRemote);&lt;br /&gt;
            listenHandle = -1;&lt;br /&gt;
            listenUrl = -1;&lt;br /&gt;
            listenRemote = -1;&lt;br /&gt;
            listenTimer = -1;&lt;br /&gt;
            if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all&lt;br /&gt;
                llSetTimerEvent(0.0);   //Remove timer&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(loop_image == TRUE &amp;amp;&amp;amp; mode == 1) //If we're looping pictures and and we're in picture mode...&lt;br /&gt;
            next(); //Next picture&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Additional Information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T04:26:50Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
== Creating a Media Screen in OpenSim ==&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
=== General Steps ===&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
=== Freeview Code ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//XEngine:&lt;br /&gt;
//FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo&lt;br /&gt;
//Multifunctional Picture viewer and Video control script with webguide support&lt;br /&gt;
//This script is distributed for free and must stay that way. &lt;br /&gt;
&lt;br /&gt;
//              *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. ***&lt;br /&gt;
&lt;br /&gt;
//Help for using this script can be obtained at: http://www.slguide.com/help&lt;br /&gt;
&lt;br /&gt;
//Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom.&lt;br /&gt;
 &lt;br /&gt;
//Whats new:&lt;br /&gt;
//- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display&lt;br /&gt;
//- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init.&lt;br /&gt;
//- Renamed WebGuide to TV-Guide to reflect what this thing does better.&lt;br /&gt;
//- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes.&lt;br /&gt;
//- Additional minor help-tips and code improvements&lt;br /&gt;
&lt;br /&gt;
//Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
integer PICTURE_ROTATION_TIMER = 60;   //In whole seconds&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed&lt;br /&gt;
&lt;br /&gt;
key VIDEO_DEFAULT = &amp;quot;71b8ff26-087d-5f44-285b-d38df2e11a81&amp;quot;;  //Test pattern - Used as default video texture when one is missing in parcel media&lt;br /&gt;
key BLANK = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; //Blank texture - Used when there are no textures to display in Picture mode&lt;br /&gt;
string NOTECARD = &amp;quot;bookmarks&amp;quot;;  //Used to host URL bookmarks for video streams&lt;br /&gt;
&lt;br /&gt;
integer VIDEO_BRIGHT = TRUE;    //FULL_BRIGHT status for Video&lt;br /&gt;
integer PICTURE_BRIGHT = TRUE;  //FULL_BRIGHT status for Picture&lt;br /&gt;
&lt;br /&gt;
integer REMOTE_CHANNEL = 9238742;&lt;br /&gt;
&lt;br /&gt;
integer mode = 0;           //Freeview mode.&lt;br /&gt;
                            //Mode 0 - Power off&lt;br /&gt;
                            //Mode 1 - Picture viewer&lt;br /&gt;
                            //Mode 2 - Video&lt;br /&gt;
&lt;br /&gt;
integer listenHandle = -1;      //Dialog menu listen handler&lt;br /&gt;
integer listenUrl = -1;         //listen handler for channel 1 for when a URL is being added&lt;br /&gt;
integer listenTimer = -1;       //Timer variable for removing all listeners after 2 minutes of listener inactivity&lt;br /&gt;
integer listenRemote = -1;      //listen handler for the remote during initial setup&lt;br /&gt;
integer encryption = 0;&lt;br /&gt;
integer numberofnotecardlines = 0;  //Stores the current number of detected notecard lines.&lt;br /&gt;
integer notecardline = 0;       //Current notecard line&lt;br /&gt;
&lt;br /&gt;
integer loop_image = FALSE;     //Are we looping pictures with a timer? (picture mode)&lt;br /&gt;
integer current_texture = 0;    //Current texture number in inventory being displayed (picture mode)&lt;br /&gt;
integer chan;                   //llDialog listen channel&lt;br /&gt;
integer notecardcheck = 0;&lt;br /&gt;
key video_texture;              //Currently used video display texture for parcel media stream&lt;br /&gt;
&lt;br /&gt;
string moviename;&lt;br /&gt;
string tempmoviename;&lt;br /&gt;
key notecardkey = NULL_KEY;&lt;br /&gt;
key tempuser;                   //Temp key storge variable&lt;br /&gt;
string tempurl;                 //Temp string storge variable&lt;br /&gt;
&lt;br /&gt;
integer isGroup = TRUE;&lt;br /&gt;
key groupcheck = NULL_KEY;&lt;br /&gt;
key last_owner;&lt;br /&gt;
key XML_channel;&lt;br /&gt;
&lt;br /&gt;
pictures()      //Change mode to Picture Viewer&lt;br /&gt;
{&lt;br /&gt;
    //Initilize variables&lt;br /&gt;
    &lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, PICTURE_BRIGHT]);&lt;br /&gt;
&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
     &lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else    &lt;br /&gt;
        if(current_texture &amp;gt; check)&lt;br /&gt;
            //Set to first texture if available&lt;br /&gt;
            current_texture = 0;&lt;br /&gt;
            &lt;br /&gt;
    display_texture(current_texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
video()         //Change mode to Video&lt;br /&gt;
{&lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, VIDEO_BRIGHT, PRIM_TEXTURE, DISPLAY_ON_SIDE, &amp;quot;62dc73ca-265f-7ca0-0453-e2a6aa60bb6f&amp;quot;, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
    &lt;br /&gt;
    report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Stopped&amp;quot;);&lt;br /&gt;
    if(finditem(NOTECARD) != -1)&lt;br /&gt;
        tempuser = llGetNumberOfNotecardLines(NOTECARD);&lt;br /&gt;
    video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]),0);&lt;br /&gt;
    if(video_texture == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        video_texture = VIDEO_DEFAULT;&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE,VIDEO_DEFAULT]);&lt;br /&gt;
        llSay(0,&amp;quot;No parcel media texture found. Setting texture to default: &amp;quot;+(string)VIDEO_DEFAULT);&lt;br /&gt;
        if(llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetTexture(video_texture,DISPLAY_ON_SIDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    report(&amp;quot;Click to power on.&amp;quot;);&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_LOW, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;0.1,0.1,0.1&amp;gt;, 1.0,PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, FALSE, PRIM_TEXTURE, DISPLAY_ON_SIDE, BLANK, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer finditem(string name)   //Finds and returns an item's inventory number&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetInventoryNumber(INVENTORY_NOTECARD);i++)&lt;br /&gt;
        if(llGetInventoryName(INVENTORY_NOTECARD,i) == NOTECARD)&lt;br /&gt;
            return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
seturl(string url, key id)  //Set parcel media URL&lt;br /&gt;
{&lt;br /&gt;
    if(mode != 2)&lt;br /&gt;
    {&lt;br /&gt;
        video();&lt;br /&gt;
        mode = 2;&lt;br /&gt;
    }&lt;br /&gt;
    moviename = tempmoviename;&lt;br /&gt;
    if(moviename)&lt;br /&gt;
        moviename = &amp;quot; [&amp;quot;+moviename+&amp;quot;]&amp;quot;;&lt;br /&gt;
    tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
    string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0);&lt;br /&gt;
    if(oldurl != &amp;quot;&amp;quot;)&lt;br /&gt;
        llOwnerSay(&amp;quot;Setting new media URL. The old URL was: &amp;quot;+oldurl);&lt;br /&gt;
&lt;br /&gt;
    llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);&lt;br /&gt;
    if(id!=NULL_KEY)&lt;br /&gt;
        menu(id);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Playing&amp;quot;);&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
    if(isGroup)&lt;br /&gt;
        llSay(0,&amp;quot;New media URL set.&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;New media URL set: &amp;quot;+url);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string mediatype(string ext)    //Returns a string stating the filetype of a file based on file extension&lt;br /&gt;
{&lt;br /&gt;
    ext = llToLower(ext);&lt;br /&gt;
    if(ext == &amp;quot;swf&amp;quot;)&lt;br /&gt;
        return &amp;quot;Flash&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mov&amp;quot; || ext == &amp;quot;avi&amp;quot; || ext == &amp;quot;mpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;smil&amp;quot;)&lt;br /&gt;
        return &amp;quot;Video&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;jpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;gif&amp;quot; || ext == &amp;quot;png&amp;quot; || ext == &amp;quot;pict&amp;quot; || ext == &amp;quot;tga&amp;quot; || ext == &amp;quot;tiff&amp;quot; || ext == &amp;quot;sgi&amp;quot; || ext == &amp;quot;bmp&amp;quot;)&lt;br /&gt;
        return &amp;quot;Image&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;txt&amp;quot;)&lt;br /&gt;
        return &amp;quot;Text&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mp3&amp;quot; || ext == &amp;quot;wav&amp;quot;)&lt;br /&gt;
        return &amp;quot;Audio&amp;quot;;&lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
browse(key id)      //Image browser function for picture viewer mode&lt;br /&gt;
{&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    string header;&lt;br /&gt;
    if(check &amp;gt; 0)&lt;br /&gt;
        header = &amp;quot;(&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;) &amp;quot;+llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    else&lt;br /&gt;
        header = &amp;quot;No pictures found.&amp;quot;;&lt;br /&gt;
    llDialog(id,&amp;quot;** Monitor Control **\n Picture Viewer mode\n- Image browser\n- &amp;quot;+header,[&amp;quot;Back&amp;quot;,&amp;quot;Next&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    extendtimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
report(string str)&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectDesc(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extendtimer()       //Add another 2 minute to the Listen Removal timer (use when a Listen event is triggered)&lt;br /&gt;
{&lt;br /&gt;
    if(listenHandle == -1)&lt;br /&gt;
        listenHandle = llListen(chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    listenTimer = (integer)llGetTime() + 120;&lt;br /&gt;
    if(loop_image == FALSE)&lt;br /&gt;
        llSetTimerEvent(45);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
config(key id)      //Configuration menu&lt;br /&gt;
{&lt;br /&gt;
    extendtimer();&lt;br /&gt;
    llDialog(id,&amp;quot;Current media URL:\n&amp;quot;+llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0)+&amp;quot;\nTip: If the picture is abit off, try 'Align ON'&amp;quot;,[&amp;quot;Set URL&amp;quot;,&amp;quot;Align ON&amp;quot;,&amp;quot;Align OFF&amp;quot;,&amp;quot;Menu&amp;quot;,&amp;quot;Set Remote&amp;quot;],chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tell_remote(string str)&lt;br /&gt;
{&lt;br /&gt;
    llShout(REMOTE_CHANNEL,llXorBase64Strings(llStringToBase64((string)encryption + str), llStringToBase64((string)encryption)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu(key id)        //Dialog menus for all 3 modes&lt;br /&gt;
{&lt;br /&gt;
    list buttons = [];&lt;br /&gt;
    string title = &amp;quot;** Monitor control **&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    extendtimer();&lt;br /&gt;
&lt;br /&gt;
    if(mode != 0)&lt;br /&gt;
    {&lt;br /&gt;
        if(mode == 1)       //Pictures menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n  Picture Viewer mode&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Browse&amp;quot;];&lt;br /&gt;
            if(loop_image == FALSE)&lt;br /&gt;
                buttons+=[&amp;quot;Loop&amp;quot;];&lt;br /&gt;
            else&lt;br /&gt;
                buttons+=[&amp;quot;Unloop&amp;quot;];&lt;br /&gt;
            buttons+=[&amp;quot;Video&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Fix scale&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        else                //Video menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n Video display mode\n&amp;quot;+moviename+&amp;quot;\nTip:\nClick 'TV Guide' to view the Online bookmarks.&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Pictures&amp;quot;,&amp;quot;Configure&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Loop&amp;quot;,&amp;quot;Unload&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Stop&amp;quot;,&amp;quot;Pause&amp;quot;,&amp;quot;TV Guide&amp;quot;,&amp;quot;Bookmarks&amp;quot;,&amp;quot;Set URL&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        buttons += [&amp;quot;Pictures&amp;quot;,&amp;quot;Video&amp;quot;,&amp;quot;Help&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id,title,buttons,chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
display_texture(integer check)  //Display texture and set name in description (picture mode)&lt;br /&gt;
{                               //&amp;quot;Check&amp;quot; holds the number of textures in contents. The function uses &amp;quot;current_texture&amp;quot; to display.&lt;br /&gt;
    string name = llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    llSetTexture(name,DISPLAY_ON_SIDE);&lt;br /&gt;
    report(&amp;quot;Showing picture: &amp;quot;+name+&amp;quot; (&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
next()  //Change to next texture (picture mode)&lt;br /&gt;
{       //This function is used twice - by the menu and timer. Therefor, it is a dedicated function.&lt;br /&gt;
    current_texture++;&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if(check == current_texture)&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
    &lt;br /&gt;
    display_texture(check);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        chan = (integer)llFrand(1000) + 1000;   //Pick a random listen channel for the listener&lt;br /&gt;
        if(PICTURE_ROTATION_TIMER &amp;lt;= 0)         //Ensure the value is no less or equal 0&lt;br /&gt;
            PICTURE_ROTATION_TIMER = 1;&lt;br /&gt;
        llListenRemove(listenHandle);&lt;br /&gt;
        listenHandle = -1;&lt;br /&gt;
        last_owner = llGetOwner();&lt;br /&gt;
        groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
        off();&lt;br /&gt;
        llOpenRemoteDataChannel();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
        //Listen only to owner or group member. Edit this code to change access controls.&lt;br /&gt;
        if(llDetectedKey(0) != llGetOwner() &amp;amp;&amp;amp; llDetectedGroup(0) == FALSE)&lt;br /&gt;
            return;&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        if(llGetOwnerKey(llGetKey()) != last_owner)  //Sense if object has been deeded to group for Web Guide function&lt;br /&gt;
        {&lt;br /&gt;
            isGroup = TRUE;&lt;br /&gt;
            last_owner = llGetOwner();&lt;br /&gt;
            groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
            &lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Detected change in ownership. Attempting to obtain current parcel media texture...&amp;quot;);&lt;br /&gt;
                video();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        menu(llDetectedKey(0));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change == CHANGED_INVENTORY) //If inventory change&lt;br /&gt;
            if(mode == 1)   //If picture mode&lt;br /&gt;
            {&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    display_texture(check);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                if(mode == 2)   //If video mode&lt;br /&gt;
                    if(finditem(NOTECARD) != -1)    //And bookmarks notecard present&lt;br /&gt;
                        if(notecardkey != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                            tempuser = llGetNumberOfNotecardLines(NOTECARD);    //Reload number of lines&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(message == &amp;quot;Pictures&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
            pictures();&lt;br /&gt;
            mode = 1;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Video&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            video();&lt;br /&gt;
            mode = 2;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Power off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
            off();&lt;br /&gt;
            mode = 0;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Help&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Help documentation is available at: http://www.slguide.com/help&amp;quot;);&lt;br /&gt;
            if(isGroup)&lt;br /&gt;
            {&lt;br /&gt;
                if(id == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(0,&amp;quot;FreeView cannot load help pages while set to group without the remote.&amp;quot;);&lt;br /&gt;
                    llSay(0,&amp;quot;For further assistance, please consult: http://slguide.com/help&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    tell_remote(&amp;quot;HELP&amp;quot;+(string)id+(string)XML_channel);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llLoadURL(id,&amp;quot;Help pages for FreeView&amp;quot;,&amp;quot;http://www.slguide.com?c=&amp;quot;+(string)XML_channel+&amp;quot;&amp;amp;help=1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 1)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Browse&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                next();&lt;br /&gt;
                browse(id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Back&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                current_texture--;&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(current_texture &amp;lt; 0)&lt;br /&gt;
                    current_texture = check - 1;&lt;br /&gt;
                &lt;br /&gt;
                display_texture(check);&lt;br /&gt;
                &lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(PICTURE_ROTATION_TIMER);&lt;br /&gt;
                loop_image = TRUE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture will change every &amp;quot;+(string)PICTURE_ROTATION_TIMER+&amp;quot; seconds.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unloop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture loop disabled.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Fix scale&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Setting display texture to 1,1 repeats and 0,0 offset.&amp;quot;);&lt;br /&gt;
                llScaleTexture(1, 1, DISPLAY_ON_SIDE);&lt;br /&gt;
                llOffsetTexture(0, 0, DISPLAY_ON_SIDE);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 2)&lt;br /&gt;
        {&lt;br /&gt;
            if(channel == REMOTE_CHANNEL)&lt;br /&gt;
            {&lt;br /&gt;
                if(encryption == 0)&lt;br /&gt;
                    encryption = (integer)message;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = -1;&lt;br /&gt;
                llSay(0,&amp;quot;Remote configured (&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
                &lt;br /&gt;
            if(message == &amp;quot;TV Guide&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(isGroup)&lt;br /&gt;
                {&lt;br /&gt;
                    if(!encryption)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSay(0,&amp;quot;** Error - This FreeView object has been deeded to group. You must use a Remote control to open the TV Guide.&amp;quot;);&lt;br /&gt;
                        llSay(0,&amp;quot;You can set up the remote control from the Video -&amp;gt; Configuration menu. Please refer to the notecard for further assistance.&amp;quot;);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    tell_remote((string)id+(string)XML_channel+(string)llGetOwner());&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llLoadURL(id, &amp;quot;Come to the Guide to Start Your Viewer Playing!&amp;quot;, &amp;quot;http://slguide.com/index.php?v=&amp;quot; + (string)llGetKey() + &amp;quot;&amp;amp;c=&amp;quot; + (string)XML_channel + &amp;quot;&amp;amp;o=&amp;quot; + (string)llGetOwner() + &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            string header = &amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: &amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(message == &amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline--;&lt;br /&gt;
                if(notecardline &amp;lt; 0)&lt;br /&gt;
                    notecardline = numberofnotecardlines - 1;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next &amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline++;&lt;br /&gt;
                if(notecardline &amp;gt;= numberofnotecardlines)&lt;br /&gt;
                    notecardline = 0;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Use&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(tempurl == &amp;quot;** No URL specified! **&amp;quot;)&lt;br /&gt;
                    tempurl = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(tempurl,id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
                    &lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Configure&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                config(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Bookmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(notecardcheck != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No valid bookmark data found in notecard '&amp;quot;+NOTECARD+&amp;quot;'.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(finditem(NOTECARD) != -1)                &lt;br /&gt;
                {&lt;br /&gt;
                    tempuser = id;&lt;br /&gt;
                    if(numberofnotecardlines &amp;lt; notecardline)&lt;br /&gt;
                        notecardline = 0;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No notecard named &amp;quot;+NOTECARD+&amp;quot; found in contents.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(llGetLandOwnerAt(llGetPos()) != llGetOwner())    //If we do not have permissions to actually do the following functions&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return; //Abort&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(listenUrl != -1 &amp;amp;&amp;amp; channel == 1) //Incoming data from &amp;quot;Set URL&amp;quot; command (user spoke on channel 1)&lt;br /&gt;
            {&lt;br /&gt;
                llListenRemove(listenUrl);&lt;br /&gt;
                listenUrl = -1;&lt;br /&gt;
                tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(message,id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Play&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Playing&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Stop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Pause&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Paused&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unload&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            //URL , Auto-Scale, &lt;br /&gt;
            if(message == &amp;quot;Set URL&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                listenUrl = llListen(1,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id,&amp;quot;Please type the URL of your choice with /1 in thebegining. For example, /1 www.google.com&amp;quot;,[&amp;quot;Ok&amp;quot;],938);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,FALSE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Set Remote&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Configuring remote...&amp;quot;);&lt;br /&gt;
                encryption = 0;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = llListen(REMOTE_CHANNEL,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
                llSay(REMOTE_CHANNEL,&amp;quot;SETUP&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(queryid == groupcheck)       //Test if object is deeded to group&lt;br /&gt;
        {&lt;br /&gt;
            groupcheck = NULL_KEY;&lt;br /&gt;
            isGroup = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(queryid == tempuser) //If just checking number of notecard lines&lt;br /&gt;
        {&lt;br /&gt;
            numberofnotecardlines = (integer)data;&lt;br /&gt;
            notecardkey = llGetInventoryKey(NOTECARD);&lt;br /&gt;
            notecardcheck = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(notecardcheck != -1)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(data == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck++;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck = -1;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(data == &amp;quot;&amp;quot; &amp;amp;&amp;amp; notecardline &amp;lt; numberofnotecardlines)    //If user just pressed &amp;quot;enter&amp;quot; in bookmarks, skip&lt;br /&gt;
        {&lt;br /&gt;
            notecardline++;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(data == EOF)&lt;br /&gt;
        {&lt;br /&gt;
            notecardline = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list parsed = llParseString2List(data,[&amp;quot;|&amp;quot;,&amp;quot;| &amp;quot;,&amp;quot; |&amp;quot;,&amp;quot; | &amp;quot;],[]);    //Ensure no blank spaces before &amp;quot;http://&amp;quot;.&lt;br /&gt;
        string name = llList2String(parsed,0);&lt;br /&gt;
        tempurl = llList2String(parsed,1);&lt;br /&gt;
        if(tempurl == &amp;quot;&amp;quot;)&lt;br /&gt;
            tempurl = &amp;quot;** No URL specified! **&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
        tempmoviename = name;&lt;br /&gt;
                &lt;br /&gt;
        llDialog(tempuser,&amp;quot;Bookmarks notecard (&amp;quot;+(string)(notecardline+1)+&amp;quot;/&amp;quot;+(string)numberofnotecardlines+&amp;quot;)\n&amp;quot;+name+&amp;quot; (&amp;quot;+mediatype(llList2String(llParseString2List(tempurl,[&amp;quot;.&amp;quot;],[]),-1))+&amp;quot;)\n&amp;quot;+tempurl,[&amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;,&amp;quot;Use&amp;quot;,&amp;quot;Next &amp;gt;&amp;gt;&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval)&lt;br /&gt;
    {&lt;br /&gt;
        if (type == REMOTE_DATA_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            XML_channel = channel;&lt;br /&gt;
        } &lt;br /&gt;
        else if(type == REMOTE_DATA_REQUEST)&lt;br /&gt;
        {&lt;br /&gt;
            list media_info = llParseString2List(sval, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            tempmoviename = llList2String(media_info,0);&lt;br /&gt;
            seturl(llList2String(media_info,1),NULL_KEY);&lt;br /&gt;
            llRemoteDataReply(channel, message_id, sval, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime() &amp;gt; listenTimer)       //If listener time expired...&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listenHandle);   //Remove listeneres.&lt;br /&gt;
            llListenRemove(listenUrl);&lt;br /&gt;
            llListenRemove(listenRemote);&lt;br /&gt;
            listenHandle = -1;&lt;br /&gt;
            listenUrl = -1;&lt;br /&gt;
            listenRemote = -1;&lt;br /&gt;
            listenTimer = -1;&lt;br /&gt;
            if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all&lt;br /&gt;
                llSetTimerEvent(0.0);   //Remove timer&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(loop_image == TRUE &amp;amp;&amp;amp; mode == 1) //If we're looping pictures and and we're in picture mode...&lt;br /&gt;
            next(); //Next picture&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categories:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T04:26:17Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Supported Audio Formats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
== Creating a Media Screen in OpenSim ==&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
=== General Steps ===&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
=== Freeview Code ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//XEngine:&lt;br /&gt;
//FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo&lt;br /&gt;
//Multifunctional Picture viewer and Video control script with webguide support&lt;br /&gt;
//This script is distributed for free and must stay that way. &lt;br /&gt;
&lt;br /&gt;
//              *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. ***&lt;br /&gt;
&lt;br /&gt;
//Help for using this script can be obtained at: http://www.slguide.com/help&lt;br /&gt;
&lt;br /&gt;
//Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom.&lt;br /&gt;
 &lt;br /&gt;
//Whats new:&lt;br /&gt;
//- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display&lt;br /&gt;
//- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init.&lt;br /&gt;
//- Renamed WebGuide to TV-Guide to reflect what this thing does better.&lt;br /&gt;
//- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes.&lt;br /&gt;
//- Additional minor help-tips and code improvements&lt;br /&gt;
&lt;br /&gt;
//Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
integer PICTURE_ROTATION_TIMER = 60;   //In whole seconds&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed&lt;br /&gt;
&lt;br /&gt;
key VIDEO_DEFAULT = &amp;quot;71b8ff26-087d-5f44-285b-d38df2e11a81&amp;quot;;  //Test pattern - Used as default video texture when one is missing in parcel media&lt;br /&gt;
key BLANK = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; //Blank texture - Used when there are no textures to display in Picture mode&lt;br /&gt;
string NOTECARD = &amp;quot;bookmarks&amp;quot;;  //Used to host URL bookmarks for video streams&lt;br /&gt;
&lt;br /&gt;
integer VIDEO_BRIGHT = TRUE;    //FULL_BRIGHT status for Video&lt;br /&gt;
integer PICTURE_BRIGHT = TRUE;  //FULL_BRIGHT status for Picture&lt;br /&gt;
&lt;br /&gt;
integer REMOTE_CHANNEL = 9238742;&lt;br /&gt;
&lt;br /&gt;
integer mode = 0;           //Freeview mode.&lt;br /&gt;
                            //Mode 0 - Power off&lt;br /&gt;
                            //Mode 1 - Picture viewer&lt;br /&gt;
                            //Mode 2 - Video&lt;br /&gt;
&lt;br /&gt;
integer listenHandle = -1;      //Dialog menu listen handler&lt;br /&gt;
integer listenUrl = -1;         //listen handler for channel 1 for when a URL is being added&lt;br /&gt;
integer listenTimer = -1;       //Timer variable for removing all listeners after 2 minutes of listener inactivity&lt;br /&gt;
integer listenRemote = -1;      //listen handler for the remote during initial setup&lt;br /&gt;
integer encryption = 0;&lt;br /&gt;
integer numberofnotecardlines = 0;  //Stores the current number of detected notecard lines.&lt;br /&gt;
integer notecardline = 0;       //Current notecard line&lt;br /&gt;
&lt;br /&gt;
integer loop_image = FALSE;     //Are we looping pictures with a timer? (picture mode)&lt;br /&gt;
integer current_texture = 0;    //Current texture number in inventory being displayed (picture mode)&lt;br /&gt;
integer chan;                   //llDialog listen channel&lt;br /&gt;
integer notecardcheck = 0;&lt;br /&gt;
key video_texture;              //Currently used video display texture for parcel media stream&lt;br /&gt;
&lt;br /&gt;
string moviename;&lt;br /&gt;
string tempmoviename;&lt;br /&gt;
key notecardkey = NULL_KEY;&lt;br /&gt;
key tempuser;                   //Temp key storge variable&lt;br /&gt;
string tempurl;                 //Temp string storge variable&lt;br /&gt;
&lt;br /&gt;
integer isGroup = TRUE;&lt;br /&gt;
key groupcheck = NULL_KEY;&lt;br /&gt;
key last_owner;&lt;br /&gt;
key XML_channel;&lt;br /&gt;
&lt;br /&gt;
pictures()      //Change mode to Picture Viewer&lt;br /&gt;
{&lt;br /&gt;
    //Initilize variables&lt;br /&gt;
    &lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, PICTURE_BRIGHT]);&lt;br /&gt;
&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
     &lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else    &lt;br /&gt;
        if(current_texture &amp;gt; check)&lt;br /&gt;
            //Set to first texture if available&lt;br /&gt;
            current_texture = 0;&lt;br /&gt;
            &lt;br /&gt;
    display_texture(current_texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
video()         //Change mode to Video&lt;br /&gt;
{&lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, VIDEO_BRIGHT, PRIM_TEXTURE, DISPLAY_ON_SIDE, &amp;quot;62dc73ca-265f-7ca0-0453-e2a6aa60bb6f&amp;quot;, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
    &lt;br /&gt;
    report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Stopped&amp;quot;);&lt;br /&gt;
    if(finditem(NOTECARD) != -1)&lt;br /&gt;
        tempuser = llGetNumberOfNotecardLines(NOTECARD);&lt;br /&gt;
    video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]),0);&lt;br /&gt;
    if(video_texture == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        video_texture = VIDEO_DEFAULT;&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE,VIDEO_DEFAULT]);&lt;br /&gt;
        llSay(0,&amp;quot;No parcel media texture found. Setting texture to default: &amp;quot;+(string)VIDEO_DEFAULT);&lt;br /&gt;
        if(llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetTexture(video_texture,DISPLAY_ON_SIDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    report(&amp;quot;Click to power on.&amp;quot;);&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_LOW, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;0.1,0.1,0.1&amp;gt;, 1.0,PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, FALSE, PRIM_TEXTURE, DISPLAY_ON_SIDE, BLANK, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer finditem(string name)   //Finds and returns an item's inventory number&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetInventoryNumber(INVENTORY_NOTECARD);i++)&lt;br /&gt;
        if(llGetInventoryName(INVENTORY_NOTECARD,i) == NOTECARD)&lt;br /&gt;
            return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
seturl(string url, key id)  //Set parcel media URL&lt;br /&gt;
{&lt;br /&gt;
    if(mode != 2)&lt;br /&gt;
    {&lt;br /&gt;
        video();&lt;br /&gt;
        mode = 2;&lt;br /&gt;
    }&lt;br /&gt;
    moviename = tempmoviename;&lt;br /&gt;
    if(moviename)&lt;br /&gt;
        moviename = &amp;quot; [&amp;quot;+moviename+&amp;quot;]&amp;quot;;&lt;br /&gt;
    tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
    string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0);&lt;br /&gt;
    if(oldurl != &amp;quot;&amp;quot;)&lt;br /&gt;
        llOwnerSay(&amp;quot;Setting new media URL. The old URL was: &amp;quot;+oldurl);&lt;br /&gt;
&lt;br /&gt;
    llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);&lt;br /&gt;
    if(id!=NULL_KEY)&lt;br /&gt;
        menu(id);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Playing&amp;quot;);&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
    if(isGroup)&lt;br /&gt;
        llSay(0,&amp;quot;New media URL set.&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;New media URL set: &amp;quot;+url);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string mediatype(string ext)    //Returns a string stating the filetype of a file based on file extension&lt;br /&gt;
{&lt;br /&gt;
    ext = llToLower(ext);&lt;br /&gt;
    if(ext == &amp;quot;swf&amp;quot;)&lt;br /&gt;
        return &amp;quot;Flash&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mov&amp;quot; || ext == &amp;quot;avi&amp;quot; || ext == &amp;quot;mpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;smil&amp;quot;)&lt;br /&gt;
        return &amp;quot;Video&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;jpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;gif&amp;quot; || ext == &amp;quot;png&amp;quot; || ext == &amp;quot;pict&amp;quot; || ext == &amp;quot;tga&amp;quot; || ext == &amp;quot;tiff&amp;quot; || ext == &amp;quot;sgi&amp;quot; || ext == &amp;quot;bmp&amp;quot;)&lt;br /&gt;
        return &amp;quot;Image&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;txt&amp;quot;)&lt;br /&gt;
        return &amp;quot;Text&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mp3&amp;quot; || ext == &amp;quot;wav&amp;quot;)&lt;br /&gt;
        return &amp;quot;Audio&amp;quot;;&lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
browse(key id)      //Image browser function for picture viewer mode&lt;br /&gt;
{&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    string header;&lt;br /&gt;
    if(check &amp;gt; 0)&lt;br /&gt;
        header = &amp;quot;(&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;) &amp;quot;+llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    else&lt;br /&gt;
        header = &amp;quot;No pictures found.&amp;quot;;&lt;br /&gt;
    llDialog(id,&amp;quot;** Monitor Control **\n Picture Viewer mode\n- Image browser\n- &amp;quot;+header,[&amp;quot;Back&amp;quot;,&amp;quot;Next&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    extendtimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
report(string str)&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectDesc(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extendtimer()       //Add another 2 minute to the Listen Removal timer (use when a Listen event is triggered)&lt;br /&gt;
{&lt;br /&gt;
    if(listenHandle == -1)&lt;br /&gt;
        listenHandle = llListen(chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    listenTimer = (integer)llGetTime() + 120;&lt;br /&gt;
    if(loop_image == FALSE)&lt;br /&gt;
        llSetTimerEvent(45);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
config(key id)      //Configuration menu&lt;br /&gt;
{&lt;br /&gt;
    extendtimer();&lt;br /&gt;
    llDialog(id,&amp;quot;Current media URL:\n&amp;quot;+llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0)+&amp;quot;\nTip: If the picture is abit off, try 'Align ON'&amp;quot;,[&amp;quot;Set URL&amp;quot;,&amp;quot;Align ON&amp;quot;,&amp;quot;Align OFF&amp;quot;,&amp;quot;Menu&amp;quot;,&amp;quot;Set Remote&amp;quot;],chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tell_remote(string str)&lt;br /&gt;
{&lt;br /&gt;
    llShout(REMOTE_CHANNEL,llXorBase64Strings(llStringToBase64((string)encryption + str), llStringToBase64((string)encryption)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu(key id)        //Dialog menus for all 3 modes&lt;br /&gt;
{&lt;br /&gt;
    list buttons = [];&lt;br /&gt;
    string title = &amp;quot;** Monitor control **&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    extendtimer();&lt;br /&gt;
&lt;br /&gt;
    if(mode != 0)&lt;br /&gt;
    {&lt;br /&gt;
        if(mode == 1)       //Pictures menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n  Picture Viewer mode&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Browse&amp;quot;];&lt;br /&gt;
            if(loop_image == FALSE)&lt;br /&gt;
                buttons+=[&amp;quot;Loop&amp;quot;];&lt;br /&gt;
            else&lt;br /&gt;
                buttons+=[&amp;quot;Unloop&amp;quot;];&lt;br /&gt;
            buttons+=[&amp;quot;Video&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Fix scale&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        else                //Video menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n Video display mode\n&amp;quot;+moviename+&amp;quot;\nTip:\nClick 'TV Guide' to view the Online bookmarks.&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Pictures&amp;quot;,&amp;quot;Configure&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Loop&amp;quot;,&amp;quot;Unload&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Stop&amp;quot;,&amp;quot;Pause&amp;quot;,&amp;quot;TV Guide&amp;quot;,&amp;quot;Bookmarks&amp;quot;,&amp;quot;Set URL&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        buttons += [&amp;quot;Pictures&amp;quot;,&amp;quot;Video&amp;quot;,&amp;quot;Help&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id,title,buttons,chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
display_texture(integer check)  //Display texture and set name in description (picture mode)&lt;br /&gt;
{                               //&amp;quot;Check&amp;quot; holds the number of textures in contents. The function uses &amp;quot;current_texture&amp;quot; to display.&lt;br /&gt;
    string name = llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    llSetTexture(name,DISPLAY_ON_SIDE);&lt;br /&gt;
    report(&amp;quot;Showing picture: &amp;quot;+name+&amp;quot; (&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
next()  //Change to next texture (picture mode)&lt;br /&gt;
{       //This function is used twice - by the menu and timer. Therefor, it is a dedicated function.&lt;br /&gt;
    current_texture++;&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if(check == current_texture)&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
    &lt;br /&gt;
    display_texture(check);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        chan = (integer)llFrand(1000) + 1000;   //Pick a random listen channel for the listener&lt;br /&gt;
        if(PICTURE_ROTATION_TIMER &amp;lt;= 0)         //Ensure the value is no less or equal 0&lt;br /&gt;
            PICTURE_ROTATION_TIMER = 1;&lt;br /&gt;
        llListenRemove(listenHandle);&lt;br /&gt;
        listenHandle = -1;&lt;br /&gt;
        last_owner = llGetOwner();&lt;br /&gt;
        groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
        off();&lt;br /&gt;
        llOpenRemoteDataChannel();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
        //Listen only to owner or group member. Edit this code to change access controls.&lt;br /&gt;
        if(llDetectedKey(0) != llGetOwner() &amp;amp;&amp;amp; llDetectedGroup(0) == FALSE)&lt;br /&gt;
            return;&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        if(llGetOwnerKey(llGetKey()) != last_owner)  //Sense if object has been deeded to group for Web Guide function&lt;br /&gt;
        {&lt;br /&gt;
            isGroup = TRUE;&lt;br /&gt;
            last_owner = llGetOwner();&lt;br /&gt;
            groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
            &lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Detected change in ownership. Attempting to obtain current parcel media texture...&amp;quot;);&lt;br /&gt;
                video();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        menu(llDetectedKey(0));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change == CHANGED_INVENTORY) //If inventory change&lt;br /&gt;
            if(mode == 1)   //If picture mode&lt;br /&gt;
            {&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    display_texture(check);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                if(mode == 2)   //If video mode&lt;br /&gt;
                    if(finditem(NOTECARD) != -1)    //And bookmarks notecard present&lt;br /&gt;
                        if(notecardkey != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                            tempuser = llGetNumberOfNotecardLines(NOTECARD);    //Reload number of lines&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(message == &amp;quot;Pictures&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
            pictures();&lt;br /&gt;
            mode = 1;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Video&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            video();&lt;br /&gt;
            mode = 2;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Power off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
            off();&lt;br /&gt;
            mode = 0;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Help&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Help documentation is available at: http://www.slguide.com/help&amp;quot;);&lt;br /&gt;
            if(isGroup)&lt;br /&gt;
            {&lt;br /&gt;
                if(id == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(0,&amp;quot;FreeView cannot load help pages while set to group without the remote.&amp;quot;);&lt;br /&gt;
                    llSay(0,&amp;quot;For further assistance, please consult: http://slguide.com/help&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    tell_remote(&amp;quot;HELP&amp;quot;+(string)id+(string)XML_channel);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llLoadURL(id,&amp;quot;Help pages for FreeView&amp;quot;,&amp;quot;http://www.slguide.com?c=&amp;quot;+(string)XML_channel+&amp;quot;&amp;amp;help=1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 1)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Browse&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                next();&lt;br /&gt;
                browse(id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Back&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                current_texture--;&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(current_texture &amp;lt; 0)&lt;br /&gt;
                    current_texture = check - 1;&lt;br /&gt;
                &lt;br /&gt;
                display_texture(check);&lt;br /&gt;
                &lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(PICTURE_ROTATION_TIMER);&lt;br /&gt;
                loop_image = TRUE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture will change every &amp;quot;+(string)PICTURE_ROTATION_TIMER+&amp;quot; seconds.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unloop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture loop disabled.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Fix scale&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Setting display texture to 1,1 repeats and 0,0 offset.&amp;quot;);&lt;br /&gt;
                llScaleTexture(1, 1, DISPLAY_ON_SIDE);&lt;br /&gt;
                llOffsetTexture(0, 0, DISPLAY_ON_SIDE);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 2)&lt;br /&gt;
        {&lt;br /&gt;
            if(channel == REMOTE_CHANNEL)&lt;br /&gt;
            {&lt;br /&gt;
                if(encryption == 0)&lt;br /&gt;
                    encryption = (integer)message;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = -1;&lt;br /&gt;
                llSay(0,&amp;quot;Remote configured (&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
                &lt;br /&gt;
            if(message == &amp;quot;TV Guide&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(isGroup)&lt;br /&gt;
                {&lt;br /&gt;
                    if(!encryption)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSay(0,&amp;quot;** Error - This FreeView object has been deeded to group. You must use a Remote control to open the TV Guide.&amp;quot;);&lt;br /&gt;
                        llSay(0,&amp;quot;You can set up the remote control from the Video -&amp;gt; Configuration menu. Please refer to the notecard for further assistance.&amp;quot;);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    tell_remote((string)id+(string)XML_channel+(string)llGetOwner());&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llLoadURL(id, &amp;quot;Come to the Guide to Start Your Viewer Playing!&amp;quot;, &amp;quot;http://slguide.com/index.php?v=&amp;quot; + (string)llGetKey() + &amp;quot;&amp;amp;c=&amp;quot; + (string)XML_channel + &amp;quot;&amp;amp;o=&amp;quot; + (string)llGetOwner() + &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            string header = &amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: &amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(message == &amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline--;&lt;br /&gt;
                if(notecardline &amp;lt; 0)&lt;br /&gt;
                    notecardline = numberofnotecardlines - 1;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next &amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline++;&lt;br /&gt;
                if(notecardline &amp;gt;= numberofnotecardlines)&lt;br /&gt;
                    notecardline = 0;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Use&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(tempurl == &amp;quot;** No URL specified! **&amp;quot;)&lt;br /&gt;
                    tempurl = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(tempurl,id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
                    &lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Configure&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                config(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Bookmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(notecardcheck != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No valid bookmark data found in notecard '&amp;quot;+NOTECARD+&amp;quot;'.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(finditem(NOTECARD) != -1)                &lt;br /&gt;
                {&lt;br /&gt;
                    tempuser = id;&lt;br /&gt;
                    if(numberofnotecardlines &amp;lt; notecardline)&lt;br /&gt;
                        notecardline = 0;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No notecard named &amp;quot;+NOTECARD+&amp;quot; found in contents.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(llGetLandOwnerAt(llGetPos()) != llGetOwner())    //If we do not have permissions to actually do the following functions&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return; //Abort&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(listenUrl != -1 &amp;amp;&amp;amp; channel == 1) //Incoming data from &amp;quot;Set URL&amp;quot; command (user spoke on channel 1)&lt;br /&gt;
            {&lt;br /&gt;
                llListenRemove(listenUrl);&lt;br /&gt;
                listenUrl = -1;&lt;br /&gt;
                tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(message,id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Play&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Playing&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Stop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Pause&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Paused&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unload&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            //URL , Auto-Scale, &lt;br /&gt;
            if(message == &amp;quot;Set URL&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                listenUrl = llListen(1,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id,&amp;quot;Please type the URL of your choice with /1 in thebegining. For example, /1 www.google.com&amp;quot;,[&amp;quot;Ok&amp;quot;],938);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,FALSE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Set Remote&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Configuring remote...&amp;quot;);&lt;br /&gt;
                encryption = 0;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = llListen(REMOTE_CHANNEL,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
                llSay(REMOTE_CHANNEL,&amp;quot;SETUP&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(queryid == groupcheck)       //Test if object is deeded to group&lt;br /&gt;
        {&lt;br /&gt;
            groupcheck = NULL_KEY;&lt;br /&gt;
            isGroup = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(queryid == tempuser) //If just checking number of notecard lines&lt;br /&gt;
        {&lt;br /&gt;
            numberofnotecardlines = (integer)data;&lt;br /&gt;
            notecardkey = llGetInventoryKey(NOTECARD);&lt;br /&gt;
            notecardcheck = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(notecardcheck != -1)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(data == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck++;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck = -1;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(data == &amp;quot;&amp;quot; &amp;amp;&amp;amp; notecardline &amp;lt; numberofnotecardlines)    //If user just pressed &amp;quot;enter&amp;quot; in bookmarks, skip&lt;br /&gt;
        {&lt;br /&gt;
            notecardline++;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(data == EOF)&lt;br /&gt;
        {&lt;br /&gt;
            notecardline = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list parsed = llParseString2List(data,[&amp;quot;|&amp;quot;,&amp;quot;| &amp;quot;,&amp;quot; |&amp;quot;,&amp;quot; | &amp;quot;],[]);    //Ensure no blank spaces before &amp;quot;http://&amp;quot;.&lt;br /&gt;
        string name = llList2String(parsed,0);&lt;br /&gt;
        tempurl = llList2String(parsed,1);&lt;br /&gt;
        if(tempurl == &amp;quot;&amp;quot;)&lt;br /&gt;
            tempurl = &amp;quot;** No URL specified! **&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
        tempmoviename = name;&lt;br /&gt;
                &lt;br /&gt;
        llDialog(tempuser,&amp;quot;Bookmarks notecard (&amp;quot;+(string)(notecardline+1)+&amp;quot;/&amp;quot;+(string)numberofnotecardlines+&amp;quot;)\n&amp;quot;+name+&amp;quot; (&amp;quot;+mediatype(llList2String(llParseString2List(tempurl,[&amp;quot;.&amp;quot;],[]),-1))+&amp;quot;)\n&amp;quot;+tempurl,[&amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;,&amp;quot;Use&amp;quot;,&amp;quot;Next &amp;gt;&amp;gt;&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval)&lt;br /&gt;
    {&lt;br /&gt;
        if (type == REMOTE_DATA_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            XML_channel = channel;&lt;br /&gt;
        } &lt;br /&gt;
        else if(type == REMOTE_DATA_REQUEST)&lt;br /&gt;
        {&lt;br /&gt;
            list media_info = llParseString2List(sval, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            tempmoviename = llList2String(media_info,0);&lt;br /&gt;
            seturl(llList2String(media_info,1),NULL_KEY);&lt;br /&gt;
            llRemoteDataReply(channel, message_id, sval, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime() &amp;gt; listenTimer)       //If listener time expired...&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listenHandle);   //Remove listeneres.&lt;br /&gt;
            llListenRemove(listenUrl);&lt;br /&gt;
            llListenRemove(listenRemote);&lt;br /&gt;
            listenHandle = -1;&lt;br /&gt;
            listenUrl = -1;&lt;br /&gt;
            listenRemote = -1;&lt;br /&gt;
            listenTimer = -1;&lt;br /&gt;
            if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all&lt;br /&gt;
                llSetTimerEvent(0.0);   //Remove timer&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(loop_image == TRUE &amp;amp;&amp;amp; mode == 1) //If we're looping pictures and and we're in picture mode...&lt;br /&gt;
            next(); //Next picture&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categories:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T04:24:54Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
Creating a Media Screen in OpenSim&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
General Steps&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
=== Freeview Code ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//XEngine:&lt;br /&gt;
//FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo&lt;br /&gt;
//Multifunctional Picture viewer and Video control script with webguide support&lt;br /&gt;
//This script is distributed for free and must stay that way. &lt;br /&gt;
&lt;br /&gt;
//              *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. ***&lt;br /&gt;
&lt;br /&gt;
//Help for using this script can be obtained at: http://www.slguide.com/help&lt;br /&gt;
&lt;br /&gt;
//Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom.&lt;br /&gt;
 &lt;br /&gt;
//Whats new:&lt;br /&gt;
//- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display&lt;br /&gt;
//- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init.&lt;br /&gt;
//- Renamed WebGuide to TV-Guide to reflect what this thing does better.&lt;br /&gt;
//- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes.&lt;br /&gt;
//- Additional minor help-tips and code improvements&lt;br /&gt;
&lt;br /&gt;
//Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
integer PICTURE_ROTATION_TIMER = 60;   //In whole seconds&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed&lt;br /&gt;
&lt;br /&gt;
key VIDEO_DEFAULT = &amp;quot;71b8ff26-087d-5f44-285b-d38df2e11a81&amp;quot;;  //Test pattern - Used as default video texture when one is missing in parcel media&lt;br /&gt;
key BLANK = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; //Blank texture - Used when there are no textures to display in Picture mode&lt;br /&gt;
string NOTECARD = &amp;quot;bookmarks&amp;quot;;  //Used to host URL bookmarks for video streams&lt;br /&gt;
&lt;br /&gt;
integer VIDEO_BRIGHT = TRUE;    //FULL_BRIGHT status for Video&lt;br /&gt;
integer PICTURE_BRIGHT = TRUE;  //FULL_BRIGHT status for Picture&lt;br /&gt;
&lt;br /&gt;
integer REMOTE_CHANNEL = 9238742;&lt;br /&gt;
&lt;br /&gt;
integer mode = 0;           //Freeview mode.&lt;br /&gt;
                            //Mode 0 - Power off&lt;br /&gt;
                            //Mode 1 - Picture viewer&lt;br /&gt;
                            //Mode 2 - Video&lt;br /&gt;
&lt;br /&gt;
integer listenHandle = -1;      //Dialog menu listen handler&lt;br /&gt;
integer listenUrl = -1;         //listen handler for channel 1 for when a URL is being added&lt;br /&gt;
integer listenTimer = -1;       //Timer variable for removing all listeners after 2 minutes of listener inactivity&lt;br /&gt;
integer listenRemote = -1;      //listen handler for the remote during initial setup&lt;br /&gt;
integer encryption = 0;&lt;br /&gt;
integer numberofnotecardlines = 0;  //Stores the current number of detected notecard lines.&lt;br /&gt;
integer notecardline = 0;       //Current notecard line&lt;br /&gt;
&lt;br /&gt;
integer loop_image = FALSE;     //Are we looping pictures with a timer? (picture mode)&lt;br /&gt;
integer current_texture = 0;    //Current texture number in inventory being displayed (picture mode)&lt;br /&gt;
integer chan;                   //llDialog listen channel&lt;br /&gt;
integer notecardcheck = 0;&lt;br /&gt;
key video_texture;              //Currently used video display texture for parcel media stream&lt;br /&gt;
&lt;br /&gt;
string moviename;&lt;br /&gt;
string tempmoviename;&lt;br /&gt;
key notecardkey = NULL_KEY;&lt;br /&gt;
key tempuser;                   //Temp key storge variable&lt;br /&gt;
string tempurl;                 //Temp string storge variable&lt;br /&gt;
&lt;br /&gt;
integer isGroup = TRUE;&lt;br /&gt;
key groupcheck = NULL_KEY;&lt;br /&gt;
key last_owner;&lt;br /&gt;
key XML_channel;&lt;br /&gt;
&lt;br /&gt;
pictures()      //Change mode to Picture Viewer&lt;br /&gt;
{&lt;br /&gt;
    //Initilize variables&lt;br /&gt;
    &lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, PICTURE_BRIGHT]);&lt;br /&gt;
&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
     &lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else    &lt;br /&gt;
        if(current_texture &amp;gt; check)&lt;br /&gt;
            //Set to first texture if available&lt;br /&gt;
            current_texture = 0;&lt;br /&gt;
            &lt;br /&gt;
    display_texture(current_texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
video()         //Change mode to Video&lt;br /&gt;
{&lt;br /&gt;
    //Change prim to Light material while coloring face 0 black to prevent light-lag generation.&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_NONE, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;1,1,1&amp;gt;, 1.0, PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, VIDEO_BRIGHT, PRIM_TEXTURE, DISPLAY_ON_SIDE, &amp;quot;62dc73ca-265f-7ca0-0453-e2a6aa60bb6f&amp;quot;, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
    &lt;br /&gt;
    report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Stopped&amp;quot;);&lt;br /&gt;
    if(finditem(NOTECARD) != -1)&lt;br /&gt;
        tempuser = llGetNumberOfNotecardLines(NOTECARD);&lt;br /&gt;
    video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]),0);&lt;br /&gt;
    if(video_texture == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        video_texture = VIDEO_DEFAULT;&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE,VIDEO_DEFAULT]);&lt;br /&gt;
        llSay(0,&amp;quot;No parcel media texture found. Setting texture to default: &amp;quot;+(string)VIDEO_DEFAULT);&lt;br /&gt;
        if(llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetTexture(video_texture,DISPLAY_ON_SIDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    report(&amp;quot;Click to power on.&amp;quot;);&lt;br /&gt;
    llSetPrimitiveParams([PRIM_BUMP_SHINY, DISPLAY_ON_SIDE, PRIM_SHINY_LOW, PRIM_BUMP_NONE, PRIM_COLOR, DISPLAY_ON_SIDE, &amp;lt;0.1,0.1,0.1&amp;gt;, 1.0,PRIM_MATERIAL, PRIM_MATERIAL_PLASTIC, PRIM_FULLBRIGHT, DISPLAY_ON_SIDE, FALSE, PRIM_TEXTURE, DISPLAY_ON_SIDE, BLANK, llGetTextureScale(DISPLAY_ON_SIDE), llGetTextureOffset(DISPLAY_ON_SIDE), llGetTextureRot(DISPLAY_ON_SIDE)]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer finditem(string name)   //Finds and returns an item's inventory number&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetInventoryNumber(INVENTORY_NOTECARD);i++)&lt;br /&gt;
        if(llGetInventoryName(INVENTORY_NOTECARD,i) == NOTECARD)&lt;br /&gt;
            return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
seturl(string url, key id)  //Set parcel media URL&lt;br /&gt;
{&lt;br /&gt;
    if(mode != 2)&lt;br /&gt;
    {&lt;br /&gt;
        video();&lt;br /&gt;
        mode = 2;&lt;br /&gt;
    }&lt;br /&gt;
    moviename = tempmoviename;&lt;br /&gt;
    if(moviename)&lt;br /&gt;
        moviename = &amp;quot; [&amp;quot;+moviename+&amp;quot;]&amp;quot;;&lt;br /&gt;
    tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
    string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0);&lt;br /&gt;
    if(oldurl != &amp;quot;&amp;quot;)&lt;br /&gt;
        llOwnerSay(&amp;quot;Setting new media URL. The old URL was: &amp;quot;+oldurl);&lt;br /&gt;
&lt;br /&gt;
    llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);&lt;br /&gt;
    if(id!=NULL_KEY)&lt;br /&gt;
        menu(id);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        report(&amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: Playing&amp;quot;);&lt;br /&gt;
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
    if(isGroup)&lt;br /&gt;
        llSay(0,&amp;quot;New media URL set.&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;New media URL set: &amp;quot;+url);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string mediatype(string ext)    //Returns a string stating the filetype of a file based on file extension&lt;br /&gt;
{&lt;br /&gt;
    ext = llToLower(ext);&lt;br /&gt;
    if(ext == &amp;quot;swf&amp;quot;)&lt;br /&gt;
        return &amp;quot;Flash&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mov&amp;quot; || ext == &amp;quot;avi&amp;quot; || ext == &amp;quot;mpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;smil&amp;quot;)&lt;br /&gt;
        return &amp;quot;Video&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;jpg&amp;quot; || ext == &amp;quot;mpeg&amp;quot; || ext == &amp;quot;gif&amp;quot; || ext == &amp;quot;png&amp;quot; || ext == &amp;quot;pict&amp;quot; || ext == &amp;quot;tga&amp;quot; || ext == &amp;quot;tiff&amp;quot; || ext == &amp;quot;sgi&amp;quot; || ext == &amp;quot;bmp&amp;quot;)&lt;br /&gt;
        return &amp;quot;Image&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;txt&amp;quot;)&lt;br /&gt;
        return &amp;quot;Text&amp;quot;;&lt;br /&gt;
    if(ext == &amp;quot;mp3&amp;quot; || ext == &amp;quot;wav&amp;quot;)&lt;br /&gt;
        return &amp;quot;Audio&amp;quot;;&lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
browse(key id)      //Image browser function for picture viewer mode&lt;br /&gt;
{&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    string header;&lt;br /&gt;
    if(check &amp;gt; 0)&lt;br /&gt;
        header = &amp;quot;(&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;) &amp;quot;+llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    else&lt;br /&gt;
        header = &amp;quot;No pictures found.&amp;quot;;&lt;br /&gt;
    llDialog(id,&amp;quot;** Monitor Control **\n Picture Viewer mode\n- Image browser\n- &amp;quot;+header,[&amp;quot;Back&amp;quot;,&amp;quot;Next&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    extendtimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
report(string str)&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectDesc(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extendtimer()       //Add another 2 minute to the Listen Removal timer (use when a Listen event is triggered)&lt;br /&gt;
{&lt;br /&gt;
    if(listenHandle == -1)&lt;br /&gt;
        listenHandle = llListen(chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    listenTimer = (integer)llGetTime() + 120;&lt;br /&gt;
    if(loop_image == FALSE)&lt;br /&gt;
        llSetTimerEvent(45);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
config(key id)      //Configuration menu&lt;br /&gt;
{&lt;br /&gt;
    extendtimer();&lt;br /&gt;
    llDialog(id,&amp;quot;Current media URL:\n&amp;quot;+llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]),0)+&amp;quot;\nTip: If the picture is abit off, try 'Align ON'&amp;quot;,[&amp;quot;Set URL&amp;quot;,&amp;quot;Align ON&amp;quot;,&amp;quot;Align OFF&amp;quot;,&amp;quot;Menu&amp;quot;,&amp;quot;Set Remote&amp;quot;],chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tell_remote(string str)&lt;br /&gt;
{&lt;br /&gt;
    llShout(REMOTE_CHANNEL,llXorBase64Strings(llStringToBase64((string)encryption + str), llStringToBase64((string)encryption)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu(key id)        //Dialog menus for all 3 modes&lt;br /&gt;
{&lt;br /&gt;
    list buttons = [];&lt;br /&gt;
    string title = &amp;quot;** Monitor control **&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    extendtimer();&lt;br /&gt;
&lt;br /&gt;
    if(mode != 0)&lt;br /&gt;
    {&lt;br /&gt;
        if(mode == 1)       //Pictures menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n  Picture Viewer mode&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Browse&amp;quot;];&lt;br /&gt;
            if(loop_image == FALSE)&lt;br /&gt;
                buttons+=[&amp;quot;Loop&amp;quot;];&lt;br /&gt;
            else&lt;br /&gt;
                buttons+=[&amp;quot;Unloop&amp;quot;];&lt;br /&gt;
            buttons+=[&amp;quot;Video&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Fix scale&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        else                //Video menu&lt;br /&gt;
        {&lt;br /&gt;
            title+=&amp;quot;\n Video display mode\n&amp;quot;+moviename+&amp;quot;\nTip:\nClick 'TV Guide' to view the Online bookmarks.&amp;quot;;&lt;br /&gt;
            buttons+=[&amp;quot;Pictures&amp;quot;,&amp;quot;Configure&amp;quot;,&amp;quot;Power off&amp;quot;,&amp;quot;Loop&amp;quot;,&amp;quot;Unload&amp;quot;,&amp;quot;Help&amp;quot;,&amp;quot;Play&amp;quot;,&amp;quot;Stop&amp;quot;,&amp;quot;Pause&amp;quot;,&amp;quot;TV Guide&amp;quot;,&amp;quot;Bookmarks&amp;quot;,&amp;quot;Set URL&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        buttons += [&amp;quot;Pictures&amp;quot;,&amp;quot;Video&amp;quot;,&amp;quot;Help&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id,title,buttons,chan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
display_texture(integer check)  //Display texture and set name in description (picture mode)&lt;br /&gt;
{                               //&amp;quot;Check&amp;quot; holds the number of textures in contents. The function uses &amp;quot;current_texture&amp;quot; to display.&lt;br /&gt;
    string name = llGetInventoryName(INVENTORY_TEXTURE,current_texture);&lt;br /&gt;
    llSetTexture(name,DISPLAY_ON_SIDE);&lt;br /&gt;
    report(&amp;quot;Showing picture: &amp;quot;+name+&amp;quot; (&amp;quot;+(string)(current_texture+1)+&amp;quot;/&amp;quot;+(string)check+&amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
next()  //Change to next texture (picture mode)&lt;br /&gt;
{       //This function is used twice - by the menu and timer. Therefor, it is a dedicated function.&lt;br /&gt;
    current_texture++;&lt;br /&gt;
    integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
    if(check == 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
        report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if(check == current_texture)&lt;br /&gt;
        current_texture = 0;&lt;br /&gt;
    &lt;br /&gt;
    display_texture(check);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        chan = (integer)llFrand(1000) + 1000;   //Pick a random listen channel for the listener&lt;br /&gt;
        if(PICTURE_ROTATION_TIMER &amp;lt;= 0)         //Ensure the value is no less or equal 0&lt;br /&gt;
            PICTURE_ROTATION_TIMER = 1;&lt;br /&gt;
        llListenRemove(listenHandle);&lt;br /&gt;
        listenHandle = -1;&lt;br /&gt;
        last_owner = llGetOwner();&lt;br /&gt;
        groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
        off();&lt;br /&gt;
        llOpenRemoteDataChannel();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
        //Listen only to owner or group member. Edit this code to change access controls.&lt;br /&gt;
        if(llDetectedKey(0) != llGetOwner() &amp;amp;&amp;amp; llDetectedGroup(0) == FALSE)&lt;br /&gt;
            return;&lt;br /&gt;
        //-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        if(llGetOwnerKey(llGetKey()) != last_owner)  //Sense if object has been deeded to group for Web Guide function&lt;br /&gt;
        {&lt;br /&gt;
            isGroup = TRUE;&lt;br /&gt;
            last_owner = llGetOwner();&lt;br /&gt;
            groupcheck = llRequestAgentData(llGetOwner(),DATA_NAME);&lt;br /&gt;
            &lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Detected change in ownership. Attempting to obtain current parcel media texture...&amp;quot;);&lt;br /&gt;
                video();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        menu(llDetectedKey(0));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change == CHANGED_INVENTORY) //If inventory change&lt;br /&gt;
            if(mode == 1)   //If picture mode&lt;br /&gt;
            {&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    display_texture(check);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                if(mode == 2)   //If video mode&lt;br /&gt;
                    if(finditem(NOTECARD) != -1)    //And bookmarks notecard present&lt;br /&gt;
                        if(notecardkey != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                            tempuser = llGetNumberOfNotecardLines(NOTECARD);    //Reload number of lines&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(message == &amp;quot;Pictures&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
            pictures();&lt;br /&gt;
            mode = 1;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Video&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            video();&lt;br /&gt;
            mode = 2;&lt;br /&gt;
            menu(id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Power off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(mode == 2)&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
            off();&lt;br /&gt;
            mode = 0;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(message == &amp;quot;Help&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Help documentation is available at: http://www.slguide.com/help&amp;quot;);&lt;br /&gt;
            if(isGroup)&lt;br /&gt;
            {&lt;br /&gt;
                if(id == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(0,&amp;quot;FreeView cannot load help pages while set to group without the remote.&amp;quot;);&lt;br /&gt;
                    llSay(0,&amp;quot;For further assistance, please consult: http://slguide.com/help&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    tell_remote(&amp;quot;HELP&amp;quot;+(string)id+(string)XML_channel);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llLoadURL(id,&amp;quot;Help pages for FreeView&amp;quot;,&amp;quot;http://www.slguide.com?c=&amp;quot;+(string)XML_channel+&amp;quot;&amp;amp;help=1&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 1)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Browse&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                next();&lt;br /&gt;
                browse(id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Back&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                extendtimer();&lt;br /&gt;
                current_texture--;&lt;br /&gt;
                integer check = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
                if(check == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTexture(BLANK,DISPLAY_ON_SIDE);&lt;br /&gt;
                    current_texture = 0;&lt;br /&gt;
                    report(&amp;quot;No pictures found.&amp;quot;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(current_texture &amp;lt; 0)&lt;br /&gt;
                    current_texture = check - 1;&lt;br /&gt;
                &lt;br /&gt;
                display_texture(check);&lt;br /&gt;
                &lt;br /&gt;
                browse(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(PICTURE_ROTATION_TIMER);&lt;br /&gt;
                loop_image = TRUE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture will change every &amp;quot;+(string)PICTURE_ROTATION_TIMER+&amp;quot; seconds.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unloop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                loop_image = FALSE;&lt;br /&gt;
                llOwnerSay(&amp;quot;Picture loop disabled.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Fix scale&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Setting display texture to 1,1 repeats and 0,0 offset.&amp;quot;);&lt;br /&gt;
                llScaleTexture(1, 1, DISPLAY_ON_SIDE);&lt;br /&gt;
                llOffsetTexture(0, 0, DISPLAY_ON_SIDE);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(mode == 2)&lt;br /&gt;
        {&lt;br /&gt;
            if(channel == REMOTE_CHANNEL)&lt;br /&gt;
            {&lt;br /&gt;
                if(encryption == 0)&lt;br /&gt;
                    encryption = (integer)message;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = -1;&lt;br /&gt;
                llSay(0,&amp;quot;Remote configured (&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
                &lt;br /&gt;
            if(message == &amp;quot;TV Guide&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(isGroup)&lt;br /&gt;
                {&lt;br /&gt;
                    if(!encryption)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSay(0,&amp;quot;** Error - This FreeView object has been deeded to group. You must use a Remote control to open the TV Guide.&amp;quot;);&lt;br /&gt;
                        llSay(0,&amp;quot;You can set up the remote control from the Video -&amp;gt; Configuration menu. Please refer to the notecard for further assistance.&amp;quot;);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    tell_remote((string)id+(string)XML_channel+(string)llGetOwner());&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llLoadURL(id, &amp;quot;Come to the Guide to Start Your Viewer Playing!&amp;quot;, &amp;quot;http://slguide.com/index.php?v=&amp;quot; + (string)llGetKey() + &amp;quot;&amp;amp;c=&amp;quot; + (string)XML_channel + &amp;quot;&amp;amp;o=&amp;quot; + (string)llGetOwner() + &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            string header = &amp;quot;Video mode&amp;quot;+moviename+&amp;quot;: &amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(message == &amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline--;&lt;br /&gt;
                if(notecardline &amp;lt; 0)&lt;br /&gt;
                    notecardline = numberofnotecardlines - 1;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Next &amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                notecardline++;&lt;br /&gt;
                if(notecardline &amp;gt;= numberofnotecardlines)&lt;br /&gt;
                    notecardline = 0;&lt;br /&gt;
                tempuser = id;&lt;br /&gt;
                llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Use&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(tempurl == &amp;quot;** No URL specified! **&amp;quot;)&lt;br /&gt;
                    tempurl = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(tempurl,id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
                    &lt;br /&gt;
            if(message == &amp;quot;Menu&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Configure&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                config(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Bookmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if(notecardcheck != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No valid bookmark data found in notecard '&amp;quot;+NOTECARD+&amp;quot;'.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                if(finditem(NOTECARD) != -1)                &lt;br /&gt;
                {&lt;br /&gt;
                    tempuser = id;&lt;br /&gt;
                    if(numberofnotecardlines &amp;lt; notecardline)&lt;br /&gt;
                        notecardline = 0;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,&amp;quot;Error: No notecard named &amp;quot;+NOTECARD+&amp;quot; found in contents.&amp;quot;,[&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(llGetLandOwnerAt(llGetPos()) != llGetOwner())    //If we do not have permissions to actually do the following functions&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Error: Cannot modify parcel media settings. &amp;quot;+llGetObjectName()+&amp;quot; is not owned by parcel owner.&amp;quot;);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return; //Abort&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(listenUrl != -1 &amp;amp;&amp;amp; channel == 1) //Incoming data from &amp;quot;Set URL&amp;quot; command (user spoke on channel 1)&lt;br /&gt;
            {&lt;br /&gt;
                llListenRemove(listenUrl);&lt;br /&gt;
                listenUrl = -1;&lt;br /&gt;
                tempmoviename = &amp;quot;&amp;quot;;&lt;br /&gt;
                seturl(message,id);&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Play&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Playing&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Stop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Pause&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Paused&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Unload&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Loop&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            //URL , Auto-Scale, &lt;br /&gt;
            if(message == &amp;quot;Set URL&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                listenUrl = llListen(1,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id,&amp;quot;Please type the URL of your choice with /1 in thebegining. For example, /1 www.google.com&amp;quot;,[&amp;quot;Ok&amp;quot;],938);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Align OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                report(header+&amp;quot;Stopped&amp;quot;);&lt;br /&gt;
                llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,FALSE]);&lt;br /&gt;
                menu(id);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(message == &amp;quot;Set Remote&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSay(0,&amp;quot;Configuring remote...&amp;quot;);&lt;br /&gt;
                encryption = 0;&lt;br /&gt;
                llListenRemove(listenRemote);&lt;br /&gt;
                listenRemote = llListen(REMOTE_CHANNEL,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
                llSay(REMOTE_CHANNEL,&amp;quot;SETUP&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(queryid == groupcheck)       //Test if object is deeded to group&lt;br /&gt;
        {&lt;br /&gt;
            groupcheck = NULL_KEY;&lt;br /&gt;
            isGroup = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(queryid == tempuser) //If just checking number of notecard lines&lt;br /&gt;
        {&lt;br /&gt;
            numberofnotecardlines = (integer)data;&lt;br /&gt;
            notecardkey = llGetInventoryKey(NOTECARD);&lt;br /&gt;
            notecardcheck = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(notecardcheck != -1)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(data == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck++;&lt;br /&gt;
                    llGetNotecardLine(NOTECARD,notecardcheck);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    notecardcheck = -1;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(data == &amp;quot;&amp;quot; &amp;amp;&amp;amp; notecardline &amp;lt; numberofnotecardlines)    //If user just pressed &amp;quot;enter&amp;quot; in bookmarks, skip&lt;br /&gt;
        {&lt;br /&gt;
            notecardline++;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(data == EOF)&lt;br /&gt;
        {&lt;br /&gt;
            notecardline = 0;&lt;br /&gt;
            llGetNotecardLine(NOTECARD,notecardline);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list parsed = llParseString2List(data,[&amp;quot;|&amp;quot;,&amp;quot;| &amp;quot;,&amp;quot; |&amp;quot;,&amp;quot; | &amp;quot;],[]);    //Ensure no blank spaces before &amp;quot;http://&amp;quot;.&lt;br /&gt;
        string name = llList2String(parsed,0);&lt;br /&gt;
        tempurl = llList2String(parsed,1);&lt;br /&gt;
        if(tempurl == &amp;quot;&amp;quot;)&lt;br /&gt;
            tempurl = &amp;quot;** No URL specified! **&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
        tempmoviename = name;&lt;br /&gt;
                &lt;br /&gt;
        llDialog(tempuser,&amp;quot;Bookmarks notecard (&amp;quot;+(string)(notecardline+1)+&amp;quot;/&amp;quot;+(string)numberofnotecardlines+&amp;quot;)\n&amp;quot;+name+&amp;quot; (&amp;quot;+mediatype(llList2String(llParseString2List(tempurl,[&amp;quot;.&amp;quot;],[]),-1))+&amp;quot;)\n&amp;quot;+tempurl,[&amp;quot;&amp;lt;&amp;lt; Prev&amp;quot;,&amp;quot;Use&amp;quot;,&amp;quot;Next &amp;gt;&amp;gt;&amp;quot;,&amp;quot;Menu&amp;quot;],chan);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval)&lt;br /&gt;
    {&lt;br /&gt;
        if (type == REMOTE_DATA_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            XML_channel = channel;&lt;br /&gt;
        } &lt;br /&gt;
        else if(type == REMOTE_DATA_REQUEST)&lt;br /&gt;
        {&lt;br /&gt;
            list media_info = llParseString2List(sval, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            tempmoviename = llList2String(media_info,0);&lt;br /&gt;
            seturl(llList2String(media_info,1),NULL_KEY);&lt;br /&gt;
            llRemoteDataReply(channel, message_id, sval, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime() &amp;gt; listenTimer)       //If listener time expired...&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listenHandle);   //Remove listeneres.&lt;br /&gt;
            llListenRemove(listenUrl);&lt;br /&gt;
            llListenRemove(listenRemote);&lt;br /&gt;
            listenHandle = -1;&lt;br /&gt;
            listenUrl = -1;&lt;br /&gt;
            listenRemote = -1;&lt;br /&gt;
            listenTimer = -1;&lt;br /&gt;
            if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all&lt;br /&gt;
                llSetTimerEvent(0.0);   //Remove timer&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(loop_image == TRUE &amp;amp;&amp;amp; mode == 1) //If we're looping pictures and and we're in picture mode...&lt;br /&gt;
            next(); //Next picture&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categories:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Streaming_Media_in_OpenSim</id>
		<title>Streaming Media in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Streaming_Media_in_OpenSim"/>
				<updated>2009-02-08T04:15:12Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Streaming media in OpenSim works the same way as in SL. One of the most frequent misconceptions about streaming content in OpenSim is the simulator or regions server is actually doing the streaming. This is not true, all streaming happens outside of the metaverse on a seperate dedicated server. The streaming content is fed directly to Quicktime from the viewer. Generally anything able to be played in Quicktime can be viewed in OpenSim through your viewer. Streaming does not impact the performance of the simulator since all content is sent to the viewer and Quicktime player. &lt;br /&gt;
&lt;br /&gt;
== QuickTime 7 Supported Audio/Video Formats ==&lt;br /&gt;
Current supported formats as listed by Apple are:&lt;br /&gt;
&lt;br /&gt;
=== Supported Video Formats ===&lt;br /&gt;
*Animation &lt;br /&gt;
*Apple BMP &lt;br /&gt;
*Apple Pixlet (Mac OS X v10.3 only) &lt;br /&gt;
*Apple Video &lt;br /&gt;
*Cinepak &lt;br /&gt;
*Component video &lt;br /&gt;
*DV and DVC Pro NTSC &lt;br /&gt;
*DV PAL &lt;br /&gt;
*DVC Pro PAL &lt;br /&gt;
*Graphics &lt;br /&gt;
*H.261 &lt;br /&gt;
*H.263 &lt;br /&gt;
*H.264 &lt;br /&gt;
*JPEG 2000 &lt;br /&gt;
*Microsoft OLE (decode only) &lt;br /&gt;
*Microsoft Video 1 (decode only) &lt;br /&gt;
*Motion JPEG A &lt;br /&gt;
*Motion JPEG B &lt;br /&gt;
*MPEG-4 (Part 2) &lt;br /&gt;
*Photo JPEG &lt;br /&gt;
*Planar RGB &lt;br /&gt;
*PNG &lt;br /&gt;
*Sorenson Video 2 &lt;br /&gt;
*Sorenson Video 3 &lt;br /&gt;
*TGA &lt;br /&gt;
*TIFF &lt;br /&gt;
=== Supported Audio Formats ===&lt;br /&gt;
*24-bit integer &lt;br /&gt;
*32-bit floating point &lt;br /&gt;
*32-bit integer &lt;br /&gt;
*64-bit floating point &lt;br /&gt;
*AAC (MPEG-4 Audio) &lt;br /&gt;
*ALaw 2:1 &lt;br /&gt;
*AMR Narrowband &lt;br /&gt;
*Apple Lossless Encoder &lt;br /&gt;
*IMA 4:1 &lt;br /&gt;
*MACE 3:1 &lt;br /&gt;
*MACE 6:1 &lt;br /&gt;
*MS ADPCM (decode only) &lt;br /&gt;
*QDesign Music 2 &lt;br /&gt;
*Qualcomm PureVoice (QCELP) &lt;br /&gt;
*ULaw 2:1&lt;br /&gt;
&lt;br /&gt;
Creating a Media Screen in OpenSim&lt;br /&gt;
&lt;br /&gt;
Now that you understand some of the fundamentals of what is going on with media content in OpenSim you are probably wanting to get started creating a video area so you and your friends can enjoy watching or listening to some media together. The best free script that I have come across is Freeview. The code for this script is listed below and you can simply copy and paste it into a script window to get you started.&lt;br /&gt;
&lt;br /&gt;
General Steps&lt;br /&gt;
#Make sure you have a texture picked out to use as a media texture. Streaming media has to be displayed on a texture and unless you want to see your media playing all over the place make sure the texture is unique to just the prim you want to use as a view screen.&lt;br /&gt;
#Create a prim that will display the media. &lt;br /&gt;
#For a good looking display choose a blank texture with a black color for all sides.&lt;br /&gt;
#Select just the prim face for the screen and make the texture your media texture from Step 1 and choose white for the color.&lt;br /&gt;
#Drop the Freeview script into the Contents tab.&lt;br /&gt;
#In the About Land window Media tab change your Replace Texture to the one in Step 1.&lt;br /&gt;
#In the About Land window General tab make sure the Allow Deed To Group item is checked.&lt;br /&gt;
&lt;br /&gt;
At this point if your script compiled correctly then you should be able to click on the media view screen and a menu will pop up. A good test would be to choose the Video button and then the Set URL button. In the chat window type /1 and then a URL to a video that you know exists on a streaming server. The video should begin playing within a minute or so.&lt;br /&gt;
&lt;br /&gt;
[[Categories:Media]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2009-02-04T19:12:50Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* The goals are: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test.oar&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2.oar&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
'''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
'''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db OpenSim.ini *.oar ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
'''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''When the server finishes booting (if you get NHibernate errors see Additional Info below) reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test.oar&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2.oar&lt;br /&gt;
&lt;br /&gt;
'''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
[[Category:Upgrading]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Build_Instructions</id>
		<title>Build Instructions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Build_Instructions"/>
				<updated>2009-01-22T04:15:24Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Users]]&lt;br /&gt;
This page covers building OpenSim from source code on multiple platforms.  Please help us keep this page up to date as the project progresses.&lt;br /&gt;
&lt;br /&gt;
==Download from SVN==&lt;br /&gt;
Check out the [[Download]] Section&lt;br /&gt;
&lt;br /&gt;
==MS Windows==&lt;br /&gt;
&lt;br /&gt;
OpenSim requires either the .Net framework version 2.0, or the latest Mono. It supports the following compilers:&lt;br /&gt;
* [http://msdn2.microsoft.com/en-us/express/aa700756.aspx Microsoft Visual C# Express Edition] (note: not Visual C++)&lt;br /&gt;
* [http://www.mono-project.com/ mono]&lt;br /&gt;
&lt;br /&gt;
Note for people who just downloaded the sources from http://dist.opensimulator.org/ (the &amp;quot;Downloads&amp;quot; link on the left) be advised that some important things are missing (like MySQL template scripts). For such features, you must download using svn!&lt;br /&gt;
&lt;br /&gt;
Additional note: any Microsoft C# Express edition should work (2005 or 2008)&lt;br /&gt;
&lt;br /&gt;
Additional note: It is possible to develope on Windows Vista 64 bits with the following tweaks:&lt;br /&gt;
# Select OpenSim project properties from solution and choose platform to be x86. Rebuild solution.&lt;br /&gt;
# Select OpenSim.exe properties under solution bin folder and choose windows xp sp 2 compatibility mode + run as administrator.&lt;br /&gt;
&lt;br /&gt;
=== Building ===&lt;br /&gt;
&lt;br /&gt;
* In the top-level directory, run the '&amp;lt;tt&amp;gt;runprebuild.bat&amp;lt;/tt&amp;gt;' file. This will create a VS2005 solution file, a nant build file and a '&amp;lt;tt&amp;gt;compile.bat&amp;lt;/tt&amp;gt;' file.&lt;br /&gt;
* If you prefer VS2008, run the '&amp;lt;tt&amp;gt;runprebuild2008.bat&amp;lt;/tt&amp;gt;' instead.&lt;br /&gt;
&lt;br /&gt;
* Open the resulting sln file with visual studio and build it there, or&lt;br /&gt;
* Run the '&amp;lt;tt&amp;gt;compile.bat&amp;lt;/tt&amp;gt;' file. This will build the executable using MSBuild.&lt;br /&gt;
* if you prefer to use nant, run nant in the same top-level directory. This will build the executables.&lt;br /&gt;
&lt;br /&gt;
If you don't care about physics (walking on prims, etc), ignore the rest of this section.&lt;br /&gt;
&lt;br /&gt;
=== Running ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of OpenSim come without an &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt; file. Copy the &amp;lt;tt&amp;gt;OpenSim.ini.example&amp;lt;/tt&amp;gt; file to &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt; before making any changes.&lt;br /&gt;
&lt;br /&gt;
Double-click on the &amp;lt;tt&amp;gt;OpenSim.exe&amp;lt;/tt&amp;gt; executable file in the &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory. This will start up OpenSim in standalone mode.&lt;br /&gt;
&lt;br /&gt;
The debugger in VS2005 C# may be used to step through the code. For those that use a Cygwin shell, you may find that one or more dll's have permissions that cause problems running. Most find that a &amp;quot;&amp;lt;tt&amp;gt;chmod 777 *&amp;lt;/tt&amp;gt;&amp;quot; from the &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory solves this.&lt;br /&gt;
&lt;br /&gt;
Physics can be invoked by adding the appropriate line to the [Startup] section of &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt;.  For ODE, that would be:&lt;br /&gt;
&lt;br /&gt;
 physics = OpenDynamicsEngine&lt;br /&gt;
&lt;br /&gt;
You can also add a command line option to a shortcut, or run from a command prompt with:&lt;br /&gt;
&lt;br /&gt;
 -physics=OpenDynamicsEngine&lt;br /&gt;
&lt;br /&gt;
'''''Windows Vista'''''&lt;br /&gt;
&lt;br /&gt;
Some people have reported that to run on Windows Vista, you must first disable Windows Firewall.  Under the new &amp;quot;Start&amp;quot; button of Vista, select &amp;quot;Control panel&amp;quot;.  Then double-click &amp;quot;Windows Firewall&amp;quot;.  In the window that pops up, on the left column, select &amp;quot;Turn Windows Firewall on or off&amp;quot;.  You will have to give permission for this to run, then select the option &amp;quot;Off (not recommended)&amp;quot;.  Click &amp;quot;OK&amp;quot; and exit from the Windows Firewall window.&lt;br /&gt;
&lt;br /&gt;
If you have McAfee SecurityCenter, see the description below.&lt;br /&gt;
&lt;br /&gt;
Once all the security features are disabled, right click on &amp;lt;tt&amp;gt;OpenSim.exe&amp;lt;/tt&amp;gt; and select &amp;quot;Run as administrator&amp;quot;.  This will pop up a window asking permission, select &amp;quot;Allow&amp;quot;.  Your OpenSim server should run in a DOS-like window and accept connections.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''McAfee Security'''''&lt;br /&gt;
&lt;br /&gt;
McAfee Security does not allow applications to listen on ports not explicitly specified.  You have two options: 1) disable firewall protection all together, 2) enable &amp;lt;tt&amp;gt;OpenSim.exe&amp;lt;/tt&amp;gt; to be able to open ports.&lt;br /&gt;
&lt;br /&gt;
''Disable firewall''&lt;br /&gt;
&lt;br /&gt;
Open McAfee SecurityCenter.  Select &amp;quot;Internet &amp;amp; Network&amp;quot;.  In the lower left corner is a small link to &amp;quot;Configure...&amp;quot;.  Select this.  In the right side of the window, select the bar that says &amp;quot;Firewall protection is enabled&amp;quot;.  Here you can select &amp;quot;Off&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Enable &amp;lt;tt&amp;gt;OpenSim.exe&amp;lt;/tt&amp;gt; to open ports''&lt;br /&gt;
&lt;br /&gt;
Open McAfee SecurityCenter.  Select &amp;quot;Internet &amp;amp; Network&amp;quot;.  In the lower left corner is a small link to &amp;quot;Configure...&amp;quot;.  Select this.  In the right side of the window, select the bar that says &amp;quot;Firewall protection is enabled&amp;quot;.  Select the &amp;quot;Advanced...&amp;quot; button.  This will pop up a new window.&lt;br /&gt;
&lt;br /&gt;
In the new window, on the left side, select &amp;quot;Program Permissions.&amp;quot;  In the middle on the right side of the window, select the &amp;quot;Add Allowed Program&amp;quot; button.  Use the browser that pops up to find the OpenSim executable and select it.&lt;br /&gt;
&lt;br /&gt;
Finally, select &amp;quot;OK&amp;quot; and exit the McAfee SecurityCenter window.&lt;br /&gt;
&lt;br /&gt;
==Linux/Mac OS X/FreeBSD==&lt;br /&gt;
&lt;br /&gt;
The easiest plaform to get running on the Linux side is Ubuntu 8.10, 32bit.  This is what most of the developers running Linux use.  If you are looking for the quick path, start there.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 8.04 / 8.10 ===&lt;br /&gt;
&lt;br /&gt;
For Ubuntu users on older distributions (7.10, 8.04, etc.) '''you need''' to upgrade your mono to 1.9.1.&lt;br /&gt;
&lt;br /&gt;
You can use the built in packages for mono.  However, for better performance, you may want to [http://xyzzyxyzzy.net/2008/05/08/updated-mono-build-script-for-hardy-heron-and-mono-191/ upgrade mono to 1.9.1] ([http://tempvariable.blogspot.com/2008/04/installing-mono-191-on-ubuntu-804-hardy.html Other simple method])&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion nant mono-gmcs libmono-microsoft8.0-cil \&lt;br /&gt;
      libmono-system-runtime2.0-cil libgdiplus libmono-i18n2.0-cil libmono-oracle2.0-cil ruby&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
To upgrade the Mono version to the latest stable build Mono 2.0.1, read this page [[Build Instructions/Ubuntu-Mono-2.0.1 | Ubuntu on Mono 2.0.1]]&lt;br /&gt;
&lt;br /&gt;
=== openSUSE 10.3 and 11 ===&lt;br /&gt;
&lt;br /&gt;
Install an openSUSE 11 or 10.3 with its default options, add the online repositories&lt;br /&gt;
when finished installing do an online update with all the latest packages.&lt;br /&gt;
&lt;br /&gt;
In yast install these packages, for running Opensim in standalone mode.&lt;br /&gt;
(there is a slight diffrence between 10.3 and 11 but following should be same)&lt;br /&gt;
 subversion&lt;br /&gt;
 nant&lt;br /&gt;
 mono-jscript&lt;br /&gt;
 - check that mono-core is installed&lt;br /&gt;
&lt;br /&gt;
If you just want to use SQLite then jump to last section &lt;br /&gt;
within this post.&lt;br /&gt;
&lt;br /&gt;
* Optional mysql - for Opensim running in Grid mode:&lt;br /&gt;
Install these mysql packages via yast&lt;br /&gt;
  mysql&lt;br /&gt;
  mysql-client&lt;br /&gt;
  mysql-administrator&lt;br /&gt;
  mysql-gui-tools&lt;br /&gt;
  mysql-query-browser&lt;br /&gt;
&lt;br /&gt;
Before building create the mysql database.&lt;br /&gt;
 /etc/init.d/mysql start&lt;br /&gt;
 mysql -u root -p -h localhost&lt;br /&gt;
 (when asked for password just hit enter)&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; create database opensim;&lt;br /&gt;
 mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
set the configuration in bin/mysql_connection.ini&lt;br /&gt;
Or on later builds set the connection string inside bin/OpenSim.ini&lt;br /&gt;
&lt;br /&gt;
Build after installation of above in bash terminal. i save it in /opt&lt;br /&gt;
&lt;br /&gt;
 su -&lt;br /&gt;
 cd /opt&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
After this you should be able to continue on starting the diffrent Servers, look in the mysql-config section,or&lt;br /&gt;
just run your OpenSim as a Standalone. By - eagleFX&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10.5/10.4 ===&lt;br /&gt;
* OpenSim is now working on PowerPC Macs! Thanks to DrScofield and those who helped him. Current nightly builds for PowerPC are not working, not sure about Intel so use the 0.5 Build. OpenSim works on Intel Macs. I'm testing on PowerBook G4. Tested these step on 10.5, but not 10.4 but should work --[[User:Mokele|Mokele]] 22:36, 14 February 2008 (PST) (Works on iMac G5 with OS 10.4.11, including expanding to local grid mode. --[[User:Magnuz|Magnuz]] 2008-12-15 10:50 (CET))&lt;br /&gt;
* Install XCode Developers Tools from DVD/CD Installation Disk or download  from http://developer.apple.com/. You have to create an Apple account to access the downloads if you don't have an Apple account.&lt;br /&gt;
* Install X11 for 10.4 from the Optional Install from the DVD/CD Installation Disk. X11 for 10.5 is installed by default.&lt;br /&gt;
* Install Mono 1.2.5 from http://ftp.novell.com/pub/mono/archive/1.2.5/macos-10-universal/5/MonoFramework-1.2.5_5.macos10.novell.universal.dmg (The more recent releases Mono 1.2.6, 1.9.1 and 2.0.1 do not appear to work with these installation instructions. --[[User:Magnuz|Magnuz]] 2008-12-14 15:56 (CET)) and in Terminal or X11 edit the .profile file  and add the following line:&lt;br /&gt;
 export PKG_CONFIG_PATH=&amp;quot;/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/:${PKG_CONFIG_PATH}&amp;quot;&lt;br /&gt;
* Compile OpenSim&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/tags/0.5.0-release opensim&lt;br /&gt;
 cd opensim &lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
* Download and Compile libopenjpeg-libsl-2.1.2.0.dylib and libsecondlife.dll&lt;br /&gt;
* libopenjpeg-libsl-2.1.2.0.dylib:&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim-libs/old/libsl1550 opensim-libs&lt;br /&gt;
 cd opensim-libs/openjpeg-libsl&lt;br /&gt;
 make -f Makefile.osx&lt;br /&gt;
 cp libopenjpeg-libsl-2.1.2.0.dylib ../../bin&lt;br /&gt;
* Note: The Makefile that creates the libopenjpeg-libsl-2.1.2.0.so does not compile on PowerPC, but works properly on Intel Macs. Looks like a gcc issue with compile options. (It appears to work on iMac G5 with OS X 10.4.11. --[[User:Magnuz|Magnuz]] 2008-12-14 15:55 (CET))&lt;br /&gt;
&lt;br /&gt;
* libsecondlife.dll: (for PowerPC Only, see  details on this step [http://xyzzyxyzzy.net/2008/02/12/installing-opensim-on-powerpcor-of-eggs-and-virtual-worlds installing OpenSim on PowerPC…or: of eggs and virtual worlds])&lt;br /&gt;
 cd .. (back into opensim-libs)&lt;br /&gt;
 nant&lt;br /&gt;
 cp bin/libsecondlife.dll ../bin&lt;br /&gt;
&lt;br /&gt;
* Edit the libsecondlife.dll.config (PowerPC Only). Remove the cpu=&amp;quot;x86&amp;quot; tag in the last dllmap line.&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 6.2 ===&lt;br /&gt;
 su&lt;br /&gt;
 cd /usr/ports/devel/subversion/ &amp;amp;&amp;amp; make install clean (you may also need to rebuild apr-svn if this step fails)&lt;br /&gt;
 cd /usr/ports/lang/mono/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/devel/nant/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/databases/sqlite3/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/x11-toolkits/libgdiplus/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /opensim/installation/directory/&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
 Note: [http://opensimulator.org/wiki/OpenSim:FAQ#System.DllNotFoundException:_..2Flibopenjpeg-libsl-2.1.2.0.so|Follow the instructions on the FAQ to fix the]&lt;br /&gt;
 &amp;quot;System.DllNotFoundException: ./libopenjpeg-libsl-2.1.2.0.so&amp;quot; issue, but use &amp;quot;gmake&amp;quot; instead of &amp;quot;make&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For ODE Physics you must do the following:&lt;br /&gt;
 cd /usr/ports/graphics/libGL/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/graphics/libGLU/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /opensim/installation/directory/&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim-libs/trunk opensim-libs&lt;br /&gt;
 cd opensim-libs/unmanaged/OpenDynamicsEngine2/&lt;br /&gt;
 sh autogen.sh&lt;br /&gt;
 ./configure --enable-shared --enable-release --disable-demos&lt;br /&gt;
 make&lt;br /&gt;
 mv ./ode/src/.libs/libode.so /opensim/installation/directory/opensim/bin/&lt;br /&gt;
&lt;br /&gt;
=== RedHat Enterprise Linux 4 ===&lt;br /&gt;
 sudo vi /etc/yum.repos.d/mono.repo&lt;br /&gt;
&lt;br /&gt;
  [mono]&lt;br /&gt;
  name=Mono for rhel-4-i386 (stable)&lt;br /&gt;
  baseurl=http://ftp.novell.com/pub/mono/download-stable/rhel-4-i386/&lt;br /&gt;
  enabled=1&lt;br /&gt;
  gpgcheck=0&lt;br /&gt;
&lt;br /&gt;
 sudo yum install mono-complete monodoc-core nant&lt;br /&gt;
 svn co svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
=== RedHat Enterprise Linux 5 ===&lt;br /&gt;
&lt;br /&gt;
The instructions below also work on other RedHat Linux flavors such as CentOS or maybe Fedora.&lt;br /&gt;
&lt;br /&gt;
1. Put the [http://download.opensuse.org/repositories/Mono/RHEL_5/Mono.repo Mono.repo] file in the /etc/yum.repo.d/ directory:&lt;br /&gt;
 $ sudo su -&lt;br /&gt;
 $ cd /etc/yum.repos.d/&lt;br /&gt;
 $ wget http://download.opensuse.org/repositories/Mono/RHEL_5/Mono.repo&lt;br /&gt;
Naturally use the most [http://download.opensuse.org/repositories/Mono up-to-date link for your distribution].&lt;br /&gt;
&lt;br /&gt;
2. Install Mono and related tools with yum:&lt;br /&gt;
 $ yum install mono nant mono-jscript mono-nunit&lt;br /&gt;
Make sure to use nunit-console2 to run your tests.&lt;br /&gt;
&lt;br /&gt;
=== Fedora 5 ===&lt;br /&gt;
* I needed to build latest mono and nant from sources to build OpenSim successfully, the ones available in yum repository didn't work so I had to uninstall and build and configure the packages.&lt;br /&gt;
&lt;br /&gt;
For detailed instructions go [http://ruakuu.blogspot.com/2008/06/installing-and-configuring-opensim-on.html here]&lt;br /&gt;
&lt;br /&gt;
=== Debian 4 ===&lt;br /&gt;
&lt;br /&gt;
For detailed instructions please see [[Debian 4 Build Instructions]]&lt;br /&gt;
&lt;br /&gt;
=== CentOS 5.2 32bit ===&lt;br /&gt;
&lt;br /&gt;
For detailed instructions please see [[CentOS 5.2 Build Instructions]]&lt;br /&gt;
&lt;br /&gt;
=== 64bit ===&lt;br /&gt;
Please note that only 32bit binaries are provided in the bin/ directory of subversion.  If you want to use 64bit, you'll need to rebuild these shared objects.  See [[Installing and running on x86-64]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Physics (Open Dynamics Engine ODE) ===&lt;br /&gt;
As installed from svn, ODE will work on most 32 bit platforms.  If you get an ODE-related crash, and/or a &amp;lt;i&amp;gt;libode.so not found&amp;lt;/i&amp;gt; type of error, you will need to build libode from source.&lt;br /&gt;
&lt;br /&gt;
Remove &amp;lt;tt&amp;gt;libode.so&amp;lt;/tt&amp;gt; from the &amp;lt;tt&amp;gt;./bin&amp;lt;/tt&amp;gt; folder.  (Note that subsequent svn updates may replace it again; best fix is to copy your built &amp;lt;tt&amp;gt;libode.so&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt;).  Do NOT remove &amp;lt;tt&amp;gt;ode.net.dll&amp;lt;/tt&amp;gt;!  Download the latest source from:&lt;br /&gt;
&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim-libs/trunk/unmanaged/OpenDynamicsEngine&lt;br /&gt;
&lt;br /&gt;
OpenSim requires a couple of patches on top of ODE which are not yet included upstream.  When compiling, make sure to use the following configure options:&lt;br /&gt;
&lt;br /&gt;
 --with-trimesh=gimpact &lt;br /&gt;
 --enable-shared&lt;br /&gt;
&lt;br /&gt;
Make sure the configure script confirms these choices, and always compile with single precision (I believe that's the default).  Try &amp;lt;code&amp;gt; make -k &amp;lt;/code&amp;gt; if you get errors relating to drawstuff, test*, or openGL.  &amp;lt;code&amp;gt; make install &amp;lt;/code&amp;gt; should put &amp;lt;tt&amp;gt;libode.so&amp;lt;/tt&amp;gt; in the proper place (usually &amp;lt;tt&amp;gt;/usr/local/lib&amp;lt;/tt&amp;gt;), and it should be seen by opensim (&amp;lt;tt&amp;gt;ode.net.dll&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
'''''Note:''' if OpenSim fails to launch with &amp;lt;tt&amp;gt;Exception: System.DllNotFoundException: ode&amp;lt;/tt&amp;gt;, after compiling ODE, just copy &amp;lt;tt&amp;gt;libode.so&amp;lt;/tt&amp;gt; from its usual place (probably &amp;lt;tt&amp;gt;/usr/local/lib/&amp;lt;/tt&amp;gt;) to ./bin/, as per [http://metafuturing.net/index.php/OpenSim_Notebook_1 this suggestion]''&lt;br /&gt;
&lt;br /&gt;
Setting up ODE for 64 Bits systems:&lt;br /&gt;
&lt;br /&gt;
========================================================================&lt;br /&gt;
HOWTO on setting up and Install OpenSim on SLES10 - SP1 64Bit&lt;br /&gt;
&lt;br /&gt;
1. I installed Mono 2.01, added this installation source in Yast2&lt;br /&gt;
    This distro supports installing packages via YaST. Add the following installation source to YaST:&lt;br /&gt;
    * http://ftp.novell.com/pub/mono/download-stable/SLE_10 [^]&lt;br /&gt;
    For assistance with using repositories and installing packages with YaST, visit the Yast help page.&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;nant&amp;quot; was installed also via this operation.&lt;br /&gt;
&lt;br /&gt;
2. I installed subversion from http://software.opensuse.org/search [^]&lt;br /&gt;
&lt;br /&gt;
   SLES/SLED10 -&amp;gt;&lt;br /&gt;
   subversion-1.5.2-34.2.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
3. I downloaded and installed the lastest SVN version of opensim as usual (like a 32 bit system):&lt;br /&gt;
   http://opensimulator.org/wiki/Build_Instructions [^]&lt;br /&gt;
&lt;br /&gt;
4. I downloaded and installed the Open Dynamics Engine (ODE) to replace the 32 bit version of ODE with a 64 bit version.&lt;br /&gt;
 &lt;br /&gt;
   I did that with the following linux commands:&lt;br /&gt;
  (it is expected that you have all required Linux building tools installed):&lt;br /&gt;
   &lt;br /&gt;
   # cd&lt;br /&gt;
   # svn co http://opensimulator.org/svn/opensim-libs/trunk/unmanaged/OpenDynamicsEngine [^]&lt;br /&gt;
   # cd OpenDynamicEngine&lt;br /&gt;
   # chmod a+x ou/bootstrap&lt;br /&gt;
   # sh autogen.sh&lt;br /&gt;
&lt;br /&gt;
 I installed/updated SLES10 with these rpm's for autogen.sh to run properly. http://software.opensuse.org/search [^]&lt;br /&gt;
&lt;br /&gt;
   SLES/SLED10 -&amp;gt;&lt;br /&gt;
   - autoconf-2.61-168.1.x86_64.rpm&lt;br /&gt;
   - automake-1.10.1-5.3.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
   # CFLAGS=&amp;quot;-m64&amp;quot; ./configure --enable-shared&lt;br /&gt;
   # make&lt;br /&gt;
&lt;br /&gt;
 I installed gtk2-devel via yast2, and all its dependancies, because make keept failing.&lt;br /&gt;
&lt;br /&gt;
   # cp ./ode/src/.libs/libode.so /opt/opensim/bin/&lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 in this directory it had made several versions of the &amp;quot;libode.so&amp;quot; because of running the previous commands several times&lt;br /&gt;
 so i had to copy libode.so.1.0.0 to /opt/opensim/bin/libode.so&lt;br /&gt;
&lt;br /&gt;
   # vi ../opensim/bin/OpenSim.ini (change av_capsule_standup_tensor_linux to 1700000)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The 'chmod' command is required to fix permissions that are wrong.&lt;br /&gt;
The change in OpenSim.ini is required to avoid that avatars have bend legs and/or their feet are in the ground.&lt;br /&gt;
========================================================================&lt;br /&gt;
&lt;br /&gt;
===Running===&lt;br /&gt;
Recent versions of OpenSim come without an &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt; file. Copy the &amp;lt;tt&amp;gt;OpenSim.ini.example&amp;lt;/tt&amp;gt; file to &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt; before making any changes.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd bin&lt;br /&gt;
 mono OpenSim.exe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: if you are running a 32bit Server such as Ubuntu 8.0.4 you need the alternative launcher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mono OpenSim.32BitLaunch.exe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* To invoke ODE, add the option:&lt;br /&gt;
 -physics=OpenDynamicsEngine&lt;br /&gt;
to the &amp;lt;tt&amp;gt;mono OpenSim.exe&amp;lt;/tt&amp;gt; line&lt;br /&gt;
&lt;br /&gt;
or add &amp;lt;code&amp;gt;  physics = OpenDynamicsEngine &amp;lt;/code&amp;gt; to the [Startup] section of &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt;.  Same deal for other physics engines, when available.&lt;br /&gt;
&lt;br /&gt;
On mono 1.2.6, some distributions may see&lt;br /&gt;
 Unhandled Exception: System.NotSupportedException: CodePage 1252 not supported&lt;br /&gt;
on startup when using mysql.  This can be resolved by installing the package libmono-i18n2.0-cil (see http://bugs.mysql.com/bug.php?id=33938).&lt;br /&gt;
&lt;br /&gt;
=== Additional Items ===&lt;br /&gt;
&lt;br /&gt;
* [[GC_NO_EXPLICIT|GC NO EXPLICIT]] - Enable Large Heap in Mono, this has been known to help performance and stability&lt;br /&gt;
&lt;br /&gt;
== Hardware selection guide ==&lt;br /&gt;
&lt;br /&gt;
An often-asked question is &amp;quot;what kind of hardware do I need to successfully run OpenSim?&amp;quot;  Unfortunately, the answer is &amp;quot;it depends&amp;quot;.  The number of regions hosted on a given machine, number of simultaneous avatars on those regions, number of prims, use of scripts, etc., all affect hardware requirements.  So, to help you make a more informed selection, some examples of hardware used are listed in the [[Hardware_Selection_Guide|hardware selection guide]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Getting Started]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Build_Instructions/Ubuntu-Mono-2.0.1</id>
		<title>Build Instructions/Ubuntu-Mono-2.0.1</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Build_Instructions/Ubuntu-Mono-2.0.1"/>
				<updated>2009-01-22T04:14:32Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;First grab the normal stuff for the Mono &lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion nant libmono-microsoft8.0-cil libmono-system-runtime2.0-cil libgdiplus libmono-i18n2.0-cil libmono-oracle2.0-cil ruby&lt;br /&gt;
&lt;br /&gt;
Then go to this website and read the compiling steps:&lt;br /&gt;
&lt;br /&gt;
http://devarthur.blogspot.com/2008/10/compiling-mono-201-on-ubuntu-gutsy.html&lt;br /&gt;
&lt;br /&gt;
PS: Be sure to use the ROOT user to compile, else it will fail&lt;br /&gt;
[[Category:Getting Started]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:Hardware</id>
		<title>Category:Hardware</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:Hardware"/>
				<updated>2009-01-22T04:10:46Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: Catch-all for hardware information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Catch-all for hardware information&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:Standards</id>
		<title>Category:Standards</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:Standards"/>
				<updated>2009-01-21T01:53:48Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page:  == Uniform criteria, methods, processes and practices in OpenSim ==&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Uniform criteria, methods, processes and practices in OpenSim ==&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Universal_Time_in_OpenSim</id>
		<title>Universal Time in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Universal_Time_in_OpenSim"/>
				<updated>2009-01-21T01:51:34Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OpenSim Standard Time ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenSim is based on [[UTC]] (Coordinated Universal Time) and not SLT (Second Life Time) which is based on PST (Pacific Standard Time). Due to the very nature of OpenSim being a metaverse, UTC was a natural choice due to its use throughout the Earth as the standard starting point for all timezones. Going forward it will be much easier to plan events and use standard toolsets in OpenSim and any metaverses based on it.&lt;br /&gt;
[[Category:History]]&lt;br /&gt;
[[Category:Standards]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:History</id>
		<title>Category:History</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:History"/>
				<updated>2009-01-21T01:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page:  == Historical and background information about OpenSim ==&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Historical and background information about OpenSim ==&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Universal_Time_in_OpenSim</id>
		<title>Universal Time in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Universal_Time_in_OpenSim"/>
				<updated>2009-01-21T01:48:59Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OpenSim Standard Time ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenSim is based on [[UTC]] (Coordinated Universal Time) and not SLT (Second Life Time) which is based on PST (Pacific Standard Time). Due to the very nature of OpenSim being a metaverse, UTC was a natural choice due to its use throughout the Earth as the standard starting point for all timezones. Going forward it will be much easier to plan events and use standard toolsets in OpenSim and any metaverses based on it.&lt;br /&gt;
[[Category:History]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Universal_Time_in_OpenSim</id>
		<title>Universal Time in OpenSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Universal_Time_in_OpenSim"/>
				<updated>2009-01-21T01:46:58Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page:  == OpenSim Standard Time ==   OpenSim is based on UTC (Coordinated Universal Time) and not SLT (Second Life Time) which is based on PST (Pacific Standard Time). Due to the very nature...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== OpenSim Standard Time ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenSim is based on [[UTC]] (Coordinated Universal Time) and not SLT (Second Life Time) which is based on PST (Pacific Standard Time). Due to the very nature of OpenSim being a metaverse, UTC was a natural choice due to its use throughout the Earth as the standard starting point for all timezones. Going forward it will be much easier to plan events and use standard toolsets in OpenSim and any metaverses based on it.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:Upgrading</id>
		<title>Category:Upgrading</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:Upgrading"/>
				<updated>2009-01-19T18:45:07Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: New page: Tips, Tricks, and Methodologies for Upgrading Your OpenSimulator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tips, Tricks, and Methodologies for Upgrading Your OpenSimulator&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2009-01-19T18:43:45Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
'''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
'''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db OpenSim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
'''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''When the server finishes booting (if you get NHibernate errors see Additional Info below) reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
'''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
[[Category:Upgrading]]&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2009-01-11T17:22:56Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
'''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
'''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db OpenSim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
'''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''When the server finishes booting (if you get NHibernate errors see Additional Info below) reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
'''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T23:30:09Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
'''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
'''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
'''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''When the server finishes booting (if you get NHibernate errors see Additional Info below) reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
'''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T23:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
'''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
'''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
'''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
'''When the server finishes booting (if you get NHibernate errors see Additional Info below)reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
'''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T19:07:44Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below)reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T19:06:00Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below)reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
=== Additional Info ===&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional &lt;br /&gt;
server upgrading issues.&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;br /&gt;
&lt;br /&gt;
==== To fix the NHibernate errors: ====&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:55:59Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below)reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
 '''To fix the NHibernate errors:'''&lt;br /&gt;
 1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
 2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
 3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:54:24Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===How to Upgrade Your Ubuntu Standalone OpenSimulator===&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The goals are: ===&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
 '''To fix the NHibernate errors:'''&lt;br /&gt;
&lt;br /&gt;
 1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
 2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
 3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:50:44Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=How to Upgrade Your Ubuntu Standalone OpenSimulator=&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The goals are: ==&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
 '''To fix the NHibernate errors:'''&lt;br /&gt;
&lt;br /&gt;
 1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
 2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
 3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:50:00Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;_NOTOC_&lt;br /&gt;
=How to Upgrade Your Ubuntu Standalone OpenSimulator=&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The goals are: ==&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
 '''To fix the NHibernate errors:'''&lt;br /&gt;
&lt;br /&gt;
 1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
 2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
 3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:49:22Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;_TOC_&lt;br /&gt;
=How to Upgrade Your Ubuntu Standalone OpenSimulator=&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The goals are: ==&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
 '''To fix the NHibernate errors:'''&lt;br /&gt;
&lt;br /&gt;
 1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
 2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
 3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:45:51Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to Upgrade Your Ubuntu Standalone OpenSimulator=&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The goals are: ==&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run OpenSim'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Save your Region information and shutdown the Simulator'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. save-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. save-oar test2&lt;br /&gt;
&lt;br /&gt;
 5. shutdown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Backup your current install, delete it, then install the latest version'''&lt;br /&gt;
 1. cd ../..&lt;br /&gt;
&lt;br /&gt;
 2. cp -R opensim opensimbak&lt;br /&gt;
&lt;br /&gt;
 3. rm -Rf opensim&lt;br /&gt;
&lt;br /&gt;
 4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
&lt;br /&gt;
 5. cd opensim&lt;br /&gt;
&lt;br /&gt;
 6. ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
 7. nant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Start moving your old information to the new install'''&lt;br /&gt;
 1. cd ../opensimbak/bin&lt;br /&gt;
&lt;br /&gt;
 2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
 4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Run the new install'''&lt;br /&gt;
 1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files:'''&lt;br /&gt;
 1. change-region test&lt;br /&gt;
&lt;br /&gt;
 2. load-oar test&lt;br /&gt;
&lt;br /&gt;
 3. change-region test2&lt;br /&gt;
&lt;br /&gt;
 4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay.'''&lt;br /&gt;
 1. shutdown&lt;br /&gt;
&lt;br /&gt;
 2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
 '''To fix the NHibernate errors:'''&lt;br /&gt;
&lt;br /&gt;
 1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
 2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
 3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:40:21Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Additional Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to Upgrade Your Ubuntu Standalone OpenSimulator=&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The goals are: ==&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run OpenSim ==&lt;br /&gt;
1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Save your Region information and shutdown the Simulator ==&lt;br /&gt;
1. change-region test&lt;br /&gt;
&lt;br /&gt;
2. save-oar test&lt;br /&gt;
&lt;br /&gt;
3. change-region test2&lt;br /&gt;
&lt;br /&gt;
4. save-oar test2&lt;br /&gt;
&lt;br /&gt;
5. shutdown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Backup your current install, delete it, then install the latest version ==&lt;br /&gt;
1. cd ../..&lt;br /&gt;
&lt;br /&gt;
2. cp -R opensim opensimbak&lt;br /&gt;
&lt;br /&gt;
3. rm -Rf opensim&lt;br /&gt;
&lt;br /&gt;
4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
&lt;br /&gt;
5. cd opensim&lt;br /&gt;
&lt;br /&gt;
6. ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
7. nant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Start moving your old information to the new install ==&lt;br /&gt;
1. cd ../opensimbak/bin&lt;br /&gt;
&lt;br /&gt;
2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run the new install ==&lt;br /&gt;
1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files: ==&lt;br /&gt;
1. change-region test&lt;br /&gt;
&lt;br /&gt;
2. load-oar test&lt;br /&gt;
&lt;br /&gt;
3. change-region test2&lt;br /&gt;
&lt;br /&gt;
4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay. ==&lt;br /&gt;
1. shutdown&lt;br /&gt;
&lt;br /&gt;
2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information on additional server upgrading issues.&lt;br /&gt;
&lt;br /&gt;
'''To fix the NHibernate errors:'''&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone</id>
		<title>Upgrade Ubuntu Standalone</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Upgrade_Ubuntu_Standalone"/>
				<updated>2008-12-07T18:37:32Z</updated>
		
		<summary type="html">&lt;p&gt;Rtkwebman: /* Additional Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to Upgrade Your Ubuntu Standalone OpenSimulator=&lt;br /&gt;
&lt;br /&gt;
The following instructions assume you have a currently running two region (island) OpenSimulator on '''Ubuntu 8.10''' in '''Standalone''' mode using '''SQLite''' for the database. We will also assume the two regions are named ''test'' and ''test2''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The goals are: ==&lt;br /&gt;
&lt;br /&gt;
1. Backup your current install and preserve all your Inventory/Assets, Terrain info, Region info, and OpenSim.ini file.&lt;br /&gt;
&lt;br /&gt;
2. Update your current version to the latest trunk.&lt;br /&gt;
&lt;br /&gt;
3. Reload it all and run your brand new upgraded OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run OpenSim ==&lt;br /&gt;
1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Save your Region information and shutdown the Simulator ==&lt;br /&gt;
1. change-region test&lt;br /&gt;
&lt;br /&gt;
2. save-oar test&lt;br /&gt;
&lt;br /&gt;
3. change-region test2&lt;br /&gt;
&lt;br /&gt;
4. save-oar test2&lt;br /&gt;
&lt;br /&gt;
5. shutdown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Backup your current install, delete it, then install the latest version ==&lt;br /&gt;
1. cd ../..&lt;br /&gt;
&lt;br /&gt;
2. cp -R opensim opensimbak&lt;br /&gt;
&lt;br /&gt;
3. rm -Rf opensim&lt;br /&gt;
&lt;br /&gt;
4. svn co http://opensimulator.org/svn/opensim/trunk opensim&lt;br /&gt;
&lt;br /&gt;
5. cd opensim&lt;br /&gt;
&lt;br /&gt;
6. ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
7. nant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Start moving your old information to the new install ==&lt;br /&gt;
1. cd ../opensimbak/bin&lt;br /&gt;
&lt;br /&gt;
2. cp -f *.db Opensim.ini test test2 ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
3. cp -Rf Regions ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
4. cd ../../opensim/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run the new install ==&lt;br /&gt;
1. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== When the server finishes booting (if you get NHibernate errors see Additional Info below), reload your oar files: ==&lt;br /&gt;
1. change-region test&lt;br /&gt;
&lt;br /&gt;
2. load-oar test&lt;br /&gt;
&lt;br /&gt;
3. change-region test2&lt;br /&gt;
&lt;br /&gt;
4. load-oar test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Now that your OpenSimulator is running, shut it down then restart it just to make sure everything is okay. ==&lt;br /&gt;
1. shutdown&lt;br /&gt;
&lt;br /&gt;
2. mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional Info ==&lt;br /&gt;
Check out the page [[Upgrading]] for some great information.&lt;br /&gt;
&lt;br /&gt;
To fix the NHibernate errors:&lt;br /&gt;
&lt;br /&gt;
1. Download the file http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download&lt;br /&gt;
&lt;br /&gt;
2. Copy the Castle.DynamicProxy2.dll Castle.DynamicProxy2.xml Castle.Core.dll Castle.Core.xml files from the bin folder into the opensim/bin directory.&lt;br /&gt;
&lt;br /&gt;
3. Run the OpenSimulator and the errors should be fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any additional files like r32 terrain files you might want to preserve them too. A good practice would be to store them somewhere other than the opensim directory so you do not risk losing them.&lt;/div&gt;</summary>
		<author><name>Rtkwebman</name></author>	</entry>

	</feed>